Merge pull request #1862 from Ansuel/lucidep
authorHannu Nyman <hannu.nyman@iki.fi>
Tue, 12 Jun 2018 16:57:22 +0000 (19:57 +0300)
committerGitHub <noreply@github.com>
Tue, 12 Jun 2018 16:57:22 +0000 (19:57 +0300)
luci-nginx: add nginx metapackages

106 files changed:
applications/luci-app-adblock/luasrc/model/cbi/adblock/overview_tab.lua
applications/luci-app-adblock/luasrc/view/adblock/blocklist.htm
applications/luci-app-adblock/luasrc/view/adblock/query.htm
applications/luci-app-adblock/po/it/adblock.po
applications/luci-app-adblock/po/ja/adblock.po
applications/luci-app-adblock/po/pt-br/adblock.po
applications/luci-app-adblock/po/ru/adblock.po
applications/luci-app-adblock/po/sv/adblock.po
applications/luci-app-adblock/po/templates/adblock.pot
applications/luci-app-adblock/po/zh-cn/adblock.po
applications/luci-app-adblock/po/zh-tw/adblock.po
applications/luci-app-ddns/Makefile
applications/luci-app-ddns/luasrc/controller/ddns.lua
applications/luci-app-ddns/luasrc/model/cbi/ddns/detail.lua
applications/luci-app-ddns/luasrc/model/cbi/ddns/hints.lua
applications/luci-app-ddns/luasrc/model/cbi/ddns/overview.lua
applications/luci-app-ddns/luasrc/tools/ddns.lua
applications/luci-app-ddns/luasrc/view/ddns/system_status.htm
applications/luci-app-firewall/luasrc/model/cbi/firewall/forward-details.lua
applications/luci-app-firewall/luasrc/model/cbi/firewall/forwards.lua
applications/luci-app-firewall/luasrc/model/cbi/firewall/rule-details.lua
applications/luci-app-firewall/luasrc/model/cbi/firewall/rules.lua
applications/luci-app-firewall/luasrc/model/cbi/firewall/zone-details.lua
applications/luci-app-firewall/luasrc/tools/firewall.lua
applications/luci-app-firewall/po/ca/firewall.po
applications/luci-app-firewall/po/cs/firewall.po
applications/luci-app-firewall/po/de/firewall.po
applications/luci-app-firewall/po/el/firewall.po
applications/luci-app-firewall/po/en/firewall.po
applications/luci-app-firewall/po/es/firewall.po
applications/luci-app-firewall/po/fr/firewall.po
applications/luci-app-firewall/po/he/firewall.po
applications/luci-app-firewall/po/hu/firewall.po
applications/luci-app-firewall/po/it/firewall.po
applications/luci-app-firewall/po/ja/firewall.po
applications/luci-app-firewall/po/ko/firewall.po
applications/luci-app-firewall/po/ms/firewall.po
applications/luci-app-firewall/po/no/firewall.po
applications/luci-app-firewall/po/pl/firewall.po
applications/luci-app-firewall/po/pt-br/firewall.po
applications/luci-app-firewall/po/pt/firewall.po
applications/luci-app-firewall/po/ro/firewall.po
applications/luci-app-firewall/po/ru/firewall.po
applications/luci-app-firewall/po/sk/firewall.po
applications/luci-app-firewall/po/sv/firewall.po
applications/luci-app-firewall/po/templates/firewall.pot
applications/luci-app-firewall/po/tr/firewall.po
applications/luci-app-firewall/po/uk/firewall.po
applications/luci-app-firewall/po/vi/firewall.po
applications/luci-app-firewall/po/zh-cn/firewall.po
applications/luci-app-firewall/po/zh-tw/firewall.po
applications/luci-app-lxc/luasrc/controller/lxc.lua
applications/luci-app-lxc/luasrc/view/lxc.htm
applications/luci-app-mwan3/po/zh-cn/mwan3.po
modules/luci-base/htdocs/luci-static/resources/cbi.js
modules/luci-base/luasrc/cbi.lua
modules/luci-base/luasrc/dispatcher.lua
modules/luci-base/luasrc/model/uci.lua
modules/luci-base/luasrc/util.lua
modules/luci-base/luasrc/view/cbi/apply_widget.htm
modules/luci-base/luasrc/view/cbi/dropdown.htm [new file with mode: 0644]
modules/luci-base/luasrc/view/cbi/firewall_zonelist.htm
modules/luci-base/luasrc/view/cbi/map.htm
modules/luci-base/luasrc/view/cbi/network_ifacelist.htm
modules/luci-base/luasrc/view/cbi/network_netlist.htm
modules/luci-base/luasrc/view/sysauth.htm
modules/luci-base/po/ca/base.po
modules/luci-base/po/cs/base.po
modules/luci-base/po/de/base.po
modules/luci-base/po/el/base.po
modules/luci-base/po/en/base.po
modules/luci-base/po/es/base.po
modules/luci-base/po/fr/base.po
modules/luci-base/po/he/base.po
modules/luci-base/po/hu/base.po
modules/luci-base/po/it/base.po
modules/luci-base/po/ja/base.po
modules/luci-base/po/ko/base.po
modules/luci-base/po/ms/base.po
modules/luci-base/po/no/base.po
modules/luci-base/po/pl/base.po
modules/luci-base/po/pt-br/base.po
modules/luci-base/po/pt/base.po
modules/luci-base/po/ro/base.po
modules/luci-base/po/ru/base.po
modules/luci-base/po/sk/base.po
modules/luci-base/po/sv/base.po
modules/luci-base/po/templates/base.pot
modules/luci-base/po/tr/base.po
modules/luci-base/po/uk/base.po
modules/luci-base/po/vi/base.po
modules/luci-base/po/zh-cn/base.po
modules/luci-base/po/zh-tw/base.po
modules/luci-mod-admin-full/luasrc/model/cbi/admin_network/ifaces.lua
modules/luci-mod-admin-full/luasrc/model/cbi/admin_network/wifi.lua
modules/luci-mod-admin-full/luasrc/model/cbi/admin_network/wifi_add.lua
modules/luci-mod-admin-full/luasrc/view/admin_network/iface_overview.htm
modules/luci-mod-admin-full/luasrc/view/admin_network/wifi_overview.htm
modules/luci-mod-freifunk/luasrc/view/freifunk/public_status.htm
protocols/luci-proto-wireguard/luasrc/model/cbi/admin_network/proto_wireguard.lua
themes/luci-theme-bootstrap/htdocs/luci-static/bootstrap/cascade.css
themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm
themes/luci-theme-material/htdocs/luci-static/material/css/style.css
themes/luci-theme-material/luasrc/view/themes/material/header.htm
themes/luci-theme-openwrt/htdocs/luci-static/openwrt.org/cascade.css
themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm

index 3f39622920a3e6013d63f34b9785302f3e89d341..da783e3361b68858df353a1eb52ba6bc680c8881 100644 (file)
@@ -183,7 +183,7 @@ end
 
 des = bl:option(DummyValue, "adb_src_desc", translate("Description"))
 
-cat = bl:option(DynamicList, "adb_src_cat", translate("Categories"))
+cat = bl:option(DynamicList, "adb_src_cat", translate("Archive Categories"))
 cat.datatype = "uciname"
 cat.optional = true
 
index 424a72f6fd3995e0606c7ab1babe14d7112eb79d..81622e9bc6dc7e7dbd0cbfb986409eb54d29d303 100644 (file)
@@ -22,25 +22,35 @@ end
 -%>
 
 <style type="text/css">
-table.cbi-section-table th,
-table.cbi-section-table td,
+.table.cbi-section-table .th,
+.table.cbi-section-table .td,
 .cbi-section-table-cell,
-.cbi-section-table-row,
-.cbi-input-text
+.cbi-section-table-row
 {
        text-align:left;
        vertical-align:top;
        margin-right:auto;
        margin-left:0px;
+       padding-left:2px;
+       line-height:20px;
+       height:20px;
+}
+.table.cbi-section-table .th
+{
+       white-space:nowrap;
+}
+.table.cbi-section-table input
+{
+       width:7em;
 }
 .cbi-input-text
 {
+       text-align:left;
+       padding-left:2px;
        outline:none;
        box-shadow:none;
        background:transparent;
-       padding-left:2px;
-       line-height:25px;
-       height:25px;
+       height:20px;
        width:10em;
 }
 </style>
index 8bbc92664d14e7309e776d242fdccebc6527d36e..8bbed3a53ee93db7063c1715ae72d9c1436cda61 100644 (file)
@@ -35,7 +35,7 @@ This is free software, licensed under the Apache License, Version 2.0
                                        else
                                        {
                                                input.style.display = 'none';
-                                               output.innerHTML = '<span class="error"><%:Invalid domain specified!%></span>';
+                                               output.innerHTML = '<span class="error"><%:Blocklist not found!%></span>';
                                        }
                                }
                        );
index 7c64468e6a5082dcab6d6e7aa1ae2e006756c1ec..c2db36effca6424ccf42d6891c2d42de0cf22d0d 100644 (file)
@@ -40,6 +40,9 @@ msgstr "Tempo addizionale in secondi di attesa prima che adblock si avvii."
 msgid "Advanced"
 msgstr "Avanzato"
 
+msgid "Archive Categories"
+msgstr ""
+
 msgid "Backup Directory"
 msgstr "Directory del Backup"
 
@@ -49,14 +52,14 @@ msgstr ""
 msgid "Blocklist Sources"
 msgstr "Fonti lista di Blocco"
 
+msgid "Blocklist not found!"
+msgstr ""
+
 msgid ""
 "Builds an additional 'Jail' list (/tmp/adb_list.jail) to block access to all "
 "domains except those listed in the whitelist file.<br />"
 msgstr ""
 
-msgid "Categories"
-msgstr ""
-
 msgid ""
 "Choose 'none' to disable automatic startups, 'timed' to use a classic "
 "timeout (default 30 sec.) or select another trigger interface."
@@ -169,9 +172,6 @@ msgstr ""
 msgid "Input file not found, please check your configuration."
 msgstr "File di input non trovato, per favore controlla la tua configurazione."
 
-msgid "Invalid domain specified!"
-msgstr "Dominio invalido specificato!"
-
 msgid "Last Run"
 msgstr "Ultimo Avvio"
 
@@ -371,6 +371,9 @@ msgstr "in pausa"
 msgid "running"
 msgstr ""
 
+#~ msgid "Invalid domain specified!"
+#~ msgstr "Dominio invalido specificato!"
+
 #~ msgid "Available blocklist sources."
 #~ msgstr "Fonti lista di blocco disponibili."
 
index 5276f69626849183e0aee349062b5c87045425a0..cddedacd4301915b49fa5d1c6e580744b7d55cda 100644 (file)
@@ -42,6 +42,9 @@ msgstr "Adblock の処理が開始されるまでの、追加の遅延時間(
 msgid "Advanced"
 msgstr "詳細設定"
 
+msgid "Archive Categories"
+msgstr ""
+
 msgid "Backup Directory"
 msgstr "バックアップ先 ディレクトリ"
 
@@ -51,6 +54,9 @@ msgstr "バックアップ モード"
 msgid "Blocklist Sources"
 msgstr "ブロックリスト提供元"
 
+msgid "Blocklist not found!"
+msgstr ""
+
 msgid ""
 "Builds an additional 'Jail' list (/tmp/adb_list.jail) to block access to all "
 "domains except those listed in the whitelist file.<br />"
@@ -58,9 +64,6 @@ msgstr ""
 "ホワイトリストに存在しない全ドメインへのアクセスをブロックするために、追加で "
 "'Jail' リスト (/tmp/adb_list.jail) を作成します。<br />"
 
-msgid "Categories"
-msgstr "カテゴリー"
-
 msgid ""
 "Choose 'none' to disable automatic startups, 'timed' to use a classic "
 "timeout (default 30 sec.) or select another trigger interface."
@@ -185,9 +188,6 @@ msgstr "ホワイトリスト ファイルへのフルパスです。"
 msgid "Input file not found, please check your configuration."
 msgstr "入力ファイルが見つかりません。設定を確認してください。"
 
-msgid "Invalid domain specified!"
-msgstr "無効なドメインが指定されています!"
-
 msgid "Last Run"
 msgstr "最終実行"
 
@@ -399,3 +399,9 @@ msgstr "一時停止"
 
 msgid "running"
 msgstr "実行中"
+
+#~ msgid "Categories"
+#~ msgstr "カテゴリー"
+
+#~ msgid "Invalid domain specified!"
+#~ msgstr "無効なドメインが指定されています!"
index 6e8098a395030d220b7af31419131e88cfb39a07..07d0f9a8d294b8c15dd36960e945f95bfb28f9b0 100644 (file)
@@ -43,6 +43,9 @@ msgstr ""
 msgid "Advanced"
 msgstr "Avançado"
 
+msgid "Archive Categories"
+msgstr ""
+
 msgid "Backup Directory"
 msgstr "Diretório da cópia de segurança"
 
@@ -52,14 +55,14 @@ msgstr ""
 msgid "Blocklist Sources"
 msgstr "Fontes de listas de bloqueio"
 
+msgid "Blocklist not found!"
+msgstr ""
+
 msgid ""
 "Builds an additional 'Jail' list (/tmp/adb_list.jail) to block access to all "
 "domains except those listed in the whitelist file.<br />"
 msgstr ""
 
-msgid "Categories"
-msgstr ""
-
 msgid ""
 "Choose 'none' to disable automatic startups, 'timed' to use a classic "
 "timeout (default 30 sec.) or select another trigger interface."
@@ -169,9 +172,6 @@ msgstr ""
 msgid "Input file not found, please check your configuration."
 msgstr "Arquivo de entrada não encontrado, por favor cheque sua configuração."
 
-msgid "Invalid domain specified!"
-msgstr "Domínio especificado inválido!"
-
 msgid "Last Run"
 msgstr ""
 
@@ -363,6 +363,9 @@ msgstr ""
 msgid "running"
 msgstr ""
 
+#~ msgid "Invalid domain specified!"
+#~ msgstr "Domínio especificado inválido!"
+
 #~ msgid "Available blocklist sources."
 #~ msgstr "Fontes de listas de bloqueio disponíveis."
 
index 24f42a7760dc52614a0056a67a0d6c479481c63f..c1193d38e11cccb1bb77ed6c9a2d06150c8e0541 100644 (file)
@@ -44,6 +44,9 @@ msgstr "Дополнительная задержка в секундах до 
 msgid "Advanced"
 msgstr "Дополнительно"
 
+msgid "Archive Categories"
+msgstr ""
+
 msgid "Backup Directory"
 msgstr "Папка для бэкапа"
 
@@ -53,6 +56,9 @@ msgstr "Режим сохранения бекапа"
 msgid "Blocklist Sources"
 msgstr "Источники списков блокировки"
 
+msgid "Blocklist not found!"
+msgstr ""
+
 msgid ""
 "Builds an additional 'Jail' list (/tmp/adb_list.jail) to block access to all "
 "domains except those listed in the whitelist file.<br />"
@@ -61,9 +67,6 @@ msgstr ""
 "заблокировать доступ ко всем доменам, кроме тех что перечислены в файле "
 "Белого списка.<br />"
 
-msgid "Categories"
-msgstr ""
-
 msgid ""
 "Choose 'none' to disable automatic startups, 'timed' to use a classic "
 "timeout (default 30 sec.) or select another trigger interface."
@@ -186,9 +189,6 @@ msgstr "Полный путь к файлу Белого списка."
 msgid "Input file not found, please check your configuration."
 msgstr "Config файл не найден, настройте config файл."
 
-msgid "Invalid domain specified!"
-msgstr "Задан недопустимый домен!"
-
 msgid "Last Run"
 msgstr "Последнее время запуска"
 
@@ -397,6 +397,9 @@ msgstr "остановлено"
 msgid "running"
 msgstr "работает"
 
+#~ msgid "Invalid domain specified!"
+#~ msgstr "Задан недопустимый домен!"
+
 #~ msgid "Available blocklist sources."
 #~ msgstr "Источники списков блокировки. "
 
index 349d0cc490fe6ec70d06dea92b06e0c5f5b1f8a1..4a7ca4b738594e0cc2f148ed6e247654ddf60a7a 100644 (file)
@@ -30,6 +30,9 @@ msgstr ""
 msgid "Advanced"
 msgstr "Avancerat"
 
+msgid "Archive Categories"
+msgstr ""
+
 msgid "Backup Directory"
 msgstr "Säkerhetskopiera mapp"
 
@@ -39,14 +42,14 @@ msgstr ""
 msgid "Blocklist Sources"
 msgstr "Källor för blockeringslistor"
 
+msgid "Blocklist not found!"
+msgstr ""
+
 msgid ""
 "Builds an additional 'Jail' list (/tmp/adb_list.jail) to block access to all "
 "domains except those listed in the whitelist file.<br />"
 msgstr ""
 
-msgid "Categories"
-msgstr ""
-
 msgid ""
 "Choose 'none' to disable automatic startups, 'timed' to use a classic "
 "timeout (default 30 sec.) or select another trigger interface."
@@ -160,9 +163,6 @@ msgid "Input file not found, please check your configuration."
 msgstr ""
 "Inmatningsfilen kunde inte hittas, var vänlig kontrollera din konfiguration."
 
-msgid "Invalid domain specified!"
-msgstr "Ogiltig domän angiven!"
-
 msgid "Last Run"
 msgstr "Kördes senast"
 
@@ -348,6 +348,9 @@ msgstr "pausad"
 msgid "running"
 msgstr ""
 
+#~ msgid "Invalid domain specified!"
+#~ msgstr "Ogiltig domän angiven!"
+
 #~ msgid "Available blocklist sources."
 #~ msgstr "Tillgängliga källor för blockeringslistor"
 
index 67c52eaacdd0106214d832e0ef73577f9e373758..a375d0edb61c821354b3a0670da289f45ed0d7f7 100644 (file)
@@ -30,6 +30,9 @@ msgstr ""
 msgid "Advanced"
 msgstr ""
 
+msgid "Archive Categories"
+msgstr ""
+
 msgid "Backup Directory"
 msgstr ""
 
@@ -39,14 +42,14 @@ msgstr ""
 msgid "Blocklist Sources"
 msgstr ""
 
+msgid "Blocklist not found!"
+msgstr ""
+
 msgid ""
 "Builds an additional 'Jail' list (/tmp/adb_list.jail) to block access to all "
 "domains except those listed in the whitelist file.<br />"
 msgstr ""
 
-msgid "Categories"
-msgstr ""
-
 msgid ""
 "Choose 'none' to disable automatic startups, 'timed' to use a classic "
 "timeout (default 30 sec.) or select another trigger interface."
@@ -152,9 +155,6 @@ msgstr ""
 msgid "Input file not found, please check your configuration."
 msgstr ""
 
-msgid "Invalid domain specified!"
-msgstr ""
-
 msgid "Last Run"
 msgstr ""
 
index 42bf0c04b9c4a014339fe9cb42b08d13a44e9543..408d04055cbf21e7bf5cc874c1baf9d65aaa0ef0 100644 (file)
@@ -16,7 +16,7 @@ msgstr ""
 "Plural-Forms: nplurals=1; plural=0;\n"
 
 msgid "'Jail' Blocklist Creation"
-msgstr ""
+msgstr "“Jail” 拦截名单创建"
 
 msgid "-------"
 msgstr "-------"
@@ -25,6 +25,7 @@ msgid ""
 "<b>Caution:</b> To prevent OOM exceptions on low memory devices with less "
 "than 64 MB free RAM, please only select a few of them!"
 msgstr ""
+"<b>注意:</b>为防止在小于 64M 空闲内存的设备上出现内存不足异常,请只选择其中的几个!"
 
 msgid "Adblock"
 msgstr "Adblock"
@@ -44,23 +45,26 @@ msgstr "触发 Adblock 开始处理前的额外延迟(以秒为单位)。"
 msgid "Advanced"
 msgstr "高级"
 
+msgid "Archive Categories"
+msgstr ""
+
 msgid "Backup Directory"
 msgstr "备份目录"
 
 msgid "Backup Mode"
-msgstr ""
+msgstr "备份模式"
 
 msgid "Blocklist Sources"
 msgstr "拦截列表来源"
 
+msgid "Blocklist not found!"
+msgstr ""
+
 msgid ""
 "Builds an additional 'Jail' list (/tmp/adb_list.jail) to block access to all "
 "domains except those listed in the whitelist file.<br />"
 msgstr ""
 
-msgid "Categories"
-msgstr ""
-
 msgid ""
 "Choose 'none' to disable automatic startups, 'timed' to use a classic "
 "timeout (default 30 sec.) or select another trigger interface."
@@ -79,6 +83,7 @@ msgid ""
 "Create compressed blocklist backups, they will be used in case of download "
 "errors or during startup in backup mode."
 msgstr ""
+"创建压缩的拦截列表备份,它们将在下载错误或备份模式启动期间使用。"
 
 msgid "DNS Backend (DNS Directory)"
 msgstr "DNS 后端(DNS 目录)"
@@ -95,7 +100,7 @@ msgid ""
 msgstr "启动期间不要自动更新 blocklists,改用 blocklists 的备份。"
 
 msgid "Download Utility"
-msgstr ""
+msgstr "下载工具"
 
 msgid "Download Utility (SSL Library)"
 msgstr "下载实用程序(SSL 库)"
@@ -110,10 +115,10 @@ msgid "Edit Whitelist"
 msgstr "编辑白名单"
 
 msgid "Email Notification"
-msgstr ""
+msgstr "Email 提醒"
 
 msgid "Email Notification Count"
-msgstr ""
+msgstr "Email 提醒计数"
 
 msgid "Enable Adblock"
 msgstr "启用 Adblock"
@@ -125,6 +130,7 @@ msgid ""
 "Enable memory intense overall sort / duplicate removal on low memory devices "
 "(&lt; 64 MB free RAM)"
 msgstr ""
+"在低内存设备上启用积极的内存整体排序/重复移除(&lt; 64 MB 空闲内存)"
 
 msgid "Enable verbose debug logging in case of any processing error."
 msgstr "在出现任何处理错误的情况下启用详细调试日志记录。"
@@ -136,25 +142,29 @@ msgid "Extra Options"
 msgstr "额外选项"
 
 msgid "Flush DNS Cache"
-msgstr ""
+msgstr "清空 DNS 缓存"
 
 msgid "Flush DNS Cache after adblock processing."
-msgstr ""
+msgstr "在 adblock 进程启动后清空 DNS 缓存。"
 
 msgid ""
 "For SSL protected blocklist sources you need a suitable SSL library, e.g. "
 "'libustream-ssl' or 'built-in'."
 msgstr ""
+"对受 SSL 保护的拦截列表源,您需要一个合适的 SSL 库,如 “libustream-ssl” 或 "
+"“built-in”。"
 
 msgid ""
 "For further information <a href=\"%s\" target=\"_blank\">check the online "
 "documentation</a>"
 msgstr ""
+"进一步信息<a href=\"%s\" target=\"_blank\">请访问在线文档"
 
 msgid ""
 "For further performance improvements you can raise this value, e.g. '8' or "
 "'16' should be safe."
 msgstr ""
+"为了进一步提高性能,您可以提高此值,例如:8 或 16 应该是安全的。"
 
 msgid "Force Local DNS"
 msgstr "强制本地 DNS"
@@ -163,14 +173,11 @@ msgid "Force Overall Sort"
 msgstr "强制整体排序"
 
 msgid "Full path to the whitelist file."
-msgstr ""
+msgstr "白名单文件的全路径。"
 
 msgid "Input file not found, please check your configuration."
 msgstr "输入文件未找到,请检查您的配置。"
 
-msgid "Invalid domain specified!"
-msgstr "无效域名!"
-
 msgid "Last Run"
 msgstr "最后运行"
 
@@ -178,6 +185,7 @@ msgid ""
 "List of available network interfaces. Usually the startup will be triggered "
 "by the 'wan' interface.<br />"
 msgstr ""
+"可用网络接口列表。通常启动将由 “wan” 接口触发。<br />"
 
 msgid ""
 "List of supported DNS backends with their default list export directory.<br /"
@@ -185,13 +193,13 @@ msgid ""
 msgstr "支持的 DNS 后端列表及其默认列表导出目录。<br />"
 
 msgid "List of supported and fully pre-configured download utilities."
-msgstr ""
+msgstr "支持和完全预配置的下载工具列表。"
 
 msgid "Loading"
 msgstr "加载中"
 
 msgid "Max. Download Queue"
-msgstr ""
+msgstr "最大下载队列"
 
 msgid "No"
 msgstr "否"
@@ -201,7 +209,7 @@ msgid ""
 msgstr "在默认设置并不适合您时的额外选项。"
 
 msgid "Overall Domains"
-msgstr ""
+msgstr "域名总览"
 
 msgid "Overview"
 msgstr "总览"
@@ -219,6 +227,7 @@ msgstr "请在终端会话中直接编辑此文件。"
 msgid ""
 "Please note: this needs additional 'msmtp' package installation and setup."
 msgstr ""
+"请注意:这需要额外的 “msmtp” 软件包安装和设置。"
 
 msgid "Query"
 msgstr "查询"
@@ -230,6 +239,7 @@ msgid ""
 "Raise the minimum email notification count, to get emails if the overall "
 "count is less or equal to the given limit (default 0),<br />"
 msgstr ""
+"如果总数小于或等于给定限制(默认为 0),请提高最小电子邮件通知数,以获取电子邮件。"
 
 msgid "Redirect all DNS queries from 'lan' zone to the local resolver."
 msgstr "将所有 DNS 查询从“lan”区域重定向到本地解析器。"
@@ -250,11 +260,13 @@ msgid ""
 "Send notification emails in case of a processing error or if domain count is "
 "&le; 0.<br />"
 msgstr ""
+"如果发生错误或域计数 &le; 0,发送通知电子邮件。<br />"
 
 msgid ""
 "Size of the download queue to handle downloads &amp; list processing in "
 "parallel (default '4').<br />"
 msgstr ""
+"处理下载队列的大小 &amp; 并行处理列表(默认 “4”)。<br />"
 
 msgid "Startup Trigger"
 msgstr "启动触发器"
@@ -269,12 +281,14 @@ msgid ""
 "Target directory for adblock backups. Please use only non-volatile disks, e."
 "g. an external usb stick."
 msgstr ""
+"adblock 备份的目标目录。 请仅使用非易失性磁盘,例如:一个外置 U 盘。"
 
 msgid "Target directory for the generated blocklist 'adb_list.overall'."
 msgstr "生成的 blocklist 'adb_list.overall'的目标目录。"
 
 msgid "The file size is too large for online editing in LuCI (&ge; 100 KB)."
 msgstr ""
+"文件过大,无法使用 LuCI 的在线编辑(&ge; 100 KB)。"
 
 msgid ""
 "This form allows you to modify the content of the adblock blacklist (%s)."
@@ -319,7 +333,7 @@ msgid "Waiting for command to complete..."
 msgstr "正在执行命令..."
 
 msgid "Whitelist File"
-msgstr ""
+msgstr "白名单文件"
 
 msgid "Yes"
 msgstr "是"
@@ -328,6 +342,7 @@ msgid ""
 "You can use this restrictive blocklist manually e.g. for guest wifi or "
 "kidsafe configurations."
 msgstr ""
+"您可以手动使用此限制性拦截列表,例如:为客人提供 wifi 或 kidsafe 配置。"
 
 msgid "disabled"
 msgstr "已禁用"
@@ -335,7 +350,7 @@ msgstr "已禁用"
 msgid ""
 "e.g. to receive an email notification with every adblock update set this "
 "value to 150000."
-msgstr ""
+msgstr "例如:要接收每个 adblock 更新的电子邮件通知时将此值设置为150000。"
 
 msgid "enabled"
 msgstr "已启用"
@@ -350,7 +365,10 @@ msgid "paused"
 msgstr "已暂停"
 
 msgid "running"
-msgstr ""
+msgstr "运行中"
+
+#~ msgid "Invalid domain specified!"
+#~ msgstr "无效域名!"
 
 #~ msgid "Available blocklist sources."
 #~ msgstr "可用的 blocklist 来源。"
index f42d1b3807bf9373e9b544cffbbdec5c3b46bbb4..45b19cdc80f75cf5139c432d638342ccfce7ba26 100644 (file)
@@ -44,6 +44,9 @@ msgstr "觸發 Adblock 開始處理前的額外延遲(以秒為單位)。"
 msgid "Advanced"
 msgstr "高階"
 
+msgid "Archive Categories"
+msgstr ""
+
 msgid "Backup Directory"
 msgstr "備份目錄"
 
@@ -53,14 +56,14 @@ msgstr ""
 msgid "Blocklist Sources"
 msgstr "攔截列表來源"
 
+msgid "Blocklist not found!"
+msgstr ""
+
 msgid ""
 "Builds an additional 'Jail' list (/tmp/adb_list.jail) to block access to all "
 "domains except those listed in the whitelist file.<br />"
 msgstr ""
 
-msgid "Categories"
-msgstr ""
-
 msgid ""
 "Choose 'none' to disable automatic startups, 'timed' to use a classic "
 "timeout (default 30 sec.) or select another trigger interface."
@@ -168,9 +171,6 @@ msgstr ""
 msgid "Input file not found, please check your configuration."
 msgstr "輸入檔案未找到,請檢查您的配置。"
 
-msgid "Invalid domain specified!"
-msgstr "無效域名!"
-
 msgid "Last Run"
 msgstr "最後執行"
 
@@ -352,6 +352,9 @@ msgstr "已暫停"
 msgid "running"
 msgstr ""
 
+#~ msgid "Invalid domain specified!"
+#~ msgstr "無效域名!"
+
 #~ msgid "Available blocklist sources."
 #~ msgstr "可用的 blocklist 來源。"
 
index bd6ddeb1b354c4f260b3d87e303c6f3da9ecd72e..72951895187a83e39b37e7688bc6da8bf5ec11c3 100644 (file)
@@ -16,10 +16,11 @@ PKG_VERSION:=2.4.9
 
 # Release == build
 # increase on changes of translation files
-PKG_RELEASE:=3
+PKG_RELEASE:=5
 
 PKG_LICENSE:=Apache-2.0
-PKG_MAINTAINER:=Christian Schoenebeck <christian.schoenebeck@gmail.com>
+PKG_MAINTAINER:=Christian Schoenebeck <christian.schoenebeck@gmail.com>, \
+                               Ansuel Smith <ansuelsmth@gmail.com>
 
 # LuCI specific settings
 LUCI_TITLE:=LuCI Support for Dynamic DNS Client (ddns-scripts)
index 5f4a5118c387443d91f9c9fa5f4462c707fed177..e152bb0d9844b24ce90db7309fed4d590793271a 100755 (executable)
@@ -21,7 +21,6 @@ luci_helper = "/usr/lib/ddns/dynamic_dns_lucihelper.sh"
 
 local srv_name    = "ddns-scripts"
 local srv_ver_min = "2.7.7"                    -- minimum version of service required
-local srv_ver_cmd = luci_helper .. [[ -V | awk {'print $2'}]]
 local app_name    = "luci-app-ddns"
 local app_title   = "Dynamic DNS"
 local app_version = "2.4.9-1"
@@ -29,7 +28,6 @@ local app_version = "2.4.9-1"
 function index()
        local nxfs      = require "nixio.fs"            -- global definitions not available
        local sys       = require "luci.sys"            -- in function index()
-       local ddns      = require "luci.tools.ddns"     -- ddns multiused functions
        local muci      = require "luci.model.uci"
 
        -- no config create an empty one
@@ -81,33 +79,40 @@ end
 
 -- Standardized application/service functions
 function app_title_main()
-       return  [[<a href="javascript:alert(']]
-                       .. I18N.translate("Version Information")
-                       .. [[\n\n]] .. app_name
-                       .. [[\n\t]] .. I18N.translate("Version") .. [[:\t]] .. app_version
-                       .. [[\n\n]] .. srv_name .. [[ ]] .. I18N.translate("required") .. [[:]]
-                       .. [[\n\t]] .. I18N.translate("Version") .. [[:\t]]
-                               .. srv_ver_min .. [[ ]] .. I18N.translate("or higher")
-                       .. [[\n\n]] .. srv_name .. [[ ]] .. I18N.translate("installed") .. [[:]]
-                       .. [[\n\t]] .. I18N.translate("Version") .. [[:\t]]
-                               .. (service_version() or I18N.translate("NOT installed"))
-                       .. [[\n\n]]
-               .. [[')">]]
-               .. I18N.translate(app_title)
-               .. [[</a>]]
+       tmp = {}
+       tmp[#tmp+1] =   [[<a href="javascript:alert(']]
+       tmp[#tmp+1] =            I18N.translate("Version Information")
+       tmp[#tmp+1] =            [[\n\n]] .. app_name
+       tmp[#tmp+1] =            [[\n]] .. I18N.translate("Version") .. [[: ]] .. app_version
+       tmp[#tmp+1] =            [[\n\n]] .. srv_name .. [[ ]] .. I18N.translate("required") .. [[:]]
+       tmp[#tmp+1] =            [[\n]] .. I18N.translate("Version") .. [[: ]]
+       tmp[#tmp+1] =                    srv_ver_min .. [[ ]] .. I18N.translate("or higher")
+       tmp[#tmp+1] =            [[\n\n]] .. srv_name .. [[ ]] .. I18N.translate("installed") .. [[:]]
+       tmp[#tmp+1] =            [[\n]] .. I18N.translate("Version") .. [[: ]]
+       tmp[#tmp+1] =                    (service_version() or I18N.translate("NOT installed"))
+       tmp[#tmp+1] =            [[\n\n]]
+       tmp[#tmp+1] =    [[')">]]
+       tmp[#tmp+1] =    I18N.translate(app_title)
+       tmp[#tmp+1] =    [[</a>]]
+               
+       return table.concat(tmp)
 end
-function service_version()
-       local ver = nil
-
-       ver = UTIL.exec(srv_ver_cmd)
-       if #ver > 0 then return ver end
 
-       IPKG.list_installed(srv_name, function(n, v, d)
-                       if v and (#v > 0) then ver = v end
-               end
-       )
-       return  ver
+function service_version()
+       
+       local srv_ver_cmd = luci_helper .. " -V | awk {'print $2'} "
+       local ver
+       
+       if IPKG then
+               ver = IPKG.info(srv_name)[srv_name].Version
+       else
+               ver = UTIL.exec(srv_ver_cmd)
+       end
+       
+       if ver and #ver > 0 then return ver or nil end
+       
 end
+
 function service_ok()
        return  IPKG.compare_versions((service_version() or "0"), ">=", srv_ver_min)
 end
index 977dbe34b1f52537e00a9cabde5cc11a988da0ae..eb2159076ef230c1c34545e191f7a9dec8f5f848 100644 (file)
@@ -172,7 +172,7 @@ local function _option_used(option, urlscript)
 end
 
 -- function to verify if option is valid
-local function _option_validate(self, value)
+local function _option_validate(self, value, optional)
        -- section is globally defined here be calling agrument (see above)
        local fusev6 = usev6:formvalue(section) or "0"
        local fsvc4  = svc4:formvalue(section) or "-"
@@ -204,6 +204,7 @@ local function _option_validate(self, value)
        if used < 1 then return "" end
        -- needed but no data then return error
        if not value or (#value == 0) then
+               if optional then return nil end                                          
                return nil, err_tab_basic(self) .. translate("missing / required")
        end
        return value
@@ -292,6 +293,10 @@ function luh.parse(self, section, novld)
 end
 
 -- use_ipv6 -- ################################################################
+
+--We call it globally as it's called 11 times even outside specific function, saves 11 os.execute slow command!
+local has_ipv6 = DDNS.env_info("has_ipv6") 
+
 usev6 = ns:taboption("basic", ListValue, "use_ipv6",
        translate("IP address version"),
        translate("Defines which IP address 'IPv4/IPv6' is send to the DDNS provider") )
@@ -300,16 +305,16 @@ usev6.default = "0"
 usev6:value("0", translate("IPv4-Address") )
 function usev6.cfgvalue(self, section)
        local value = AbstractValue.cfgvalue(self, section) or "0"
-       if DDNS.has_ipv6 or (value == "1" and not DDNS.has_ipv6) then
+       if has_ipv6 or (value == "1" and not has_ipv6) then
                self:value("1", translate("IPv6-Address") )
        end
-       if value == "1" and not DDNS.has_ipv6 then
+       if value == "1" and not has_ipv6 then
                self.description = err_ipv6_basic
        end
        return value
 end
 function usev6.validate(self, value)
-       if (value == "1" and DDNS.has_ipv6) or value == "0" then
+       if (value == "1" and has_ipv6) or value == "0" then
                return value
        end
        return nil, err_tab_basic(self) .. err_ipv6_plain
@@ -360,7 +365,7 @@ svc6 = ns:taboption("basic", ListValue, "ipv6_service_name",
        translate("DDNS Service provider") .. " [IPv6]" )
 svc6.default   = "-"
 svc6:depends("use_ipv6", "1")  -- only show on IPv6
-if not DDNS.has_ipv6 then
+if not has_ipv6 then
        svc6.description = err_ipv6_basic
 end
 function svc6.cfgvalue(self, section)
@@ -374,7 +379,7 @@ function svc6.cfgvalue(self, section)
 end
 function svc6.validate(self, value)
        if usev6:formvalue(section) == "1" then -- do only on IPv6
-               if DDNS.has_ipv6 then return value end
+               if has_ipv6 then return value end
                return nil, err_tab_basic(self) .. err_ipv6_plain
        else
                return ""       -- suppress validate error
@@ -509,18 +514,18 @@ pe = ns:taboption("basic", Value, "param_enc",
                translate("Optional Encoded Parameter"),
                translate("Optional: Replaces [PARAMENC] in Update-URL (URL-encoded)") )
 function pe.validate(self, value)
-       return _option_validate(self, value)
+       return _option_validate(self, value, true)
 end
 function pe.parse(self, section, novld)
        DDNS.value_parse(self, section, novld)
 end
 
--- IPv4/IPv6 - param_enc -- ###################################################
+-- IPv4/IPv6 - param_opt -- ###################################################
 po = ns:taboption("basic", Value, "param_opt",
                translate("Optional Parameter"),
                translate("Optional: Replaces [PARAMOPT] in Update-URL (NOT URL-encoded)") )
 function po.validate(self, value)
-       return _option_validate(self, value)
+       return _option_validate(self, value, true)
 end
 function po.parse(self, section, novld)
        DDNS.value_parse(self, section, novld)
@@ -586,13 +591,17 @@ end
 svc6:value("-", translate("-- custom --") )
 
 -- IPv4/IPv6 - use_https -- ###################################################
-if DDNS.has_ssl or ( ( m:get(section, "use_https") or "0" ) == "1" ) then
+
+--We call it globally as it's called 4 times outside specific function.
+local has_ssl = DDNS.env_info("has_ssl")
+
+if has_ssl or ( ( m:get(section, "use_https") or "0" ) == "1" ) then
        https = ns:taboption("basic", Flag, "use_https",
                translate("Use HTTP Secure") )
        https.orientation = "horizontal"
        function https.cfgvalue(self, section)
                local value = AbstractValue.cfgvalue(self, section)
-               if not DDNS.has_ssl and value == "1" then
+               if not has_ssl and value == "1" then
                        self.description = bold_on .. font_red ..
                                translate("HTTPS not supported") .. font_off .. "<br />" ..
                                translate("please disable") .. " !" .. bold_off
@@ -602,7 +611,7 @@ if DDNS.has_ssl or ( ( m:get(section, "use_https") or "0" ) == "1" ) then
                return value
        end
        function https.validate(self, value)
-               if (value == "1" and DDNS.has_ssl ) or value == "0" then return value end
+               if (value == "1" and has_ssl ) or value == "0" then return value end
                return nil, err_tab_basic(self) .. translate("HTTPS not supported") .. " !"
        end
        function https.write(self, section, value)
@@ -616,7 +625,7 @@ if DDNS.has_ssl or ( ( m:get(section, "use_https") or "0" ) == "1" ) then
 end
 
 -- IPv4/IPv6 - cacert -- ######################################################
-if DDNS.has_ssl then
+if has_ssl then
        cert = ns:taboption("basic", Value, "cacert",
                translate("Path to CA-Certificate"),
                translate("directory or path/file") .. "<br />" ..
@@ -706,7 +715,7 @@ src6:value("network", translate("Network"))
 src6:value("web", translate("URL"))
 src6:value("interface", translate("Interface"))
 src6:value("script", translate("Script"))
-if not DDNS.has_ipv6 then
+if not has_ipv6 then
        src6.description = err_ipv6_other
 end
 function src6.cfgvalue(self, section)
@@ -715,7 +724,7 @@ end
 function src6.validate(self, value)
        if usev6:formvalue(section) ~= "1" then
                return ""       -- ignore on IPv4 selected
-       elseif not DDNS.has_ipv6 then
+       elseif not has_ipv6 then
                return nil, err_tab_adv(self) .. err_ipv6_plain
        elseif not _verify_ip_source() then
                return nil, err_tab_adv(self) ..
@@ -794,7 +803,7 @@ ipn6 = ns:taboption("advanced", ListValue, "ipv6_network",
 ipn6:depends("ipv6_source", "network")
 ipn6.default = "wan6"
 WADM.cbi_add_networks(ipn6)
-if DDNS.has_ipv6 then
+if has_ipv6 then
        ipn6.description = translate("Defines the network to read systems IPv6-Address from")
 else
        ipn6.description = err_ipv6_other
@@ -808,7 +817,7 @@ function ipn6.validate(self, value)
                -- ignore if IPv4 selected OR
                -- ignore everything except "network"
                return ""
-       elseif DDNS.has_ipv6 then
+       elseif has_ipv6 then
                return value
        else
                return nil, err_tab_adv(self) .. err_ipv6_plain
@@ -881,7 +890,7 @@ iurl6 = ns:taboption("advanced", Value, "ipv6_url",
        translate("URL to detect") .. " [IPv6]" )
 iurl6:depends("ipv6_source", "web")
 iurl6.default = "http://checkipv6.dyndns.com"
-if DDNS.has_ipv6 then
+if has_ipv6 then
        iurl6.description = translate("Defines the Web page to read systems IPv6-Address from")
 else
        iurl6.description = err_ipv6_other
@@ -895,7 +904,7 @@ function iurl6.validate(self, value)
                -- ignore if IPv4 selected OR
                -- ignore everything except "web"
                return ""
-       elseif not DDNS.has_ipv6 then
+       elseif not has_ipv6 then
                return nil, err_tab_adv(self) .. err_ipv6_plain
        elseif not value or #value == 0 then
                return nil, err_tab_adv(self) .. translate("missing / required")
@@ -1051,7 +1060,7 @@ eif6:depends("ipv6_source", "web")
 eif6:depends("ipv6_source", "script")
 eif6.default = "wan6"
 WADM.cbi_add_networks(eif6)
-if not DDNS.has_ipv6 then
+if not has_ipv6 then
        eif6.description = err_ipv6_other
 else
        eif6.description = translate("Network on which the ddns-updater scripts will be started")
@@ -1065,7 +1074,7 @@ function eif6.validate(self, value)
         or fsrc6 == "network"
         or fsrc6 == "interface" then
                return ""       -- ignore IPv4, network, interface
-       elseif not DDNS.has_ipv6 then
+       elseif not has_ipv6 then
                return nil, err_tab_adv(self) .. err_ipv6_plain
        else
                return value
@@ -1084,10 +1093,13 @@ function eif6.write(self, section, value)
 end
 function eif6.parse(self, section, novld)
        DDNS.value_parse(self, section, novld)
-end
+end 
 
 -- IPv4/IPv6 - bind_network -- ################################################
-if DDNS.has_bindnet or ( ( m:get(section, "bind_network") or "" ) ~= "" ) then
+
+local has_bindnet = DDNS.env_info("has_bindnet")
+
+if has_bindnet or ( ( m:get(section, "bind_network") or "" ) ~= "" ) then
        bnet = ns:taboption("advanced", ListValue, "bind_network",
                translate("Bind Network") )
        bnet:depends("ipv4_source", "web")
@@ -1097,7 +1109,7 @@ if DDNS.has_bindnet or ( ( m:get(section, "bind_network") or "" ) ~= "" ) then
        WADM.cbi_add_networks(bnet)
        function bnet.cfgvalue(self, section)
                local value = AbstractValue.cfgvalue(self, section)
-               if not DDNS.has_bindnet and value ~= "" then
+               if not has_bindnet and value ~= "" then
                        self.description = bold_on .. font_red ..
                                translate("Binding to a specific network not supported") .. font_off .. "<br />" ..
                                translate("please set to 'default'") .. " !" .. bold_off
@@ -1108,7 +1120,7 @@ if DDNS.has_bindnet or ( ( m:get(section, "bind_network") or "" ) ~= "" ) then
                return value
        end
        function bnet.validate(self, value)
-               if ( (value ~= "") and DDNS.has_bindnet ) or (value == "") then return value end
+               if ( (value ~= "") and has_bindnet ) or (value == "") then return value end
                return nil, err_tab_adv(self) .. translate("Binding to a specific network not supported") .. " !"
        end
        function bnet.parse(self, section, novld)
@@ -1119,13 +1131,16 @@ end
 -- IPv4 + IPv6 - force_ipversion -- ###########################################
 -- optional to force wget/curl and host to use only selected IP version
 -- command parameter "-4" or "-6"
-if DDNS.has_forceip or ( ( m:get(section, "force_ipversion") or "0" ) ~= "0" ) then
+
+local has_forceip = DDNS.env_info("has_forceip")
+
+if has_forceip or ( ( m:get(section, "force_ipversion") or "0" ) ~= "0" ) then
        fipv = ns:taboption("advanced", Flag, "force_ipversion",
                translate("Force IP Version") )
        fipv.orientation = "horizontal"
        function fipv.cfgvalue(self, section)
                local value = AbstractValue.cfgvalue(self, section)
-               if not DDNS.has_forceip and value ~= "0" then
+               if not has_forceip and value ~= "0" then
                        self.description = bold_on .. font_red ..
                                translate("Force IP Version not supported") .. font_off .. "<br />" ..
                                translate("please disable") .. " !" .. bold_off
@@ -1135,14 +1150,17 @@ if DDNS.has_forceip or ( ( m:get(section, "force_ipversion") or "0" ) ~= "0" ) t
                return value
        end
        function fipv.validate(self, value)
-               if (value == "1" and DDNS.has_forceip) or value == "0" then return value end
+               if (value == "1" and has_forceip) or value == "0" then return value end
                return nil, err_tab_adv(self) .. translate("Force IP Version not supported")
        end
 end
 
 -- IPv4 + IPv6 - dns_server -- ################################################
 -- optional DNS Server to use resolving my IP
-if DDNS.has_dnsserver or ( ( m:get(section, "dns_server") or "" ) ~= "" ) then
+
+local has_dnsserver = DDNS.env_info("has_dnsserver")
+
+if has_dnsserver or ( ( m:get(section, "dns_server") or "" ) ~= "" ) then
        dns = ns:taboption("advanced", Value, "dns_server",
                translate("DNS-Server"),
                translate("OPTIONAL: Use non-default DNS-Server to detect 'Registered IP'.") .. "<br />" ..
@@ -1152,7 +1170,7 @@ if DDNS.has_dnsserver or ( ( m:get(section, "dns_server") or "" ) ~= "" ) then
                -- if .datatype is set, then it is checked before calling this function
                if not value or (#value == 0) then
                        return ""       -- ignore on empty
-               elseif not DDNS.has_dnsserver then
+               elseif not has_dnsserver then
                        return nil, err_tab_adv(self) .. translate("Specifying a DNS-Server is not supported")
                elseif not DTYP.host(value) then
                        return nil, err_tab_adv(self) .. translate("use hostname, FQDN, IPv4- or IPv6-Address")
@@ -1179,13 +1197,16 @@ if DDNS.has_dnsserver or ( ( m:get(section, "dns_server") or "" ) ~= "" ) then
 end
 
 -- IPv4 + IPv6 - force_dnstcp -- ##############################################
-if DDNS.has_bindhost or ( ( m:get(section, "force_dnstcp") or "0" ) ~= "0" ) then
+
+local has_bindhost = DDNS.env_info("has_bindhost")
+
+if has_bindhost or ( ( m:get(section, "force_dnstcp") or "0" ) ~= "0" ) then
        tcp = ns:taboption("advanced", Flag, "force_dnstcp",
                translate("Force TCP on DNS") )
        tcp.orientation = "horizontal"
        function tcp.cfgvalue(self, section)
                local value = AbstractValue.cfgvalue(self, section)
-               if not DDNS.has_bindhost and value ~= "0" then
+               if not has_bindhost and value ~= "0" then
                        self.description = bold_on .. font_red ..
                                translate("DNS requests via TCP not supported") .. font_off .. "<br />" ..
                                translate("please disable") .. " !" .. bold_off
@@ -1195,7 +1216,7 @@ if DDNS.has_bindhost or ( ( m:get(section, "force_dnstcp") or "0" ) ~= "0" ) the
                return value
        end
        function tcp.validate(self, value)
-               if (value == "1" and DDNS.has_bindhost ) or value == "0" then
+               if (value == "1" and has_bindhost ) or value == "0" then
                        return value
                end
                return nil, err_tab_adv(self) .. translate("DNS requests via TCP not supported")
@@ -1204,13 +1225,16 @@ end
 
 -- IPv4 + IPv6 - proxy -- #####################################################
 -- optional Proxy to use for http/https requests  [user:password@]proxyhost[:port]
-if DDNS.has_proxy or ( ( m:get(section, "proxy") or "" ) ~= "" ) then
+
+local has_proxy = DDNS.env_info("has_proxy")
+
+if has_proxy or ( ( m:get(section, "proxy") or "" ) ~= "" ) then
        pxy = ns:taboption("advanced", Value, "proxy",
                translate("PROXY-Server") )
        pxy.placeholder="user:password@myproxy.lan:8080"
        function pxy.cfgvalue(self, section)
                local value = AbstractValue.cfgvalue(self, section)
-               if not DDNS.has_proxy and value ~= "" then
+               if not has_proxy and value ~= "" then
                        self.description = bold_on .. font_red ..
                                translate("PROXY-Server not supported") .. font_off .. "<br />" ..
                                translate("please remove entry") .. "!" .. bold_off
@@ -1226,7 +1250,7 @@ if DDNS.has_proxy or ( ( m:get(section, "proxy") or "" ) ~= "" ) then
                -- if .datatype is set, then it is checked before calling this function
                if not value or (#value == 0) then
                        return ""       -- ignore on empty
-               elseif DDNS.has_proxy then
+               elseif has_proxy then
                        local ipv6  = usev6:formvalue(section) or "0"
                        local force = fipv:formvalue(section) or "0"
                        local command = CTRL.luci_helper .. [[ -]]
index df39a3a7e583ce29ede849ffce2681cb674fed10..419201548b5c372bb139f2f0b934476eea5ae297 100644 (file)
@@ -48,7 +48,7 @@ if not SYS.init.enabled("ddns") then
 end
 
 -- No IPv6 support
-if not DDNS.has_ipv6 then
+if not DDNS.env_info("has_ipv6") then
        local v6 = s:option(DummyValue, "_no_ipv6")
        v6.titleref = 'http://www.openwrt.org" target="_blank'
        v6.rawhtml  = true
@@ -60,7 +60,7 @@ if not DDNS.has_ipv6 then
 end
 
 -- No HTTPS support
-if not DDNS.has_ssl then
+if not DDNS.env_info("has_ssl") then
        local sl = s:option(DummyValue, "_no_https")
        sl.titleref = DISP.build_url("admin", "system", "packages")
        sl.rawhtml  = true
@@ -74,7 +74,7 @@ if not DDNS.has_ssl then
 end
 
 -- No bind_network
-if not DDNS.has_bindnet then
+if not DDNS.env_info("has_bindnet") then
        local bn = s:option(DummyValue, "_no_bind_network")
        bn.titleref = DISP.build_url("admin", "system", "packages")
        bn.rawhtml  = true
@@ -90,7 +90,7 @@ if not DDNS.has_bindnet then
 end
 
 -- currently only cURL possibly without proxy support
-if not DDNS.has_proxy then
+if not DDNS.env_info("has_proxy") then
        local px = s:option(DummyValue, "_no_proxy")
        px.titleref = DISP.build_url("admin", "system", "packages")
        px.rawhtml  = true
@@ -104,7 +104,7 @@ if not DDNS.has_proxy then
 end
 
 -- "Force IP Version not supported"
-if not DDNS.has_forceip then
+if not DDNS.env_info("has_forceip") then
        local fi = s:option(DummyValue, "_no_force_ip")
        fi.titleref = DISP.build_url("admin", "system", "packages")
        fi.rawhtml  = true
@@ -112,11 +112,11 @@ if not DDNS.has_forceip then
                translate("Force IP Version not supported") .. bold_off
        local value = translate("BusyBox's nslookup and Wget do not support to specify " ..
                                "the IP version to use for communication with DDNS Provider!")
-       if not (DDNS.has_wgetssl or DDNS.has_curl or DDNS.has_fetch) then
+       if not (DDNS.env_info("has_wgetssl") or DDNS.env_info("has_curl") or DDNS.env_info("has_fetch")) then
                value = value .. "<br />- " ..
                        translate("You should install 'wget' or 'curl' or 'uclient-fetch' package.")
        end
-       if not DDNS.has_bindhost then
+       if not DDNS.env_info("has_bindhost") then
                value = value .. "<br />- " ..
                        translate("You should install 'bind-host' or 'knot-host' or 'drill' package for DNS requests.")
        end
@@ -124,7 +124,7 @@ if not DDNS.has_forceip then
 end
 
 -- "DNS requests via TCP not supported"
-if not DDNS.has_bindhost then
+if not DDNS.env_info("has_bindhost") then
        local dt = s:option(DummyValue, "_no_dnstcp")
        dt.titleref = DISP.build_url("admin", "system", "packages")
        dt.rawhtml  = true
@@ -137,7 +137,7 @@ if not DDNS.has_bindhost then
 end
 
 -- nslookup compiled with musl produce problems when using
-if not DDNS.has_dnsserver then
+if not DDNS.env_info("has_dnsserver") then
        local ds = s:option(DummyValue, "_no_dnsserver")
        ds.titleref = DISP.build_url("admin", "system", "packages")
        ds.rawhtml  = true
@@ -151,7 +151,7 @@ if not DDNS.has_dnsserver then
 end
 
 -- certificates installed
-if DDNS.has_ssl and not DDNS.has_cacerts then
+if DDNS.env_info("has_ssl") and not DDNS.env_info("has_cacerts") then
        local ca = s:option(DummyValue, "_no_certs")
        ca.titleref = DISP.build_url("admin", "system", "packages")
        ca.rawhtml  = true
index 114f831c170f16a9a2b870c818b0bc9e7ec2842d..11f73800ea7156454a979632e4ac1fbb693378b6 100644 (file)
@@ -1,21 +1,20 @@
 -- Copyright 2014-2018 Christian Schoenebeck <christian dot schoenebeck at gmail dot com>
 -- Licensed to the public under the Apache License 2.0.
 
-local NXFS = require "nixio.fs"
 local DISP = require "luci.dispatcher"
 local HTTP = require "luci.http"
 local SYS  = require "luci.sys"
 local CTRL = require "luci.controller.ddns"    -- this application's controller
 local DDNS = require "luci.tools.ddns"         -- ddns multiused functions
 
-local show_hints = not (DDNS.has_ipv6          -- IPv6 support
-                   and DDNS.has_ssl            -- HTTPS support
-                   and DDNS.has_proxy          -- Proxy support
-                   and DDNS.has_bindhost       -- DNS TCP support
-                   and DDNS.has_forceip        -- Force IP version
-                   and DDNS.has_dnsserver      -- DNS server support
-                   and DDNS.has_bindnet        -- Bind to network/interface
-                   and DDNS.has_cacerts        -- certificates installed at /etc/ssl/certs
+local show_hints = not (DDNS.env_info("has_ipv6")              -- IPv6 support
+                                  and  DDNS.env_info("has_ssl")                -- HTTPS support
+                                  and  DDNS.env_info("has_proxy")              -- Proxy support
+                                  and  DDNS.env_info("has_bindhost")   -- DNS TCP support
+                                  and  DDNS.env_info("has_forceip")    -- Force IP version
+                                  and  DDNS.env_info("has_dnsserver")  -- DNS server support
+                                  and  DDNS.env_info("has_bindnet")    -- Bind to network/interface
+                                  and  DDNS.env_info("has_cacerts")    -- certificates installed at /etc/ssl/certs
                )
 local not_enabled = not SYS.init.enabled("ddns")
 local need_update = not CTRL.service_ok()
index 690b9b30ceb57d62a1ef3bce90917326e229d5ac..57913a51fe529f1022ea3dade30f5e8d05fa2e05 100755 (executable)
@@ -5,36 +5,134 @@ module("luci.tools.ddns", package.seeall)
 
 local NX   = require "nixio"
 local NXFS = require "nixio.fs"
-local OPKG = require "luci.model.ipkg"
 local UCI  = require "luci.model.uci"
 local SYS  = require "luci.sys"
-local UTIL = require "luci.util"
 
-local function _check_certs()
-       local _, v = NXFS.glob("/etc/ssl/certs/*.crt")
-       if ( v == 0 ) then _, v = NXFS.glob("/etc/ssl/certs/*.pem") end
-       return (v > 0)
-end
+function env_info(type)
+
+       if ( type == "has_ssl" ) or ( type == "has_proxy" ) or ( type == "has_forceip" ) 
+           or ( type == "has_bindnet" ) or ( type == "has_fetch" ) 
+               or ( type == "has_wgetssl" ) or ( type == "has_curl" ) 
+               or ( type == "has_curlssl" ) or ( type == "has_curlpxy" ) 
+               or ( type == "has_fetchssl" ) or ( type == "has_bbwget" ) then 
+               
+               local function has_wgetssl() 
+                       return (SYS.call( [[which wget-ssl >/dev/null 2>&1]] ) == 0)    -- and true or nil
+               end
+               
+               local function has_curlssl() 
+                       return (SYS.call( [[$(which curl) -V 2>&1 | grep "Protocols:" | grep -qF "https"]] ) ~= 0)
+               end
+               
+               local function has_fetch()
+                       return (SYS.call( [[which uclient-fetch >/dev/null 2>&1]] ) == 0)
+               end
+               
+               local function has_fetchssl()
+                       return NXFS.access("/lib/libustream-ssl.so")
+               end
+               
+               local function has_curl()
+                       return (SYS.call( [[which curl >/dev/null 2>&1]] ) == 0)
+               end
+               
+               local function has_curlpxy()
+                       return (SYS.call( [[grep -i "all_proxy" /usr/lib/libcurl.so* >/dev/null 2>&1]] ) == 0)
+               end
+               
+               local function has_bbwget()
+                       return (SYS.call( [[$(which wget) -V 2>&1 | grep -iqF "busybox"]] ) == 0)
+               end
+               
+               if type == "has_wgetssl" then
+                       return has_wgetssl()
+               
+               elseif type == "has_curl" then
+                       return has_curl()
+                       
+               elseif type == "has_curlssl" then
+                       return has_curlssl()
+                       
+               elseif type == "has_curlpxy" then
+                       return has_curlpxy()
+                       
+               elseif type == "has_fetch" then
+                       return has_fetch()
+                       
+               elseif type == "has_fetchssl" then
+                       return has_fetchssl()
+                       
+               elseif type == "has_bbwget" then
+                       return has_bbwget()
+               
+               elseif type == "has_ssl" then
+                       if has_wgetssl() then return true end
+                       if has_curlssl() then return true end
+                       if (has_fetch() and has_fetchssl()) then return true end
+                       return false
+                       
+               elseif type == "has_proxy" then
+                       if has_wgetssl() then return true end
+                       if has_curlpxy() then return true end
+                       if has_fetch() then return true end
+                       if has_bbwget() then return true end
+                       return false
+                       
+               elseif type == "has_forceip" then
+                       if has_wgetssl() then return true end
+                       if has_curl() then return true end
+                       if has_fetch() then return true end -- only really needed for transfer
+                       return false
+                       
+               elseif type == "has_bindnet" then
+                       if has_curl() then return true end
+                       if has_wgetssl() then return true end
+                       return false
+               end
+       
+       elseif ( type == "has_dnsserver" ) or ( type == "has_bindhost" ) or ( type == "has_hostip" ) or ( type == "has_nslookup" ) then
+               local function has_bindhost() 
+                       if (SYS.call( [[which host >/dev/null 2>&1]] ) == 0) then return true end
+                       if (SYS.call( [[which host >/dev/null 2>&1]] ) == 0) then return true end
+                       if (SYS.call( [[which khost >/dev/null 2>&1]] ) == 0) then return true end
+                       if (SYS.call( [[which drill >/dev/null 2>&1]] ) == 0) then return true end
+                       return false
+               end
+               
+               local function has_hostip()
+                       return (SYS.call( [[which hostip >/dev/null 2>&1]] ) == 0)
+               end
+               
+               local function has_nslookup()
+                       return (SYS.call( [[$(which nslookup) localhost 2>&1 | grep -qF "(null)"]] ) ~= 0)
+               end
+               
+               if type == "has_bindhost" then
+                       return has_bindhost()
+               elseif type == "has_hostip" then
+                       return has_hostip()
+               elseif type == "has_nslookup" then
+                       return has_nslookup()
+               elseif tyep == "has_dnsserver" then
+                       if has_bindhost() then return true end
+                       if has_hostip() then return true end
+                       if has_nslookup() then return true end
+                       return false
+               end
+               
+       elseif type == "has_ipv6" then
+               return (NXFS.access("/proc/net/ipv6_route") and NXFS.access("/usr/sbin/ip6tables"))
+               
+       elseif type == "has_cacerts" then
+               --old _check_certs() local function 
+               local _, v = NXFS.glob("/etc/ssl/certs/*.crt")
+               if ( v == 0 ) then _, v = NXFS.glob("/etc/ssl/certs/*.pem") end
+               return (v > 0)
+       else
+               return
+       end
 
-has_wgetssl    = (SYS.call( [[which wget-ssl >/dev/null 2>&1]] ) == 0) -- and true or nil
-has_curl       = (SYS.call( [[which curl >/dev/null 2>&1]] ) == 0)
-has_curlssl    = (SYS.call( [[$(which curl) -V 2>&1 | grep "Protocols:" | grep -qF "https"]] ) ~= 0)
-has_curlpxy    = (SYS.call( [[grep -i "all_proxy" /usr/lib/libcurl.so* >/dev/null 2>&1]] ) == 0)
-has_fetch      = (SYS.call( [[which uclient-fetch >/dev/null 2>&1]] ) == 0)
-has_fetchssl   = NXFS.access("/lib/libustream-ssl.so")
-has_bbwget     = (SYS.call( [[$(which wget) -V 2>&1 | grep -iqF "busybox"]] ) == 0)
-has_bindhost   = (SYS.call( [[which host >/dev/null 2>&1]] ) == 0)
-               or (SYS.call( [[which khost >/dev/null 2>&1]] ) == 0)
-               or (SYS.call( [[which drill >/dev/null 2>&1]] ) == 0)
-has_hostip     = (SYS.call( [[which hostip >/dev/null 2>&1]] ) == 0)
-has_nslookup   = (SYS.call( [[$(which nslookup) localhost 2>&1 | grep -qF "(null)"]] ) ~= 0)
-has_ipv6       = (NXFS.access("/proc/net/ipv6_route") and NXFS.access("/usr/sbin/ip6tables"))
-has_ssl                = (has_wgetssl or has_curlssl or (has_fetch and has_fetchssl))
-has_proxy      = (has_wgetssl or has_curlpxy or has_fetch or has_bbwget)
-has_forceip    = (has_wgetssl or has_curl or has_fetch) -- only really needed for transfer
-has_dnsserver  = (has_bindhost or has_hostip or has_nslookup)
-has_bindnet    = (has_wgetssl or has_curl)
-has_cacerts    = _check_certs()
+end
 
 -- function to calculate seconds from given interval and unit
 function calc_seconds(interval, unit)
index 5bdcb03e736bd56ef74e18441b881faa2d54acc9..7fcb882a15dfb95b4b219ce81af2f59b2b31409d 100644 (file)
@@ -1,4 +1,3 @@
-
 <!-- ++ BEGIN ++ Dynamic DNS ++ system_status.htm ++ -->
 <script type="text/javascript">//<![CDATA[
        // helper to move status data to the relevant
@@ -10,8 +9,8 @@
                if ( !(tbl) ) { return; }
 
                // clear all rows
-               while (tbl.rows.length > 1)
-                       tbl.deleteRow(1);
+               while (tbl.firstElementChild !== tbl.lastElementChild)
+                       tbl.removeChild(tbl.lastElementChild);
 
                // variable for Modulo-Division use to set cbi-rowstyle-? (0 or 1)
                var i = -1;
                if (data[0].enabled == 0) {
                        var txt = '<strong><font color="red"><%:DDNS Autostart disabled%></font>' ;
                        var url = '<a href="' + data[0].url_up + '"><%:enable here%></a></strong>' ;
-                       var tr = tbl.insertRow(-1);
-                       tr.className = 'cbi-section-table-row cbi-rowstyle-' + (((j + i) % 2) + 1);
-                       var td = tr.insertCell(-1);
-                       td.colSpan = 2 ;
-                       td.innerHTML = txt + " - " + url
-                       tr.insertCell(-1).colSpan = 3 ;
+                       tbl.appendChild(E('<div class="tr cbi-section-table-row cbi-rowstyle-%d">'.format(((j + i) % 2) + 1), [
+                                       E('<div class="td">', [ txt," - ", url ])
+                                       ]));
                        i++ ;
                }
 
+               var configuration;
+               var next_update;
+               var lookup;
+               var registered_ip;
+               var network;
+
                for( j = 1; j < data.length; j++ )
                {
-                       var tr = tbl.insertRow(-1);
-                       tr.className = 'cbi-section-table-row cbi-rowstyle-' + (((j + i) % 2) + 1) ;
-
                        // configuration
-                       tr.insertCell(-1).innerHTML = '<strong>' + data[j].section + '</strong>' ;
+                       configuration = data[j].section;
 
                        // pid
                        // data[j].pid ignored here
                        // next update
                        switch (data[j].datenext) {
                                case "_empty_":
-                                       tr.insertCell(-1).innerHTML = '<em><%:Unknown error%></em>' ;
+                                       next_update = '<em><%:Unknown error%></em>';
                                        break;
                                case "_stopped_":
-                                       tr.insertCell(-1).innerHTML = '<em><%:Stopped%></em>' ;
+                                       next_update = '<em><%:Stopped%></em>';
                                        break;
                                case "_disabled_":
-                                       tr.insertCell(-1).innerHTML = '<em><%:Disabled%></em>' ;
+                                       next_update = '<em><%:Disabled%></em>';
                                        break;
                                case "_noupdate_":
-                                       tr.insertCell(-1).innerHTML = '<em><%:Update error%></em>' ;
+                                       next_update = '<em><%:Update error%></em>';
                                        break;
                                case "_runonce_":
-                                       tr.insertCell(-1).innerHTML = '<em><%:Run once%></em>' ;
+                                       next_update = '<em><%:Run once%></em>';
                                        break;
                                case "_verify_":
-                                       tr.insertCell(-1).innerHTML = '<em><%:Verify%></em>';
+                                       next_update = '<em><%:Verify%></em>';
                                        break;
                                default:
-                                       tr.insertCell(-1).innerHTML = data[j].datenext ;
+                                       next_update = data[j].datenext;
                                        break;
                        }
 
                        // lookup
                        if (data[j].lookup == "_nolookup_")
-                               tr.insertCell(-1).innerHTML = '<em><%:config error%></em>';
+                               lookup = '<em><%:config error%></em>';
                        else
-                               tr.insertCell(-1).innerHTML = data[j].lookup;
+                               lookup = data[j].lookup;
 
                        // registered IP
                        switch (data[j].reg_ip) {
                                case "_nolookup_":
-                                       tr.insertCell(-1).innerHTML = '<em><%:Config error%></em>';
+                                       registered_ip = '<em><%:config error%></em>';
                                        break;
                                case "_nodata_":
-                                       tr.insertCell(-1).innerHTML = '<em><%:No data%></em>';
+                                       registered_ip = '<em><%:No data%></em>';
                                        break;
                                case "_noipv6_":
-                                       tr.insertCell(-1).innerHTML = '<em><%:IPv6 not supported%></em>';
+                                       registered_ip = '<em><%:IPv6 not supported%></em>';
                                        break;
                                default:
-                                       tr.insertCell(-1).innerHTML = data[j].reg_ip;
+                                       registered_ip = data[j].reg_ip;
                                        break;
                        }
 
                        // monitored interface
                        if (data[j].iface == "_nonet_")
-                               tr.insertCell(-1).innerHTML = '<em><%:Config error%></em>';
+                               network = '<em><%:Config error%></em>';
                        else
-                               tr.insertCell(-1).innerHTML = data[j].iface;
+                               network = data[j].iface;
+
+                       tbl.appendChild(E('<div class="tr cbi-section-table-row cbi-rowstyle-%d">'.format(((j + i) % 2) + 1), [
+                                       E('<div class="td">', [ E('<strong>', configuration) ]),
+                                       E('<div class="td">', next_update),
+                                       E('<div class="td">', lookup),
+                                       E('<div class="td">', registered_ip),
+                                       E('<div class="td">', network)
+                                       ]));
                }
 
-               if (tbl.rows.length == 1 || (data[0].enabled == 0 && tbl.rows.length == 2) ) {
+               if (tbl.firstElementChild === tbl.lastElementChild || (data[0].enabled == 0 && tbl.childNodes.length == 2) ) {
                        var br = '<br />';
-                       if (tbl.rows.length > 1)
+                       var msg = '<%:There is no service configured.%>';
+                       if (tbl.firstElementChild !== tbl.lastElementChild)
                                br = '';
-                       var tr = tbl.insertRow(-1);
-                       tr.className = "cbi-section-table-row";
-                       var td = tr.insertCell(-1);
-                       td.colSpan = 5;
-                       td.innerHTML = '<em>' + br + '<%:There is no service configured.%></em>' ;
+                       msg = br + msg;
+                       tbl.appendChild(E('<div class="tr cbi-section-table-row">', [
+                                       E('<div class="td">', [ E('<em>', msg) ])
+                                       ]));
                }
        }
 
 <fieldset class="cbi-section" id="ddns_status_section">
        <legend><a href="<%=url([[admin]], [[services]], [[ddns]])%>"><%:Dynamic DNS%></a></legend>
 
-       <table class="cbi-section-table" id="ddns_status_table">
-               <tr class="cbi-section-table-titles">
-                       <th class="cbi-section-table-cell"><%:Configuration%></th>
-                       <th class="cbi-section-table-cell"><%:Next Update%></th>
-                       <th class="cbi-section-table-cell"><%:Lookup Hostname%></th>
-                       <th class="cbi-section-table-cell"><%:Registered IP%></th>
-                       <th class="cbi-section-table-cell"><%:Network%></th>
-               </tr>
-               <tr class="cbi-section-table-row">
-                       <td colspan="5"><em><br /><%:Collecting data...%></em></td>
-               </tr>
-       </table>
+       <div class="table cbi-section-table" id="ddns_status_table">
+               <div class="tr cbi-section-table-titles">
+                       <div class="th cbi-section-table-cell"><%:Configuration%></div>
+                       <div class="th cbi-section-table-cell"><%:Next Update%></div>
+                       <div class="th cbi-section-table-cell"><%:Lookup Hostname%></div>
+                       <div class="th cbi-section-table-cell"><%:Registered IP%></div>
+                       <div class="th cbi-section-table-cell"><%:Network%></div>
+               </div>
+               <div class="tr cbi-section-table-row">
+                       <div class="td"><em><br /><%:Collecting data...%></em></div>
+               </div>
+       </div>
 </fieldset>
 <!-- ++ END ++ Dynamic DNS ++ system_status.htm ++ -->
index 17a49483d77115fed13c2fdcf2e0b0eced594b42..d51f8fb79b4a9ca759477ec4fd8019478543c831 100644 (file)
@@ -55,6 +55,7 @@ o = s:option(Value, "src", translate("Source zone"))
 o.nocreate = true
 o.default = "wan"
 o.template = "cbi/firewall_zonelist"
+o.rmempty = false
 
 
 o = s:option(DynamicList, "src_mac",
@@ -88,6 +89,10 @@ o.rmempty = true
 o.datatype = "neg(portrange)"
 o.placeholder = translate("any")
 
+o:depends("proto", "tcp")
+o:depends("proto", "udp")
+o:depends("proto", "tcp udp")
+o:depends("proto", "tcpudp")
 
 o = s:option(Value, "src_dip",
        translate("External IP address"),
@@ -108,7 +113,10 @@ o = s:option(Value, "src_dport", translate("External port"),
                "destination port or port range on this host"))
 o.datatype = "neg(portrange)"
 
-
+o:depends("proto", "tcp")
+o:depends("proto", "udp")
+o:depends("proto", "tcp udp")
+o:depends("proto", "tcpudp")
 
 o = s:option(Value, "dest", translate("Internal zone"))
 o.nocreate = true
@@ -133,6 +141,10 @@ o = s:option(Value, "dest_port",
 o.placeholder = translate("any")
 o.datatype = "portrange"
 
+o:depends("proto", "tcp")
+o:depends("proto", "udp")
+o:depends("proto", "tcp udp")
+o:depends("proto", "tcpudp")
 
 o = s:option(Flag, "reflection", translate("Enable NAT Loopback"))
 o.rmempty = true
index e61ce73cdd6662a998ac03d34db537f62e688b45..5485ebf09680e01c1f09c40fa1229b96980a36f9 100644 (file)
@@ -54,7 +54,7 @@ function s.parse(self, ...)
        if created then
                m.uci:save("firewall")
                luci.http.redirect(ds.build_url(
-                       "admin/network/firewall/redirect", created
+                       "admin/network/firewall/forwards", created
                ))
        end
 end
index 1c838888f10e282da9c99191b99b61f74f686233..b57201041d289dde5538baebd14c7e3d6e246d0f 100644 (file)
@@ -115,6 +115,10 @@ elseif rule_type == "redirect" then
        o.datatype = "neg(portrange)"
        o.placeholder = translate("any")
 
+       o:depends("proto", "tcp")
+       o:depends("proto", "udp")
+       o:depends("proto", "tcp udp")
+       o:depends("proto", "tcpudp")
 
        o = s:option(Value, "dest", translate("Destination zone"))
        o.nocreate = true
@@ -139,6 +143,10 @@ elseif rule_type == "redirect" then
        o.placeholder = translate("any")
        o.datatype = "neg(portrange)"
 
+       o:depends("proto", "tcp")
+       o:depends("proto", "udp")
+       o:depends("proto", "tcp udp")
+       o:depends("proto", "tcpudp")
 
        o = s:option(Value, "src_dip",
                translate("SNAT IP address"),
@@ -163,6 +171,10 @@ elseif rule_type == "redirect" then
        o.rmempty = true
        o.placeholder = translate('Do not rewrite')
 
+       o:depends("proto", "tcp")
+       o:depends("proto", "udp")
+       o:depends("proto", "tcp udp")
+       o:depends("proto", "tcpudp")
 
        s:option(Value, "extra",
                translate("Extra arguments"),
@@ -255,7 +267,7 @@ else
        o = s:option(Value, "src", translate("Source zone"))
        o.nocreate = true
        o.allowany = true
-       o.default = "wan"
+       o.allowlocal = "src"
        o.template = "cbi/firewall_zonelist"
 
 
@@ -281,12 +293,26 @@ else
        o.datatype = "list(neg(portrange))"
        o.placeholder = translate("any")
 
+       o:depends("proto", "tcp")
+       o:depends("proto", "udp")
+       o:depends("proto", "tcp udp")
+       o:depends("proto", "tcpudp")
 
-       o = s:option(Value, "dest", translate("Destination zone"))
+       o = s:option(Value, "dest_local", translate("Output zone"))
+       o.nocreate = true
+       o.allowany = true
+       o.rmempty = false
+       o.template = "cbi/firewall_zonelist"
+       o.alias = "dest"
+       o:depends("src", "")
+
+       o = s:option(Value, "dest_remote", translate("Destination zone"))
        o.nocreate = true
        o.allowany = true
        o.allowlocal = true
        o.template = "cbi/firewall_zonelist"
+       o.alias = "dest"
+       o:depends({["src"] = "", ["!reverse"] = true})
 
 
        o = s:option(Value, "dest_ip", translate("Destination address"))
@@ -302,6 +328,10 @@ else
        o.datatype = "list(neg(portrange))"
        o.placeholder = translate("any")
 
+       o:depends("proto", "tcp")
+       o:depends("proto", "udp")
+       o:depends("proto", "tcp udp")
+       o:depends("proto", "tcpudp")
 
        o = s:option(ListValue, "target", translate("Action"))
        o.default = "ACCEPT"
@@ -316,9 +346,9 @@ else
                translate("Passes additional arguments to iptables. Use with care!"))
 end
 
-o = s:option(MultiValue, "weekdays", translate("Week Days"))
-o.oneline = true
-o.widget = "checkbox"
+o = s:option(DropDown, "weekdays", translate("Week Days"))
+o.multiple = true
+o.display = 5
 o:value("Sun", translate("Sunday"))
 o:value("Mon", translate("Monday"))
 o:value("Tue", translate("Tuesday"))
@@ -327,9 +357,9 @@ o:value("Thu", translate("Thursday"))
 o:value("Fri", translate("Friday"))
 o:value("Sat", translate("Saturday"))
 
-o = s:option(MultiValue, "monthdays", translate("Month Days"))
-o.oneline = true
-o.widget = "checkbox"
+o = s:option(DropDown, "monthdays", translate("Month Days"))
+o.multiple = true
+o.display = 15
 for i = 1,31 do
        o:value(translate(i))
 end
index c533491977c05bd0f13f5f01dccdf9f02e2cdd0a..22dec5ee6bf86ebaa8c712ff71dd8643034a1135 100644 (file)
@@ -89,17 +89,31 @@ local function rule_proto_txt(self, s)
 end
 
 local function rule_src_txt(self, s)
-       local z = ft.fmt_zone(self.map:get(s, "src"), translate("any zone"))
-       local a = ft.fmt_ip(self.map:get(s, "src_ip"), translate("any host"))
+       local z = ft.fmt_zone(self.map:get(s, "src"))
        local p = ft.fmt_port(self.map:get(s, "src_port"))
        local m = ft.fmt_mac(self.map:get(s, "src_mac"))
 
-       if p and m then
-               return translatef("From %s in %s with source %s and %s", a, z, p, m)
-       elseif p or m then
-               return translatef("From %s in %s with source %s", a, z, p or m)
+       -- Forward/Input
+       if z and #z > 0 then
+               local a = ft.fmt_ip(self.map:get(s, "src_ip"), translate("any host"))
+               if p and m then
+                       return translatef("From %s in %s with source %s and %s", a, z, p, m)
+               elseif p or m then
+                       return translatef("From %s in %s with source %s", a, z, p or m)
+               else
+                       return translatef("From %s in %s", a, z)
+               end
+
+       -- Output
        else
-               return translatef("From %s in %s", a, z)
+               local a = ft.fmt_ip(self.map:get(s, "src_ip"), translate("any router IP"))
+               if p and m then
+                       return translatef("From %s on <var>this device</var> with source %s and %s", a, p, m)
+               elseif p or m then
+                       return translatef("From %s on <var>this device</var> with source %s", a, p or m)
+               else
+                       return translatef("From %s on <var>this device</var>", a)
+               end
        end
 end
 
@@ -158,7 +172,7 @@ target = s:option(DummyValue, "target", translate("Action"))
 target.rawhtml = true
 target.width   = "20%"
 function target.cfgvalue(self, s)
-       local t = ft.fmt_target(self.map:get(s, "target"), self.map:get(s, "dest"))
+       local t = ft.fmt_target(self.map:get(s, "target"), self.map:get(s, "src"), self.map:get(s, "dest"))
        local l = ft.fmt_limit(self.map:get(s, "limit"),
                self.map:get(s, "limit_burst"))
 
index a42c1499f09f59a138ebd47d2b4d24998e3b3ffa..e168c3c6054341273b7207662aba2c82acc4f234 100644 (file)
@@ -101,9 +101,12 @@ end
 function net.write(self, section, value)
        zone:clear_networks()
 
-       local n
-       for n in ut.imatch(value) do
-               zone:add_network(n)
+       local net
+       for net in ut.imatch(value) do
+               local n = nw:get_network(net) or nw:add_network(net, { proto = "none" })
+               if n then
+                       zone:add_network(n:name())
+               end
        end
 end
 
index 2d89bfa2a6e6792f1f47215531568853d1ff27b4..055342bfb376af4bba8c373653cf7c64ca96953c 100644 (file)
@@ -198,8 +198,18 @@ function fmt_limit(limit, burst)
        end
 end
 
-function fmt_target(x, dest)
-       if dest and #dest > 0 then
+function fmt_target(x, src, dest)
+       if not src or #src == 0 then
+               if x == "ACCEPT" then
+                       return _("Accept output")
+               elseif x == "REJECT" then
+                       return _("Refuse output")
+               elseif x == "NOTRACK" then
+                       return _("Do not track output")
+               else --if x == "DROP" then
+                       return _("Discard output")
+               end
+       elseif dest and #dest > 0 then
                if x == "ACCEPT" then
                        return _("Accept forward")
                elseif x == "REJECT" then
index 2ccffca9a7adbe1bb23eaf310942a0aabb7af978..b206fce1e41d65327b3fdb243da797a91097dbb8 100644 (file)
@@ -314,6 +314,9 @@ msgstr "Altre..."
 msgid "Output"
 msgstr "Sortida"
 
+msgid "Output zone"
+msgstr ""
+
 msgid "Passes additional arguments to iptables. Use with care!"
 msgstr "Passa paràmetres addicionals al iptables. Utilitzeu-ho amb cura!"
 
index 4cbf356d0b775e5af48b8a7e5f46abdc7eda9454..3ecd433a7d6be514ed0cb12aaf6efef021dfe5b2 100644 (file)
@@ -309,6 +309,9 @@ msgstr "Ostatní ..."
 msgid "Output"
 msgstr "Výstup"
 
+msgid "Output zone"
+msgstr ""
+
 msgid "Passes additional arguments to iptables. Use with care!"
 msgstr "Předává další argumenty iptables. Používat opatrně!"
 
index 0ee6007dd62ef7d39b3ccd6d57cff4fa17498f51..e39d4f8566de712c28e108698b800618dc6b6aa4 100644 (file)
@@ -307,6 +307,9 @@ msgstr "Anderes..."
 msgid "Output"
 msgstr "Ausgang"
 
+msgid "Output zone"
+msgstr ""
+
 msgid "Passes additional arguments to iptables. Use with care!"
 msgstr ""
 "Gibt zusätzliche Kommandozeilenargumente an iptables weiter. Mit Vorsicht "
index 9ddd4c9db1cb0ffb00dd76e8b5fbfff6f3b074de..783fcd462c1479a6143cbc10a26860084e118ca3 100644 (file)
@@ -306,6 +306,9 @@ msgstr "Άλλο..."
 msgid "Output"
 msgstr "Έξοδος"
 
+msgid "Output zone"
+msgstr ""
+
 msgid "Passes additional arguments to iptables. Use with care!"
 msgstr ""
 
index f0fe0b37821042cfd21c25582804a57534a024e1..9d9166d68f31ac871ce70908479006cf179d404a 100644 (file)
@@ -305,6 +305,9 @@ msgstr ""
 msgid "Output"
 msgstr "Output"
 
+msgid "Output zone"
+msgstr ""
+
 msgid "Passes additional arguments to iptables. Use with care!"
 msgstr ""
 
index 000853e9bd9300dab108c370a7da1388fd1428a1..e96fecad99b2dbfe46a782b5aa4660631bf60815 100644 (file)
@@ -312,6 +312,9 @@ msgstr "Otros..."
 msgid "Output"
 msgstr "Salida"
 
+msgid "Output zone"
+msgstr ""
+
 msgid "Passes additional arguments to iptables. Use with care!"
 msgstr "Pasa más parámetros a IPTables. ¡Usar con cuidado!"
 
index 74c28b88363ffa252565a90b388cc1bd5eb338f9..4a34064868ffc649a53e28a4327c9b936e148737 100644 (file)
@@ -307,6 +307,9 @@ msgstr "Autre..."
 msgid "Output"
 msgstr "Sortie"
 
+msgid "Output zone"
+msgstr ""
+
 msgid "Passes additional arguments to iptables. Use with care!"
 msgstr ""
 
index 0416661c263fe221bd54e4193f1ebe99ea5ef5f8..5511e8ab10ce96838fcb608eca49cc2e666a982b 100644 (file)
@@ -296,6 +296,9 @@ msgstr ""
 msgid "Output"
 msgstr ""
 
+msgid "Output zone"
+msgstr ""
+
 msgid "Passes additional arguments to iptables. Use with care!"
 msgstr ""
 
index 33a305ce8e6030a30fcdc6d77b5b8708917f1504..30c242913d785dc95b96e060e5c5cd6e8b13d8d5 100644 (file)
@@ -313,6 +313,9 @@ msgstr "Egyéb..."
 msgid "Output"
 msgstr "Kimenet"
 
+msgid "Output zone"
+msgstr ""
+
 msgid "Passes additional arguments to iptables. Use with care!"
 msgstr ""
 "További argumentumok küldése az iptables részére. Használja körültekintően!"
index 4808d124759435b305e7020048cafd7d02b7b4ef..e26c504b95d7dc3adbe8a22f5d5a65e92a329c95 100644 (file)
@@ -311,6 +311,9 @@ msgstr "Altri..."
 msgid "Output"
 msgstr ""
 
+msgid "Output zone"
+msgstr ""
+
 msgid "Passes additional arguments to iptables. Use with care!"
 msgstr "Passa comandi addizionali a iptables. Usare con cura!"
 
index 27109904ba5e0c96b1192880f9de7d19a50ec21d..d4cf84c956bb2be9f219b7edf1d7894884129f34 100644 (file)
@@ -316,6 +316,9 @@ msgstr "その他のプロトコル"
 msgid "Output"
 msgstr "送信"
 
+msgid "Output zone"
+msgstr ""
+
 msgid "Passes additional arguments to iptables. Use with care!"
 msgstr ""
 "iptablesにパススルーする追加の引数を設定してください。ただし、注意して設定し"
index dd4f96197ad03c7c5df669ca2070662fc139d9a7..5c3d02c1e256803b37add24f1ff45f61c04ca1bd 100644 (file)
@@ -304,6 +304,9 @@ msgstr ""
 msgid "Output"
 msgstr ""
 
+msgid "Output zone"
+msgstr ""
+
 msgid "Passes additional arguments to iptables. Use with care!"
 msgstr "iptables 명령에 추가 인자들을 더합니다.  조심해 사용하세요!"
 
index 58aea1fd0b09116e3683face97a651ab32c4f535..9688622ba46c3ca188e9ae8647f6c72d1297bc43 100644 (file)
@@ -295,6 +295,9 @@ msgstr ""
 msgid "Output"
 msgstr ""
 
+msgid "Output zone"
+msgstr ""
+
 msgid "Passes additional arguments to iptables. Use with care!"
 msgstr ""
 
index 2a13b6b3cd73b2aef633b1604d1dcd91e68542b8..d59fec3646978cdf2a617cc6b2c2e49b27d8e125 100644 (file)
@@ -308,6 +308,9 @@ msgstr "Andre..."
 msgid "Output"
 msgstr "Utdata"
 
+msgid "Output zone"
+msgstr ""
+
 msgid "Passes additional arguments to iptables. Use with care!"
 msgstr "Sender flere argumenter til iptables. Bruk med forsiktighet!"
 
index a08a1e5606df7158f3f8aa821f1b5c9ac73c5722..7c087ef02bdd030cb0fcf06947dbeca17362d218 100644 (file)
@@ -316,6 +316,9 @@ msgstr "Inne..."
 msgid "Output"
 msgstr "Wyjście (Output)"
 
+msgid "Output zone"
+msgstr ""
+
 msgid "Passes additional arguments to iptables. Use with care!"
 msgstr ""
 "Przekazuje dodatkowe argumenty do iptables. Zachowaj szczególną ostrożność!"
index 7da028bee4f39ebcf93d34b9bf1e3b6abdb38721..bfcdd54d9be3e435a83c3f7e6a0cfbdbe5d659e7 100644 (file)
@@ -313,6 +313,9 @@ msgstr "Outro..."
 msgid "Output"
 msgstr "Saída"
 
+msgid "Output zone"
+msgstr ""
+
 msgid "Passes additional arguments to iptables. Use with care!"
 msgstr "Passa argumentos adicionais para o iptables. Use com cuidado!"
 
index 543489e1ad8bfcdc5180a663e84fd6edf8ae9ede..2536b7a3696a76af06783203dd75752216698f7c 100644 (file)
@@ -314,6 +314,9 @@ msgstr "Outro..."
 msgid "Output"
 msgstr "Saída"
 
+msgid "Output zone"
+msgstr ""
+
 msgid "Passes additional arguments to iptables. Use with care!"
 msgstr "Passa argumentos adicionais para o iptables. Usar com cuidado!"
 
index 937efe722b9b83feaf0a3dc830deb45972888a97..dbae3382295e4e575b944356cebfed18111ace25 100644 (file)
@@ -300,6 +300,9 @@ msgstr "Altele..."
 msgid "Output"
 msgstr "Ieşire"
 
+msgid "Output zone"
+msgstr ""
+
 msgid "Passes additional arguments to iptables. Use with care!"
 msgstr ""
 
index 528756d7e314853019c88b375f4ed762809e4bdf..a441c5a709d047efb1791cb2e0f53a23349c6ea2 100644 (file)
@@ -318,6 +318,9 @@ msgstr "Другое..."
 msgid "Output"
 msgstr "Исходящий трафик"
 
+msgid "Output zone"
+msgstr ""
+
 msgid "Passes additional arguments to iptables. Use with care!"
 msgstr ""
 "Передаёт дополнительные аргументы таблице iptables. Используйте с "
index a382bde7db7ac9e9b5cdf4c9d566ae4419af14f9..c6952faa357fa708c500f32dfbcf2b75c14b357f 100644 (file)
@@ -296,6 +296,9 @@ msgstr ""
 msgid "Output"
 msgstr ""
 
+msgid "Output zone"
+msgstr ""
+
 msgid "Passes additional arguments to iptables. Use with care!"
 msgstr ""
 
index d5f6a2d8a58414e51478f68fc52d6753038ffdf6..0301c25b5a6ec1a21eac27d5b387f5173491e4f6 100644 (file)
@@ -302,6 +302,9 @@ msgstr "Andra..."
 msgid "Output"
 msgstr "Utmatning"
 
+msgid "Output zone"
+msgstr ""
+
 msgid "Passes additional arguments to iptables. Use with care!"
 msgstr ""
 
index 6ff4c3ca0fc06921a423803781d130024d43b2ae..d2691cc44ade69326f1a9aca7d9e5578b12c2c53 100644 (file)
@@ -289,6 +289,9 @@ msgstr ""
 msgid "Output"
 msgstr ""
 
+msgid "Output zone"
+msgstr ""
+
 msgid "Passes additional arguments to iptables. Use with care!"
 msgstr ""
 
index 1dd1e6f9cf7ffb26aef182f71294b1558cfea4a3..9c5adb1cd2161f704b9ae4b8f267a9b549db7cfb 100644 (file)
@@ -296,6 +296,9 @@ msgstr ""
 msgid "Output"
 msgstr ""
 
+msgid "Output zone"
+msgstr ""
+
 msgid "Passes additional arguments to iptables. Use with care!"
 msgstr ""
 
index 86ff65edf1114754e6966c1d34ba407eb5965b4d..7234ceff6654475c029c13ae924eb411d634241c 100644 (file)
@@ -1,7 +1,7 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
-"PO-Revision-Date: 2012-12-29 12:53+0200\n"
+"PO-Revision-Date: 2018-06-10 17:15+0200\n"
 "Last-Translator: Yurii <yuripet@gmail.com>\n"
 "Language-Team: none\n"
 "Language: uk\n"
@@ -10,7 +10,9 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%"
 "10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
-"X-Generator: Pootle 2.0.6\n"
+
+msgid ""
+msgstr "Content-Type: text/plain; charset=UTF-8"
 
 msgid "%s in %s"
 msgstr "%s у %s"
@@ -40,10 +42,10 @@ msgid "<var>%s</var> and limit to %s"
 msgstr "<var>%s</var> з лімітом %s"
 
 msgid "Accept forward"
-msgstr ""
+msgstr "Приймати переспрямовування"
 
 msgid "Accept input"
-msgstr ""
+msgstr "Приймати введення"
 
 msgid "Action"
 msgstr "Дія"
@@ -58,10 +60,10 @@ msgid "Advanced Settings"
 msgstr "Розширені настройки"
 
 msgid "Allow forward from <em>source zones</em>:"
-msgstr "Дозволити спрямовування від <em>зон-джерел</em>:"
+msgstr "Дозволити переспрямовування від <em>зон-джерел</em>:"
 
 msgid "Allow forward to <em>destination zones</em>:"
-msgstr "Дозволити спрямовування до <em>зон призначення</em>:"
+msgstr "Дозволити переспрямовування до <em>зон призначення</em>:"
 
 msgid "Any"
 msgstr "Будь-який"
@@ -95,22 +97,22 @@ msgid "Destination zone"
 msgstr "Зона призначення"
 
 msgid "Disable"
-msgstr ""
+msgstr "Вимкнути"
 
 msgid "Discard forward"
-msgstr ""
+msgstr "Відкидати переспрямовування"
 
 msgid "Discard input"
-msgstr ""
+msgstr "Відкидати введення"
 
 msgid "Do not rewrite"
 msgstr "Не перезаписувати"
 
 msgid "Do not track forward"
-msgstr ""
+msgstr "Не відслідковувати переспрямовування"
 
 msgid "Do not track input"
-msgstr ""
+msgstr "Не відслідковувати введення"
 
 msgid "Drop invalid packets"
 msgstr "Відкидати помилкові пакети"
@@ -128,7 +130,7 @@ msgid "Enable logging on this zone"
 msgstr "Увімкнути реєстрування у цій зоні"
 
 msgid "Experimental feature. Not fully compatible with QoS/SQM."
-msgstr ""
+msgstr "Експериментальна функція. Не повністю сумісно з QoS / SQM."
 
 msgid "External IP address"
 msgstr "Зовнішня IP-адреса"
@@ -149,7 +151,7 @@ msgid "Firewall - Custom Rules"
 msgstr "Брандмауер — Настроювані правила"
 
 msgid "Firewall - Port Forwards"
-msgstr "Ð\91Ñ\80андмаÑ\83еÑ\80 â\80\94 Ð¡прямовування портів"
+msgstr "Ð\91Ñ\80андмаÑ\83еÑ\80 â\80\94 Ð\9fеÑ\80еÑ\81прямовування портів"
 
 msgid "Firewall - Traffic Rules"
 msgstr "Брандмауер — Правила трафіка"
@@ -161,13 +163,13 @@ msgid "Force connection tracking"
 msgstr "Увімкнути відстеження з'єднань"
 
 msgid "Forward"
-msgstr "Спрямовування"
+msgstr "Ð\9fеÑ\80еÑ\81прямовування"
 
 msgid "Forward to"
-msgstr "спрямовування до"
+msgstr "переспрямовування до"
 
 msgid "Friday"
-msgstr ""
+msgstr "П'ятниця"
 
 msgid "From %s in %s"
 msgstr "%s у %s"
@@ -182,16 +184,16 @@ msgid "General Settings"
 msgstr "Загальні настройки"
 
 msgid "Hardware flow offloading"
-msgstr ""
+msgstr "Апаратні засоби розвантаження потоку"
 
 msgid "IP"
-msgstr ""
+msgstr "IP-адреса"
 
 msgid "IP range"
-msgstr ""
+msgstr "Діапазон IP"
 
 msgid "IPs"
-msgstr ""
+msgstr "IP-алреси"
 
 msgid "IPv4"
 msgstr "IPv4"
@@ -212,7 +214,7 @@ msgid "Input"
 msgstr "Вхідний"
 
 msgid "Inter-Zone Forwarding"
-msgstr "СпÑ\80Ñ\8fмовÑ\83ваннÑ\8f ÐºÑ\80Ñ\96зÑ\8c Ð·Ð¾Ð½и"
+msgstr "Ð\9fеÑ\80еÑ\81пÑ\80Ñ\8fмовÑ\83ваннÑ\8f Ð¼Ñ\96ж Ð·Ð¾Ð½Ð°Ð¼и"
 
 msgid "Internal IP address"
 msgstr "Внутрішня IP-адреса"
@@ -227,10 +229,10 @@ msgid "Limit log messages"
 msgstr "Обмеження повідомлень журналу"
 
 msgid "MAC"
-msgstr ""
+msgstr "MAC-алреса"
 
 msgid "MACs"
-msgstr ""
+msgstr "MAC-алреси"
 
 msgid "MSS clamping"
 msgstr "Затискання MSS"
@@ -246,8 +248,8 @@ msgstr "Зіставляти ICMP типу"
 
 msgid "Match forwarded traffic to the given destination port or port range."
 msgstr ""
-"Зіставляти трафік, що спрямовується на заданий порт призначення або діапазон "
-"портів."
+"Зіставляти трафік, що переспрямовується на заданий порт призначення або "
+"дÑ\96апазон Ð¿Ð¾Ñ\80Ñ\82Ñ\96в."
 
 msgid ""
 "Match incoming traffic directed at the given destination port or port range "
@@ -264,10 +266,10 @@ msgstr ""
 "діапазоні портів вузла клієнта."
 
 msgid "Monday"
-msgstr ""
+msgstr "Понеділок"
 
 msgid "Month Days"
-msgstr ""
+msgstr "Дні місяця"
 
 msgid "Name"
 msgstr "Ім'я"
@@ -276,13 +278,13 @@ msgid "New SNAT rule"
 msgstr "Нове правило SNAT"
 
 msgid "New forward rule"
-msgstr "Нове правило спрямовування"
+msgstr "Нове правило переспрямовування"
 
 msgid "New input rule"
 msgstr "Нове вхідне правило"
 
 msgid "New port forward"
-msgstr "Нове спрямовування порту"
+msgstr "Нове переспрямовування порту"
 
 msgid "New source NAT"
 msgstr "Новий NAT джерела"
@@ -312,18 +314,21 @@ msgstr "Інше..."
 msgid "Output"
 msgstr "Вихідний"
 
+msgid "Output zone"
+msgstr "Вихідна зона"
+
 msgid "Passes additional arguments to iptables. Use with care!"
 msgstr ""
 "Передача додаткових аргументів для IPTables. Використовуйте з обережністю!"
 
 msgid "Port Forwards"
-msgstr "Спрямовування портів"
+msgstr "Ð\9fеÑ\80еÑ\81прямовування портів"
 
 msgid ""
 "Port forwarding allows remote computers on the Internet to connect to a "
 "specific computer or service within the private LAN."
 msgstr ""
-"Спрямовування портів дозволяє віддаленим комп'ютерам з Інтернету "
+"Ð\9fеÑ\80еÑ\81прямовування портів дозволяє віддаленим комп'ютерам з Інтернету "
 "підключатися до певного комп'ютера або служби у приватній мережі."
 
 msgid "Protocol"
@@ -338,16 +343,16 @@ msgid "Redirect matched incoming traffic to the specified internal host"
 msgstr "Переспрямувати відповідний вхідний трафік на заданий внутрішній вузол"
 
 msgid "Refuse forward"
-msgstr ""
+msgstr "Відхиляти переспрямовування"
 
 msgid "Refuse input"
-msgstr ""
+msgstr "Відхиляти введення"
 
 msgid "Requires hardware NAT support. Implemented at least for mt7621"
-msgstr ""
+msgstr "Необхідна апаратна підтримка NAT. Впроваджено принаймні для mt7621"
 
 msgid "Restart Firewall"
-msgstr ""
+msgstr "Перезавантажити брандмауер"
 
 msgid "Restrict Masquerading to given destination subnets"
 msgstr "Обмежити підміну заданими підмережами призначення"
@@ -375,13 +380,13 @@ msgid "Rewrite to source %s, %s"
 msgstr "перезапис на вихідний %s, %s"
 
 msgid "Routing/NAT Offloading"
-msgstr ""
+msgstr "Розвантаження маршрутизації/NAT"
 
 msgid "Rule is disabled"
-msgstr ""
+msgstr "Правило вимкнено"
 
 msgid "Rule is enabled"
-msgstr ""
+msgstr "Правило ввімкнено"
 
 msgid "SNAT IP address"
 msgstr "IP-адреса SNAT"
@@ -390,13 +395,13 @@ msgid "SNAT port"
 msgstr "Порт SNAT"
 
 msgid "Saturday"
-msgstr ""
+msgstr "Субота"
 
 msgid "Software based offloading for routing/NAT"
-msgstr ""
+msgstr "Програмне розвантаження для маршрутизації/NAT"
 
 msgid "Software flow offloading"
-msgstr ""
+msgstr "Програмне розвантаження потоку"
 
 msgid "Source IP address"
 msgstr "IP-адреса джерела"
@@ -426,19 +431,19 @@ msgid "Source zone"
 msgstr "Зона-джерело"
 
 msgid "Start Date (yyyy-mm-dd)"
-msgstr ""
+msgstr "Дата початку (рррр-мм-дд)"
 
 msgid "Start Time (hh:mm:ss)"
-msgstr ""
+msgstr "Час початку (гг:хх:сс)"
 
 msgid "Stop Date (yyyy-mm-dd)"
-msgstr ""
+msgstr "Дата зупинки (рррр-мм-дд)"
 
 msgid "Stop Time (hh:mm:ss)"
-msgstr ""
+msgstr "Час зупинки (гг:хх:сс)"
 
 msgid "Sunday"
-msgstr ""
+msgstr "Неділя"
 
 msgid ""
 "The firewall creates zones over your network interfaces to control network "
@@ -455,19 +460,20 @@ msgid ""
 "rule is <em>unidirectional</em>, e.g. a forward from lan to wan does "
 "<em>not</em> imply a permission to forward from wan to lan as well."
 msgstr ""
-"Опції, наведені нижче, управляють політиками спрямовування між цією (%s) та "
-"іншими зонами. <em>Зони призначення</em> покриваються трафіком, що "
-"<strong>виходить з %q</strong>. <em>Зони-джерела</em> покриваються трафіком "
-"з інших зон, <strong>спрямованим на %q</strong>. Правила спрямування є "
-"<em>односпрямованим</em>, тобто, спрямування від LAN до WAN <em>не</em> "
-"означає, що є також дозвіл спрямовувати від WAN в LAN."
+"Опції, наведені нижче, керують політиками переспрямовування між цією (%s) "
+"та іншими зонами. <em>Зони призначення</em> покриваються переспрямованим "
+"трафіком, що <strong>виходить з %q</strong>. <em>Зони-джерела</em> "
+"покриваються трафіком з інших зон, <strong>переспрямованим на %q</strong>. "
+"Правило переспрямовування є <em>односпрямованим</em>, тобто, спрямовування "
+"від LAN до WAN <em>не</em> означає, що є також дозвіл спрямовувати від WAN "
+"до LAN."
 
 msgid ""
 "This page allows you to change advanced properties of the port forwarding "
 "entry. In most cases there is no need to modify those settings."
 msgstr ""
-"На цій сторінці можна змінити додаткові властивості елемента спрямовування "
-"поÑ\80Ñ\82Ñ\96в. Ð£ Ð±Ñ\96лÑ\8cÑ\88оÑ\81Ñ\82Ñ\96 Ð²Ð¸Ð¿Ð°Ð´ÐºÑ\96в Ð·Ð¼Ñ\96нÑ\8eваÑ\82и Ñ\86Ñ\96 Ð¿Ð°Ñ\80амеÑ\82Ñ\80и Ð½ÐµÐ¼Ð°Ñ\94 Ð½ÐµÐ¾Ð±Ñ\85Ñ\96дноÑ\81Ñ\82Ñ\96."
+"На цій сторінці можна змінити додаткові властивості елемента переспрямовування "
+"поÑ\80Ñ\82Ñ\96в. Ð£ Ð±Ñ\96лÑ\8cÑ\88оÑ\81Ñ\82Ñ\96 Ð²Ð¸Ð¿Ð°Ð´ÐºÑ\96в Ð·Ð¼Ñ\96нÑ\8eваÑ\82и Ñ\86Ñ\96 Ð¿Ð°Ñ\80амеÑ\82Ñ\80и Ð½ÐµÐ¼Ð°Ñ\94 Ð¿Ð¾Ñ\82Ñ\80еби."
 
 msgid ""
 "This page allows you to change advanced properties of the traffic rule "
@@ -476,7 +482,6 @@ msgstr ""
 "На цій сторінці можна змінити додаткові властивості елемента правил трафіка, "
 "таких як відповідні параметри джерела та вузлів призначення."
 
-#, fuzzy
 msgid ""
 "This section defines common properties of %q. The <em>input</em> and "
 "<em>output</em> options set the default policies for traffic entering and "
@@ -486,15 +491,15 @@ msgid ""
 msgstr ""
 "Цей розділ визначає загальні властивості %q. Параметри <em>вхідний</em> і "
 "<em>вихідний</em> задають типову політику для трафіку на вході й виході з "
-"цієї зони, а параметр \"спрямовування\" описує політику спрямовування "
-"Ñ\82Ñ\80аÑ\84Ñ\96кÑ\83 Ð¼Ñ\96ж Ñ\80Ñ\96зними Ð¼ÐµÑ\80ежами Ð² Ð¼ÐµÐ¶Ð°Ñ\85 Ð·Ð¾Ð½Ð¸. Ð\9fÑ\83нкÑ\82 <em>вкриті мережі</em> "
+"цієї зони, а параметр \"переспрямовування\" описує політику спрямовування "
+"Ñ\82Ñ\80аÑ\84Ñ\96кÑ\83 Ð¼Ñ\96ж Ñ\80Ñ\96зними Ð¼ÐµÑ\80ежами Ð² Ð¼ÐµÐ¶Ð°Ñ\85 Ð·Ð¾Ð½Ð¸. Ð\9fÑ\83нкÑ\82 <em>Ð\9fокриті мережі</em> "
 "визначає, які доступні мережі є членами цієї зони."
 
 msgid "Thursday"
-msgstr ""
+msgstr "Четвер"
 
 msgid "Time in UTC"
-msgstr ""
+msgstr "Час в UTC"
 
 msgid "To %s at %s on <var>this device</var>"
 msgstr "%s на %s <var>цього пристрою</var>"
@@ -527,7 +532,7 @@ msgstr ""
 "порти WAN на маршрутизаторі."
 
 msgid "Tuesday"
-msgstr ""
+msgstr "Вівторок"
 
 msgid "Via %s"
 msgstr "Через %s"
@@ -536,10 +541,10 @@ msgid "Via %s at %s"
 msgstr "Через %s на %s"
 
 msgid "Wednesday"
-msgstr ""
+msgstr "Середа"
 
 msgid "Week Days"
-msgstr ""
+msgstr "Дні тижня"
 
 msgid ""
 "You may specify multiple by selecting \"-- custom --\" and then entering "
@@ -552,7 +557,7 @@ msgid "Zone %q"
 msgstr "Зона %q"
 
 msgid "Zone ⇒ Forwardings"
-msgstr "Ð\97она â\87\92 Ð¡прямовування"
+msgstr "Ð\97она â\87\92 Ð\9fеÑ\80еÑ\81прямовування"
 
 msgid "Zones"
 msgstr "Зони"
@@ -573,7 +578,7 @@ msgid "any zone"
 msgstr "будь-якій зоні"
 
 msgid "day"
-msgstr ""
+msgstr "день"
 
 msgid "don't track"
 msgstr "не відстеж."
@@ -582,31 +587,31 @@ msgid "drop"
 msgstr "опускати"
 
 msgid "hour"
-msgstr ""
+msgstr "година"
 
 msgid "minute"
-msgstr ""
+msgstr "хвилина"
 
 msgid "not"
-msgstr ""
+msgstr "не"
 
 msgid "port"
-msgstr ""
+msgstr "порт"
 
 msgid "ports"
-msgstr ""
+msgstr "порти"
 
 msgid "reject"
 msgstr "відкидати"
 
 msgid "second"
-msgstr ""
+msgstr "секунда"
 
 msgid "traffic"
-msgstr ""
+msgstr "трафік"
 
 msgid "type"
-msgstr ""
+msgstr "типом"
 
 msgid "types"
-msgstr ""
+msgstr "типами"
index bd33afcd0997fd76f74ec129bbd0d47cb5ef9c52..0eba33f760cd6cb51949b6397e727ba7e94cf93e 100644 (file)
@@ -306,6 +306,9 @@ msgstr ""
 msgid "Output"
 msgstr "Output"
 
+msgid "Output zone"
+msgstr ""
+
 msgid "Passes additional arguments to iptables. Use with care!"
 msgstr ""
 
index 46da547c0893d42bf7844620ba6a3d7d40254979..8c1424cf06d3238cbecec8b94ace7572c884e0fd 100644 (file)
@@ -179,7 +179,7 @@ msgid "General Settings"
 msgstr "基本设置"
 
 msgid "Hardware flow offloading"
-msgstr "硬件æµ\81é\87\8få\8d¸载"
+msgstr "硬件æµ\81é\87\8få\88\86载"
 
 msgid "IP"
 msgstr "IP"
@@ -301,6 +301,9 @@ msgstr "其它..."
 msgid "Output"
 msgstr "出站数据"
 
+msgid "Output zone"
+msgstr ""
+
 msgid "Passes additional arguments to iptables. Use with care!"
 msgstr "传递到 iptables 的额外参数。小心使用!"
 
@@ -359,7 +362,7 @@ msgid "Rewrite to source %s, %s"
 msgstr "源地址改写成 %s, %s"
 
 msgid "Routing/NAT Offloading"
-msgstr "Routing/NAT å\8d¸载"
+msgstr "Routing/NAT å\88\86载"
 
 msgid "Rule is disabled"
 msgstr "规则已禁用"
@@ -377,10 +380,10 @@ msgid "Saturday"
 msgstr "星期六"
 
 msgid "Software based offloading for routing/NAT"
-msgstr "å\9fºäº\8e软件ç\9a\84 Routing/NAT å\8d¸载"
+msgstr "å\9fºäº\8e软件ç\9a\84 Routing/NAT å\88\86载"
 
 msgid "Software flow offloading"
-msgstr "软件æµ\81é\87\8få\8d¸载"
+msgstr "软件æµ\81é\87\8få\88\86载"
 
 msgid "Source IP address"
 msgstr "源 IP 地址"
index 1fbe970ddb97479df9c124ef9b6b795c4e5ecd32..93af452d0569d7c8aca78ded92fd8baaf684bded 100644 (file)
@@ -301,6 +301,9 @@ msgstr "其它..."
 msgid "Output"
 msgstr "出站資料"
 
+msgid "Output zone"
+msgstr ""
+
 msgid "Passes additional arguments to iptables. Use with care!"
 msgstr "傳遞到 iptables 的額外引數。小心使用!"
 
index c7fe63f87bdcf1c5d2439cb8593633a8bb17af94..8557f2b82107fe8960661ec71fac50f2b3253207 100644 (file)
@@ -18,7 +18,7 @@ module("luci.controller.lxc", package.seeall)
 
 local uci  = require "luci.model.uci".cursor()
 local util = require "luci.util"
-local fs   = require "nixio"
+local nx   = require "nixio"
 
 function index()
        if not nixio.fs.access("/etc/config/lxc") then
@@ -60,8 +60,8 @@ end
 function lxc_create(lxc_name, lxc_template)
        luci.http.prepare_content("text/plain")
 
-       local check = lxc_get_config_path()
-       if not check then
+       local path = lxc_get_config_path()
+       if not path then
                return
        end
 
@@ -80,6 +80,10 @@ function lxc_create(lxc_name, lxc_template)
                        ssl_status
                }
        }), src_err)
+
+       while (nx.fs.access(path .. lxc_name .. "/partial")) do
+               nx.nanosleep(1)
+       end
 end
 
 function lxc_action(lxc_action, lxc_name)
@@ -96,7 +100,7 @@ function lxc_get_config_path()
 
        local ret = content:match('^%s*lxc.lxcpath%s*=%s*([^%s]*)')
        if ret then
-               if nixio.fs.access(ret) then
+               if nx.fs.access(ret) then
                        local min_space = tonumber(uci:get("lxc", "lxc", "min_space")) or 100000
                        local free_space = tonumber(util.exec("df " ..ret.. " | awk '{if(NR==2)print $4}'"))
                        if free_space and free_space >= min_space then
@@ -150,7 +154,7 @@ function lxc_configuration_set(lxc_name)
 end
 
 function lxc_get_arch_target()
-       local target = fs.uname().machine
+       local target = nx.uname().machine
        local target_map = {
                armv5  = "armel",
                armv6  = "armel",
index a68143b796318c53cba397e846224f5f134e6417..b45e27f51f3fd514fa625a062bac5dd0a62470ed 100644 (file)
@@ -15,8 +15,8 @@ Author: Petar Koretic <petar.koretic@sartura.hr>
 -%>
 
 <%-
-local fs     = require "nixio"
-local target = fs.uname().machine
+local nx     = require "nixio"
+local target = nx.uname().machine
 -%>
 
 <fieldset class="cbi-section">
@@ -36,7 +36,7 @@ local target = fs.uname().machine
        <span id="lxc-list-output"></span>
 </fieldset>
 
-<hr/>
+<hr />
 <fieldset class="cbi-section">
        <legend><%:Create New Container%></legend>
        <div class="cbi-section-node">
@@ -46,11 +46,11 @@ local target = fs.uname().machine
                                <div class="th cbi-section-table-cell"><%:Template%></div>
                                <div class="th cbi-section-table-cell"><%:Actions%></div>
                        </div>
-                       <div class="tr cbi-section-table-row" id="div_holder">
+                       <div class="tr cbi-section-table-row" id="div_create">
                                <div class="td"><input class="cbi-input-text" type="text" id="tx_name" placeholder="<%:Enter new name%>" value='' /></div>
                                <div class="td"><select id="s_template" class="cbi-input-select cbi-button"></select></div>
                                <div class="td">
-                                       <input type="button" id="bt_create" value="<%:Create%>" onclick="lxc_create(div_holder)" class="cbi-button cbi-button-add" />
+                                       <input type="button" id="bt_create" value="<%:Create%>" onclick="lxc_create()" class="cbi-button cbi-button-add" />
                                        <span id="lxc-add-loader" style="display:inline-block; width:16px; height:16px; margin:0 5px"></span>
                                </div>
                        </div>
@@ -62,25 +62,29 @@ local target = fs.uname().machine
        <span id="lxc-add-output"></span>
 </fieldset>
 
-<hr/>
+<hr />
 
 <script type="text/javascript" src="<%=resource%>/cbi.js"></script>
 <script type="text/javascript">
 //<![CDATA[
-       window.img    = { "red" : "<%=resource%>/cbi/red.gif", "green" : "<%=resource%>/cbi/green.gif", "purple" : "<%=resource%>/cbi/purple.gif" }
-       window.states = { "STOPPED" : "red", "RUNNING" : "green", "FROZEN" : "purple" }
+       window.img    = { "red" : "<%=resource%>/cbi/red.gif", "green" : "<%=resource%>/cbi/green.gif", "purple" : "<%=resource%>/cbi/purple.gif" };
+       window.states = { "STOPPED" : "red", "RUNNING" : "green", "FROZEN" : "purple" };
 
        var t_lxc_list  = document.getElementById('t_lxc_list');
        var loader_html = '<img src="<%=resource%>/icons/loading.gif" alt="<%:Loading%>" width="16" height="16" style="vertical-align:middle" />';
-       var output_list = document.getElementById("lxc-list-output")
-       var output_add  = document.getElementById("lxc-add-output")
-       var loader_add  = document.getElementById("lxc-add-loader")
+       var output_list = document.getElementById("lxc-list-output");
+       var output_add  = document.getElementById("lxc-add-output");
+       var loader_add  = document.getElementById("lxc-add-loader");
+       var div_create  = document.getElementById("div_create");
+       var bt_create   = div_create.querySelector("#bt_create");
 
-       function lxc_create(div)
+       bt_create.disabled = true;
+       info_message(output_add, "Template download in progress, please be patient!");
+
+       function lxc_create()
        {
-               var lxc_name     = div.querySelector("#tx_name").value.replace(/[\s!@#$%^&*()+=\[\]{};':"\\|,<>\/?]/g,'');
-               var lxc_template = div.querySelector("#s_template").value;
-               var bt_create    = div.querySelector("#bt_create");
+               var lxc_name     = div_create.querySelector("#tx_name").value.replace(/[\s!@#$%^&*()+=\[\]{};':"\\|,<>\/?]/g,'');
+               var lxc_template = div_create.querySelector("#s_template").value;
 
                if (t_lxc_list.querySelector("[data-id='" + lxc_name + "']") != null)
                {
@@ -155,7 +159,7 @@ local target = fs.uname().machine
                var div3 = document.createElement("div");
                div3.className = "td";
                div3.style.width = "50%";
-               div3.innerHTML = actions
+               div3.innerHTML = actions;
 
                document.getElementById("t_lxc_list").appendChild(div0);
                div0.appendChild(div1);
@@ -209,8 +213,8 @@ local target = fs.uname().machine
                }
                else if (action == "destroy")
                {
-                       var div = self.parentNode.parentNode
-                       var img = div.querySelector('img')
+                       var div = self.parentNode.parentNode;
+                       var img = div.querySelector('img');
 
                        if (img.getAttribute('src') != window.img["red"])
                        {
@@ -434,7 +438,7 @@ local target = fs.uname().machine
                }
                else
                {
-                       setTimeout(function() { elem.innerHTML = ''}, 1000);
+                       setTimeout(function() { elem.innerHTML = ''}, 2000);
                }
        }
 
@@ -466,10 +470,6 @@ local target = fs.uname().machine
                }
        }
 
-       lxc_list_update();
-
-       info_message(output_add, "Template download in progress, please be patient!");
-
        new XHR().get('<%=luci.dispatcher.build_url("admin", "services")%>/lxc_get_downloadable', null,
        function(x, data)
        {
@@ -489,7 +489,6 @@ local target = fs.uname().machine
                        return set_no_template();
                }
 
-               bt_create.disabled = false;
                var select = document.getElementById("s_template");
                for(var key in data)
                {
@@ -498,7 +497,11 @@ local target = fs.uname().machine
                        option.text = data[key].replace(/[_:]/g, ' ');
                        select.add(option, -1);
                }
+
                info_message(output_add, "");
+               bt_create.disabled = false;
        })
+
+       lxc_list_update();
 //]]>
 </script>
index 4a92c7abd90f98a3dd48ce0b07c6244025d3b185..13773ef1e1f31c61e202c2f07c4f1b3f5d2a689a 100644 (file)
@@ -42,7 +42,7 @@ msgid "Check IP rules"
 msgstr "检查 IP 规则"
 
 msgid "Check link quality"
-msgstr ""
+msgstr "检查连接数量"
 
 msgid "Check routing table"
 msgstr "检查路由表"
@@ -57,7 +57,7 @@ msgid "Destination port"
 msgstr "目标端口"
 
 msgid "Detail"
-msgstr ""
+msgstr "详细"
 
 msgid "Diagnostics"
 msgstr "诊断"
@@ -76,7 +76,7 @@ msgid "Enter value in hex, starting with <code>0x</code>"
 msgstr "输入十六进制值,以 <code>0x</code> 开头"
 
 msgid "Execute"
-msgstr ""
+msgstr "执行"
 
 msgid "Expect interface state on up event"
 msgstr "在 up 事件发生时的预期接口状态"
@@ -103,7 +103,7 @@ msgid "Hotplug ifup"
 msgstr "Hotplug ifup"
 
 msgid "INFO: MWAN not running"
-msgstr ""
+msgstr "信息:MWAN 没有运行"
 
 msgid "IPset"
 msgstr "IPset"
@@ -154,28 +154,28 @@ msgid "Local source interface"
 msgstr "本地源接口"
 
 msgid "MWAN - Globals"
-msgstr ""
+msgstr "MWAN - 全局"
 
 msgid "MWAN - Interfaces"
-msgstr ""
+msgstr "MWAN - 接口"
 
 msgid "MWAN - Members"
-msgstr ""
+msgstr "MWAN - 成员"
 
 msgid "MWAN - Notification"
-msgstr ""
+msgstr "MWAN - 通知"
 
 msgid "MWAN - Policies"
-msgstr ""
+msgstr "MWAN - 策略"
 
 msgid "MWAN - Rules"
-msgstr ""
+msgstr "MWAN - 规则"
 
 msgid "MWAN Interface Configuration - %s"
 msgstr "MWAN 接口配置 - %s"
 
 msgid "MWAN Interfaces"
-msgstr ""
+msgstr "MWAN 接口"
 
 msgid "MWAN Member Configuration - %s"
 msgstr "MWAN 成员配置 - %s"
@@ -187,13 +187,13 @@ msgid "MWAN Rule Configuration - %s"
 msgstr "MWAN 规则配置 - %s"
 
 msgid "MWAN Status - Detail"
-msgstr ""
+msgstr "MWAN Status - 详细"
 
 msgid "MWAN Status - Diagnostics"
-msgstr ""
+msgstr "MWAN Status - 诊断"
 
 msgid "MWAN Status - Troubleshooting"
-msgstr ""
+msgstr "MWAN Status - 故障排除"
 
 msgid ""
 "MWAN supports up to 252 physical and/or logical interfaces<br />MWAN "
@@ -209,10 +209,10 @@ msgstr ""
 "口不应该与成员、策略、规则中的任意一个设置项使用相同的名称"
 
 msgid "Max packet latency [ms]"
-msgstr ""
+msgstr "最大数据包延迟 [ms]"
 
 msgid "Max packet loss [%]"
-msgstr ""
+msgstr "最大数据包丢失率 [%]"
 
 msgid ""
 "May be entered as a single or multiple port(s) (eg \"22\" or \"80,443\") or "
@@ -246,10 +246,10 @@ msgid "Metric"
 msgstr "跃点数"
 
 msgid "Min packet latency [ms]"
-msgstr ""
+msgstr "最小数据包延迟 [ms]"
 
 msgid "Min packet loss [%]"
-msgstr ""
+msgstr "最小数据包丢失率 [%]"
 
 msgid ""
 "Name of IPset rule. Requires IPset rule in /etc/dnsmasq.conf (eg \"ipset=/"
@@ -265,7 +265,7 @@ msgid "No MWAN interfaces found"
 msgstr "没有找到 MWAN 接口"
 
 msgid "Notification"
-msgstr ""
+msgstr "通知"
 
 msgid "Offline"
 msgstr "离线"
@@ -312,7 +312,7 @@ msgstr ""
 "“策略”把成员进行分组,告诉 MWAN 如何分配“规则”中使用这一策略的流量<br />拥有"
 "较低跃点数的成员将会被优先使用。拥有相同跃点数的成员把流量进行负载均衡。<br /"
 ">进行负载均衡的成员之间拥有较高比重的成员将会被分配到更多流量。<br />名称允许"
-"包括A-Z、a-z、0-9、_ 但是不能有空格。名称应该在 15 个字符以内<br />策略不应该"
+"包括 A-Z、a-z、0-9、_ 但是不能有空格。名称应该在 15 个字符以内<br />策略不应该"
 "与接口、成员、规则中的任意一个设置项使用相同的名称"
 
 msgid "Policy"
@@ -344,6 +344,11 @@ msgid ""
 "z, 0-9, _ and no spaces<br />Rules may not share the same name as configured "
 "interfaces, members or policies"
 msgstr ""
+"规则指定哪些流量将使用特定的 MWAN 策略<br />规则基于 IP 地址,端口或协议<br />"
+"规则从上到下匹配<br />匹配规则以下的规则被忽略<br />不符合任何规则的流量将使用主路由表进"
+"行路由<br />目的地为已知(非默认)网络的流量由主路由表处理<br />流量符合规则,但该策略的"
+"所有 WAN 接口关闭后都会被失效<br />名称可包含字符 A-Z,a-z,0-9,_和空格<br />"
+"规则不能与配置的接口、成员或策略共享相同的名称"
 
 msgid "Seconds. Acceptable values: 1-1000000. Defaults to 600 if not set"
 msgstr "单位为秒。接受的值:1-1000000。留空则使用默认值 600 秒"
@@ -364,7 +369,7 @@ msgid "Supports CIDR notation (eg \"192.168.100.0/24\") without quotes"
 msgstr "支持 CIDR 记法(例如:\"192.168.100.0/24\")不含引号"
 
 msgid "Task"
-msgstr ""
+msgstr "任务"
 
 msgid "There are currently %d of %d supported interfaces configured"
 msgstr "当前已配置 %d 个接口,最大支持 %d 个"
@@ -395,6 +400,14 @@ msgid ""
 "Physical device name which interface went up or down (e.g. \"eth0\" or "
 "\"wwan0\")<br /><br />"
 msgstr ""
+"这里允许您修改“/etc/mwan3.user”的内容。<br />该文件在 sysupgrade 期间也会"
+"保留。<br /><br />注意:<br />该文件会作为 shell 脚本解释。<br />脚本的第"
+"一行必须是 &#34;#!/bin/sh&#34;,不带引号。<br />以 # 开头的行是注释,不会执"
+"行。<br />将您的自定义 mwan3 动作放在这里,他们将<br />在启用 mwan3 的接口"
+"上<br />在 netifd hotplug 接口事件时执行。<br /><br />有三个主要的环境变量"
+"传递给这个脚本。<br /><br />$ACTION “ifup” 或 “ifdown”<br />$INTERFACE 启动"
+"或停止的接口名(例如 “wan” 或 “wwan”)<br />$DEVICE 启动或停止接口的物理设备"
+"名(例如 “eth0” 或 “wwan0”)<br /><br />"
 
 msgid "Tracking hostname or IP address"
 msgstr "跟踪的主机或 IP 地址"
@@ -421,35 +434,37 @@ msgid ""
 msgstr "使用该接口的 IP 地址作为路由器本身发起的流量的源 IP 地址"
 
 msgid "View the content of /etc/protocols for protocol description"
-msgstr ""
+msgstr "查看协议描述的 /etc/protocols 的内容"
 
 msgid "WARNING: %d interfaces are configured exceeding the maximum of %d!"
 msgstr "警告:已配置 %d 个接口,超过最大值 %d!"
 
 msgid "WARNING: Interface %s are not found in /etc/config/network"
-msgstr ""
+msgstr "警告:接口 %s 在 /etc/config/network 中未找到"
 
 msgid "WARNING: Interface %s has a duplicate metric %s configured"
-msgstr ""
+msgstr "警告:接口 %s 的 metric %s 配置重复"
 
 msgid ""
 "WARNING: Interface %s has a higher reliability requirement than tracking "
 "hosts (%d)"
 msgstr ""
+"警告:接口 %s 比跟踪主机具有更高的可靠性要求(%d)"
 
 msgid "WARNING: Interface %s has no default route in the main routing table"
-msgstr ""
+msgstr "警告:接口 %s 在主路由表中没有默认的路由"
 
 msgid "WARNING: Policy %s has exceeding the maximum name of 15 characters"
-msgstr ""
+msgstr "警告:策略 %s 名称超过 15 个字符"
 
 msgid ""
 "WARNING: Rule %s have a port configured with no or improper protocol "
 "specified!"
 msgstr ""
+"警告:规则 %s 有一个端口配置没有指定或协议不正确!"
 
 msgid "Waiting for command to complete..."
-msgstr ""
+msgstr "正在等待命令完成..."
 
 msgid "Weight"
 msgstr "比重"
index 0a1961916cb1388da46393b2abb73573d456682d..a7f999d8764dc7ab592b7d68e590a1d7367040ff 100644 (file)
@@ -465,31 +465,16 @@ function cbi_d_add(field, dep, index) {
 }
 
 function cbi_d_checkvalue(target, ref) {
-       var t = document.getElementById(target);
-       var value;
+       var value = null,
+           query = 'input[id="'+target+'"], input[name="'+target+'"], ' +
+                   'select[id="'+target+'"], select[name="'+target+'"]';
 
-       if (!t) {
-               var tl = document.getElementsByName(target);
-
-               if( tl.length > 0 && (tl[0].type == 'radio' || tl[0].type == 'checkbox'))
-                       for( var i = 0; i < tl.length; i++ )
-                               if( tl[i].checked ) {
-                                       value = tl[i].value;
-                                       break;
-                               }
-
-               value = value ? value : "";
-       } else if (!t.value) {
-               value = "";
-       } else {
-               value = t.value;
-
-               if (t.type == "checkbox") {
-                       value = t.checked ? value : "";
-               }
-       }
+       document.querySelectorAll(query).forEach(function(i) {
+               if (value === null && ((i.type !== 'radio' && i.type !== 'checkbox') || i.checked === true))
+                       value = i.value;
+       });
 
-       return (value == ref)
+       return (((value !== null) ? value : "") == ref);
 }
 
 function cbi_d_check(deps) {
@@ -634,6 +619,10 @@ function cbi_init() {
                                   node.getAttribute('data-type'));
        }
 
+       document.querySelectorAll('.cbi-dropdown').forEach(function(s) {
+                cbi_dropdown_init(s);
+       });
+
        cbi_d_update();
 }
 
@@ -1574,3 +1563,484 @@ function E()
 
        return elem;
 }
+
+if (typeof(window.CustomEvent) !== 'function') {
+       function CustomEvent(event, params) {
+               params = params || { bubbles: false, cancelable: false, detail: undefined };
+               var evt = document.createEvent('CustomEvent');
+                   evt.initCustomEvent( event, params.bubbles, params.cancelable, params.detail );
+               return evt;
+       }
+
+       CustomEvent.prototype = window.Event.prototype;
+       window.CustomEvent = CustomEvent;
+}
+
+CBIDropdown = {
+       openDropdown: function(sb) {
+               var st = window.getComputedStyle(sb, null),
+                   ul = sb.querySelector('ul'),
+                   li = ul.querySelectorAll('li'),
+                   sel = ul.querySelector('[selected]'),
+                   rect = sb.getBoundingClientRect(),
+                   h = sb.clientHeight - parseFloat(st.paddingTop) - parseFloat(st.paddingBottom),
+                   mh = this.dropdown_items * h,
+                   eh = Math.min(mh, li.length * h);
+
+               document.querySelectorAll('.cbi-dropdown[open]').forEach(function(s) {
+                       s.dispatchEvent(new CustomEvent('cbi-dropdown-close', {}));
+               });
+
+               ul.style.maxHeight = mh + 'px';
+               sb.setAttribute('open', '');
+
+               ul.scrollTop = sel ? Math.max(sel.offsetTop - sel.offsetHeight, 0) : 0;
+               ul.querySelectorAll('[selected] input[type="checkbox"]').forEach(function(c) {
+                       c.checked = true;
+               });
+
+               ul.style.top = ul.style.bottom = '';
+               ul.style[((sb.getBoundingClientRect().top + eh) > window.innerHeight) ? 'bottom' : 'top'] = rect.height + 'px';
+               ul.classList.add('dropdown');
+
+               var pv = ul.cloneNode(true);
+                   pv.classList.remove('dropdown');
+                   pv.classList.add('preview');
+
+               sb.insertBefore(pv, ul.nextElementSibling);
+
+               li.forEach(function(l) {
+                       l.setAttribute('tabindex', 0);
+               });
+
+               sb.lastElementChild.setAttribute('tabindex', 0);
+
+               this.setFocus(sb, sel || li[0], true);
+       },
+
+       closeDropdown: function(sb, no_focus) {
+               if (!sb.hasAttribute('open'))
+                       return;
+
+               var pv = sb.querySelector('ul.preview'),
+                   ul = sb.querySelector('ul.dropdown'),
+                   li = ul.querySelectorAll('li');
+
+               li.forEach(function(l) { l.removeAttribute('tabindex'); });
+               sb.lastElementChild.removeAttribute('tabindex');
+
+               sb.removeChild(pv);
+               sb.removeAttribute('open');
+               sb.style.width = sb.style.height = '';
+
+               ul.classList.remove('dropdown');
+
+               if (!no_focus)
+                       this.setFocus(sb, sb);
+
+               this.saveValues(sb, ul);
+       },
+
+       toggleItem: function(sb, li, force_state) {
+               if (li.hasAttribute('unselectable'))
+                       return;
+
+               if (this.multi) {
+                       var cbox = li.querySelector('input[type="checkbox"]'),
+                           items = li.parentNode.querySelectorAll('li'),
+                           label = sb.querySelector('ul.preview'),
+                           sel = li.parentNode.querySelectorAll('[selected]').length,
+                           more = sb.querySelector('.more'),
+                           ndisplay = this.display_items,
+                           n = 0;
+
+                       if (li.hasAttribute('selected')) {
+                               if (force_state !== true) {
+                                       if (sel > 1 || this.optional) {
+                                               li.removeAttribute('selected');
+                                               cbox.checked = cbox.disabled = false;
+                                               sel--;
+                                       }
+                                       else {
+                                               cbox.disabled = true;
+                                       }
+                               }
+                       }
+                       else {
+                               if (force_state !== false) {
+                                       li.setAttribute('selected', '');
+                                       cbox.checked = true;
+                                       cbox.disabled = false;
+                                       sel++;
+                               }
+                       }
+
+                       while (label.firstElementChild)
+                               label.removeChild(label.firstElementChild);
+
+                       for (var i = 0; i < items.length; i++) {
+                               items[i].removeAttribute('display');
+                               if (items[i].hasAttribute('selected')) {
+                                       if (ndisplay-- > 0) {
+                                               items[i].setAttribute('display', n++);
+                                               label.appendChild(items[i].cloneNode(true));
+                                       }
+                                       var c = items[i].querySelector('input[type="checkbox"]');
+                                       if (c)
+                                               c.disabled = (sel == 1 && !this.optional);
+                               }
+                       }
+
+                       if (ndisplay < 0)
+                               sb.setAttribute('more', '');
+                       else
+                               sb.removeAttribute('more');
+
+                       if (ndisplay === this.display_items)
+                               sb.setAttribute('empty', '');
+                       else
+                               sb.removeAttribute('empty');
+
+                       more.innerHTML = (ndisplay === this.display_items) ? this.placeholder : '···';
+               }
+               else {
+                       var sel = li.parentNode.querySelector('[selected]');
+                       if (sel) {
+                               sel.removeAttribute('display');
+                               sel.removeAttribute('selected');
+                       }
+
+                       li.setAttribute('display', 0);
+                       li.setAttribute('selected', '');
+
+                       this.closeDropdown(sb, true);
+               }
+
+               this.saveValues(sb, li.parentNode);
+       },
+
+       transformItem: function(sb, li) {
+               var cbox = E('form', {}, E('input', { type: 'checkbox', tabindex: -1, onclick: 'event.preventDefault()' })),
+                   label = E('label');
+
+               while (li.firstChild)
+                       label.appendChild(li.firstChild);
+
+               li.appendChild(cbox);
+               li.appendChild(label);
+       },
+
+       saveValues: function(sb, ul) {
+               var sel = ul.querySelectorAll('[selected]'),
+                   div = sb.lastElementChild;
+
+               while (div.lastElementChild)
+                       div.removeChild(div.lastElementChild);
+
+               sel.forEach(function (s) {
+                       div.appendChild(E('input', {
+                               type: 'hidden',
+                               name: s.hasAttribute('name') ? s.getAttribute('name') : (sb.getAttribute('name') || ''),
+                               value: s.hasAttribute('value') ? s.getAttribute('value') : s.innerText
+                       }));
+               });
+
+               cbi_d_update();
+       },
+
+       setFocus: function(sb, elem, scroll) {
+               if (sb && sb.hasAttribute && sb.hasAttribute('locked-in'))
+                       return;
+
+               document.querySelectorAll('.focus').forEach(function(e) {
+                       if (e.nodeName.toLowerCase() !== 'input') {
+                               e.classList.remove('focus');
+                               e.blur();
+                       }
+               });
+
+               if (elem) {
+                       elem.focus();
+                       elem.classList.add('focus');
+
+                       if (scroll)
+                               elem.parentNode.scrollTop = elem.offsetTop - elem.parentNode.offsetTop;
+               }
+       },
+
+       createItems: function(sb, value) {
+               var sbox = this,
+                   val = (value || '').trim().split(/\s+/),
+                   ul = sb.querySelector('ul');
+
+               if (!sbox.multi)
+                       val.length = Math.min(val.length, 1);
+
+               val.forEach(function(item) {
+                       var new_item = null;
+
+                       ul.childNodes.forEach(function(li) {
+                               if (li.getAttribute && li.getAttribute('value') === item)
+                                       new_item = li;
+                       });
+
+                       if (!new_item) {
+                               var markup,
+                                   tpl = sb.querySelector(sbox.template);
+
+                               if (tpl)
+                                       markup = (tpl.textContent || tpl.innerHTML || tpl.firstChild.data).replace(/^<!--|-->$/, '').trim();
+                               else
+                                       markup = '<li value="{{value}}">{{value}}</li>';
+
+                               new_item = E(markup.replace(/{{value}}/g, item));
+
+                               if (sbox.multi) {
+                                       sbox.transformItem(sb, new_item);
+                               }
+                               else {
+                                       var old = ul.querySelector('li[created]');
+                                       if (old)
+                                               ul.removeChild(old);
+
+                                       new_item.setAttribute('created', '');
+                               }
+
+                               new_item = ul.insertBefore(new_item, ul.lastElementChild);
+                       }
+
+                       sbox.toggleItem(sb, new_item, true);
+                       sbox.setFocus(sb, new_item, true);
+               });
+       },
+
+       closeAllDropdowns: function() {
+               document.querySelectorAll('.cbi-dropdown[open]').forEach(function(s) {
+                       s.dispatchEvent(new CustomEvent('cbi-dropdown-close', {}));
+               });
+       },
+
+       findParent: function(node, selector) {
+               while (node)
+                       if (node.msMatchesSelector && node.msMatchesSelector(selector))
+                               return node;
+                       else if (node.matches && node.matches(selector))
+                               return node;
+                       else
+                               node = node.parentNode;
+
+               return null;
+       }
+};
+
+function cbi_dropdown_init(sb) {
+       if (!(this instanceof cbi_dropdown_init))
+               return new cbi_dropdown_init(sb);
+
+       this.multi = sb.hasAttribute('multiple');
+       this.optional = sb.hasAttribute('optional');
+       this.placeholder = sb.getAttribute('placeholder') || '---';
+       this.display_items = parseInt(sb.getAttribute('display-items') || 3);
+       this.dropdown_items = parseInt(sb.getAttribute('dropdown-items') || 5);
+       this.create = sb.getAttribute('item-create') || '.create-item-input';
+       this.template = sb.getAttribute('item-template') || 'script[type="item-template"]';
+
+       var sbox = this,
+           ul = sb.querySelector('ul'),
+           items = ul.querySelectorAll('li'),
+           more = sb.appendChild(E('span', { class: 'more', tabindex: -1 }, '···')),
+           open = sb.appendChild(E('span', { class: 'open', tabindex: -1 }, '▾')),
+           canary = sb.appendChild(E('div')),
+           create = sb.querySelector(this.create),
+           ndisplay = this.display_items,
+           n = 0;
+
+       if (this.multi) {
+               for (var i = 0; i < items.length; i++) {
+                       sbox.transformItem(sb, items[i]);
+
+                       if (items[i].hasAttribute('selected') && ndisplay-- > 0)
+                               items[i].setAttribute('display', n++);
+               }
+       }
+       else {
+               var sel = sb.querySelectorAll('[selected]');
+
+               sel.forEach(function(s) {
+                       s.removeAttribute('selected');
+               });
+
+               var s = sel[0] || items[0];
+               if (s) {
+                       s.setAttribute('selected', '');
+                       s.setAttribute('display', n++);
+               }
+
+               ndisplay--;
+
+               if (this.optional && !ul.querySelector('li[value=""]')) {
+                       var placeholder = E('li', { placeholder: '' }, this.placeholder);
+                       ul.firstChild ? ul.insertBefore(placeholder, ul.firstChild) : ul.appendChild(placeholder);
+               }
+       }
+
+       sbox.saveValues(sb, ul);
+
+       ul.setAttribute('tabindex', -1);
+       sb.setAttribute('tabindex', 0);
+
+       if (ndisplay < 0)
+               sb.setAttribute('more', '')
+       else
+               sb.removeAttribute('more');
+
+       if (ndisplay === this.display_items)
+               sb.setAttribute('empty', '')
+       else
+               sb.removeAttribute('empty');
+
+       more.innerHTML = (ndisplay === this.display_items) ? this.placeholder : '···';
+
+
+       sb.addEventListener('click', function(ev) {
+               if (!this.hasAttribute('open')) {
+                       if (ev.target.nodeName.toLowerCase() !== 'input')
+                               sbox.openDropdown(this);
+               }
+               else {
+                       var li = sbox.findParent(ev.target, 'li');
+                       if (li && li.parentNode.classList.contains('dropdown'))
+                               sbox.toggleItem(this, li);
+               }
+
+               ev.preventDefault();
+               ev.stopPropagation();
+       });
+
+       sb.addEventListener('keydown', function(ev) {
+               if (ev.target.nodeName.toLowerCase() === 'input')
+                       return;
+
+               if (!this.hasAttribute('open')) {
+                       switch (ev.keyCode) {
+                       case 37:
+                       case 38:
+                       case 39:
+                       case 40:
+                               sbox.openDropdown(this);
+                               ev.preventDefault();
+                       }
+               }
+               else
+               {
+                       var active = sbox.findParent(document.activeElement, 'li');
+
+                       switch (ev.keyCode) {
+                       case 27:
+                               sbox.closeDropdown(this);
+                               break;
+
+                       case 13:
+                               if (active) {
+                                       if (!active.hasAttribute('selected'))
+                                               sbox.toggleItem(this, active);
+                                       sbox.closeDropdown(this);
+                                       ev.preventDefault();
+                               }
+                               break;
+
+                       case 32:
+                               if (active) {
+                                       sbox.toggleItem(this, active);
+                                       ev.preventDefault();
+                               }
+                               break;
+
+                       case 38:
+                               if (active && active.previousElementSibling) {
+                                       sbox.setFocus(this, active.previousElementSibling);
+                                       ev.preventDefault();
+                               }
+                               break;
+
+                       case 40:
+                               if (active && active.nextElementSibling) {
+                                       sbox.setFocus(this, active.nextElementSibling);
+                                       ev.preventDefault();
+                               }
+                               break;
+                       }
+               }
+       });
+
+       sb.addEventListener('cbi-dropdown-close', function(ev) {
+               sbox.closeDropdown(this, true);
+       });
+
+       if ('ontouchstart' in window) {
+               sb.addEventListener('touchstart', function(ev) { ev.stopPropagation(); });
+               window.addEventListener('touchstart', sbox.closeAllDropdowns);
+       }
+       else {
+               sb.addEventListener('mouseover', function(ev) {
+                       if (!this.hasAttribute('open'))
+                               return;
+
+                       var li = sbox.findParent(ev.target, 'li');
+                       if (li) {
+                               if (li.parentNode.classList.contains('dropdown'))
+                                       sbox.setFocus(this, li);
+
+                               ev.stopPropagation();
+                       }
+               });
+
+               sb.addEventListener('focus', function(ev) {
+                       document.querySelectorAll('.cbi-dropdown[open]').forEach(function(s) {
+                               if (s !== this || this.hasAttribute('open'))
+                                       s.dispatchEvent(new CustomEvent('cbi-dropdown-close', {}));
+                       });
+               });
+
+               canary.addEventListener('focus', function(ev) {
+                       sbox.closeDropdown(this.parentNode);
+               });
+
+               window.addEventListener('mouseover', sbox.setFocus);
+               window.addEventListener('click', sbox.closeAllDropdowns);
+       }
+
+       if (create) {
+               create.addEventListener('keydown', function(ev) {
+                       switch (ev.keyCode) {
+                       case 13:
+                               sbox.createItems(sb, this.value);
+                               ev.preventDefault();
+                               this.value = '';
+                               this.blur();
+                               break;
+                       }
+               });
+
+               create.addEventListener('focus', function(ev) {
+                       var cbox = sbox.findParent(this, 'li').querySelector('input[type="checkbox"]');
+                       if (cbox) cbox.checked = true;
+                       sb.setAttribute('locked-in', '');
+               });
+
+               create.addEventListener('blur', function(ev) {
+                       var cbox = sbox.findParent(this, 'li').querySelector('input[type="checkbox"]');
+                       if (cbox) cbox.checked = false;
+                       sb.removeAttribute('locked-in');
+               });
+
+               var li = sbox.findParent(create, 'li');
+
+               li.setAttribute('unselectable', '');
+               li.addEventListener('click', function(ev) {
+                       this.querySelector(sbox.create).focus();
+               });
+       }
+}
+
+cbi_dropdown_init.prototype = CBIDropdown;
index 4728642118c5d3794a3b5f9d7f25389bcf5c8743..d275c5b27564366041a56fc3010b07d4a938e8dc 100644 (file)
@@ -1226,13 +1226,14 @@ function TypedSection.parse(self, novld)
                local stval = RESORT_PREFIX .. self.config .. "." .. self.sectiontype
                local order = self.map:formvalue(stval)
                if order and #order > 0 then
-                       local sid
-                       local num = 0
+                       local sids, sid = { }, nil
                        for sid in util.imatch(order) do
-                               self.map.uci:reorder(self.config, sid, num)
-                               num = num + 1
+                               sids[#sids+1] = sid
+                       end
+                       if #sids > 0 then
+                               self.map.uci:reorder(self.config, sids)
+                               self.changed = true
                        end
-                       self.changed = (num > 0)
                end
        end
 
@@ -1416,6 +1417,12 @@ function AbstractValue.parse(self, section, novld)
                        self:add_error(section, "invalid", val_err)
                end
 
+               if self.alias then
+                       self.section.aliased = self.section.aliased or {}
+                       self.section.aliased[section] = self.section.aliased[section] or {}
+                       self.section.aliased[section][self.alias] = true
+               end
+
                if fvalue and (self.forcewrite or not (fvalue == cvalue)) then
                        if self:write(section, fvalue) then
                                -- Push events
@@ -1425,10 +1432,16 @@ function AbstractValue.parse(self, section, novld)
                end
        else                                                    -- Unset the UCI or error
                if self.rmempty or self.optional then
-                       if self:remove(section) then
-                               -- Push events
-                               self.section.changed = true
-                               --luci.util.append(self.map.events, self.events)
+                       if not self.alias or
+                          not self.section.aliased or
+                          not self.section.aliased[section] or
+                          not self.section.aliased[section][self.alias]
+                       then
+                               if self:remove(section) then
+                                       -- Push events
+                                       self.section.changed = true
+                                       --luci.util.append(self.map.events, self.events)
+                               end
                        end
                elseif cvalue ~= fvalue and not novld then
                        -- trigger validator with nil value to get custom user error msg.
@@ -1454,7 +1467,7 @@ function AbstractValue.cfgvalue(self, section)
        if self.tag_error[section] then
                value = self:formvalue(section)
        else
-               value = self.map:get(section, self.option)
+               value = self.map:get(section, self.alias or self.option)
        end
 
        if not value then
@@ -1495,12 +1508,12 @@ AbstractValue.transform = AbstractValue.validate
 
 -- Write to UCI
 function AbstractValue.write(self, section, value)
-       return self.map:set(section, self.option, value)
+       return self.map:set(section, self.alias or self.option, value)
 end
 
 -- Remove from UCI
 function AbstractValue.remove(self, section)
-       return self.map:del(section, self.option)
+       return self.map:del(section, self.alias or self.option)
 end
 
 
@@ -1833,6 +1846,15 @@ function DynamicList.formvalue(self, section)
 end
 
 
+DropDown = class(MultiValue)
+
+function DropDown.__init__(self, ...)
+       ListValue.__init__(self, ...)
+       self.template = "cbi/dropdown"
+       self.delimiter = " "
+end
+
+
 --[[
 TextValue - A multi-line value
        rows:   Rows
index 2c58b0ab3d9220d76f7b0a1e7196b0da622949f6..6850d7e3a946ae55f58f7f2066221dee6be132a3 100644 (file)
@@ -358,7 +358,7 @@ function dispatch(request)
                        elseif key == "REQUEST_URI" then
                                return build_url(unpack(ctx.requestpath))
                        elseif key == "FULL_REQUEST_URI" then
-                               local url = { http.getenv("SCRIPT_NAME") or "" , http.getenv("PATH_INFO") }
+                               local url = { http.getenv("SCRIPT_NAME") or "", http.getenv("PATH_INFO") }
                                local query = http.getenv("QUERY_STRING")
                                if query and #query > 0 then
                                        url[#url+1] = "?"
@@ -507,10 +507,11 @@ function dispatch(request)
                else
                        ok, err = util.copcall(target, unpack(args))
                end
-               assert(ok,
-                      "Failed to execute " .. (type(c.target) == "function" and "function" or c.target.type or "unknown") ..
-                      " dispatcher target for entry '/" .. table.concat(request, "/") .. "'.\n" ..
-                      "The called action terminated with an exception:\n" .. tostring(err or "(unknown)"))
+               if not ok then
+                       error500("Failed to execute " .. (type(c.target) == "function" and "function" or c.target.type or "unknown") ..
+                                " dispatcher target for entry '/" .. table.concat(request, "/") .. "'.\n" ..
+                                "The called action terminated with an exception:\n" .. tostring(err or "(unknown)"))
+               end
        else
                local root = node()
                if not root or not root.target then
index 461ba9d5a38efae2c042829dce83d5aaeec13749..92c0d8f69998a19c61d3e1827dd3363b91900298 100644 (file)
@@ -8,7 +8,7 @@ local table = require "table"
 
 local setmetatable, rawget, rawset = setmetatable, rawget, rawset
 local require, getmetatable, assert = require, getmetatable, assert
-local error, pairs, ipairs = error, pairs, ipairs
+local error, pairs, ipairs, select = error, pairs, ipairs, select
 local type, tostring, tonumber, unpack = type, tostring, tonumber, unpack
 
 -- The typical workflow for UCI is:  Get a cursor instance from the
@@ -106,7 +106,7 @@ function changes(self, config)
                        local _, change
                        for _, change in ipairs(changes) do
                                local operation, section, option, value = unpack(change)
-                               if option and value and operation ~= "add" then
+                               if option and operation ~= "add" then
                                        res[package][section] = res[package][section] or { }
 
                                        if operation == "list-add" then
@@ -373,15 +373,15 @@ function add(self, config, stype)
        return self:section(config, stype)
 end
 
-function set(self, config, section, option, value)
-       if value == nil then
+function set(self, config, section, option, ...)
+       if select('#', ...) == 0 then
                local sname, err = self:section(config, option, section)
                return (not not sname), err
        else
                local _, err = call("set", {
                        config  = config,
                        section = section,
-                       values  = { [option] = value }
+                       values  = { [option] = select(1, ...) }
                })
                return (err == nil), ERRSTR[err]
        end
index ce42af2fb00509779d1ef5feb9c124eb083a91cc..10428b0b35f707d26b42ca492fa94bf94713991b 100644 (file)
@@ -100,6 +100,8 @@ end
 -- Scope manipulation routines
 --
 
+coxpt = setmetatable({}, { __mode = "kv" })
+
 local tl_meta = {
        __mode = "k",
 
@@ -697,73 +699,69 @@ function checklib(fullpathexe, wantedlib)
        return false
 end
 
+-------------------------------------------------------------------------------
+-- Coroutine safe xpcall and pcall versions
 --
--- Coroutine safe xpcall and pcall versions modified for Luci
--- original version:
--- coxpcall 1.13 - Copyright 2005 - Kepler Project (www.keplerproject.org)
+-- Encapsulates the protected calls with a coroutine based loop, so errors can
+-- be dealed without the usual Lua 5.x pcall/xpcall issues with coroutines
+-- yielding inside the call to pcall or xpcall.
 --
--- Copyright © 2005 Kepler Project.
--- Permission is hereby granted, free of charge, to any person obtaining a
--- copy of this software and associated documentation files (the "Software"),
--- to deal in the Software without restriction, including without limitation
--- the rights to use, copy, modify, merge, publish, distribute, sublicense,
--- and/or sell copies of the Software, and to permit persons to whom the
--- Software is furnished to do so, subject to the following conditions:
+-- Authors: Roberto Ierusalimschy and Andre Carregal
+-- Contributors: Thomas Harning Jr., Ignacio Burgueño, Fabio Mascarenhas
 --
--- The above copyright notice and this permission notice shall be
--- included in all copies or substantial portions of the Software.
+-- Copyright 2005 - Kepler Project
 --
--- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
--- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
--- OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
--- IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
--- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
--- TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
--- OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-local performResume, handleReturnValue
-local oldpcall, oldxpcall = pcall, xpcall
-coxpt = {}
-setmetatable(coxpt, {__mode = "kv"})
-
--- Identity function for copcall
-local function copcall_id(trace, ...)
-  return ...
-end
-
---                             values of either the function or the error handler
-function coxpcall(f, err, ...)
-       local res, co = oldpcall(coroutine.create, f)
-       if not res then
-               local params = {...}
-               local newf = function() return f(unpack(params)) end
-               co = coroutine.create(newf)
-       end
-       local c = coroutine.running()
-       coxpt[co] = coxpt[c] or c or 0
+-- $Id: coxpcall.lua,v 1.13 2008/05/19 19:20:02 mascarenhas Exp $
+-------------------------------------------------------------------------------
 
-       return performResume(err, co, ...)
-end
-
---                             values of the function or the error object
-function copcall(f, ...)
-       return coxpcall(f, copcall_id, ...)
-end
+-------------------------------------------------------------------------------
+-- Implements xpcall with coroutines
+-------------------------------------------------------------------------------
+local coromap = setmetatable({}, { __mode = "k" })
 
--- Handle return value of protected call
-function handleReturnValue(err, co, status, ...)
+local function handleReturnValue(err, co, status, ...)
        if not status then
                return false, err(debug.traceback(co, (...)), ...)
        end
-
-       if coroutine.status(co) ~= 'suspended' then
+       if coroutine.status(co) == 'suspended' then
+               return performResume(err, co, coroutine.yield(...))
+       else
                return true, ...
        end
-
-       return performResume(err, co, coroutine.yield(...))
 end
 
--- Resume execution of protected function call
 function performResume(err, co, ...)
        return handleReturnValue(err, co, coroutine.resume(co, ...))
 end
+
+local function id(trace, ...)
+       return trace
+end
+
+function coxpcall(f, err, ...)
+       local current = coroutine.running()
+       if not current then
+               if err == id then
+                       return pcall(f, ...)
+               else
+                       if select("#", ...) > 0 then
+                               local oldf, params = f, { ... }
+                               f = function() return oldf(unpack(params)) end
+                       end
+                       return xpcall(f, err)
+               end
+       else
+               local res, co = pcall(coroutine.create, f)
+               if not res then
+                       local newf = function(...) return f(...) end
+                       co = coroutine.create(newf)
+               end
+               coromap[co] = current
+               coxpt[co] = coxpt[current] or current or 0
+               return performResume(err, co, ...)
+       end
+end
+
+function copcall(f, ...)
+       return coxpcall(f, id, ...)
+end
index 543ef0b80ba9015a3de3d285c2f363cc96825aa3..702512f495dfc11b4a2cb3f66fd519861543697f 100644 (file)
@@ -1,59 +1,98 @@
 <% export("cbi_apply_widget", function(redirect_ok) -%>
 <style type="text/css">
-       #cbi_apply_status {
+       .alert-message.notice {
+               background: linear-gradient(#fff 0%, #eee 100%);
+       }
+
+       #cbi_apply_overlay {
+               position: absolute;
+               top: 0;
+               left: 0;
+               bottom: 0;
+               right: 0;
+               background: rgba(0, 0, 0, 0.7);
+               display: none;
+               z-index: 20000;
+       }
+
+       #cbi_apply_overlay .alert-message {
+               position: relative;
+               top: 10%;
+               width: 60%;
+               margin: auto;
                display: flex;
                flex-wrap: wrap;
                min-height: 32px;
                align-items: center;
-               margin: 1.5em 0 1.5em 0;
        }
 
-       #cbi_apply_status > h4,
-       #cbi_apply_status > p,
-       #cbi_apply_status > div {
+       #cbi_apply_overlay .alert-message > h4,
+       #cbi_apply_overlay .alert-message > p,
+       #cbi_apply_overlay .alert-message > div {
                flex-basis: 100%;
        }
 
-       #cbi_apply_status > img {
+       #cbi_apply_overlay .alert-message > img {
                margin-right: 1em;
                flex-basis: 32px;
        }
 
-       #cbi_apply_status + script + .cbi-section {
-               margin-top: -1em;
+       body.apply-overlay-active {
+               overflow: hidden;
+               height: 100vh;
        }
 
-       .alert-message.notice {
-               background: linear-gradient(#fff 0%, #eee 100%);
+       body.apply-overlay-active #cbi_apply_overlay {
+               display: block;
        }
 </style>
 
-<script type="text/javascript" src="<%=resource%>/cbi.js"></script>
+<script type="text/javascript" src="<%=resource%>/cbi.js?v=git-18.138.59467-72fe5dd"></script>
 <script type="text/javascript">//<![CDATA[
        var xhr = new XHR(),
-           stat, indicator,
            uci_apply_auth = { sid: '<%=luci.dispatcher.context.authsession%>', token: '<%=token%>' },
            uci_apply_rollback = <%=math.max(luci.config and luci.config.apply and luci.config.apply.rollback or 30, 30)%>,
            uci_apply_holdoff = <%=math.max(luci.config and luci.config.apply and luci.config.apply.holdoff or 4, 1)%>,
            uci_apply_timeout = <%=math.max(luci.config and luci.config.apply and luci.config.apply.timeout or 5, 1)%>,
            uci_apply_display = <%=math.max(luci.config and luci.config.apply and luci.config.apply.display or 1.5, 1)%>;
 
+       function uci_status_message(type, content) {
+               var overlay = document.getElementById('cbi_apply_overlay') || document.body.appendChild(E('<div id="cbi_apply_overlay"><div class="alert-message"></div></div>')),
+                   message = overlay.querySelector('.alert-message');
+
+               if (message && type) {
+                       if (!message.classList.contains(type)) {
+                               message.classList.remove('notice');
+                               message.classList.remove('warning');
+                               message.classList.add(type);
+                       }
+
+                       if (content)
+                               message.innerHTML = content;
+
+                       document.body.classList.add('apply-overlay-active');
+               }
+               else {
+                       document.body.classList.remove('apply-overlay-active');
+               }
+       }
+
        function uci_rollback(checked) {
                if (checked) {
-                       stat.classList.remove('notice');
-                       stat.classList.add('warning');
-                       stat.innerHTML = '<img src="<%=resource%>/icons/loading.gif" alt="" style="vertical-align:middle" /> ' +
-                                        '<%:Failed to confirm apply within %ds, waiting for rollback…%>'.format(uci_apply_rollback);
+                       uci_status_message('warning',
+                               '<img src="<%=resource%>/icons/loading.gif" alt="" style="vertical-align:middle" /> ' +
+                               '<%:Failed to confirm apply within %ds, waiting for rollback…%>'.format(uci_apply_rollback));
 
                        var call = function(r) {
                                if (r.status === 204) {
-                                       stat.innerHTML = '<h4><%:Configuration has been rolled back!%></h4>' +
+                                       uci_status_message('warning',
+                                               '<h4><%:Configuration has been rolled back!%></h4>' +
                                                '<p><%:The device could not be reached within %d seconds after applying the pending changes, which caused the configuration to be rolled back for safety reasons. If you believe that the configuration changes are correct nonetheless, perform an unchecked configuration apply. Alternatively, you can dismiss this warning and edit changes before attempting to apply again, or revert all pending changes to keep the currently working configuration state.%></p>'.format(uci_apply_rollback) +
                                                '<div class="right">' +
-                                                       '<input type="button" class="btn" onclick="this.parentNode.parentNode.style.display=\'none\'" value="<%:Dismiss%>" /> ' +
+                                                       '<input type="button" class="btn" onclick="uci_status_message(false)" value="<%:Dismiss%>" /> ' +
                                                        '<input type="button" class="btn" onclick="uci_revert()" value="<%:Revert changes%>" /> ' +
                                                        '<input type="button" class="btn danger" onclick="uci_apply(false)" value="<%:Apply unchecked%>" />' +
-                                               '</div>';
+                                               '</div>');
 
                                        return;
                                }
                        call({ status: 0 });
                }
                else {
-                       stat.classList.remove('notice');
-                       stat.classList.add('warning');
-                       stat.innerHTML = '<h4><%:Device unreachable!%></h4>' +
-                               '<p><%:Could not regain access to the device after applying the configuration changes. You might need to reconnect if you modified network related settings such as the IP address or wireless security credentials.%></p>';
+                       uci_status_message('warning',
+                               '<h4><%:Device unreachable!%></h4>' +
+                               '<p><%:Could not regain access to the device after applying the configuration changes. You might need to reconnect if you modified network related settings such as the IP address or wireless security credentials.%></p>');
                }
        }
 
                var tt;
                var ts = Date.now();
 
-               stat = document.getElementById('cbi_apply_status');
-               stat.style.display = '';
-               stat.classList.remove('warning');
-               stat.classList.add('notice');
-
-               indicator = document.querySelector('.uci_change_indicator');
+               uci_status_message('notice');
 
                var call = function(r) {
                        if (Date.now() >= deadline) {
                                return;
                        }
                        else if (r && (r.status === 200 || r.status === 204)) {
-                               if (indicator)
-                                       indicator.style.display = 'none';
+                               var indicator = document.querySelector('.uci_change_indicator');
+                               if (indicator) indicator.style.display = 'none';
 
-                               stat.innerHTML = '<%:Configuration has been applied.%>';
+                               uci_status_message('notice', '<%:Configuration has been applied.%>');
 
                                window.clearTimeout(tt);
                                window.setTimeout(function() {
-                                       stat.style.display = 'none';
-                                       <% if redirect_ok then %>location.href = decodeURIComponent('<%=luci.util.urlencode(redirect_ok)%>');<% end %>
+                                       <% if redirect_ok then -%>
+                                               location.href = decodeURIComponent('<%=luci.util.urlencode(redirect_ok)%>');
+                                       <%- else -%>
+                                               window.location = window.location.href.split('#')[0];
+                                       <% end %>
                                }, uci_apply_display * 1000);
 
                                return;
                var tick = function() {
                        var now = Date.now();
 
-                       stat.innerHTML = '<img src="<%=resource%>/icons/loading.gif" alt="" style="vertical-align:middle" /> ' +
-                                        '<%:Waiting for configuration to get applied… %ds%>'.format(Math.max(Math.floor((deadline - Date.now()) / 1000), 0));
+                       uci_status_message('notice',
+                               '<img src="<%=resource%>/icons/loading.gif" alt="" style="vertical-align:middle" /> ' +
+                               '<%:Waiting for configuration to get applied… %ds%>'.format(Math.max(Math.floor((deadline - Date.now()) / 1000), 0)));
 
                        if (now >= deadline)
                                return;
        }
 
        function uci_apply(checked) {
-               stat = document.getElementById('cbi_apply_status');
-               stat.style.display = '';
-               stat.classList.remove('warning');
-               stat.classList.add('notice');
-               stat.innerHTML = '<img src="<%=resource%>/icons/loading.gif" alt="" style="vertical-align:middle" /> ' +
-                                '<%:Starting configuration apply…%>';
+               uci_status_message('notice',
+                       '<img src="<%=resource%>/icons/loading.gif" alt="" style="vertical-align:middle" /> ' +
+                       '<%:Starting configuration apply…%>');
 
                xhr.post('<%=url("admin/uci")%>/' + (checked ? 'apply_rollback' : 'apply_unchecked'), uci_apply_auth, function(r) {
                        if (r.status === (checked ? 200 : 204)) {
                                uci_confirm(checked, Date.now() + uci_apply_rollback * 1000);
                        }
                        else if (checked && r.status === 204) {
-                               stat.innerHTML = '<%:There are no changes to apply.%>';
+                               uci_status_message('notice', '<%:There are no changes to apply.%>');
                                window.setTimeout(function() {
-                                       stat.style.display = 'none';
-                                       <% if redirect_ok then %>location.href = decodeURIComponent('<%=luci.util.urlencode(redirect_ok)%>');<% end %>
+                                       <% if redirect_ok then -%>
+                                               location.href = decodeURIComponent('<%=luci.util.urlencode(redirect_ok)%>');
+                                       <%- else -%>
+                                               uci_status_message(false);
+                                       <%- end %>
                                }, uci_apply_display * 1000);
                        }
                        else {
-                               stat.classList.add('warning');
-                               stat.classList.remove('notice');
-                               stat.innerHTML = '<%_Apply request failed with status <code>%h</code>%>'.format(r.responseText || r.statusText || r.status);
+                               uci_status_message('warning', '<%_Apply request failed with status <code>%h</code>%>'.format(r.responseText || r.statusText || r.status));
+                               window.setTimeout(function() { uci_status_message(false); }, uci_apply_display * 1000);
                        }
                });
        }
 
        function uci_revert() {
-               stat = document.getElementById('cbi_apply_status');
-               stat.style.display = '';
-               stat.classList.remove('warning');
-               stat.classList.add('notice');
-               stat.innerHTML = '<img src="<%=resource%>/icons/loading.gif" alt="" style="vertical-align:middle" /> ' +
-                                '<%:Reverting configuration…%>';
+               uci_status_message('notice',
+                       '<img src="<%=resource%>/icons/loading.gif" alt="" style="vertical-align:middle" /> ' +
+                       '<%:Reverting configuration…%>');
 
                xhr.post('<%=url("admin/uci/revert")%>', uci_apply_auth, function(r) {
                        if (r.status === 200) {
-                               stat.innerHTML = '<%:Changes have been reverted.%>';
+                               uci_status_message('notice', '<%:Changes have been reverted.%>');
                                window.setTimeout(function() {
                                        <% if redirect_ok then -%>
                                                location.href = decodeURIComponent('<%=luci.util.urlencode(redirect_ok)%>');
                                }, uci_apply_display * 1000);
                        }
                        else {
-                               stat.classList.add('warning');
-                               stat.classList.remove('notice');
-                               stat.innerHTML = '<%_Revert request failed with status <code>%h</code>%>'.format(r.statusText || r.status);
+                               uci_status_message('warning', '<%_Revert request failed with status <code>%h</code>%>'.format(r.statusText || r.status));
+                               window.setTimeout(function() { uci_status_message(false); }, uci_apply_display * 1000);
                        }
                });
        }
diff --git a/modules/luci-base/luasrc/view/cbi/dropdown.htm b/modules/luci-base/luasrc/view/cbi/dropdown.htm
new file mode 100644 (file)
index 0000000..bdf7248
--- /dev/null
@@ -0,0 +1,42 @@
+<%+cbi/valueheader%>
+
+<%-
+       local selected = { }
+
+       if self.multiple then
+               local val
+               for val in luci.util.imatch(self:cfgvalue(section)) do
+                       selected[val] = true
+               end
+       else
+               selected[self:cfgvalue(section)] = true
+       end
+
+       if not next(selected) and self.default then
+               selected[self.default] = true
+       end
+-%>
+
+<div class="cbi-dropdown"<%=
+       attr("name", cbid) ..
+       attr("display-items", self.display or self.size or 3) ..
+       attr("dropdown-items", self.dropdown or self.display or self.size or 5) ..
+       attr("placeholder", self.placeholder or translate("-- please select --")) ..
+       ifattr(self.multiple, "multiple", "multiple") ..
+       ifattr(self.optional or self.rmempty, "optional", "optional")
+%>>
+       <ul>
+               <% local i, key; for i, key in pairs(self.keylist) do %>
+                       <li<%=
+                               attr("data-index", i) ..
+                               attr("data-depends", self:deplist2json(section, self.deplist[i])) ..
+                               attr("value", key) ..
+                               ifattr(selected[key], "selected", "selected")
+                       %>>
+                               <%=pcdata(self.vallist[i])%>
+                       </li>
+               <% end %>
+       </ul>
+</div>
+
+<%+cbi/valuefooter%>
index b4260707ef1293326139e67b090aa9ce014967f6..3a108020b6062907cbcaddc2f10ae21ef80e5bde 100644 (file)
        end
 -%>
 
-<span>
-       <ul style="margin:0; list-style-type:none; text-align:left">
+<div class="cbi-dropdown" dropdown-items="5" placeholder="<%:-- please select -- %>"<%=
+       attr("name", cbid) ..
+       ifattr(self.widget == "checkbox", "multiple", "multiple") ..
+       ifattr(self.rmempty or self.optional, "optional", "optional")
+%>>
+       <script type="item-template"><!--
+               <li value="{{value}}">
+                       <span class="zonebadge" style="background:repeating-linear-gradient(45deg,rgba(204,204,204,0.5),rgba(204,204,204,0.5) 5px,rgba(255,255,255,0.5) 5px,rgba(255,255,255,0.5) 10px)">
+                               <strong>{{value}}:</strong><em>(<%:create%>)</em>
+                       </span>
+               </li>
+       --></script>
+       <ul>
                <% if self.allowlocal then %>
-               <li style="padding:0.5em">
-                       <input class="cbi-input-radio" data-update="click change"<%=attr("type", self.widget or "radio") .. attr("id", cbid .. "_empty") .. attr("name", cbid) .. attr("value", "") .. ifattr(checked[""], "checked", "checked")%> /> &#160;
-                       <label<%=attr("for", cbid .. "_empty")%>></label>
-                       <label<%=attr("for", cbid .. "_empty")%> style="background-color:<%=fwm.zone.get_color()%>" class="zonebadge">
+               <li value=""<%=ifattr(checked[""], "selected", "selected")%>>
+                       <span style="background-color:<%=fwm.zone.get_color()%>" class="zonebadge">
                                <strong><%:Device%></strong>
-                               <% if self.allowany and self.allowlocal then %>(<%:input%>)<% end %>
-                       </label>
+                               <% if self.allowany and self.allowlocal then -%>
+                                       (<%= self.alias ~= "dest"
+                                               and translate("output") or translate("input") %>)
+                               <%- end %>
+                       </span>
+               </li>
+               <% elseif self.widget ~= "checkbox" and (self.rmempty or self.optional) then %>
+               <li value=""<%=ifattr(checked[""], "selected", "selected")%>>
+                       <span class="zonebadge">
+                               <em><%:unspecified%></em>
+                       </span>
                </li>
                <% end %>
                <% if self.allowany then %>
-               <li style="padding:0.5em">
-                       <input class="cbi-input-radio" data-update="click change"<%=attr("type", self.widget or "radio") .. attr("id", cbid .. "_any") .. attr("name", cbid) .. attr("value", "*") .. ifattr(checked["*"], "checked", "checked")%> /> &#160;
-                       <label<%=attr("for", cbid .. "_any")%>></label>
-                       <label<%=attr("for", cbid .. "_any")%> style="background-color:<%=fwm.zone.get_color()%>" class="zonebadge">
+               <li value="*"<%=ifattr(checked["*"], "selected", "selected")%>>
+                       <span style="background-color:<%=fwm.zone.get_color()%>" class="zonebadge">
                                <strong><%:Any zone%></strong>
                                <% if self.allowany and self.allowlocal then %>(<%:forward%>)<% end %>
-                       </label>
+                       </span>
                </li>
                <% end %>
                <%
                                if zone:name() ~= self.exclude then
                                        selected = selected or (value == zone:name())
                %>
-               <li style="padding:0.5em">
-                       <input class="cbi-input-radio" data-update="click change"<%=attr("type", self.widget or "radio") .. attr("id", cbid .. "." .. zone:name()) .. attr("name", cbid) .. attr("value", zone:name()) .. ifattr(checked[zone:name()], "checked", "checked")%> /> &#160;
-                       <label<%=attr("for", cbid .. "." .. zone:name())%>></label>
-                       <label<%=attr("for", cbid .. "." .. zone:name())%> style="background-color:<%=zone:get_color()%>" class="zonebadge">
+               <li<%=attr("value", zone:name()) .. ifattr(checked[zone:name()], "selected", "selected")%>>
+                       <span style="background-color:<%=zone:get_color()%>" class="zonebadge">
                                <strong><%=zone:name()%>:</strong>
-                               <%
+                               <%-
                                        local zempty = true
                                        for _, net in ipairs(zone:get_networks()) do
                                                net = nwm:get_network(net)
                                                if net then
                                                        zempty = false
-                               %>
+                               -%>
                                        <span class="ifacebadge<% if net:name() == self.network then %> ifacebadge-active<% end %>"><%=net:name()%>:
-                                       <%
+                                       <%-
                                                local nempty = true
                                                for _, iface in ipairs(net:is_bridge() and net:get_interfaces() or { net:get_interface() }) do
                                                        nempty = false
                                        %>
-                                               <img<%=attr("title", iface:get_i18n())%> style="width:16px; height:16px; vertical-align:middle" src="<%=resource%>/icons/<%=iface:type()%><%=iface:is_up() and "" or "_disabled"%>.png" />
+                                               <img<%=attr("title", iface:get_i18n())%> src="<%=resource%>/icons/<%=iface:type()%><%=iface:is_up() and "" or "_disabled"%>.png" />
                                        <% end %>
-                                       <% if nempty then %><em><%:(empty)%></em><% end %>
+                                       <% if nempty then %><em><%:(empty)%></em><% end -%>
                                        </span>
-                               <% end end %>
-                               <% if zempty then %><em><%:(empty)%></em><% end %>
-                       </label>
+                               <%- end end -%>
+                               <%- if zempty then %><em><%:(empty)%></em><% end -%>
+                       </span>
                </li>
                <% end end %>
 
                <% if self.widget ~= "checkbox" and not self.nocreate then %>
-               <li style="padding:0.5em">
-                       <input class="cbi-input-radio" data-update="click change" type="radio"<%=attr("id", cbid .. "_new") .. attr("name", cbid) .. attr("value", "-") .. ifattr(not selected, "checked", "checked")%> /> &#160;
-                       <label<%=attr("for", cbid .. "_new")%>></label>
-                       <div onclick="document.getElementById('<%=cbid%>_new').checked=true" class="zonebadge" style="background-color:<%=fwm.zone.get_color()%>">
-                               <em><%:unspecified -or- create:%>&#160;</em>
-                               <input type="text"<%=attr("name", cbid .. ".newzone") .. ifattr(not selected, "value", luci.http.formvalue(cbid .. ".newzone") or self.default)%> onfocus="document.getElementById('<%=cbid%>_new').checked=true" />
-                       </div>
+               <li value="-">
+                       <span class="zonebadge">
+                               <em><%:create%>:</em>
+                               <input type="password" style="display:none" />
+                               <input class="create-item-input" type="text" />
+                       </span>
                </li>
                <% end %>
        </ul>
-</span>
+</div>
 
 <%+cbi/valuefooter%>
index 69ef3615a28665925cd84946e86da6ec140fd488..02b47f545511b2cd994de277422bbc7637272f3e 100644 (file)
@@ -1,5 +1,5 @@
 <%- if firstmap and messages then local msg; for _, msg in ipairs(messages) do -%>
-       <div class="errorbox"><%=pcdata(msg)%></div>
+       <div class="alert-message warning"><%=pcdata(msg)%></div>
 <%- end end -%>
 
 <div class="cbi-map" id="cbi-<%=self.config%>">
index 62dbde7dd4fd863116f08ff5a9547f44f216fce2..abfa33e1edca600a7918db83f96427fe3c43edef 100644 (file)
@@ -19,7 +19,9 @@
 
        if value then
                for value in utl.imatch(value) do
-                       checked[value] = true
+                       for value in utl.imatch(value) do
+                               checked[value] = true
+                       end
                end
        else
                local n = self.network and net:get_network(self.network)
 -%>
 
 <input type="hidden" name="<%=cbeid%>" value="1" />
-<ul style="margin:0; list-style-type:none">
-       <% for _, iface in ipairs(ifaces) do
-            local link = iface:adminlink()
-         if (not self.nobridges  or not iface:is_bridge()) and
-                   (not self.noinactive or iface:is_up()) and
-                   iface:name() ~= self.exclude
-                then %>
-       <li>
-               <input class="cbi-input-<%=self.widget or "radio"%>" data-update="click change"<%=
-                       attr("type", self.widget or "radio") ..
-                       attr("id", cbid .. "." .. iface:name()) ..
-                       attr("name", cbid) .. attr("value", iface:name()) ..
-                       ifattr(checked[iface:name()], "checked", "checked")
-               %> />
-               <%- if not self.widget or self.widget == "checkbox" or self.widget == "radio" then -%>
-                       <label<%=attr("for", cbid .. "." .. iface:name())%>></label>
-               <%- end -%>
-               &#160;
-               <label<%=attr("for", cbid .. "." .. iface:name())%>>
-                       <% if link then -%><a href="<%=link%>"><% end -%>
-                       <img<%=attr("title", iface:get_i18n())%> style="width:16px; height:16px; vertical-align:middle" src="<%=resource%>/icons/<%=iface:type()%><%=iface:is_up() and "" or "_disabled"%>.png" />
-                       <% if link then -%></a><% end -%>
-                       <%=pcdata(iface:get_i18n())%>
-                       <% local ns = iface:get_networks(); if #ns > 0 then %>(
-                               <%- local i, n; for i, n in ipairs(ns) do -%>
-                                       <%-= (i>1) and ', ' -%>
-                                       <a href="<%=n:adminlink()%>"><%=n:name()%></a>
-                               <%- end -%>
-                       )<% end %>
-               </label>
-       </li>
-       <% end end %>
-       <% if not self.nocreate then %>
-       <li>
-               <input class="cbi-input-<%=self.widget or "radio"%>" data-update="click change"<%=
-                       attr("type", self.widget or "radio") ..
-                       attr("id", cbid .. "_custom") ..
-                       attr("name", cbid) ..
-                       attr("value", " ")
-               %> />
-               <%- if not self.widget or self.widget == "checkbox" or self.widget == "radio" then -%>
-                       <label<%=attr("for", cbid .. "_custom")%>></label>
-               <%- end -%>
-               &#160;
-               <label<%=attr("for", cbid .. "_custom")%>>
-                       <img title="<%:Custom Interface%>" style="width:16px; height:16px; vertical-align:middle" src="<%=resource%>/icons/ethernet_disabled.png" />
-                       <%:Custom Interface%>:
-               </label>
-               <input type="text" style="width:50px" onfocus="document.getElementById('<%=cbid%>_custom').checked=true" onblur="var x=document.getElementById('<%=cbid%>_custom'); x.value=this.value; x.checked=true" />
-       </li>
-       <% end %>
-</ul>
+
+<div class="cbi-dropdown" display-items="5" placeholder="<%:-- please select -- %>"<%=
+       attr("name", cbid) ..
+       ifattr(self.widget == "checkbox", "multiple", "multiple") ..
+       ifattr(self.widget == "checkbox", "optional", "optional")
+%>>
+       <script type="item-template"><!--
+               <li value="{{value}}">
+                       <img title="<%:Custom Interface%>: &quot;{{value}}&quot;" src="<%=resource%>/icons/ethernet_disabled.png" />
+                       <span class="hide-open">{{value}}</span>
+                       <span class="hide-close"><%:Custom Interface%>: "{{value}}"</span>
+               </li>
+       --></script>
+       <ul>
+               <% for _, iface in ipairs(ifaces) do
+                       if (not self.nobridges  or not iface:is_bridge()) and
+                          (not self.noinactive or iface:is_up()) and
+                          iface:name() ~= self.exclude
+                       then %>
+               <li<%=
+                       attr("value", iface:name()) ..
+                       ifattr(checked[iface:name()], "selected", "selected")
+               %>>
+                       <img<%=attr("title", iface:get_i18n())%> src="<%=resource%>/icons/<%=iface:type()%><%=iface:is_up() and "" or "_disabled"%>.png" />
+                       <span class="hide-open"><%=pcdata(iface:name())%></span>
+                       <span class="hide-close">
+                               <%=pcdata(iface:get_i18n())%>
+                               <% local ns = iface:get_networks(); if #ns > 0 then %>(
+                                       <%- local i, n; for i, n in ipairs(ns) do -%>
+                                               <%-= (i>1) and ', ' -%>
+                                               <a href="<%=n:adminlink()%>"><%=n:name()%></a>
+                                       <%- end -%>
+                               )<% end %>
+                       </span>
+               </li>
+               <% end end %>
+               <% if not self.nocreate then %>
+               <li value="">
+                       <img title="<%:Custom Interface%>" src="<%=resource%>/icons/ethernet_disabled.png" />
+                       <span><%:Custom Interface%>:</span>
+                       <input type="password" style="display:none" />
+                       <input class="create-item-input" type="text" />
+               </li>
+               <% end %>
+       </ul>
+</div>
 
 <%+cbi/valuefooter%>
index 8bf1a70a2058e99ab22cbe789ab0e08b94524434..ba6ebb843456f5e40dffad2139f806cca09feb8f 100644 (file)
        end
 -%>
 
-<ul style="margin:0; list-style-type:none; text-align:left">
-       <% for _, net in ipairs(networks) do
-              if (net:name() ~= "loopback") and
-                     (net:name() ~= self.exclude) and
-                     (not self.novirtual or not net:is_virtual())
-                  then %>
-       <li style="padding:0.25em 0">
-               <input class="cbi-input-<%=self.widget or "radio"%>" data-update="click change"<%=
-                       attr("type", self.widget or "radio") ..
-                       attr("id", cbid .. "." .. net:name()) ..
-                       attr("name", cbid) .. attr("value", net:name()) ..
-                       ifattr(checked[net:name()], "checked", "checked")
-               %> /> &#160;
-               <label<%=attr("for", cbid .. "." .. net:name())%>>
+<div class="cbi-dropdown" display-items="5" placeholder="<%:-- please select -- %>"<%=
+       attr("name", cbid) ..
+       ifattr(self.widget == "checkbox", "multiple", "multiple") ..
+       ifattr(self.widget == "checkbox", "optional", "optional")
+%>>
+       <script type="item-template"><!--
+               <li value="{{value}}">
+                       <span class="ifacebadge" style="background:repeating-linear-gradient(45deg,rgba(204,204,204,0.5),rgba(204,204,204,0.5) 5px,rgba(255,255,255,0.5) 5px,rgba(255,255,255,0.5) 10px)">
+                               {{value}}: <em>(<%:create%>)</em>
+                       </span>
+               </li>
+       --></script>
+       <ul>
+               <% if self.widget ~= "checkbox" then %>
+               <li value=""<%= ifattr(not value, "selected", "selected") %>>
+                       <em><%:unspecified%></em>
+               </li>
+               <% end %>
+
+               <% for _, net in ipairs(networks) do
+                      if (net:name() ~= "loopback") and
+                             (net:name() ~= self.exclude) and
+                             (not self.novirtual or not net:is_virtual())
+                          then %>
+               <li<%= attr("value", net:name()) .. ifattr(checked[net:name()], "selected", "selected") %>>
                        <span class="ifacebadge"><%=net:name()%>:
                                <%
                                        local empty = true
                                        for _, iface in ipairs(net:is_bridge() and net:get_interfaces() or { net:get_interface() }) do
                                                if not iface:is_bridge() then
                                                        empty = false
-                                %>
+                               -%>
                                        <img<%=attr("title", iface:get_i18n())%> style="width:16px; height:16px; vertical-align:middle" src="<%=resource%>/icons/<%=iface:type()%><%=iface:is_up() and "" or "_disabled"%>.png" />
-                               <% end end %>
-                               <% if empty then %><em><%:(no interfaces attached)%></em><% end %>
+                               <%- end end %>
+                               <% if empty then %>
+                                       <em class="hide-close"><%:(no interfaces attached)%></em>
+                                       <em class="hide-open">-</em>
+                               <% end %>
                        </span>
-               </label>
-       </li>
-       <% end end %>
+               </li>
+               <% end end %>
 
-       <% if not self.nocreate then %>
-       <li style="padding:0.25em 0">
-               <input class="cbi-input-<%=self.widget or "radio"%>" data-update="click change"<%=attr("type", self.widget or "radio") .. attr("id", cbid .. "_new") .. attr("name", cbid) .. attr("value", "-") .. ifattr(not value and self.widget ~= "checkbox", "checked", "checked")%> /> &#160;
-               <%- if not self.widget or self.widget == "checkbox" or self.widget == "radio" then -%>
-                       <label<%=attr("for", cbid .. "_new")%>></label>
-               <%- end -%>
-               <div style="padding:0.5em; display:inline">
-                       <label<%=attr("for", cbid .. "_new")%>><em>
+               <% if not self.nocreate then %>
+               <li value="-"<%= ifattr(not value and self.widget ~= "checkbox", "selected", "selected") %>>
+                       <em>
                                <%- if self.widget == "checkbox" then -%>
                                        <%:create:%>
                                <%- else -%>
                                        <%:unspecified -or- create:%>
-                               <%- end -%>&#160;</em></label>
+                               <%- end -%>
+                       </em>
                        <input style="display:none" type="password" />
-                       <input style="width:6em" type="text"<%=attr("name", cbid .. ".newnet")%> onfocus="document.getElementById('<%=cbid%>_new').checked=true" />
-               </div>
-       </li>
-       <% elseif self.widget ~= "checkbox" and self.unspecified then %>
-       <li style="padding:0.25em 0">
-               <input class="cbi-input-<%=self.widget or "radio"%>" data-update="click change"<%=
-                       attr("type", self.widget or "radio") ..
-                       attr("id", cbid .. "_uns") ..
-                       attr("name", cbid) ..
-                       attr("value", "") ..
-                       ifattr(not value or #value == 0, "checked", "checked")
-               %> /> &#160;
-               <div style="padding:0.5em; display:inline">
-                       <label<%=attr("for", cbid .. "_uns")%>><em><%:unspecified%></em></label>
-               </div>
-       </li>
-       <% end %>
-</ul>
+                       <input class="create-item-input" type="text" />
+               </li>
+               <% end %>
+       </ul>
+</div>
 
 <%+cbi/valuefooter%>
index b3ec9b761705e2fe1c8fca5237362b3d152e1497..e7a741aaab034cea812e7cd6475a3678dbdb44fd 100644 (file)
@@ -8,7 +8,9 @@
 
 <form method="post" action="<%=pcdata(FULL_REQUEST_URI)%>">
        <%- if fuser then %>
-       <div class="errorbox"><%:Invalid username and/or password! Please try again.%></div>
+               <div class="alert-message warning">
+                       <p><%:Invalid username and/or password! Please try again.%></p>
+               </div>
        <% end -%>
 
        <div class="cbi-map">
index f9976f3ebf50a0e284415196fcaf3410339c0f9d..32cee9f50c3aac43da684fd8454de0fa8e675b26 100644 (file)
@@ -49,6 +49,9 @@ msgstr ""
 msgid "-- match by uuid --"
 msgstr ""
 
+msgid "-- please select --"
+msgstr ""
+
 msgid "1 Minute Load:"
 msgstr "Càrrega d'1 minut:"
 
@@ -401,6 +404,9 @@ msgstr ""
 msgid "Apply unchecked"
 msgstr ""
 
+msgid "Architecture"
+msgstr ""
+
 msgid ""
 "Assign a part of given length of every public IPv6-prefix to this interface"
 msgstr ""
@@ -415,6 +421,9 @@ msgstr ""
 msgid "Associated Stations"
 msgstr "Estacions associades"
 
+msgid "Associations"
+msgstr ""
+
 msgid "Auth Group"
 msgstr ""
 
@@ -1287,7 +1296,7 @@ msgstr "Espai lliure"
 
 msgid ""
 "Further information about WireGuard interfaces and peers at <a href=\"http://"
-"wireguard.io\">wireguard.io</a>."
+"wireguard.com\">wireguard.com</a>."
 msgstr ""
 
 msgid "GHz"
@@ -1421,8 +1430,8 @@ msgstr "IPv4"
 msgid "IPv4 Firewall"
 msgstr "Tallafocs IPv4"
 
-msgid "IPv4 WAN Status"
-msgstr "Estat WAN IPv4"
+msgid "IPv4 Upstream"
+msgstr ""
 
 msgid "IPv4 address"
 msgstr "Adreça IPv4"
@@ -1472,8 +1481,8 @@ msgstr ""
 msgid "IPv6 ULA-Prefix"
 msgstr ""
 
-msgid "IPv6 WAN Status"
-msgstr "Estat WAN IPv6"
+msgid "IPv6 Upstream"
+msgstr ""
 
 msgid "IPv6 address"
 msgstr "Adreça IPv6"
@@ -2584,12 +2593,12 @@ msgstr ""
 "\"Dynamic Host Configuration Protocol\">DHCP</abbr>"
 
 msgid ""
-"Really delete this interface? The deletion cannot be undone!\\nYou might "
-"lose access to this device if you are connected via this interface."
+"Really delete this interface? The deletion cannot be undone! You might lose "
+"access to this device if you are connected via this interface."
 msgstr ""
 
 msgid ""
-"Really delete this wireless network? The deletion cannot be undone!\\nYou "
+"Really delete this wireless network? The deletion cannot be undone! You "
 "might lose access to this device if you are connected via this network."
 msgstr ""
 
@@ -2597,12 +2606,12 @@ msgid "Really reset all changes?"
 msgstr ""
 
 msgid ""
-"Really shut down network?\\nYou might lose access to this device if you are "
+"Really shut down network? You might lose access to this device if you are "
 "connected via this interface."
 msgstr ""
 
 msgid ""
-"Really shutdown interface \"%s\" ?\\nYou might lose access to this device if "
+"Really shutdown interface \"%s\"You might lose access to this device if "
 "you are connected via this interface."
 msgstr ""
 
@@ -3708,6 +3717,9 @@ msgstr ""
 msgid "bridged"
 msgstr "pontejat"
 
+msgid "create"
+msgstr ""
+
 msgid "create:"
 msgstr "crea:"
 
@@ -3796,6 +3808,9 @@ msgstr "engegat"
 msgid "open"
 msgstr "obert"
 
+msgid "output"
+msgstr ""
+
 msgid "overlay"
 msgstr ""
 
@@ -3847,6 +3862,12 @@ msgstr "sí"
 msgid "« Back"
 msgstr "« Enrere"
 
+#~ msgid "IPv4 WAN Status"
+#~ msgstr "Estat WAN IPv4"
+
+#~ msgid "IPv6 WAN Status"
+#~ msgstr "Estat WAN IPv6"
+
 #~ msgid "Apply"
 #~ msgstr "Aplica"
 
index daae96c49d0336d0cefaef96116924863cca5bc3..673ca6fd440d28ff5613dd1d8a05e37898c3d272 100644 (file)
@@ -47,6 +47,9 @@ msgstr ""
 msgid "-- match by uuid --"
 msgstr ""
 
+msgid "-- please select --"
+msgstr ""
+
 msgid "1 Minute Load:"
 msgstr "Zatížení za 1 minutu:"
 
@@ -397,6 +400,9 @@ msgstr ""
 msgid "Apply unchecked"
 msgstr ""
 
+msgid "Architecture"
+msgstr ""
+
 msgid ""
 "Assign a part of given length of every public IPv6-prefix to this interface"
 msgstr ""
@@ -411,6 +417,9 @@ msgstr ""
 msgid "Associated Stations"
 msgstr "Připojení klienti"
 
+msgid "Associations"
+msgstr ""
+
 msgid "Auth Group"
 msgstr ""
 
@@ -1289,7 +1298,7 @@ msgstr "Volné místo"
 
 msgid ""
 "Further information about WireGuard interfaces and peers at <a href=\"http://"
-"wireguard.io\">wireguard.io</a>."
+"wireguard.com\">wireguard.com</a>."
 msgstr ""
 
 msgid "GHz"
@@ -1420,8 +1429,8 @@ msgstr "IPv4"
 msgid "IPv4 Firewall"
 msgstr "IPv4 firewall"
 
-msgid "IPv4 WAN Status"
-msgstr "Stav IPv4 WAN"
+msgid "IPv4 Upstream"
+msgstr ""
 
 msgid "IPv4 address"
 msgstr "IPv4 adresa"
@@ -1471,8 +1480,8 @@ msgstr ""
 msgid "IPv6 ULA-Prefix"
 msgstr ""
 
-msgid "IPv6 WAN Status"
-msgstr "Stav IPv6 WAN"
+msgid "IPv6 Upstream"
+msgstr ""
 
 msgid "IPv6 address"
 msgstr "IPv6 adresa"
@@ -2595,15 +2604,15 @@ msgstr ""
 "Host Configuration Protocol\">DHCP</abbr> Serveru"
 
 msgid ""
-"Really delete this interface? The deletion cannot be undone!\\nYou might "
-"lose access to this device if you are connected via this interface."
+"Really delete this interface? The deletion cannot be undone! You might lose "
+"access to this device if you are connected via this interface."
 msgstr ""
 "Opravdu odstranit toto rozhraní? Odstranění nelze vrátit zpět!\n"
 "Můžete ztratit přístup k zařízení, pokud jste připojeni prostřednictvím "
 "tohoto rozhraní."
 
 msgid ""
-"Really delete this wireless network? The deletion cannot be undone!\\nYou "
+"Really delete this wireless network? The deletion cannot be undone! You "
 "might lose access to this device if you are connected via this network."
 msgstr ""
 "Opravdu odstranit bezdrátovou síť? Odstranění nelze vrátit zpět!\n"
@@ -2615,7 +2624,7 @@ msgstr "Opravdu resetovat všechny změny?"
 
 #, fuzzy
 msgid ""
-"Really shut down network?\\nYou might lose access to this device if you are "
+"Really shut down network? You might lose access to this device if you are "
 "connected via this interface."
 msgstr ""
 "Opravdu vypnout síť ?\n"
@@ -2623,7 +2632,7 @@ msgstr ""
 "tohoto rozhraní."
 
 msgid ""
-"Really shutdown interface \"%s\" ?\\nYou might lose access to this device if "
+"Really shutdown interface \"%s\"You might lose access to this device if "
 "you are connected via this interface."
 msgstr ""
 "Opravdu vypnout rozhraní \"%s\" ?\n"
@@ -3749,6 +3758,9 @@ msgstr "baseT"
 msgid "bridged"
 msgstr "přemostěný"
 
+msgid "create"
+msgstr ""
+
 msgid "create:"
 msgstr ""
 
@@ -3837,6 +3849,9 @@ msgstr "on"
 msgid "open"
 msgstr ""
 
+msgid "output"
+msgstr ""
+
 msgid "overlay"
 msgstr ""
 
@@ -3888,6 +3903,12 @@ msgstr "ano"
 msgid "« Back"
 msgstr "« Zpět"
 
+#~ msgid "IPv4 WAN Status"
+#~ msgstr "Stav IPv4 WAN"
+
+#~ msgid "IPv6 WAN Status"
+#~ msgstr "Stav IPv6 WAN"
+
 #~ msgid "Apply"
 #~ msgstr "Použít"
 
index a7b003caf30d9a0bc3960eb7e815cf528dcbc475..c0e0f914d17d6bfed66200804f58671222206006 100644 (file)
@@ -49,6 +49,9 @@ msgstr "-- anhand Label selektieren --"
 msgid "-- match by uuid --"
 msgstr "-- UUID vergleichen --"
 
+msgid "-- please select --"
+msgstr ""
+
 msgid "1 Minute Load:"
 msgstr "Systemlast (1 Minute):"
 
@@ -402,6 +405,9 @@ msgstr ""
 msgid "Apply unchecked"
 msgstr ""
 
+msgid "Architecture"
+msgstr ""
+
 msgid ""
 "Assign a part of given length of every public IPv6-prefix to this interface"
 msgstr ""
@@ -420,6 +426,9 @@ msgstr ""
 msgid "Associated Stations"
 msgstr "Assoziierte Clients"
 
+msgid "Associations"
+msgstr ""
+
 msgid "Auth Group"
 msgstr "Berechtigungsgruppe"
 
@@ -1322,10 +1331,10 @@ msgstr "Freier Platz"
 
 msgid ""
 "Further information about WireGuard interfaces and peers at <a href=\"http://"
-"wireguard.io\">wireguard.io</a>."
+"wireguard.com\">wireguard.com</a>."
 msgstr ""
 "Weitere Informationen zu WireGuard-Schnittstellen und Peers unter <a href="
-"\"http://wireguard.io\">wireguard.io</a>."
+"\"http://wireguard.com\">wireguard.com</a>."
 
 msgid "GHz"
 msgstr "GHz"
@@ -1456,8 +1465,8 @@ msgstr "IPv4"
 msgid "IPv4 Firewall"
 msgstr "IPv4 Firewall"
 
-msgid "IPv4 WAN Status"
-msgstr "IPv4 WAN Status"
+msgid "IPv4 Upstream"
+msgstr ""
 
 msgid "IPv4 address"
 msgstr "IPv4 Adresse"
@@ -1507,8 +1516,8 @@ msgstr "IPv6 Einstellungen"
 msgid "IPv6 ULA-Prefix"
 msgstr "IPv6 ULA-Präfix"
 
-msgid "IPv6 WAN Status"
-msgstr "IPv6 WAN Status"
+msgid "IPv6 Upstream"
+msgstr ""
 
 msgid "IPv6 address"
 msgstr "IPv6 Adresse"
@@ -2675,8 +2684,8 @@ msgid ""
 msgstr "Lese Informationen aus /etc/ethers um den DHCP-Server zu konfigurieren"
 
 msgid ""
-"Really delete this interface? The deletion cannot be undone!\\nYou might "
-"lose access to this device if you are connected via this interface."
+"Really delete this interface? The deletion cannot be undone! You might lose "
+"access to this device if you are connected via this interface."
 msgstr ""
 "Diese Schnittstelle wirklich löschen? Der Schritt kann nicht rückgängig "
 "gemacht werden!\n"
@@ -2684,7 +2693,7 @@ msgstr ""
 "Schnittstelle verbunden sind."
 
 msgid ""
-"Really delete this wireless network? The deletion cannot be undone!\\nYou "
+"Really delete this wireless network? The deletion cannot be undone! You "
 "might lose access to this device if you are connected via this network."
 msgstr ""
 "Dieses Drahtlosnetzwerk wirklich löschen? Der Schritt kann nicht rückgängig "
@@ -2697,7 +2706,7 @@ msgstr "Sollen wirklich alle Änderungen verworfen werden?"
 
 #, fuzzy
 msgid ""
-"Really shut down network?\\nYou might lose access to this device if you are "
+"Really shut down network? You might lose access to this device if you are "
 "connected via this interface."
 msgstr ""
 "Das Netzwerk wirklich herunterfahren?\n"
@@ -2705,7 +2714,7 @@ msgstr ""
 "Schnittstelle verbunden sind."
 
 msgid ""
-"Really shutdown interface \"%s\" ?\\nYou might lose access to this device if "
+"Really shutdown interface \"%s\"You might lose access to this device if "
 "you are connected via this interface."
 msgstr ""
 "Die Schnitstelle \"%s\" wirklich herunterfahren?\n"
@@ -3887,6 +3896,9 @@ msgstr "baseT"
 msgid "bridged"
 msgstr "bridged"
 
+msgid "create"
+msgstr ""
+
 msgid "create:"
 msgstr "erstelle:"
 
@@ -3973,6 +3985,9 @@ msgstr "ein"
 msgid "open"
 msgstr "offen"
 
+msgid "output"
+msgstr ""
+
 msgid "overlay"
 msgstr "Overlay"
 
@@ -4023,3 +4038,9 @@ msgstr "ja"
 
 msgid "« Back"
 msgstr "« Zurück"
+
+#~ msgid "IPv4 WAN Status"
+#~ msgstr "IPv4 WAN Status"
+
+#~ msgid "IPv6 WAN Status"
+#~ msgstr "IPv6 WAN Status"
index 60566b82176f9f78dc0fabec5e7ca415d643cabd..3d3c765409c4eff8c191a96affbb209a4bb1fd2a 100644 (file)
@@ -49,6 +49,9 @@ msgstr ""
 msgid "-- match by uuid --"
 msgstr ""
 
+msgid "-- please select --"
+msgstr ""
+
 msgid "1 Minute Load:"
 msgstr "Φορτίο 1 λεπτού:"
 
@@ -404,6 +407,9 @@ msgstr ""
 msgid "Apply unchecked"
 msgstr ""
 
+msgid "Architecture"
+msgstr ""
+
 msgid ""
 "Assign a part of given length of every public IPv6-prefix to this interface"
 msgstr ""
@@ -418,6 +424,9 @@ msgstr ""
 msgid "Associated Stations"
 msgstr "Συνδεδεμένοι Σταθμοί"
 
+msgid "Associations"
+msgstr ""
+
 msgid "Auth Group"
 msgstr ""
 
@@ -1303,7 +1312,7 @@ msgstr "Ελεύθερος χώρος"
 
 msgid ""
 "Further information about WireGuard interfaces and peers at <a href=\"http://"
-"wireguard.io\">wireguard.io</a>."
+"wireguard.com\">wireguard.com</a>."
 msgstr ""
 
 msgid "GHz"
@@ -1433,7 +1442,7 @@ msgstr "IPv4"
 msgid "IPv4 Firewall"
 msgstr "IPv4 Τείχος Προστασίας"
 
-msgid "IPv4 WAN Status"
+msgid "IPv4 Upstream"
 msgstr ""
 
 msgid "IPv4 address"
@@ -1484,8 +1493,8 @@ msgstr ""
 msgid "IPv6 ULA-Prefix"
 msgstr ""
 
-msgid "IPv6 WAN Status"
-msgstr "Κατάσταση IPv6 WAN"
+msgid "IPv6 Upstream"
+msgstr ""
 
 msgid "IPv6 address"
 msgstr "Διεύθυνση IPv6"
@@ -2601,12 +2610,12 @@ msgstr ""
 "εξυπηρετητή <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr>"
 
 msgid ""
-"Really delete this interface? The deletion cannot be undone!\\nYou might "
-"lose access to this device if you are connected via this interface."
+"Really delete this interface? The deletion cannot be undone! You might lose "
+"access to this device if you are connected via this interface."
 msgstr ""
 
 msgid ""
-"Really delete this wireless network? The deletion cannot be undone!\\nYou "
+"Really delete this wireless network? The deletion cannot be undone! You "
 "might lose access to this device if you are connected via this network."
 msgstr ""
 
@@ -2614,12 +2623,12 @@ msgid "Really reset all changes?"
 msgstr "Αρχικοποίηση όλων των αλλαγών;"
 
 msgid ""
-"Really shut down network?\\nYou might lose access to this device if you are "
+"Really shut down network? You might lose access to this device if you are "
 "connected via this interface."
 msgstr ""
 
 msgid ""
-"Really shutdown interface \"%s\" ?\\nYou might lose access to this device if "
+"Really shutdown interface \"%s\"You might lose access to this device if "
 "you are connected via this interface."
 msgstr ""
 
@@ -3700,6 +3709,9 @@ msgstr ""
 msgid "bridged"
 msgstr ""
 
+msgid "create"
+msgstr ""
+
 msgid "create:"
 msgstr ""
 
@@ -3789,6 +3801,9 @@ msgstr "ανοιχτό"
 msgid "open"
 msgstr ""
 
+msgid "output"
+msgstr ""
+
 msgid "overlay"
 msgstr ""
 
@@ -3840,6 +3855,9 @@ msgstr "ναι"
 msgid "« Back"
 msgstr "« Πίσω"
 
+#~ msgid "IPv6 WAN Status"
+#~ msgstr "Κατάσταση IPv6 WAN"
+
 #~ msgid "Apply"
 #~ msgstr "Εφαρμογή"
 
index 5ff626f76477488f35dc2364d6e7126bfc9ccf29..49cf819cd9118fd749480a5f00af03b831ccbf6d 100644 (file)
@@ -49,6 +49,9 @@ msgstr ""
 msgid "-- match by uuid --"
 msgstr ""
 
+msgid "-- please select --"
+msgstr ""
+
 msgid "1 Minute Load:"
 msgstr "1 Minute Load:"
 
@@ -395,6 +398,9 @@ msgstr ""
 msgid "Apply unchecked"
 msgstr ""
 
+msgid "Architecture"
+msgstr ""
+
 msgid ""
 "Assign a part of given length of every public IPv6-prefix to this interface"
 msgstr ""
@@ -409,6 +415,9 @@ msgstr ""
 msgid "Associated Stations"
 msgstr "Associated Stations"
 
+msgid "Associations"
+msgstr ""
+
 msgid "Auth Group"
 msgstr ""
 
@@ -1278,7 +1287,7 @@ msgstr ""
 
 msgid ""
 "Further information about WireGuard interfaces and peers at <a href=\"http://"
-"wireguard.io\">wireguard.io</a>."
+"wireguard.com\">wireguard.com</a>."
 msgstr ""
 
 msgid "GHz"
@@ -1407,7 +1416,7 @@ msgstr ""
 msgid "IPv4 Firewall"
 msgstr ""
 
-msgid "IPv4 WAN Status"
+msgid "IPv4 Upstream"
 msgstr ""
 
 msgid "IPv4 address"
@@ -1458,7 +1467,7 @@ msgstr ""
 msgid "IPv6 ULA-Prefix"
 msgstr ""
 
-msgid "IPv6 WAN Status"
+msgid "IPv6 Upstream"
 msgstr ""
 
 msgid "IPv6 address"
@@ -2567,12 +2576,12 @@ msgstr ""
 "Configuration Protocol\">DHCP</abbr>-Server"
 
 msgid ""
-"Really delete this interface? The deletion cannot be undone!\\nYou might "
-"lose access to this device if you are connected via this interface."
+"Really delete this interface? The deletion cannot be undone! You might lose "
+"access to this device if you are connected via this interface."
 msgstr ""
 
 msgid ""
-"Really delete this wireless network? The deletion cannot be undone!\\nYou "
+"Really delete this wireless network? The deletion cannot be undone! You "
 "might lose access to this device if you are connected via this network."
 msgstr ""
 
@@ -2580,12 +2589,12 @@ msgid "Really reset all changes?"
 msgstr ""
 
 msgid ""
-"Really shut down network?\\nYou might lose access to this device if you are "
+"Really shut down network? You might lose access to this device if you are "
 "connected via this interface."
 msgstr ""
 
 msgid ""
-"Really shutdown interface \"%s\" ?\\nYou might lose access to this device if "
+"Really shutdown interface \"%s\"You might lose access to this device if "
 "you are connected via this interface."
 msgstr ""
 
@@ -3658,6 +3667,9 @@ msgstr ""
 msgid "bridged"
 msgstr ""
 
+msgid "create"
+msgstr ""
+
 msgid "create:"
 msgstr ""
 
@@ -3746,6 +3758,9 @@ msgstr ""
 msgid "open"
 msgstr ""
 
+msgid "output"
+msgstr ""
+
 msgid "overlay"
 msgstr ""
 
index 3a408e4c7c002215999b59eaa96986cbd268e219..4c4713609bee3dd2ebd6e2794c08e2ef9dcdeb3d 100644 (file)
@@ -49,6 +49,9 @@ msgstr ""
 msgid "-- match by uuid --"
 msgstr ""
 
+msgid "-- please select --"
+msgstr ""
+
 msgid "1 Minute Load:"
 msgstr "Carga a 1 minuto:"
 
@@ -401,6 +404,9 @@ msgstr ""
 msgid "Apply unchecked"
 msgstr ""
 
+msgid "Architecture"
+msgstr ""
+
 msgid ""
 "Assign a part of given length of every public IPv6-prefix to this interface"
 msgstr ""
@@ -415,6 +421,9 @@ msgstr ""
 msgid "Associated Stations"
 msgstr "Estaciones asociadas"
 
+msgid "Associations"
+msgstr ""
+
 msgid "Auth Group"
 msgstr ""
 
@@ -1297,7 +1306,7 @@ msgstr "Espacio libre"
 
 msgid ""
 "Further information about WireGuard interfaces and peers at <a href=\"http://"
-"wireguard.io\">wireguard.io</a>."
+"wireguard.com\">wireguard.com</a>."
 msgstr ""
 
 msgid "GHz"
@@ -1429,8 +1438,8 @@ msgstr "IPv4"
 msgid "IPv4 Firewall"
 msgstr "Cortafuegos IPv4"
 
-msgid "IPv4 WAN Status"
-msgstr "Estado de la WAN IPv4"
+msgid "IPv4 Upstream"
+msgstr ""
 
 msgid "IPv4 address"
 msgstr "Dirección IPv4"
@@ -1480,8 +1489,8 @@ msgstr ""
 msgid "IPv6 ULA-Prefix"
 msgstr ""
 
-msgid "IPv6 WAN Status"
-msgstr "Estado de la WAN IPv6"
+msgid "IPv6 Upstream"
+msgstr ""
 
 msgid "IPv6 address"
 msgstr "Dirección IPv6"
@@ -2609,8 +2618,8 @@ msgstr ""
 "\"Dynamic Host Configuration Protocol\">DHCP</abbr>"
 
 msgid ""
-"Really delete this interface? The deletion cannot be undone!\\nYou might "
-"lose access to this device if you are connected via this interface."
+"Really delete this interface? The deletion cannot be undone! You might lose "
+"access to this device if you are connected via this interface."
 msgstr ""
 "¿Está seguro de borrar esta interfaz?. ¡No será posible deshacer el "
 "borrado!\n"
@@ -2618,7 +2627,7 @@ msgstr ""
 "interfaz."
 
 msgid ""
-"Really delete this wireless network? The deletion cannot be undone!\\nYou "
+"Really delete this wireless network? The deletion cannot be undone! You "
 "might lose access to this device if you are connected via this network."
 msgstr ""
 "¿Está seguro de borrar esta red inalámbrica?. ¡No será posible deshacer el "
@@ -2630,14 +2639,14 @@ msgstr "¿Está seguro de querer reiniciar todos los cambios?"
 
 #, fuzzy
 msgid ""
-"Really shut down network?\\nYou might lose access to this device if you are "
+"Really shut down network? You might lose access to this device if you are "
 "connected via this interface."
 msgstr ""
 "¿Está seguro de querer apagar esta red?.\n"
 "Puede perder el acceso a este dispositivo si está conectado por esta red."
 
 msgid ""
-"Really shutdown interface \"%s\" ?\\nYou might lose access to this device if "
+"Really shutdown interface \"%s\"You might lose access to this device if "
 "you are connected via this interface."
 msgstr ""
 "¿Está seguro de apagar la interfaz \"%s\"?.\n"
@@ -3776,6 +3785,9 @@ msgstr "baseT"
 msgid "bridged"
 msgstr "puenteado"
 
+msgid "create"
+msgstr ""
+
 msgid "create:"
 msgstr "crear:"
 
@@ -3864,6 +3876,9 @@ msgstr "activo"
 msgid "open"
 msgstr "abierto"
 
+msgid "output"
+msgstr ""
+
 msgid "overlay"
 msgstr ""
 
@@ -3915,6 +3930,12 @@ msgstr "sí"
 msgid "« Back"
 msgstr "« Volver"
 
+#~ msgid "IPv4 WAN Status"
+#~ msgstr "Estado de la WAN IPv4"
+
+#~ msgid "IPv6 WAN Status"
+#~ msgstr "Estado de la WAN IPv6"
+
 #~ msgid "Apply"
 #~ msgstr "Aplicar"
 
index 777117f3e639ed28ac7ce5faee3f33349a5f14d4..d6e7ccf6bc6b95d10a1eebd3ef2e853a92778871 100644 (file)
@@ -49,6 +49,9 @@ msgstr ""
 msgid "-- match by uuid --"
 msgstr ""
 
+msgid "-- please select --"
+msgstr ""
+
 msgid "1 Minute Load:"
 msgstr "Charge sur 1 minute :"
 
@@ -407,6 +410,9 @@ msgstr ""
 msgid "Apply unchecked"
 msgstr ""
 
+msgid "Architecture"
+msgstr ""
+
 msgid ""
 "Assign a part of given length of every public IPv6-prefix to this interface"
 msgstr ""
@@ -421,6 +427,9 @@ msgstr ""
 msgid "Associated Stations"
 msgstr "Équipements associés"
 
+msgid "Associations"
+msgstr ""
+
 msgid "Auth Group"
 msgstr ""
 
@@ -1308,7 +1317,7 @@ msgstr "Espace libre"
 
 msgid ""
 "Further information about WireGuard interfaces and peers at <a href=\"http://"
-"wireguard.io\">wireguard.io</a>."
+"wireguard.com\">wireguard.com</a>."
 msgstr ""
 
 msgid "GHz"
@@ -1441,8 +1450,8 @@ msgstr "IPv4"
 msgid "IPv4 Firewall"
 msgstr "Pare-feu IPv4"
 
-msgid "IPv4 WAN Status"
-msgstr "État IPv4 du WAN"
+msgid "IPv4 Upstream"
+msgstr ""
 
 msgid "IPv4 address"
 msgstr "Adresse IPv4"
@@ -1492,8 +1501,8 @@ msgstr ""
 msgid "IPv6 ULA-Prefix"
 msgstr ""
 
-msgid "IPv6 WAN Status"
-msgstr "État IPv6 du WAN"
+msgid "IPv6 Upstream"
+msgstr ""
 
 msgid "IPv6 address"
 msgstr "Adresse IPv6"
@@ -2620,8 +2629,8 @@ msgid ""
 msgstr "Lire /etc/ethers pour configurer le serveur DHCP"
 
 msgid ""
-"Really delete this interface? The deletion cannot be undone!\\nYou might "
-"lose access to this device if you are connected via this interface."
+"Really delete this interface? The deletion cannot be undone! You might lose "
+"access to this device if you are connected via this interface."
 msgstr ""
 "Voulez-vous vraiment supprimer cette interface? L'effacement ne peut être "
 "annulé!\n"
@@ -2629,7 +2638,7 @@ msgstr ""
 "cette interface."
 
 msgid ""
-"Really delete this wireless network? The deletion cannot be undone!\\nYou "
+"Really delete this wireless network? The deletion cannot be undone! You "
 "might lose access to this device if you are connected via this network."
 msgstr ""
 "Voulez-vous vraiment supprimer ce réseau sans-fil? L'effacement ne peut être "
@@ -2641,7 +2650,7 @@ msgid "Really reset all changes?"
 msgstr "Voulez-vous vraiment ré-initialiser toutes les modifications ?"
 
 msgid ""
-"Really shut down network?\\nYou might lose access to this device if you are "
+"Really shut down network? You might lose access to this device if you are "
 "connected via this interface."
 msgstr ""
 "Voulez-vous vraiment arrêter l'interface %s ?\n"
@@ -2649,7 +2658,7 @@ msgstr ""
 "cette interface."
 
 msgid ""
-"Really shutdown interface \"%s\" ?\\nYou might lose access to this device if "
+"Really shutdown interface \"%s\"You might lose access to this device if "
 "you are connected via this interface."
 msgstr ""
 "Voulez-vous vraiment arrêter l'interface %s ?\n"
@@ -3796,6 +3805,9 @@ msgstr "baseT"
 msgid "bridged"
 msgstr "ponté"
 
+msgid "create"
+msgstr ""
+
 msgid "create:"
 msgstr "créer:"
 
@@ -3882,6 +3894,9 @@ msgstr "Actif"
 msgid "open"
 msgstr "ouvrir"
 
+msgid "output"
+msgstr ""
+
 msgid "overlay"
 msgstr ""
 
@@ -3933,6 +3948,12 @@ msgstr "oui"
 msgid "« Back"
 msgstr "« Retour"
 
+#~ msgid "IPv4 WAN Status"
+#~ msgstr "État IPv4 du WAN"
+
+#~ msgid "IPv6 WAN Status"
+#~ msgstr "État IPv6 du WAN"
+
 #~ msgid "Apply"
 #~ msgstr "Appliquer"
 
index 5a179a30635ce38c701d49c3d95f9bbf9defe07c..a8adc1038a76a6979df601c2434c7d61dcedfbd4 100644 (file)
@@ -47,6 +47,9 @@ msgstr ""
 msgid "-- match by uuid --"
 msgstr ""
 
+msgid "-- please select --"
+msgstr ""
+
 msgid "1 Minute Load:"
 msgstr "עומס במשך דקה:"
 
@@ -396,6 +399,9 @@ msgstr ""
 msgid "Apply unchecked"
 msgstr ""
 
+msgid "Architecture"
+msgstr ""
+
 msgid ""
 "Assign a part of given length of every public IPv6-prefix to this interface"
 msgstr ""
@@ -410,6 +416,9 @@ msgstr ""
 msgid "Associated Stations"
 msgstr "תחנות קשורות"
 
+msgid "Associations"
+msgstr ""
+
 msgid "Auth Group"
 msgstr ""
 
@@ -1263,7 +1272,7 @@ msgstr ""
 
 msgid ""
 "Further information about WireGuard interfaces and peers at <a href=\"http://"
-"wireguard.io\">wireguard.io</a>."
+"wireguard.com\">wireguard.com</a>."
 msgstr ""
 
 msgid "GHz"
@@ -1390,7 +1399,7 @@ msgstr ""
 msgid "IPv4 Firewall"
 msgstr ""
 
-msgid "IPv4 WAN Status"
+msgid "IPv4 Upstream"
 msgstr ""
 
 msgid "IPv4 address"
@@ -1441,7 +1450,7 @@ msgstr ""
 msgid "IPv6 ULA-Prefix"
 msgstr ""
 
-msgid "IPv6 WAN Status"
+msgid "IPv6 Upstream"
 msgstr ""
 
 msgid "IPv6 address"
@@ -2532,12 +2541,12 @@ msgid ""
 msgstr ""
 
 msgid ""
-"Really delete this interface? The deletion cannot be undone!\\nYou might "
-"lose access to this device if you are connected via this interface."
+"Really delete this interface? The deletion cannot be undone! You might lose "
+"access to this device if you are connected via this interface."
 msgstr ""
 
 msgid ""
-"Really delete this wireless network? The deletion cannot be undone!\\nYou "
+"Really delete this wireless network? The deletion cannot be undone! You "
 "might lose access to this device if you are connected via this network."
 msgstr ""
 
@@ -2546,14 +2555,14 @@ msgstr ""
 
 #, fuzzy
 msgid ""
-"Really shut down network?\\nYou might lose access to this device if you are "
+"Really shut down network? You might lose access to this device if you are "
 "connected via this interface."
 msgstr ""
 "האם למחוק את הרשת האלחוטית הזו? המחיקה אינה ניתנת לביטול!\n"
 "ייתכן ותאבד גישה לנתב הזה אם אתה מחובר דרך השרת הזו."
 
 msgid ""
-"Really shutdown interface \"%s\" ?\\nYou might lose access to this device if "
+"Really shutdown interface \"%s\"You might lose access to this device if "
 "you are connected via this interface."
 msgstr ""
 
@@ -3611,6 +3620,9 @@ msgstr ""
 msgid "bridged"
 msgstr ""
 
+msgid "create"
+msgstr ""
+
 msgid "create:"
 msgstr ""
 
@@ -3697,6 +3709,9 @@ msgstr "פועל"
 msgid "open"
 msgstr ""
 
+msgid "output"
+msgstr ""
+
 msgid "overlay"
 msgstr ""
 
index f8cee36c434ecc4304ed96f5c080619d81f9f971..57f9c45abe7ca3d35b9bdfeeae2b589aa550b7af 100644 (file)
@@ -47,6 +47,9 @@ msgstr ""
 msgid "-- match by uuid --"
 msgstr ""
 
+msgid "-- please select --"
+msgstr ""
+
 msgid "1 Minute Load:"
 msgstr "Terhelés (utolsó 1 perc):"
 
@@ -400,6 +403,9 @@ msgstr ""
 msgid "Apply unchecked"
 msgstr ""
 
+msgid "Architecture"
+msgstr ""
+
 msgid ""
 "Assign a part of given length of every public IPv6-prefix to this interface"
 msgstr ""
@@ -414,6 +420,9 @@ msgstr ""
 msgid "Associated Stations"
 msgstr "Kapcsolódó kliensek"
 
+msgid "Associations"
+msgstr ""
+
 msgid "Auth Group"
 msgstr ""
 
@@ -1299,7 +1308,7 @@ msgstr "Szabad hely"
 
 msgid ""
 "Further information about WireGuard interfaces and peers at <a href=\"http://"
-"wireguard.io\">wireguard.io</a>."
+"wireguard.com\">wireguard.com</a>."
 msgstr ""
 
 msgid "GHz"
@@ -1430,8 +1439,8 @@ msgstr "IPv4"
 msgid "IPv4 Firewall"
 msgstr "IPv4 tűzfal"
 
-msgid "IPv4 WAN Status"
-msgstr "IPv4 WAN állapot"
+msgid "IPv4 Upstream"
+msgstr ""
 
 msgid "IPv4 address"
 msgstr "IPv4 cím"
@@ -1481,8 +1490,8 @@ msgstr ""
 msgid "IPv6 ULA-Prefix"
 msgstr ""
 
-msgid "IPv6 WAN Status"
-msgstr "IPv6 WAN állapot"
+msgid "IPv6 Upstream"
+msgstr ""
 
 msgid "IPv6 address"
 msgstr "IPv6 cím"
@@ -2612,15 +2621,15 @@ msgstr ""
 "Configuration Protocol\">DHCP</abbr> kiszolgáló beállításához"
 
 msgid ""
-"Really delete this interface? The deletion cannot be undone!\\nYou might "
-"lose access to this device if you are connected via this interface."
+"Really delete this interface? The deletion cannot be undone! You might lose "
+"access to this device if you are connected via this interface."
 msgstr ""
 "Biztosan törli az interfészt? A törlés nem visszavonható!\n"
 " Lehet, hogy elveszti a hozzáférést az eszközhöz, amennyiben ezen az "
 "interfészen keresztül kapcsolódik."
 
 msgid ""
-"Really delete this wireless network? The deletion cannot be undone!\\nYou "
+"Really delete this wireless network? The deletion cannot be undone! You "
 "might lose access to this device if you are connected via this network."
 msgstr ""
 "Biztosan törli ezt a vezetéknélküli hálózatot? A törlés nem visszavonható!\n"
@@ -2632,7 +2641,7 @@ msgstr "Biztos, hogy visszavonja az összes módosítást?"
 
 #, fuzzy
 msgid ""
-"Really shut down network?\\nYou might lose access to this device if you are "
+"Really shut down network? You might lose access to this device if you are "
 "connected via this interface."
 msgstr ""
 "Biztos, hogy leállítja a hálózatot?!\n"
@@ -2640,7 +2649,7 @@ msgstr ""
 "hálózaton keresztül kapcsolódik."
 
 msgid ""
-"Really shutdown interface \"%s\" ?\\nYou might lose access to this device if "
+"Really shutdown interface \"%s\"You might lose access to this device if "
 "you are connected via this interface."
 msgstr ""
 "Biztos, hogy leállítja a \"%s\" interfészt?\n"
@@ -3783,6 +3792,9 @@ msgstr "baseT"
 msgid "bridged"
 msgstr "áthidalt"
 
+msgid "create"
+msgstr ""
+
 msgid "create:"
 msgstr "új:"
 
@@ -3871,6 +3883,9 @@ msgstr "be"
 msgid "open"
 msgstr "nyitás"
 
+msgid "output"
+msgstr ""
+
 msgid "overlay"
 msgstr ""
 
@@ -3922,6 +3937,12 @@ msgstr "igen"
 msgid "« Back"
 msgstr "« Vissza"
 
+#~ msgid "IPv4 WAN Status"
+#~ msgstr "IPv4 WAN állapot"
+
+#~ msgid "IPv6 WAN Status"
+#~ msgstr "IPv6 WAN állapot"
+
 #~ msgid "Apply"
 #~ msgstr "Alkalmaz"
 
index 0bc37e4d0c9336d2ad22ebb10d45a94c3f8b7566..214a73f568a70c7af455a5c925df38d17b9c44f5 100644 (file)
@@ -49,6 +49,9 @@ msgstr ""
 msgid "-- match by uuid --"
 msgstr ""
 
+msgid "-- please select --"
+msgstr ""
+
 msgid "1 Minute Load:"
 msgstr "Carico in 1 minuto:"
 
@@ -409,6 +412,9 @@ msgstr ""
 msgid "Apply unchecked"
 msgstr ""
 
+msgid "Architecture"
+msgstr ""
+
 msgid ""
 "Assign a part of given length of every public IPv6-prefix to this interface"
 msgstr ""
@@ -423,6 +429,9 @@ msgstr ""
 msgid "Associated Stations"
 msgstr "Dispositivi Wi-Fi connessi"
 
+msgid "Associations"
+msgstr ""
+
 msgid "Auth Group"
 msgstr ""
 
@@ -1301,7 +1310,7 @@ msgstr "Spazio libero"
 
 msgid ""
 "Further information about WireGuard interfaces and peers at <a href=\"http://"
-"wireguard.io\">wireguard.io</a>."
+"wireguard.com\">wireguard.com</a>."
 msgstr ""
 
 msgid "GHz"
@@ -1435,8 +1444,8 @@ msgstr "IPv4"
 msgid "IPv4 Firewall"
 msgstr "IPv4 Firewall"
 
-msgid "IPv4 WAN Status"
-msgstr "Stato WAN IPv4"
+msgid "IPv4 Upstream"
+msgstr ""
 
 msgid "IPv4 address"
 msgstr "Indirizzi IPv4"
@@ -1486,8 +1495,8 @@ msgstr "Impostazioni IPv6"
 msgid "IPv6 ULA-Prefix"
 msgstr ""
 
-msgid "IPv6 WAN Status"
-msgstr "Stato WAN IPv6"
+msgid "IPv6 Upstream"
+msgstr ""
 
 msgid "IPv6 address"
 msgstr "Indirizzi IPv6"
@@ -2610,32 +2619,35 @@ msgstr ""
 "\"Dynamic Host Configuration Protocol\">DHCP</abbr>"
 
 msgid ""
-"Really delete this interface? The deletion cannot be undone!\\nYou might "
-"lose access to this device if you are connected via this interface."
+"Really delete this interface? The deletion cannot be undone! You might lose "
+"access to this device if you are connected via this interface."
 msgstr ""
+"Vuoi davvero rimuovere questa interfaccia? La rimozione non può essere ripristinata! "
+"Potresti perdere l'accesso a questo dispositivo se sei connesso con questa rete."
 
 msgid ""
-"Really delete this wireless network? The deletion cannot be undone!\\nYou "
+"Really delete this wireless network? The deletion cannot be undone! You "
 "might lose access to this device if you are connected via this network."
 msgstr ""
+"Vuoi davvero rimuovere questa interfaccia wireless? La rimozione non può essere ripristinata! "
+"Potresti perdere l'accesso a questo dispositivo se sei connesso con questa rete."
 
 msgid "Really reset all changes?"
 msgstr "Azzerare veramente tutte le modifiche?"
 
-#, fuzzy
 msgid ""
-"Really shut down network?\\nYou might lose access to this device if you are "
+"Really shut down network? You might lose access to this device if you are "
 "connected via this interface."
 msgstr ""
-"Vuoi davvero spegnere questa interfaccia?\\nPotresti perdere "
-"l'accesso a questo router se sei connesso usando questa interfaccia."
+"Vuoi davvero spegnere questa interfaccia? Potresti perdere l'accesso a "
+"questo router se sei connesso usando questa interfaccia."
 
 msgid ""
-"Really shutdown interface \"%s\" ?\\nYou might lose access to this device if "
+"Really shutdown interface \"%s\"You might lose access to this device if "
 "you are connected via this interface."
 msgstr ""
-"Vuoi davvero spegnere questa interfaccia \"%s\" ?\\nPotresti perdere "
-"l'accesso a questo router se stai usando questa interfaccia."
+"Vuoi davvero spegnere questa interfaccia \"%s\"? Potresti perdere l'accesso "
+"a questo router se stai usando questa interfaccia."
 
 msgid "Really switch protocol?"
 msgstr "Cambiare veramente il protocollo?"
@@ -3745,6 +3757,9 @@ msgstr "baseT"
 msgid "bridged"
 msgstr "ponte"
 
+msgid "create"
+msgstr ""
+
 msgid "create:"
 msgstr "crea:"
 
@@ -3833,6 +3848,9 @@ msgstr "acceso"
 msgid "open"
 msgstr "apri"
 
+msgid "output"
+msgstr ""
+
 msgid "overlay"
 msgstr ""
 
@@ -3884,3 +3902,8 @@ msgstr "Sì"
 msgid "« Back"
 msgstr "« Indietro"
 
+#~ msgid "IPv4 WAN Status"
+#~ msgstr "Stato WAN IPv4"
+
+#~ msgid "IPv6 WAN Status"
+#~ msgstr "Stato WAN IPv6"
index ed36969885c343933b1bd339dc01dc12fcbac073..75a18b746abfa000479a8e0a83ac74001af8fff1 100644 (file)
@@ -3,7 +3,7 @@ msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2009-06-10 03:40+0200\n"
-"PO-Revision-Date: 2018-05-21 00:47+0900\n"
+"PO-Revision-Date: 2018-06-01 02:42+0900\n"
 "Last-Translator: INAGAKI Hiroshi <musashino.open@gmail.com>\n"
 "Language: ja\n"
 "MIME-Version: 1.0\n"
@@ -49,6 +49,9 @@ msgstr "-- ラベルを指定 --"
 msgid "-- match by uuid --"
 msgstr "-- UUID を指定 --"
 
+msgid "-- please select --"
+msgstr ""
+
 msgid "1 Minute Load:"
 msgstr "過去1分の負荷:"
 
@@ -401,6 +404,9 @@ msgstr "適用リクエストはステータス <code>%h</code> により失敗
 msgid "Apply unchecked"
 msgstr "チェックなしの適用"
 
+msgid "Architecture"
+msgstr "アーキテクチャ"
+
 msgid ""
 "Assign a part of given length of every public IPv6-prefix to this interface"
 msgstr ""
@@ -415,6 +421,9 @@ msgstr ""
 msgid "Associated Stations"
 msgstr "認証済み端末"
 
+msgid "Associations"
+msgstr "アソシエーション数"
+
 msgid "Auth Group"
 msgstr "認証グループ"
 
@@ -580,7 +589,7 @@ msgid "Changes applied."
 msgstr "変更が適用されました。"
 
 msgid "Changes have been reverted."
-msgstr ""
+msgstr "変更は取り消されました。"
 
 msgid "Changes the administrator password for accessing the device"
 msgstr "デバイスの管理者パスワードを変更します"
@@ -1315,10 +1324,10 @@ msgstr "ディスクの空き容量"
 
 msgid ""
 "Further information about WireGuard interfaces and peers at <a href=\"http://"
-"wireguard.io\">wireguard.io</a>."
+"wireguard.com\">wireguard.com</a>."
 msgstr ""
 "WireGuard インターフェースとピアについての詳細情報: <a href=\"http://"
-"wireguard.io\">wireguard.io</a>"
+"wireguard.com\">wireguard.com</a>"
 
 msgid "GHz"
 msgstr "GHz"
@@ -1446,8 +1455,8 @@ msgstr "IPv4"
 msgid "IPv4 Firewall"
 msgstr "IPv4 ファイアウォール"
 
-msgid "IPv4 WAN Status"
-msgstr "IPv4 WAN ステータス"
+msgid "IPv4 Upstream"
+msgstr "IPv4 アップストリーム"
 
 msgid "IPv4 address"
 msgstr "IPv4 アドレス"
@@ -1497,8 +1506,8 @@ msgstr "IPv6 設定"
 msgid "IPv6 ULA-Prefix"
 msgstr "IPv6 ULA-プレフィクス"
 
-msgid "IPv6 WAN Status"
-msgstr "IPv6 WAN ステータス"
+msgid "IPv6 Upstream"
+msgstr "IPv6 アップストリーム"
 
 msgid "IPv6 address"
 msgstr "IPv6 アドレス"
@@ -2635,8 +2644,8 @@ msgstr ""
 "として<code>/etc/ethers</code> をロードします"
 
 msgid ""
-"Really delete this interface? The deletion cannot be undone!\\nYou might "
-"lose access to this device if you are connected via this interface."
+"Really delete this interface? The deletion cannot be undone! You might lose "
+"access to this device if you are connected via this interface."
 msgstr ""
 "本当にこのインターフェースを削除しますか?一度削除すると、元に戻すことはできま"
 "せん!\n"
@@ -2644,7 +2653,7 @@ msgstr ""
 "る場合があります。"
 
 msgid ""
-"Really delete this wireless network? The deletion cannot be undone!\\nYou "
+"Really delete this wireless network? The deletion cannot be undone! You "
 "might lose access to this device if you are connected via this network."
 msgstr ""
 "本当にこの無線ネットワークを削除しますか?一度削除すると、元に戻すことはできま"
@@ -2656,7 +2665,7 @@ msgid "Really reset all changes?"
 msgstr "本当に全ての変更をリセットしますか?"
 
 msgid ""
-"Really shut down network?\\nYou might lose access to this device if you are "
+"Really shut down network? You might lose access to this device if you are "
 "connected via this interface."
 msgstr ""
 "本当にネットワークを停止しますか?\n"
@@ -2664,7 +2673,7 @@ msgstr ""
 "合があります。"
 
 msgid ""
-"Really shutdown interface \"%s\" ?\\nYou might lose access to this device if "
+"Really shutdown interface \"%s\"You might lose access to this device if "
 "you are connected via this interface."
 msgstr ""
 "本当にインターフェース \"%s\" を停止しますか?\n"
@@ -3807,6 +3816,9 @@ msgstr "baseT"
 msgid "bridged"
 msgstr "ブリッジ"
 
+msgid "create"
+msgstr ""
+
 msgid "create:"
 msgstr "作成:"
 
@@ -3895,6 +3907,9 @@ msgstr "オン"
 msgid "open"
 msgstr "オープン"
 
+msgid "output"
+msgstr ""
+
 msgid "overlay"
 msgstr "オーバーレイ"
 
index 50dc84e4d1be08acc601fb05989910fad509a58d..2206a87ceb0e2942f5b82dde235f01e148245e55 100644 (file)
@@ -49,6 +49,9 @@ msgstr ""
 msgid "-- match by uuid --"
 msgstr ""
 
+msgid "-- please select --"
+msgstr ""
+
 msgid "1 Minute Load:"
 msgstr "1 분 부하:"
 
@@ -389,6 +392,9 @@ msgstr ""
 msgid "Apply unchecked"
 msgstr ""
 
+msgid "Architecture"
+msgstr ""
+
 msgid ""
 "Assign a part of given length of every public IPv6-prefix to this interface"
 msgstr ""
@@ -403,6 +409,9 @@ msgstr ""
 msgid "Associated Stations"
 msgstr "연결된 station 들"
 
+msgid "Associations"
+msgstr ""
+
 msgid "Auth Group"
 msgstr ""
 
@@ -1276,7 +1285,7 @@ msgstr "여유 공간"
 
 msgid ""
 "Further information about WireGuard interfaces and peers at <a href=\"http://"
-"wireguard.io\">wireguard.io</a>."
+"wireguard.com\">wireguard.com</a>."
 msgstr ""
 
 msgid "GHz"
@@ -1406,8 +1415,8 @@ msgstr ""
 msgid "IPv4 Firewall"
 msgstr "IPv4 방화벽"
 
-msgid "IPv4 WAN Status"
-msgstr "IPv4 WAN 상태"
+msgid "IPv4 Upstream"
+msgstr ""
 
 msgid "IPv4 address"
 msgstr "IPv4 주소"
@@ -1457,8 +1466,8 @@ msgstr "IPv6 설정"
 msgid "IPv6 ULA-Prefix"
 msgstr ""
 
-msgid "IPv6 WAN Status"
-msgstr "IPv6 WAN 상태"
+msgid "IPv6 Upstream"
+msgstr ""
 
 msgid "IPv6 address"
 msgstr ""
@@ -2560,12 +2569,12 @@ msgstr ""
 "Configuration Protocol\">DHCP</abbr>-서버를 설정합니다"
 
 msgid ""
-"Really delete this interface? The deletion cannot be undone!\\nYou might "
-"lose access to this device if you are connected via this interface."
+"Really delete this interface? The deletion cannot be undone! You might lose "
+"access to this device if you are connected via this interface."
 msgstr ""
 
 msgid ""
-"Really delete this wireless network? The deletion cannot be undone!\\nYou "
+"Really delete this wireless network? The deletion cannot be undone! You "
 "might lose access to this device if you are connected via this network."
 msgstr ""
 
@@ -2573,14 +2582,14 @@ msgid "Really reset all changes?"
 msgstr ""
 
 msgid ""
-"Really shut down network?\\nYou might lose access to this device if you are "
+"Really shut down network? You might lose access to this device if you are "
 "connected via this interface."
 msgstr ""
 "정말로 네트워크를 shutdown 하시겠습니까?\\n이 인터페이스를 통해 연결하였다면 "
 "접속이 끊어질 수 있습니다."
 
 msgid ""
-"Really shutdown interface \"%s\" ?\\nYou might lose access to this device if "
+"Really shutdown interface \"%s\"You might lose access to this device if "
 "you are connected via this interface."
 msgstr ""
 
@@ -3667,6 +3676,9 @@ msgstr ""
 msgid "bridged"
 msgstr ""
 
+msgid "create"
+msgstr ""
+
 msgid "create:"
 msgstr ""
 
@@ -3755,6 +3767,9 @@ msgstr ""
 msgid "open"
 msgstr ""
 
+msgid "output"
+msgstr ""
+
 msgid "overlay"
 msgstr ""
 
@@ -3806,6 +3821,12 @@ msgstr ""
 msgid "« Back"
 msgstr ""
 
+#~ msgid "IPv4 WAN Status"
+#~ msgstr "IPv4 WAN 상태"
+
+#~ msgid "IPv6 WAN Status"
+#~ msgstr "IPv6 WAN 상태"
+
 #~ msgid "Apply"
 #~ msgstr "적용"
 
index 3f73db88f4a21d10f158d197dff8153a5af5d949..79c66e1306f1c18b1ed67ee7b0c5dd5b76b4ccd8 100644 (file)
@@ -49,6 +49,9 @@ msgstr ""
 msgid "-- match by uuid --"
 msgstr ""
 
+msgid "-- please select --"
+msgstr ""
+
 msgid "1 Minute Load:"
 msgstr ""
 
@@ -384,6 +387,9 @@ msgstr ""
 msgid "Apply unchecked"
 msgstr ""
 
+msgid "Architecture"
+msgstr ""
+
 msgid ""
 "Assign a part of given length of every public IPv6-prefix to this interface"
 msgstr ""
@@ -398,6 +404,9 @@ msgstr ""
 msgid "Associated Stations"
 msgstr "Associated Stesen"
 
+msgid "Associations"
+msgstr ""
+
 msgid "Auth Group"
 msgstr ""
 
@@ -1248,7 +1257,7 @@ msgstr ""
 
 msgid ""
 "Further information about WireGuard interfaces and peers at <a href=\"http://"
-"wireguard.io\">wireguard.io</a>."
+"wireguard.com\">wireguard.com</a>."
 msgstr ""
 
 msgid "GHz"
@@ -1377,7 +1386,7 @@ msgstr ""
 msgid "IPv4 Firewall"
 msgstr ""
 
-msgid "IPv4 WAN Status"
+msgid "IPv4 Upstream"
 msgstr ""
 
 msgid "IPv4 address"
@@ -1428,7 +1437,7 @@ msgstr ""
 msgid "IPv6 ULA-Prefix"
 msgstr ""
 
-msgid "IPv6 WAN Status"
+msgid "IPv6 Upstream"
 msgstr ""
 
 msgid "IPv6 address"
@@ -2536,12 +2545,12 @@ msgid ""
 msgstr "Baca /etc/ethers untuk mengkonfigurasikan DHCP-Server"
 
 msgid ""
-"Really delete this interface? The deletion cannot be undone!\\nYou might "
-"lose access to this device if you are connected via this interface."
+"Really delete this interface? The deletion cannot be undone! You might lose "
+"access to this device if you are connected via this interface."
 msgstr ""
 
 msgid ""
-"Really delete this wireless network? The deletion cannot be undone!\\nYou "
+"Really delete this wireless network? The deletion cannot be undone! You "
 "might lose access to this device if you are connected via this network."
 msgstr ""
 
@@ -2549,12 +2558,12 @@ msgid "Really reset all changes?"
 msgstr ""
 
 msgid ""
-"Really shut down network?\\nYou might lose access to this device if you are "
+"Really shut down network? You might lose access to this device if you are "
 "connected via this interface."
 msgstr ""
 
 msgid ""
-"Really shutdown interface \"%s\" ?\\nYou might lose access to this device if "
+"Really shutdown interface \"%s\"You might lose access to this device if "
 "you are connected via this interface."
 msgstr ""
 
@@ -3628,6 +3637,9 @@ msgstr ""
 msgid "bridged"
 msgstr ""
 
+msgid "create"
+msgstr ""
+
 msgid "create:"
 msgstr ""
 
@@ -3714,6 +3726,9 @@ msgstr ""
 msgid "open"
 msgstr ""
 
+msgid "output"
+msgstr ""
+
 msgid "overlay"
 msgstr ""
 
index d938c540fc397ec436c04947704bb95528fd9c7e..5fd40001ec1af341ef691b9696df1c8c1d669d87 100644 (file)
@@ -44,6 +44,9 @@ msgstr ""
 msgid "-- match by uuid --"
 msgstr ""
 
+msgid "-- please select --"
+msgstr ""
+
 msgid "1 Minute Load:"
 msgstr "1 minutts belastning:"
 
@@ -393,6 +396,9 @@ msgstr ""
 msgid "Apply unchecked"
 msgstr ""
 
+msgid "Architecture"
+msgstr ""
+
 msgid ""
 "Assign a part of given length of every public IPv6-prefix to this interface"
 msgstr ""
@@ -407,6 +413,9 @@ msgstr ""
 msgid "Associated Stations"
 msgstr "Tilkoblede Klienter"
 
+msgid "Associations"
+msgstr ""
+
 msgid "Auth Group"
 msgstr ""
 
@@ -1285,7 +1294,7 @@ msgstr "Ledig plass"
 
 msgid ""
 "Further information about WireGuard interfaces and peers at <a href=\"http://"
-"wireguard.io\">wireguard.io</a>."
+"wireguard.com\">wireguard.com</a>."
 msgstr ""
 
 msgid "GHz"
@@ -1416,8 +1425,8 @@ msgstr "IPv4"
 msgid "IPv4 Firewall"
 msgstr "IPv4 Brannmur"
 
-msgid "IPv4 WAN Status"
-msgstr "IPv4 WAN Status"
+msgid "IPv4 Upstream"
+msgstr ""
 
 msgid "IPv4 address"
 msgstr "IPv4 adresse"
@@ -1467,8 +1476,8 @@ msgstr ""
 msgid "IPv6 ULA-Prefix"
 msgstr ""
 
-msgid "IPv6 WAN Status"
-msgstr "IPv6 WAN Status"
+msgid "IPv6 Upstream"
+msgstr ""
 
 msgid "IPv6 address"
 msgstr "IPv6 adresse"
@@ -2587,15 +2596,15 @@ msgstr ""
 "Configuration Protocol\">DHCP</abbr>-Server"
 
 msgid ""
-"Really delete this interface? The deletion cannot be undone!\\nYou might "
-"lose access to this device if you are connected via this interface."
+"Really delete this interface? The deletion cannot be undone! You might lose "
+"access to this device if you are connected via this interface."
 msgstr ""
 "Fjerne dette grensesnittet? Slettingen kan ikke omgjøres!\n"
 "Du kan miste kontakten med ruteren om du er tilkoblet via dette "
 "grensesnittet."
 
 msgid ""
-"Really delete this wireless network? The deletion cannot be undone!\\nYou "
+"Really delete this wireless network? The deletion cannot be undone! You "
 "might lose access to this device if you are connected via this network."
 msgstr ""
 "Fjerne dette trådløse nettverket? Slettingen kan ikke omgjøres!\n"
@@ -2606,7 +2615,7 @@ msgstr "Vil du nullstille alle endringer?"
 
 #, fuzzy
 msgid ""
-"Really shut down network?\\nYou might lose access to this device if you are "
+"Really shut down network? You might lose access to this device if you are "
 "connected via this interface."
 msgstr ""
 "Slå av dette nettverket ?\n"
@@ -2614,7 +2623,7 @@ msgstr ""
 "grensesnittet."
 
 msgid ""
-"Really shutdown interface \"%s\" ?\\nYou might lose access to this device if "
+"Really shutdown interface \"%s\"You might lose access to this device if "
 "you are connected via this interface."
 msgstr ""
 "Slå av dette grensesnittet \"%s\" ?\n"
@@ -3748,6 +3757,9 @@ msgstr "baseT"
 msgid "bridged"
 msgstr "brokoblet"
 
+msgid "create"
+msgstr ""
+
 msgid "create:"
 msgstr "opprett:"
 
@@ -3836,6 +3848,9 @@ msgstr "på"
 msgid "open"
 msgstr "åpen"
 
+msgid "output"
+msgstr ""
+
 msgid "overlay"
 msgstr ""
 
@@ -3887,6 +3902,12 @@ msgstr "ja"
 msgid "« Back"
 msgstr "« Tilbake"
 
+#~ msgid "IPv4 WAN Status"
+#~ msgstr "IPv4 WAN Status"
+
+#~ msgid "IPv6 WAN Status"
+#~ msgstr "IPv6 WAN Status"
+
 #~ msgid "Apply"
 #~ msgstr "Bruk"
 
index bf43720174b8f50bb1b19624c4491515f2f6e55d..9d685c58c0b7b0a0968d45fcc472a29669bb6c5e 100644 (file)
@@ -3,7 +3,7 @@ msgstr ""
 "Project-Id-Version: LuCI\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2010-04-20 09:40+0200\n"
-"PO-Revision-Date: 2018-05-14 20:05+0200\n"
+"PO-Revision-Date: 2018-06-10 10:05+0200\n"
 "Last-Translator: Rixerx <krystian.kozak20@gmail.com>\n"
 "Language-Team: Polish\n"
 "Language: pl\n"
@@ -50,6 +50,9 @@ msgstr "-- dopasuj po etykiecie --"
 msgid "-- match by uuid --"
 msgstr "-- dopasuj po uuid --"
 
+msgid "-- please select --"
+msgstr ""
+
 msgid "1 Minute Load:"
 msgstr "Obciążenie 1 min.:"
 
@@ -372,13 +375,13 @@ msgid "Annex M G.992.5"
 msgstr ""
 
 msgid "Announce as default router even if no public prefix is available."
-msgstr ""
+msgstr "Rozgłaszaj jako domyślny router nawet jeśli publiczny prefiks nie jest dostępny."
 
 msgid "Announced DNS domains"
-msgstr ""
+msgstr "Rozgłaszaj domeny DNS"
 
 msgid "Announced DNS servers"
-msgstr ""
+msgstr "Rozgłaszaj serwery DNS"
 
 msgid "Anonymous Identity"
 msgstr ""
@@ -407,9 +410,13 @@ msgstr ""
 msgid "Apply unchecked"
 msgstr ""
 
+msgid "Architecture"
+msgstr "Architektura"
+
 msgid ""
 "Assign a part of given length of every public IPv6-prefix to this interface"
 msgstr ""
+"Przypisz część danej długości każdego publicznego prefiksu IPv6 do tego interfejsu"
 
 msgid "Assign interfaces..."
 msgstr "Przypisz interfejsy..."
@@ -417,10 +424,14 @@ msgstr "Przypisz interfejsy..."
 msgid ""
 "Assign prefix parts using this hexadecimal subprefix ID for this interface."
 msgstr ""
+"Przypisz cześć prefiksu za pomocą szesnastkowego ID subprefiksu dla tego interfejsu"
 
 msgid "Associated Stations"
 msgstr "Połączone stacje"
 
+msgid "Associations"
+msgstr "Połączeni"
+
 msgid "Auth Group"
 msgstr ""
 
@@ -525,7 +536,7 @@ msgid "Bind interface"
 msgstr ""
 
 msgid "Bind only to specific interfaces rather than wildcard address."
-msgstr ""
+msgstr "Powiąż tylko ze specyficznymi interfejsami, a nie z adresami wieloznacznymi."
 
 msgid "Bind the tunnel to this interface (optional)."
 msgstr ""
@@ -687,10 +698,10 @@ msgid "Configuration files will be kept."
 msgstr "Pliki konfiguracyjne zostaną zachowane."
 
 msgid "Configuration has been applied."
-msgstr ""
+msgstr "Konfiguracja została zastosowana."
 
 msgid "Configuration has been rolled back!"
-msgstr ""
+msgstr "Konfiguracja została wycofana!"
 
 msgid "Confirmation"
 msgstr "Potwierdzenie"
@@ -759,6 +770,8 @@ msgid ""
 "Custom files (certificates, scripts) may remain on the system. To prevent "
 "this, perform a factory-reset first."
 msgstr ""
+"Własne pliki (certyfikaty, skrypty) mogą pozostać w systemie. Aby zapobiec "
+"temu, wykonaj najpierw reset do ustawień fabrycznych"
 
 msgid ""
 "Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
@@ -789,10 +802,10 @@ msgid "DHCPv6 client"
 msgstr "Klient DHCPv6"
 
 msgid "DHCPv6-Mode"
-msgstr ""
+msgstr "Tryb DHCPv6"
 
 msgid "DHCPv6-Service"
-msgstr ""
+msgstr "Serwis DHCPv6"
 
 msgid "DNS"
 msgstr "DNS"
@@ -807,7 +820,7 @@ msgid "DNSSEC"
 msgstr ""
 
 msgid "DNSSEC check unsigned"
-msgstr ""
+msgstr "Sprawdzanie DNSSEC bez podpisu"
 
 msgid "DPD Idle Timeout"
 msgstr ""
@@ -840,7 +853,7 @@ msgid "Default gateway"
 msgstr "Brama domyślna"
 
 msgid "Default is stateless + stateful"
-msgstr ""
+msgstr "Domyślnie jest to stateless + stateful"
 
 msgid "Default state"
 msgstr "Stan domyślny"
@@ -1174,13 +1187,13 @@ msgid "External R1 Key Holder List"
 msgstr ""
 
 msgid "External system log server"
-msgstr "Zewnętrzny serwer dla logów systemowych"
+msgstr "Serwer zewnętrzny dla logów systemowych"
 
 msgid "External system log server port"
-msgstr "Port zewnętrznego serwera dla logów systemowych"
+msgstr "Port zewnętrznego serwera logów systemowych"
 
 msgid "External system log server protocol"
-msgstr "Protokół zewnętrznego serwera dla logów systemowych"
+msgstr "Protokół zewnętrznego serwera logów systemowych"
 
 msgid "Extra SSH command options"
 msgstr ""
@@ -1319,7 +1332,7 @@ msgstr "Wolna przestrzeń"
 
 msgid ""
 "Further information about WireGuard interfaces and peers at <a href=\"http://"
-"wireguard.io\">wireguard.io</a>."
+"wireguard.com\">wireguard.com</a>."
 msgstr ""
 
 msgid "GHz"
@@ -1364,7 +1377,7 @@ msgid "Global Settings"
 msgstr ""
 
 msgid "Global network options"
-msgstr ""
+msgstr "Globalne opcje sieciowe"
 
 msgid "Go to password configuration..."
 msgstr "Przejdź do konfiguracji hasła..."
@@ -1455,8 +1468,8 @@ msgstr "IPv4"
 msgid "IPv4 Firewall"
 msgstr "Firewall IPv4"
 
-msgid "IPv4 WAN Status"
-msgstr "Status IPv4 WAN"
+msgid "IPv4 Upstream"
+msgstr "Protokół IPv4"
 
 msgid "IPv4 address"
 msgstr "Adres IPv4"
@@ -1501,22 +1514,22 @@ msgid "IPv6 Neighbours"
 msgstr ""
 
 msgid "IPv6 Settings"
-msgstr ""
+msgstr "Ustawienia IPv6"
 
 msgid "IPv6 ULA-Prefix"
-msgstr ""
+msgstr "IPv6 Prefiks-ULA"
 
-msgid "IPv6 WAN Status"
-msgstr "Status WAN IPv6"
+msgid "IPv6 Upstream"
+msgstr "Protokół IPv6"
 
 msgid "IPv6 address"
 msgstr "Adres IPv6"
 
 msgid "IPv6 assignment hint"
-msgstr ""
+msgstr "Wskazówka przypisania IPv6"
 
 msgid "IPv6 assignment length"
-msgstr ""
+msgstr "Długość przydziału IPv6"
 
 msgid "IPv6 gateway"
 msgstr "Brama IPv6"
@@ -1534,7 +1547,7 @@ msgid "IPv6 routed prefix"
 msgstr ""
 
 msgid "IPv6 suffix"
-msgstr ""
+msgstr "Sufiks IPv6"
 
 msgid "IPv6-Address"
 msgstr "Adres IPv6"
@@ -1793,7 +1806,7 @@ msgid "Limit"
 msgstr "Limit"
 
 msgid "Limit DNS service to subnets interfaces on which we are serving DNS."
-msgstr ""
+msgstr "Ogranicz usługi DNS do podsieci interfejsów, na których obsługujemy DNS."
 
 msgid "Limit listening to these interfaces, and loopback."
 msgstr "Ogranicz nasłuchiwanie do tych interfesjów, oraz loopbacku."
@@ -1877,7 +1890,7 @@ msgid "Local IPv6 address"
 msgstr "Lokalny adres IPv6"
 
 msgid "Local Service Only"
-msgstr ""
+msgstr "Tylko serwis lokalny"
 
 msgid "Local Startup"
 msgstr "Lokalny autostart"
@@ -1898,7 +1911,7 @@ msgstr ""
 
 msgid "Local domain suffix appended to DHCP names and hosts file entries"
 msgstr ""
-"Przyrostek (suffiks) domeny przyłączany do nazw DHCP i wpisów w pliku hosts"
+"Przyrostek (sufiks) domeny przyłączany do nazw DHCP i wpisów w pliku hosts"
 
 msgid "Local server"
 msgstr "Serwer lokalny"
@@ -2098,7 +2111,7 @@ msgid "NCM"
 msgstr "NCM"
 
 msgid "NDP-Proxy"
-msgstr ""
+msgstr "Proxy NDP"
 
 msgid "NT Domain"
 msgstr ""
@@ -2185,7 +2198,7 @@ msgid "Non Pre-emtive CRC errors (CRC_P)"
 msgstr ""
 
 msgid "Non-wildcard"
-msgstr ""
+msgstr "Bez symboli wieloznacznych"
 
 msgid "None"
 msgstr "Brak"
@@ -2215,7 +2228,8 @@ msgid "Nslookup"
 msgstr "Nslookup"
 
 msgid "Number of cached DNS entries (max is 10000, 0 is no caching)"
-msgstr ""
+msgstr "Liczba buforowanych wpisów DNS (max wynosi 10000, 0 oznacza "
+"brak pamięci podręcznej)"
 
 msgid "OK"
 msgstr "OK"
@@ -2293,6 +2307,10 @@ msgid ""
 "server, use the suffix (like '::1') to form the IPv6 address ('a:b:c:d::1') "
 "for the interface."
 msgstr ""
+"Opcjonalne. Dopuszczalne wartości: 'eui64', 'random', stałe wartości takie jak " 
+"'::1' lub '::1:2'. Kiedy prefiks IPv6 (taki jak 'a:b:c:d::') jest odbierany z serwera "
+"delegującego, użyj sufiksa (takiego jak '::1') aby utworzyć adres IPv6 ('a:b:c:d::1') "
+"dla tego interfejsu."
 
 msgid ""
 "Optional. Base64-encoded preshared key. Adds in an additional layer of "
@@ -2585,7 +2603,7 @@ msgid "Public prefix routed to this device for distribution to clients."
 msgstr ""
 
 msgid "QMI Cellular"
-msgstr ""
+msgstr "Komórkowy QMI"
 
 msgid "Quality"
 msgstr "Jakość"
@@ -2637,15 +2655,15 @@ msgstr ""
 "\"Dynamic Host Configuration Protocol\">DHCP</abbr>"
 
 msgid ""
-"Really delete this interface? The deletion cannot be undone!\\nYou might "
-"lose access to this device if you are connected via this interface."
+"Really delete this interface? The deletion cannot be undone! You might lose "
+"access to this device if you are connected via this interface."
 msgstr ""
 "Naprawdę usunąć ten interfejs? Usunięcie nie może zostać cofnięte!\n"
 "Możesz stracić dostęp do tego urządzenia, jeśli jesteś połączony przez ten "
 "interfejs!"
 
 msgid ""
-"Really delete this wireless network? The deletion cannot be undone!\\nYou "
+"Really delete this wireless network? The deletion cannot be undone! You "
 "might lose access to this device if you are connected via this network."
 msgstr ""
 "Naprawdę usunąć tę sieć bezprzewodową? Usunięcie nie może zostać cofnięte!\n"
@@ -2657,7 +2675,7 @@ msgstr "Naprawdę usunąć wszelkie zmiany?"
 
 #, fuzzy
 msgid ""
-"Really shut down network?\\nYou might lose access to this device if you are "
+"Really shut down network? You might lose access to this device if you are "
 "connected via this interface."
 msgstr ""
 "Naprawdę wyłączyć tę sieć?\n"
@@ -2665,7 +2683,7 @@ msgstr ""
 "interfejs!"
 
 msgid ""
-"Really shutdown interface \"%s\" ?\\nYou might lose access to this device if "
+"Really shutdown interface \"%s\"You might lose access to this device if "
 "you are connected via this interface."
 msgstr ""
 "Naprawdę wyłączyć interfejs \"%s\"?\n"
@@ -2785,7 +2803,8 @@ msgstr ""
 msgid ""
 "Requires upstream supports DNSSEC; verify unsigned domain responses really "
 "come from unsigned domains"
-msgstr ""
+msgstr "Wymagane jest wsparcie dla DNSSEC; sprawdzanie, czy niepodpisane "
+"odpowiedzi w domenie rzeczywiście pochodzą z domen bez znaku"
 
 msgid "Reset"
 msgstr "Resetuj"
@@ -2839,10 +2858,10 @@ msgid "Route Allowed IPs"
 msgstr ""
 
 msgid "Route type"
-msgstr ""
+msgstr "Typ trasy"
 
 msgid "Router Advertisement-Service"
-msgstr ""
+msgstr "Serwis rozgłoszeniowy routera"
 
 msgid "Router Password"
 msgstr "Hasło routera"
@@ -2977,7 +2996,7 @@ msgid "Size (.ipk)"
 msgstr ""
 
 msgid "Size of DNS query cache"
-msgstr ""
+msgstr "Rozmiar pamięci podręcznej zapytań DNS"
 
 msgid "Skip"
 msgstr "Pomiń"
@@ -2995,7 +3014,7 @@ msgid "Software"
 msgstr "Oprogramowanie"
 
 msgid "Software VLAN"
-msgstr "VLAN programowy"
+msgstr "Programowy VLAN"
 
 msgid "Some fields are invalid, cannot save values!"
 msgstr "Wartości pewnych pól są niewłaściwe, nie mogę ich zachować!"
@@ -3106,10 +3125,10 @@ msgid "Submit"
 msgstr "Wyślij"
 
 msgid "Suppress logging"
-msgstr ""
+msgstr "Pomiń rejestrowanie"
 
 msgid "Suppress logging of the routine operation of these protocols"
-msgstr ""
+msgstr "Pomiń rejestrowanie rutynowych operacji dla tych protokołów"
 
 msgid "Swap"
 msgstr ""
@@ -3348,7 +3367,7 @@ msgid "There are no active leases."
 msgstr "Brak aktywnych dzierżaw."
 
 msgid "There are no changes to apply."
-msgstr ""
+msgstr "Nie ma żadnych zmian do zastosowania."
 
 msgid "There are no pending changes to revert!"
 msgstr "Brak oczekujących zmian do przywrócenia!"
@@ -3378,6 +3397,9 @@ msgid ""
 "'server=1.2.3.4' fordomain-specific or full upstream <abbr title=\"Domain "
 "Name System\">DNS</abbr> servers."
 msgstr ""
+"Ten plik może zawierać linie takie jak 'server=/domain/1.2.3.4' lub "
+"'server=1.2.3.4' dla specyficznych dla domeny lub pełnych serwerów "
+"<abbr title=\"Domain Name System\">DNS</abbr>"
 
 msgid ""
 "This is a list of shell glob patterns for matching files and directories to "
@@ -3458,7 +3480,7 @@ msgid ""
 "To restore configuration files, you can upload a previously generated backup "
 "archive here."
 msgstr ""
-"Aby przywrócić pliki konfiguracyjne, możesz tutaj przesłać wcześniej "
+"Aby przywrócić pliki konfiguracyjne, możesz przesłać tutaj wcześniej "
 "utworzoną kopię zapasową."
 
 msgid "Tone"
@@ -3722,7 +3744,7 @@ msgid "Waiting for command to complete..."
 msgstr "Trwa wykonanie polecenia..."
 
 msgid "Waiting for configuration to get applied… %ds"
-msgstr ""
+msgstr "Oczekiwanie na zastosowanie konfiguracji… %ds"
 
 msgid "Waiting for device..."
 msgstr "Oczekiwanie na urządzenie..."
@@ -3806,9 +3828,9 @@ msgid ""
 "upgrade it to at least version 7 or use another browser like Firefox, Opera "
 "or Safari."
 msgstr ""
-"Twój Internet Explorer jest za stary, aby poprawnie wyświetlić tę "
-"stronę zaktualizuj go do wersji co najmniej 7 lub użyj innej przeglądarki, "
-"takiej jak Firefox, Opera czy Safari."
+"Twój Internet Explorer jest za stary, aby poprawnie wyświetlić tę stronę "
+"zaktualizuj go do wersji co najmniej 7 lub użyj innej przeglądarki, takiej "
+"jak Firefox, Opera czy Safari."
 
 msgid "any"
 msgstr "dowolny"
@@ -3822,6 +3844,9 @@ msgstr "baseT"
 msgid "bridged"
 msgstr "zmostkowany"
 
+msgid "create"
+msgstr ""
+
 msgid "create:"
 msgstr "utwórz:"
 
@@ -3911,6 +3936,9 @@ msgstr "włączone"
 msgid "open"
 msgstr "otwarte"
 
+msgid "output"
+msgstr ""
+
 msgid "overlay"
 msgstr ""
 
@@ -3962,3 +3990,8 @@ msgstr "tak"
 msgid "« Back"
 msgstr "« Wróć"
 
+#~ msgid "IPv4 WAN Status"
+#~ msgstr "Status IPv4 WAN"
+
+#~ msgid "IPv6 WAN Status"
+#~ msgstr "Status WAN IPv6"
index 49b149432615d9b07bf5c4b8fee0ac6a1936757f..fde8be16a71f815c76549ea013de7d44282594b5 100644 (file)
@@ -51,6 +51,9 @@ msgstr ""
 "-- casar por <abbr title=\"Universal Unique IDentifier/Identificador Único "
 "Universal\">UUID</abbr> --"
 
+msgid "-- please select --"
+msgstr ""
+
 msgid "1 Minute Load:"
 msgstr "Carga 1 Minuto:"
 
@@ -425,6 +428,9 @@ msgstr ""
 msgid "Apply unchecked"
 msgstr ""
 
+msgid "Architecture"
+msgstr ""
+
 msgid ""
 "Assign a part of given length of every public IPv6-prefix to this interface"
 msgstr ""
@@ -443,6 +449,9 @@ msgstr ""
 msgid "Associated Stations"
 msgstr "Estações associadas"
 
+msgid "Associations"
+msgstr ""
+
 msgid "Auth Group"
 msgstr "Grupo de Autenticação"
 
@@ -1350,10 +1359,10 @@ msgstr "Espaço livre"
 
 msgid ""
 "Further information about WireGuard interfaces and peers at <a href=\"http://"
-"wireguard.io\">wireguard.io</a>."
+"wireguard.com\">wireguard.com</a>."
 msgstr ""
 "Mais informações sobre interfaces e parceiros WireGuard em <a href=\"http://"
-"wireguard.io\">wireguard.io</a>."
+"wireguard.com\">wireguard.com</a>."
 
 msgid "GHz"
 msgstr "GHz"
@@ -1493,8 +1502,8 @@ msgstr "IPv4"
 msgid "IPv4 Firewall"
 msgstr "Firewall para IPv4"
 
-msgid "IPv4 WAN Status"
-msgstr "Estado IPv4 da WAN"
+msgid "IPv4 Upstream"
+msgstr ""
 
 msgid "IPv4 address"
 msgstr "Endereço IPv4"
@@ -1546,8 +1555,8 @@ msgstr ""
 "Prefixo <abbr title=\"Unique Local Address/Endereço Local Único\">ULA</abbr> "
 "IPv6"
 
-msgid "IPv6 WAN Status"
-msgstr "Estado IPv6 da WAN"
+msgid "IPv6 Upstream"
+msgstr ""
 
 msgid "IPv6 address"
 msgstr "Endereço IPv6"
@@ -2723,15 +2732,15 @@ msgstr ""
 "\"Protocolo de Configuração Dinâmica de Hosts\">DHCP</abbr>"
 
 msgid ""
-"Really delete this interface? The deletion cannot be undone!\\nYou might "
-"lose access to this device if you are connected via this interface."
+"Really delete this interface? The deletion cannot be undone! You might lose "
+"access to this device if you are connected via this interface."
 msgstr ""
 "Realmente excluir esta interface? A exclusão não pode ser desfeita!\n"
 " Você poderá perder o acesso a este dispositivo se você estiver conectado "
 "através desta interface."
 
 msgid ""
-"Really delete this wireless network? The deletion cannot be undone!\\nYou "
+"Really delete this wireless network? The deletion cannot be undone! You "
 "might lose access to this device if you are connected via this network."
 msgstr ""
 "Realmente excluir esta interface Wireless? A exclusão não pode ser "
@@ -2743,7 +2752,7 @@ msgid "Really reset all changes?"
 msgstr "Realmente limpar todas as mudanças?"
 
 msgid ""
-"Really shut down network?\\nYou might lose access to this device if you are "
+"Really shut down network? You might lose access to this device if you are "
 "connected via this interface."
 msgstr ""
 "Realmente desligar esta rede\"%s\" ?\n"
@@ -2751,7 +2760,7 @@ msgstr ""
 "através desta interface."
 
 msgid ""
-"Really shutdown interface \"%s\" ?\\nYou might lose access to this device if "
+"Really shutdown interface \"%s\"You might lose access to this device if "
 "you are connected via this interface."
 msgstr ""
 "Realmente desligar esta interface\"%s\" ?\n"
@@ -3927,6 +3936,9 @@ msgstr "baseT"
 msgid "bridged"
 msgstr "em ponte"
 
+msgid "create"
+msgstr ""
+
 msgid "create:"
 msgstr "criar"
 
@@ -4017,6 +4029,9 @@ msgstr "ligado"
 msgid "open"
 msgstr "aberto"
 
+msgid "output"
+msgstr ""
+
 msgid "overlay"
 msgstr "sobreposição"
 
@@ -4067,3 +4082,9 @@ msgstr "sim"
 
 msgid "« Back"
 msgstr "« Voltar"
+
+#~ msgid "IPv4 WAN Status"
+#~ msgstr "Estado IPv4 da WAN"
+
+#~ msgid "IPv6 WAN Status"
+#~ msgstr "Estado IPv6 da WAN"
index a05bfc1cfcc5647a971c943fd22d422c6fba92f1..28c13c819475c700845afca82430cb6823926552 100644 (file)
@@ -49,6 +49,9 @@ msgstr ""
 msgid "-- match by uuid --"
 msgstr ""
 
+msgid "-- please select --"
+msgstr ""
+
 msgid "1 Minute Load:"
 msgstr "Carga de 1 Minuto:"
 
@@ -406,6 +409,9 @@ msgstr ""
 msgid "Apply unchecked"
 msgstr ""
 
+msgid "Architecture"
+msgstr ""
+
 msgid ""
 "Assign a part of given length of every public IPv6-prefix to this interface"
 msgstr ""
@@ -420,6 +426,9 @@ msgstr ""
 msgid "Associated Stations"
 msgstr "Estações Associadas"
 
+msgid "Associations"
+msgstr ""
+
 msgid "Auth Group"
 msgstr ""
 
@@ -1302,7 +1311,7 @@ msgstr "Espaço livre"
 
 msgid ""
 "Further information about WireGuard interfaces and peers at <a href=\"http://"
-"wireguard.io\">wireguard.io</a>."
+"wireguard.com\">wireguard.com</a>."
 msgstr ""
 
 msgid "GHz"
@@ -1437,8 +1446,8 @@ msgstr "IPv4"
 msgid "IPv4 Firewall"
 msgstr "Firewall IPv4"
 
-msgid "IPv4 WAN Status"
-msgstr "Estado WAN IPv4"
+msgid "IPv4 Upstream"
+msgstr ""
 
 msgid "IPv4 address"
 msgstr "Endereço IPv4"
@@ -1488,8 +1497,8 @@ msgstr ""
 msgid "IPv6 ULA-Prefix"
 msgstr ""
 
-msgid "IPv6 WAN Status"
-msgstr "Estado WAN IPv6"
+msgid "IPv6 Upstream"
+msgstr ""
 
 msgid "IPv6 address"
 msgstr "Endereço IPv6"
@@ -2607,15 +2616,15 @@ msgstr ""
 "\"Protocolo de Configuração Dinâmica de Hosts\">DHCP</abbr>"
 
 msgid ""
-"Really delete this interface? The deletion cannot be undone!\\nYou might "
-"lose access to this device if you are connected via this interface."
+"Really delete this interface? The deletion cannot be undone! You might lose "
+"access to this device if you are connected via this interface."
 msgstr ""
 "Deseja mesmo apagar esta interface? A eliminação não poder desfeita!\n"
 "Pode perde a ligação ao dispositivo, caso esta ligado através desta "
 "interface."
 
 msgid ""
-"Really delete this wireless network? The deletion cannot be undone!\\nYou "
+"Really delete this wireless network? The deletion cannot be undone! You "
 "might lose access to this device if you are connected via this network."
 msgstr ""
 "Deseja mesmo apagar esta rede? A eliminação não poder desfeita!\n"
@@ -2626,14 +2635,14 @@ msgstr "Deseja mesmo limpar todas as alterações?"
 
 #, fuzzy
 msgid ""
-"Really shut down network?\\nYou might lose access to this device if you are "
+"Really shut down network? You might lose access to this device if you are "
 "connected via this interface."
 msgstr ""
 "Deseja mesmo desligar esta rede?\n"
 "Pode perder o acesso ao dispositivo se estiver ligado através desta rede."
 
 msgid ""
-"Really shutdown interface \"%s\" ?\\nYou might lose access to this device if "
+"Really shutdown interface \"%s\"You might lose access to this device if "
 "you are connected via this interface."
 msgstr ""
 "Deseja mesmo desligar a interface \"%s\" ?\n"
@@ -3743,6 +3752,9 @@ msgstr "baseT"
 msgid "bridged"
 msgstr ""
 
+msgid "create"
+msgstr ""
+
 msgid "create:"
 msgstr "criar:"
 
@@ -3832,6 +3844,9 @@ msgstr "ligado"
 msgid "open"
 msgstr "abrir"
 
+msgid "output"
+msgstr ""
+
 msgid "overlay"
 msgstr ""
 
@@ -3883,6 +3898,12 @@ msgstr "sim"
 msgid "« Back"
 msgstr "« Voltar"
 
+#~ msgid "IPv4 WAN Status"
+#~ msgstr "Estado WAN IPv4"
+
+#~ msgid "IPv6 WAN Status"
+#~ msgstr "Estado WAN IPv6"
+
 #~ msgid "Apply"
 #~ msgstr "Aplicar"
 
index 1b7c612b22fedd463fa59ac981e4fd4bd21fdb49..1e596adc7e61e0817409844153746895daba431b 100644 (file)
@@ -48,6 +48,9 @@ msgstr ""
 msgid "-- match by uuid --"
 msgstr ""
 
+msgid "-- please select --"
+msgstr ""
+
 msgid "1 Minute Load:"
 msgstr "Incarcarea in ultimul minut"
 
@@ -392,6 +395,9 @@ msgstr ""
 msgid "Apply unchecked"
 msgstr ""
 
+msgid "Architecture"
+msgstr ""
+
 msgid ""
 "Assign a part of given length of every public IPv6-prefix to this interface"
 msgstr ""
@@ -406,6 +412,9 @@ msgstr ""
 msgid "Associated Stations"
 msgstr "Statiile asociate"
 
+msgid "Associations"
+msgstr ""
+
 msgid "Auth Group"
 msgstr ""
 
@@ -1255,7 +1264,7 @@ msgstr "Spatiu liber"
 
 msgid ""
 "Further information about WireGuard interfaces and peers at <a href=\"http://"
-"wireguard.io\">wireguard.io</a>."
+"wireguard.com\">wireguard.com</a>."
 msgstr ""
 
 msgid "GHz"
@@ -1384,8 +1393,8 @@ msgstr "IPv4"
 msgid "IPv4 Firewall"
 msgstr "Firewall IPv4"
 
-msgid "IPv4 WAN Status"
-msgstr "Statusul IPv4 pe WAN"
+msgid "IPv4 Upstream"
+msgstr ""
 
 msgid "IPv4 address"
 msgstr "Adresa IPv4"
@@ -1435,8 +1444,8 @@ msgstr ""
 msgid "IPv6 ULA-Prefix"
 msgstr ""
 
-msgid "IPv6 WAN Status"
-msgstr "Statusul IPv6 pe WAN"
+msgid "IPv6 Upstream"
+msgstr ""
 
 msgid "IPv6 address"
 msgstr "Adresa IPv6"
@@ -2531,12 +2540,12 @@ msgstr ""
 "<abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr>-"
 
 msgid ""
-"Really delete this interface? The deletion cannot be undone!\\nYou might "
-"lose access to this device if you are connected via this interface."
+"Really delete this interface? The deletion cannot be undone! You might lose "
+"access to this device if you are connected via this interface."
 msgstr ""
 
 msgid ""
-"Really delete this wireless network? The deletion cannot be undone!\\nYou "
+"Really delete this wireless network? The deletion cannot be undone! You "
 "might lose access to this device if you are connected via this network."
 msgstr ""
 
@@ -2544,12 +2553,12 @@ msgid "Really reset all changes?"
 msgstr ""
 
 msgid ""
-"Really shut down network?\\nYou might lose access to this device if you are "
+"Really shut down network? You might lose access to this device if you are "
 "connected via this interface."
 msgstr ""
 
 msgid ""
-"Really shutdown interface \"%s\" ?\\nYou might lose access to this device if "
+"Really shutdown interface \"%s\"You might lose access to this device if "
 "you are connected via this interface."
 msgstr ""
 
@@ -3604,6 +3613,9 @@ msgstr ""
 msgid "bridged"
 msgstr ""
 
+msgid "create"
+msgstr ""
+
 msgid "create:"
 msgstr ""
 
@@ -3690,6 +3702,9 @@ msgstr ""
 msgid "open"
 msgstr ""
 
+msgid "output"
+msgstr ""
+
 msgid "overlay"
 msgstr ""
 
@@ -3741,6 +3756,12 @@ msgstr "da"
 msgid "« Back"
 msgstr "« Inapoi"
 
+#~ msgid "IPv4 WAN Status"
+#~ msgstr "Statusul IPv4 pe WAN"
+
+#~ msgid "IPv6 WAN Status"
+#~ msgstr "Statusul IPv6 pe WAN"
+
 #~ msgid "Apply"
 #~ msgstr "Aplica"
 
index 2514084b76fedbceb325e2da21ba7ba049a741f1..78488225869df71ff5fffc4d36c568f05f33f42e 100644 (file)
@@ -51,6 +51,9 @@ msgstr "-- проверка по метке --"
 msgid "-- match by uuid --"
 msgstr "-- проверка по uuid --"
 
+msgid "-- please select --"
+msgstr ""
+
 msgid "1 Minute Load:"
 msgstr "Загрузка за 1 минуту:"
 
@@ -410,6 +413,9 @@ msgstr ""
 msgid "Apply unchecked"
 msgstr ""
 
+msgid "Architecture"
+msgstr ""
+
 msgid ""
 "Assign a part of given length of every public IPv6-prefix to this interface"
 msgstr ""
@@ -428,6 +434,9 @@ msgstr ""
 msgid "Associated Stations"
 msgstr "Подключенные клиенты"
 
+msgid "Associations"
+msgstr ""
+
 msgid "Auth Group"
 msgstr "Группа аутентификации"
 
@@ -1335,10 +1344,10 @@ msgstr "Свободное место"
 
 msgid ""
 "Further information about WireGuard interfaces and peers at <a href=\"http://"
-"wireguard.io\">wireguard.io</a>."
+"wireguard.com\">wireguard.com</a>."
 msgstr ""
 "Дополнительная информация о интерфейсах и партнерах WireGuard приведена в <a "
-"href=\"http://wireguard.io\">wireguard.io</a>."
+"href=\"http://wireguard.com\">wireguard.com</a>."
 
 msgid "GHz"
 msgstr "ГГц"
@@ -1468,8 +1477,8 @@ msgstr "IPv4"
 msgid "IPv4 Firewall"
 msgstr "Межсетевой экран IPv4"
 
-msgid "IPv4 WAN Status"
-msgstr "Состояние IPv4 WAN"
+msgid "IPv4 Upstream"
+msgstr ""
 
 msgid "IPv4 address"
 msgstr "IPv4-адрес"
@@ -1519,8 +1528,8 @@ msgstr "IPv6 Настройки"
 msgid "IPv6 ULA-Prefix"
 msgstr "IPv6 ULA-Prefix"
 
-msgid "IPv6 WAN Status"
-msgstr "Состояние IPv6 WAN"
+msgid "IPv6 Upstream"
+msgstr ""
 
 msgid "IPv6 address"
 msgstr "IPv6-адрес"
@@ -2682,15 +2691,15 @@ msgstr ""
 "динамической настройки узла\">DHCP</abbr>-сервера."
 
 msgid ""
-"Really delete this interface? The deletion cannot be undone!\\nYou might "
-"lose access to this device if you are connected via this interface."
+"Really delete this interface? The deletion cannot be undone! You might lose "
+"access to this device if you are connected via this interface."
 msgstr ""
 "Действительно удалить этот интерфейс? Удаление не может быть отменено!\\nВы "
 "можете потерять доступ к этому устройству, если вы подключены через этот "
 "интерфейс."
 
 msgid ""
-"Really delete this wireless network? The deletion cannot be undone!\\nYou "
+"Really delete this wireless network? The deletion cannot be undone! You "
 "might lose access to this device if you are connected via this network."
 msgstr ""
 "Действительно удалить эту беспроводную сеть? Удаление не может быть отменено!"
@@ -2701,18 +2710,18 @@ msgid "Really reset all changes?"
 msgstr "Действительно сбросить все изменения?"
 
 msgid ""
-"Really shut down network?\\nYou might lose access to this device if you are "
+"Really shut down network? You might lose access to this device if you are "
 "connected via this interface."
 msgstr ""
 "Действительно отключить сеть? Вы можете потерять доступ к этому устройству, "
 "если вы подключены через этот интерфейс."
 
 msgid ""
-"Really shutdown interface \"%s\" ?\\nYou might lose access to this device if "
+"Really shutdown interface \"%s\"You might lose access to this device if "
 "you are connected via this interface."
 msgstr ""
-"Действительно отключить интерфейс \"%s\" ?\\nВы можете потерять доступ к "
-"Ñ\8dÑ\82омÑ\83 Ñ\83Ñ\81Ñ\82Ñ\80ойÑ\81Ñ\82вÑ\83, ÐµÑ\81ли Ð²Ñ\8b Ð¿Ð¾Ð´ÐºÐ»Ñ\8eÑ\87енÑ\8b Ñ\87еÑ\80ез Ñ\8dÑ\82оÑ\82 Ð¸Ð½Ñ\82еÑ\80Ñ\84ейÑ\81."
+"Действительно отключить интерфейс \"%s\"? Вы можете потерять доступ к этому "
+"устройству, если вы подключены через этот интерфейс."
 
 msgid "Really switch protocol?"
 msgstr "Вы действительно хотите изменить протокол?"
@@ -3876,6 +3885,9 @@ msgstr "baseT"
 msgid "bridged"
 msgstr "соед. мостом"
 
+msgid "create"
+msgstr ""
+
 msgid "create:"
 msgstr "создать:"
 
@@ -3964,6 +3976,9 @@ msgstr "включено"
 msgid "open"
 msgstr "открыть"
 
+msgid "output"
+msgstr ""
+
 msgid "overlay"
 msgstr "overlay"
 
@@ -4014,3 +4029,9 @@ msgstr "да"
 
 msgid "« Back"
 msgstr "« Назад"
+
+#~ msgid "IPv4 WAN Status"
+#~ msgstr "Состояние IPv4 WAN"
+
+#~ msgid "IPv6 WAN Status"
+#~ msgstr "Состояние IPv6 WAN"
index e7e302b1b0c5ee639c40af08565241717a874bc1..04468455b87b03460ee077d1364416a3a8b79a55 100644 (file)
@@ -44,6 +44,9 @@ msgstr ""
 msgid "-- match by uuid --"
 msgstr ""
 
+msgid "-- please select --"
+msgstr ""
+
 msgid "1 Minute Load:"
 msgstr ""
 
@@ -378,6 +381,9 @@ msgstr ""
 msgid "Apply unchecked"
 msgstr ""
 
+msgid "Architecture"
+msgstr ""
+
 msgid ""
 "Assign a part of given length of every public IPv6-prefix to this interface"
 msgstr ""
@@ -392,6 +398,9 @@ msgstr ""
 msgid "Associated Stations"
 msgstr ""
 
+msgid "Associations"
+msgstr ""
+
 msgid "Auth Group"
 msgstr ""
 
@@ -1235,7 +1244,7 @@ msgstr ""
 
 msgid ""
 "Further information about WireGuard interfaces and peers at <a href=\"http://"
-"wireguard.io\">wireguard.io</a>."
+"wireguard.com\">wireguard.com</a>."
 msgstr ""
 
 msgid "GHz"
@@ -1362,7 +1371,7 @@ msgstr ""
 msgid "IPv4 Firewall"
 msgstr ""
 
-msgid "IPv4 WAN Status"
+msgid "IPv4 Upstream"
 msgstr ""
 
 msgid "IPv4 address"
@@ -1413,7 +1422,7 @@ msgstr ""
 msgid "IPv6 ULA-Prefix"
 msgstr ""
 
-msgid "IPv6 WAN Status"
+msgid "IPv6 Upstream"
 msgstr ""
 
 msgid "IPv6 address"
@@ -2504,12 +2513,12 @@ msgid ""
 msgstr ""
 
 msgid ""
-"Really delete this interface? The deletion cannot be undone!\\nYou might "
-"lose access to this device if you are connected via this interface."
+"Really delete this interface? The deletion cannot be undone! You might lose "
+"access to this device if you are connected via this interface."
 msgstr ""
 
 msgid ""
-"Really delete this wireless network? The deletion cannot be undone!\\nYou "
+"Really delete this wireless network? The deletion cannot be undone! You "
 "might lose access to this device if you are connected via this network."
 msgstr ""
 
@@ -2517,12 +2526,12 @@ msgid "Really reset all changes?"
 msgstr ""
 
 msgid ""
-"Really shut down network?\\nYou might lose access to this device if you are "
+"Really shut down network? You might lose access to this device if you are "
 "connected via this interface."
 msgstr ""
 
 msgid ""
-"Really shutdown interface \"%s\" ?\\nYou might lose access to this device if "
+"Really shutdown interface \"%s\"You might lose access to this device if "
 "you are connected via this interface."
 msgstr ""
 
@@ -3572,6 +3581,9 @@ msgstr ""
 msgid "bridged"
 msgstr ""
 
+msgid "create"
+msgstr ""
+
 msgid "create:"
 msgstr ""
 
@@ -3658,6 +3670,9 @@ msgstr ""
 msgid "open"
 msgstr ""
 
+msgid "output"
+msgstr ""
+
 msgid "overlay"
 msgstr ""
 
index dc68fdc3689e55f406ea198dec3b2d08f1982e69..982d8fa6949454db8e9b0c730e8c3247e5f7deab 100644 (file)
@@ -47,6 +47,9 @@ msgstr "-- matcha enligt märke --"
 msgid "-- match by uuid --"
 msgstr "-- matcha enligt uuid --"
 
+msgid "-- please select --"
+msgstr ""
+
 msgid "1 Minute Load:"
 msgstr "Belastning senaste minuten:"
 
@@ -389,6 +392,9 @@ msgstr ""
 msgid "Apply unchecked"
 msgstr ""
 
+msgid "Architecture"
+msgstr ""
+
 msgid ""
 "Assign a part of given length of every public IPv6-prefix to this interface"
 msgstr ""
@@ -403,6 +409,9 @@ msgstr ""
 msgid "Associated Stations"
 msgstr "Associerade stationer"
 
+msgid "Associations"
+msgstr ""
+
 msgid "Auth Group"
 msgstr "Autentiseringsgrupp"
 
@@ -1255,7 +1264,7 @@ msgstr "Fritt utrymme"
 
 msgid ""
 "Further information about WireGuard interfaces and peers at <a href=\"http://"
-"wireguard.io\">wireguard.io</a>."
+"wireguard.com\">wireguard.com</a>."
 msgstr ""
 
 msgid "GHz"
@@ -1382,7 +1391,7 @@ msgstr "IPv4"
 msgid "IPv4 Firewall"
 msgstr "IPv4-brandvägg"
 
-msgid "IPv4 WAN Status"
+msgid "IPv4 Upstream"
 msgstr ""
 
 msgid "IPv4 address"
@@ -1433,7 +1442,7 @@ msgstr "IPv6-inställningar"
 msgid "IPv6 ULA-Prefix"
 msgstr ""
 
-msgid "IPv6 WAN Status"
+msgid "IPv6 Upstream"
 msgstr ""
 
 msgid "IPv6 address"
@@ -2527,12 +2536,12 @@ msgstr ""
 "Configuration Protocol\">DHCP</abbr>-servern"
 
 msgid ""
-"Really delete this interface? The deletion cannot be undone!\\nYou might "
-"lose access to this device if you are connected via this interface."
+"Really delete this interface? The deletion cannot be undone! You might lose "
+"access to this device if you are connected via this interface."
 msgstr ""
 
 msgid ""
-"Really delete this wireless network? The deletion cannot be undone!\\nYou "
+"Really delete this wireless network? The deletion cannot be undone! You "
 "might lose access to this device if you are connected via this network."
 msgstr ""
 
@@ -2540,12 +2549,12 @@ msgid "Really reset all changes?"
 msgstr "Verkligen återställa alla ändringar?"
 
 msgid ""
-"Really shut down network?\\nYou might lose access to this device if you are "
+"Really shut down network? You might lose access to this device if you are "
 "connected via this interface."
 msgstr ""
 
 msgid ""
-"Really shutdown interface \"%s\" ?\\nYou might lose access to this device if "
+"Really shutdown interface \"%s\"You might lose access to this device if "
 "you are connected via this interface."
 msgstr ""
 
@@ -3605,6 +3614,9 @@ msgstr ""
 msgid "bridged"
 msgstr "bryggad"
 
+msgid "create"
+msgstr ""
+
 msgid "create:"
 msgstr "skapa:"
 
@@ -3691,6 +3703,9 @@ msgstr "på"
 msgid "open"
 msgstr "öppen"
 
+msgid "output"
+msgstr ""
+
 msgid "overlay"
 msgstr ""
 
@@ -3741,4 +3756,3 @@ msgstr "ja"
 
 msgid "« Back"
 msgstr "« Bakåt"
-
index b944566c09e8120f09e8241d74477b54ae0651f3..7a2cdec81b0fbfd77179909a6d9ad4ad6835251f 100644 (file)
@@ -37,6 +37,9 @@ msgstr ""
 msgid "-- match by uuid --"
 msgstr ""
 
+msgid "-- please select --"
+msgstr ""
+
 msgid "1 Minute Load:"
 msgstr ""
 
@@ -371,6 +374,9 @@ msgstr ""
 msgid "Apply unchecked"
 msgstr ""
 
+msgid "Architecture"
+msgstr ""
+
 msgid ""
 "Assign a part of given length of every public IPv6-prefix to this interface"
 msgstr ""
@@ -385,6 +391,9 @@ msgstr ""
 msgid "Associated Stations"
 msgstr ""
 
+msgid "Associations"
+msgstr ""
+
 msgid "Auth Group"
 msgstr ""
 
@@ -1355,7 +1364,7 @@ msgstr ""
 msgid "IPv4 Firewall"
 msgstr ""
 
-msgid "IPv4 WAN Status"
+msgid "IPv4 Upstream"
 msgstr ""
 
 msgid "IPv4 address"
@@ -1406,7 +1415,7 @@ msgstr ""
 msgid "IPv6 ULA-Prefix"
 msgstr ""
 
-msgid "IPv6 WAN Status"
+msgid "IPv6 Upstream"
 msgstr ""
 
 msgid "IPv6 address"
@@ -2497,12 +2506,12 @@ msgid ""
 msgstr ""
 
 msgid ""
-"Really delete this interface? The deletion cannot be undone!\\nYou might "
-"lose access to this device if you are connected via this interface."
+"Really delete this interface? The deletion cannot be undone! You might lose "
+"access to this device if you are connected via this interface."
 msgstr ""
 
 msgid ""
-"Really delete this wireless network? The deletion cannot be undone!\\nYou "
+"Really delete this wireless network? The deletion cannot be undone! You "
 "might lose access to this device if you are connected via this network."
 msgstr ""
 
@@ -2510,12 +2519,12 @@ msgid "Really reset all changes?"
 msgstr ""
 
 msgid ""
-"Really shut down network?\\nYou might lose access to this device if you are "
+"Really shut down network? You might lose access to this device if you are "
 "connected via this interface."
 msgstr ""
 
 msgid ""
-"Really shutdown interface \"%s\" ?\\nYou might lose access to this device if "
+"Really shutdown interface \"%s\"You might lose access to this device if "
 "you are connected via this interface."
 msgstr ""
 
@@ -3565,6 +3574,9 @@ msgstr ""
 msgid "bridged"
 msgstr ""
 
+msgid "create"
+msgstr ""
+
 msgid "create:"
 msgstr ""
 
@@ -3651,6 +3663,9 @@ msgstr ""
 msgid "open"
 msgstr ""
 
+msgid "output"
+msgstr ""
+
 msgid "overlay"
 msgstr ""
 
index cfa7cd3c482c6a3031714d260d5fd2f1a2dfd1d3..cadfc595396a3c5133194d7d9e04a7f610ab8d9e 100644 (file)
@@ -47,6 +47,9 @@ msgstr "-- etikete göre eşleştir --"
 msgid "-- match by uuid --"
 msgstr "-- uuid'e göre eşleştir --"
 
+msgid "-- please select --"
+msgstr ""
+
 msgid "1 Minute Load:"
 msgstr "1 Dakikalık Yük:"
 
@@ -391,6 +394,9 @@ msgstr ""
 msgid "Apply unchecked"
 msgstr ""
 
+msgid "Architecture"
+msgstr ""
+
 msgid ""
 "Assign a part of given length of every public IPv6-prefix to this interface"
 msgstr ""
@@ -405,6 +411,9 @@ msgstr ""
 msgid "Associated Stations"
 msgstr ""
 
+msgid "Associations"
+msgstr ""
+
 msgid "Auth Group"
 msgstr ""
 
@@ -1248,7 +1257,7 @@ msgstr ""
 
 msgid ""
 "Further information about WireGuard interfaces and peers at <a href=\"http://"
-"wireguard.io\">wireguard.io</a>."
+"wireguard.com\">wireguard.com</a>."
 msgstr ""
 
 msgid "GHz"
@@ -1375,7 +1384,7 @@ msgstr ""
 msgid "IPv4 Firewall"
 msgstr ""
 
-msgid "IPv4 WAN Status"
+msgid "IPv4 Upstream"
 msgstr ""
 
 msgid "IPv4 address"
@@ -1426,7 +1435,7 @@ msgstr ""
 msgid "IPv6 ULA-Prefix"
 msgstr ""
 
-msgid "IPv6 WAN Status"
+msgid "IPv6 Upstream"
 msgstr ""
 
 msgid "IPv6 address"
@@ -2517,12 +2526,12 @@ msgid ""
 msgstr ""
 
 msgid ""
-"Really delete this interface? The deletion cannot be undone!\\nYou might "
-"lose access to this device if you are connected via this interface."
+"Really delete this interface? The deletion cannot be undone! You might lose "
+"access to this device if you are connected via this interface."
 msgstr ""
 
 msgid ""
-"Really delete this wireless network? The deletion cannot be undone!\\nYou "
+"Really delete this wireless network? The deletion cannot be undone! You "
 "might lose access to this device if you are connected via this network."
 msgstr ""
 
@@ -2530,12 +2539,12 @@ msgid "Really reset all changes?"
 msgstr ""
 
 msgid ""
-"Really shut down network?\\nYou might lose access to this device if you are "
+"Really shut down network? You might lose access to this device if you are "
 "connected via this interface."
 msgstr ""
 
 msgid ""
-"Really shutdown interface \"%s\" ?\\nYou might lose access to this device if "
+"Really shutdown interface \"%s\"You might lose access to this device if "
 "you are connected via this interface."
 msgstr ""
 
@@ -3587,6 +3596,9 @@ msgstr "baseT"
 msgid "bridged"
 msgstr "köprülü"
 
+msgid "create"
+msgstr ""
+
 msgid "create:"
 msgstr "oluşturma:"
 
@@ -3673,6 +3685,9 @@ msgstr "açık"
 msgid "open"
 msgstr "açık"
 
+msgid "output"
+msgstr ""
+
 msgid "overlay"
 msgstr "bindirilmiş"
 
index d0532004968225874a1e9f3725904370b2431602..a9455e45e660dfa384601c0c28ca63a14bda49de 100644 (file)
@@ -1,8 +1,8 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
-"PO-Revision-Date: 2013-12-05 19:07+0200\n"
-"Last-Translator: Dmitri <4glitch@gmail.com>\n"
+"PO-Revision-Date: 2018-06-10 16:50+0200\n"
+"Last-Translator: Yurii <yuripet@gmail.com>\n"
 "Language-Team: none\n"
 "Language: uk\n"
 "MIME-Version: 1.0\n"
@@ -10,19 +10,21 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%"
 "10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
-"X-Generator: Pootle 2.0.6\n"
+
+msgid ""
+msgstr ""Content-Type: text/plain; charset=UTF-8"
 
 msgid "%.1f dB"
-msgstr ""
+msgstr "%.1f дБ"
 
 msgid "%s is untagged in multiple VLANs!"
-msgstr ""
+msgstr "%s є непозначеним у декількох VLAN!"
 
 msgid "(%d minute window, %d second interval)"
-msgstr "(%d-хвилинне вікно, %d-секундний інтервал)"
+msgstr "(вікно - %d хвилин, інтервал - %d секунд)"
 
 msgid "(%s available)"
-msgstr "(%s доступно)"
+msgstr "(доступно %s)"
 
 msgid "(empty)"
 msgstr "(пусто)"
@@ -34,19 +36,22 @@ msgid "-- Additional Field --"
 msgstr "-- Додаткові поля --"
 
 msgid "-- Please choose --"
-msgstr "-- Ð\92иберіть --"
+msgstr "-- Ð\9eберіть --"
 
 msgid "-- custom --"
 msgstr "-- нетипово --"
 
 msgid "-- match by device --"
-msgstr ""
+msgstr "-- відповідно пристрою --"
 
 msgid "-- match by label --"
-msgstr ""
+msgstr "-- відповідно мітці --"
 
 msgid "-- match by uuid --"
-msgstr ""
+msgstr "-- відповідно UUID --"
+
+msgid "-- please select --"
+msgstr "-- виберіть --"
 
 msgid "1 Minute Load:"
 msgstr "Навантаження за 1 хвилину:"
@@ -55,34 +60,35 @@ msgid "15 Minute Load:"
 msgstr "Навантаження за 15 хвилин:"
 
 msgid "4-character hexadecimal ID"
-msgstr ""
+msgstr "4-симв. шістнадцятковий ID"
 
 msgid "464XLAT (CLAT)"
-msgstr ""
+msgstr "464XLAT (CLAT)"
 
 msgid "5 Minute Load:"
 msgstr "Навантаження за 5 хвилин:"
 
 msgid "6-octet identifier as a hex string - no colons"
 msgstr ""
+"6-октетний ідентифікатор у вигляді шістнадцяткового рядка – без двокрапок"
 
 msgid "802.11r Fast Transition"
-msgstr ""
+msgstr "Швидкий перехід 802.11r"
 
 msgid "802.11w Association SA Query maximum timeout"
-msgstr ""
+msgstr "Максимальний тайм-аут запиту асоціації 802.11w"
 
 msgid "802.11w Association SA Query retry timeout"
-msgstr ""
+msgstr "Тайм-аут повторювання запиту асоціації 802.11w"
 
 msgid "802.11w Management Frame Protection"
-msgstr ""
+msgstr "Захист кадрів управління 802.11w"
 
 msgid "802.11w maximum timeout"
-msgstr ""
+msgstr "Максимальний тайм-аут 802.11w"
 
 msgid "802.11w retry timeout"
-msgstr ""
+msgstr "Тайм-аут повторювання 802.11w"
 
 msgid "<abbr title=\"Basic Service Set Identifier\">BSSID</abbr>"
 msgstr ""
@@ -104,7 +110,7 @@ msgid ""
 "order of the resolvfile"
 msgstr ""
 "<abbr title=\"Domain Name System — система доменних імен\">DNS</abbr>-"
-"сервери будуть опитані у порядку, визначеному файлом resolvfile"
+"сервери буде опитано в порядку, визначеному файлом <em>resolvfile</em>"
 
 msgid "<abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"
 msgstr ""
@@ -131,11 +137,11 @@ msgid "<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Gateway"
 msgstr "<abbr title=\"Інтернет-протокол версії 6\">IPv6</abbr>-шлюз"
 
 msgid "<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Suffix (hex)"
-msgstr ""
+msgstr "<abbr title=\"Інтернет-протокол версії 6\">IPv6</abbr>-суфікс (hex)"
 
 msgid "<abbr title=\"Light Emitting Diode\">LED</abbr> Configuration"
 msgstr ""
-"Настроювання <abbr title=\"Light Emitting Diode — світлодіод\">LED</abbr>"
+"Налаштування <abbr title=\"Light Emitting Diode — світлодіод\">LED</abbr>"
 
 msgid "<abbr title=\"Light Emitting Diode\">LED</abbr> Name"
 msgstr "Назва <abbr title=\"Light Emitting Diode — світлодіод\">LED</abbr>"
@@ -146,33 +152,35 @@ msgstr ""
 "abbr>-адреса"
 
 msgid "<abbr title=\"The DHCP Unique Identifier\">DUID</abbr>"
-msgstr ""
+msgstr "<abbr title=\"Унікальний ідентифікатор DHCP\">DUID</abbr>"
 
 msgid ""
 "<abbr title=\"maximal\">Max.</abbr> <abbr title=\"Dynamic Host Configuration "
 "Protocol\">DHCP</abbr> leases"
 msgstr ""
-"<abbr title=\"Максимум\">Max.</abbr> оренд <abbr title=\"Dynamic Host "
+"<abbr title=\"Максимум\">Макс.</abbr> оренд <abbr title=\"Dynamic Host "
 "Configuration Protocol — протокол динамічної конфігурації вузла\">DHCP</abbr>"
 
 msgid ""
 "<abbr title=\"maximal\">Max.</abbr> <abbr title=\"Extension Mechanisms for "
 "Domain Name System\">EDNS0</abbr> packet size"
 msgstr ""
-"<abbr title=\"Максимум\">Max.</abbr> розмір пакета <abbr title=\"Extension "
+"<abbr title=\"Максимальний\">Макс.</abbr> розмір пакета <abbr title=\"Extension "
 "Mechanisms for Domain Name System — Механізми розширень для доменної системи "
 "імен\">EDNS0</abbr>"
 
 msgid "<abbr title=\"maximal\">Max.</abbr> concurrent queries"
-msgstr "<abbr title=\"Максимум\">Max.</abbr> одночасних запитів"
+msgstr "<abbr title=\"Максимум\">Макс.</abbr> одночасних запитів"
 
 msgid "<abbr title='Pairwise: %s / Group: %s'>%s - %s</abbr>"
-msgstr "<abbr title='Парний: %s / Груповий: %s'>%s - %s</abbr>"
+msgstr "<abbr title='Парний: %s / Груповий: %s'>%s  %s</abbr>"
 
 msgid ""
 "<br/>Note: you need to manually restart the cron service if the crontab file "
 "was empty before editing."
 msgstr ""
+"<br/>Примітка: якщо перед редагуванням, файл crontab був порожній, вам потрібно "
+"вручну перезапустити служби cron."
 
 msgid "A43C + J43 + A43"
 msgstr ""
@@ -191,10 +199,11 @@ msgstr ""
 "<abbr title=\"Access Point Name — символічна назва точки доступу\">APN</abbr>"
 
 msgid "ARP retry threshold"
-msgstr "Ð\9fоÑ\80Ñ\96г Ð¿Ð¾Ð²Ñ\82оÑ\80Ñ\83 ARP"
+msgstr "Ð\9fоÑ\80Ñ\96г Ð¿Ð¾Ð²Ñ\82оÑ\80Ñ\8eваннÑ\8f ARP"
 
 msgid "ATM (Asynchronous Transfer Mode)"
 msgstr ""
+"<abbr title=\"Asynchronous Transfer Mode — асинхронний режим передавання"\">ATM</abbr>"
 
 msgid "ATM Bridges"
 msgstr "ATM-мости"
@@ -214,7 +223,7 @@ msgid ""
 "Linux network interfaces which can be used in conjunction with DHCP or PPP "
 "to dial into the provider network."
 msgstr ""
-"ATM-мости виставляють інкапсульований Ethernet у з'єднаннях AAL5 як "
+"ATM-мости виставляють інкапсульований Ethernet у зєднаннях AAL5 як "
 "віртуальні мережеві інтерфейси Linux, котрі можуть використовуватися в "
 "поєднанні з DHCP або PPP для підключення до мережі провайдера."
 
@@ -267,7 +276,7 @@ msgid "Additional Hosts files"
 msgstr "Додаткові файли hosts"
 
 msgid "Additional servers file"
-msgstr ""
+msgstr "Додаткові файли servers"
 
 msgid "Address"
 msgstr "Адреса"
@@ -282,7 +291,7 @@ msgid "Advanced Settings"
 msgstr "Додаткові параметри"
 
 msgid "Aggregate Transmit Power(ACTATP)"
-msgstr ""
+msgstr "Сумарна потужність передавання"
 
 msgid "Alert"
 msgstr "Тривога"
@@ -291,9 +300,10 @@ msgid ""
 "Allocate IP addresses sequentially, starting from the lowest available "
 "address"
 msgstr ""
+"Виділяти IP-адреси послідовно, починаючи з найнижчої доступної адреси"
 
 msgid "Allocate IP sequentially"
-msgstr ""
+msgstr "Виділяти IP послідовно"
 
 msgid "Allow <abbr title=\"Secure Shell\">SSH</abbr> password authentication"
 msgstr ""
@@ -304,7 +314,7 @@ msgid "Allow all except listed"
 msgstr "Дозволити всі, крім зазначених"
 
 msgid "Allow legacy 802.11b rates"
-msgstr ""
+msgstr "Дозволити застарілі швидкості 802.11b"
 
 msgid "Allow listed only"
 msgstr "Дозволити тільки зазначені"
@@ -314,7 +324,8 @@ msgstr "Дозволити локальний вузол"
 
 msgid "Allow remote hosts to connect to local SSH forwarded ports"
 msgstr ""
-"Дозволити віддаленим вузлам підключення до локальних SSH-спрямованих портів"
+"Дозволити віддаленим вузлам підключення до локальних переспрямованих портів "
+"SSH"
 
 msgid "Allow root logins with password"
 msgstr "Дозволити root-вхід із паролем"
@@ -325,14 +336,14 @@ msgstr "Дозволити користувачеві <em>root</em> вхід у
 msgid ""
 "Allow upstream responses in the 127.0.0.0/8 range, e.g. for RBL services"
 msgstr ""
-"Дозволити відповіді від клієнта на сервер у діапазоні 127.0.0.0/8, "
+"Дозволити висхідні відповіді від клієнта на сервер у діапазоні 127.0.0.0/8, "
 "наприклад, для RBL-послуг"
 
 msgid "Allowed IPs"
-msgstr ""
+msgstr "Дозволено IP-адреси"
 
 msgid "Always announce default router"
-msgstr ""
+msgstr "Завжди оголошувати типовим маршрутизатором"
 
 msgid "Annex"
 msgstr ""
@@ -380,22 +391,23 @@ msgid "Annex M G.992.5"
 msgstr ""
 
 msgid "Announce as default router even if no public prefix is available."
-msgstr ""
+msgstr "Оголошувати типовим маршрутизатором, навіть якщо немає доступного "
+"спільного префікса."
 
 msgid "Announced DNS domains"
-msgstr ""
+msgstr "Оголошено DNS-домени"
 
 msgid "Announced DNS servers"
-msgstr ""
+msgstr "Оголошено DNS-сервери"
 
 msgid "Anonymous Identity"
-msgstr ""
+msgstr "Анонімне посвідчення"
 
 msgid "Anonymous Mount"
-msgstr ""
+msgstr "Анонімне монтування"
 
 msgid "Anonymous Swap"
-msgstr ""
+msgstr "Анонімний своп"
 
 msgid "Antenna 1"
 msgstr "Антена 1"
@@ -410,14 +422,19 @@ msgid "Any zone"
 msgstr "Будь-яка зона"
 
 msgid "Apply request failed with status <code>%h</code>"
-msgstr ""
+msgstr "Сталася помилка запиту на застосування зі статусом <code>%h</code>"
 
 msgid "Apply unchecked"
-msgstr ""
+msgstr "Застосування не позначено"
+
+msgid "Architecture"
+msgstr "Архітектура"
 
 msgid ""
 "Assign a part of given length of every public IPv6-prefix to this interface"
 msgstr ""
+"Призначати частину заданої довжини до кожного публічного IPv6-префікса "
+"цього інтерфейсу"
 
 msgid "Assign interfaces..."
 msgstr "Призначення інтерфейсів..."
@@ -425,18 +442,23 @@ msgstr "Призначення інтерфейсів..."
 msgid ""
 "Assign prefix parts using this hexadecimal subprefix ID for this interface."
 msgstr ""
+"Призначати для цього інтерфейсу частину префікса, використовуючи цей "
+"шістнадцятковий ID субпрефікса."
 
 msgid "Associated Stations"
-msgstr "Приєднані станції"
+msgstr "Приєднано станції"
+
+msgid "Associations"
+msgstr "З’єднань"
 
 msgid "Auth Group"
-msgstr ""
+msgstr "Група автентифікації"
 
 msgid "Authentication"
 msgstr "Автентифікація"
 
 msgid "Authentication Type"
-msgstr ""
+msgstr "Тип автентифікації"
 
 msgid "Authoritative"
 msgstr "Надійний"
@@ -448,25 +470,28 @@ msgid "Auto Refresh"
 msgstr "Автоматичне оновлення"
 
 msgid "Automatic"
-msgstr ""
+msgstr "Автоматично"
 
 msgid "Automatic Homenet (HNCP)"
-msgstr ""
+msgstr "Автоматично Homenet (HNCP)"
 
 msgid "Automatically check filesystem for errors before mounting"
 msgstr ""
+"Автоматично перевіряти файлову систему на наявність помилок перед "
+"монтуванням"
 
 msgid "Automatically mount filesystems on hotplug"
 msgstr ""
+"Автоматично монтувати файлові системи при оперативниму підключенні"
 
 msgid "Automatically mount swap on hotplug"
-msgstr ""
+msgstr "Автоматично монтувати своп при оперативниму підключенні"
 
 msgid "Automount Filesystem"
-msgstr ""
+msgstr "Автомонтування ФС"
 
 msgid "Automount Swap"
-msgstr ""
+msgstr "Автомонтування своп"
 
 msgid "Available"
 msgstr "Доступно"
@@ -505,7 +530,7 @@ msgid "Back to scan results"
 msgstr "Повернутися до результатів сканування"
 
 msgid "Backup / Flash Firmware"
-msgstr "РезеÑ\80вне ÐºÐ¾Ð¿Ñ\96Ñ\8eваннÑ\8f / Ð\9eновленнÑ\8f Ð¿Ñ\80оÑ\88ивки"
+msgstr "РезеÑ\80вне ÐºÐ¾Ð¿Ñ\96Ñ\8eваннÑ\8f / Ð\9fÑ\80оÑ\88ивка Ð¼Ñ\96кÑ\80опÑ\80огÑ\80ами"
 
 msgid "Backup / Restore"
 msgstr "Резервне копіювання/відновлення"
@@ -514,10 +539,10 @@ msgid "Backup file list"
 msgstr "Список файлів резервних копій"
 
 msgid "Bad address specified!"
-msgstr "Ð\92казана Ð½ÐµÐ¿Ñ\80авилÑ\8cна Ð°Ð´Ñ\80еÑ\81а!"
+msgstr "Ð\92казано Ð½ÐµÐ¿Ñ\80авилÑ\8cнÑ\83 Ð°Ð´Ñ\80еÑ\81Ñ\83!"
 
 msgid "Band"
-msgstr ""
+msgstr "Група"
 
 msgid ""
 "Below is the determined list of files to backup. It consists of changed "
@@ -529,16 +554,16 @@ msgstr ""
 "базових файлів, та файлів за користувацькими шаблонами резервного копіювання."
 
 msgid "Bind interface"
-msgstr ""
+msgstr "Прив’язка інтерфейсу"
 
 msgid "Bind only to specific interfaces rather than wildcard address."
-msgstr ""
+msgstr "Прив’язка тільки до певних інтерфейсів, а не шаблонної адреси."
 
 msgid "Bind the tunnel to this interface (optional)."
-msgstr ""
+msgstr "Прив’язка тунелю до цього інтерфейсу (за бажання)."
 
 msgid "Bitrate"
-msgstr "Швидкість передачі даних"
+msgstr "Швидкість передавання даних"
 
 msgid "Bogus NX Domain Override"
 msgstr "Відкидати підробки NX-домену"
@@ -547,7 +572,7 @@ msgid "Bridge"
 msgstr "Міст"
 
 msgid "Bridge interfaces"
-msgstr "Об'єднати інтерфейси в міст"
+msgstr "Обєднати інтерфейси в міст"
 
 msgid "Bridge unit number"
 msgstr "Номер моста"
@@ -568,9 +593,12 @@ msgid ""
 "Build/distribution specific feed definitions. This file will NOT be "
 "preserved in any sysupgrade."
 msgstr ""
+"Специфічні для збірки/поширення визначення каналів. Цей файл НЕ БУДЕ "
+"збережено при будь-якому оновленні системи."
 
 msgid "CA certificate; if empty it will be saved after the first connection."
 msgstr ""
+"Сертифікат CA; якщо порожньо, його буде збережено після першого підключення."
 
 msgid "CPU usage (%)"
 msgstr "Завантаження ЦП, %"
@@ -579,7 +607,7 @@ msgid "Cancel"
 msgstr "Скасувати"
 
 msgid "Category"
-msgstr ""
+msgstr "Категорія"
 
 msgid "Chain"
 msgstr "Ланцюжок"
@@ -591,7 +619,7 @@ msgid "Changes applied."
 msgstr "Зміни застосовано."
 
 msgid "Changes have been reverted."
-msgstr ""
+msgstr "Зміни було скасовано."
 
 msgid "Changes the administrator password for accessing the device"
 msgstr "Зміна пароля адміністратора для доступу до пристрою"
@@ -603,15 +631,17 @@ msgid ""
 "Channel %d is not available in the %s regulatory domain and has been auto-"
 "adjusted to %d."
 msgstr ""
+"Канал %d не доступний у %s регуляторному домені й був автоматично "
+"скоригований на %d."
 
 msgid "Check"
 msgstr "Перевірити"
 
 msgid "Check filesystems before mount"
-msgstr ""
+msgstr "Перевірити файлову систему перед монтуванням"
 
 msgid "Check this option to delete the existing networks from this radio."
-msgstr ""
+msgstr "Позначте цей параметр, щоб видалити існуючі мережі з цього радіо."
 
 msgid "Checksum"
 msgstr "Контрольна сума"
@@ -638,7 +668,7 @@ msgid "Cipher"
 msgstr "Шифр"
 
 msgid "Cisco UDP encapsulation"
-msgstr ""
+msgstr "Інкапсуляція UDP Cisco"
 
 msgid ""
 "Click \"Generate archive\" to download a tar archive of the current "
@@ -646,8 +676,8 @@ msgid ""
 "\"Perform reset\" (only possible with squashfs images)."
 msgstr ""
 "Натисніть кнопку \"Створити архів\", щоб завантажити tar-архів поточних "
-"Ñ\84айлÑ\96в ÐºÐ¾Ð½Ñ\84Ñ\96гÑ\83Ñ\80аÑ\86Ñ\96Ñ\97. Ð\94лÑ\8f Ð²Ñ\96дновленнÑ\8f Ð¿Ñ\80оÑ\88ивки Ð´Ð¾ Ñ\97Ñ\97 Ð¿Ð¾Ñ\87аÑ\82кового Ñ\81Ñ\82анÑ\83, "
-"натисніть кнопку \"Відновити\" (можливе тільки з образами SquashFS)."
+"Ñ\84айлÑ\96в ÐºÐ¾Ð½Ñ\84Ñ\96гÑ\83Ñ\80аÑ\86Ñ\96Ñ\97. Ð\94лÑ\8f Ð²Ñ\96дновленнÑ\8f Ð¼Ñ\96кÑ\80опÑ\80огÑ\80ами Ð´Ð¾ Ñ\97Ñ\97 Ð¿Ð¾Ñ\87аÑ\82кового "
+"стану натисніть кнопку \"Відновити\" (можливо тільки з образами SquashFS)."
 
 msgid "Client"
 msgstr "Клієнт"
@@ -659,8 +689,8 @@ msgid ""
 "Close inactive connection after the given amount of seconds, use 0 to "
 "persist connection"
 msgstr ""
-"Закривати неактивні з'єднання після певного інтервалу часу (секунди). Для "
-"утримання неактивних з'єднань використовуйте 0"
+"Закривати неактивні зєднання після певного інтервалу часу (секунди). Для "
+"утримання неактивних зєднань використовуйте 0"
 
 msgid "Close list..."
 msgstr "Згорнути список..."
@@ -680,18 +710,22 @@ msgid ""
 "workaround might cause interoperability issues and reduced robustness of key "
 "negotiation especially in environments with heavy traffic load."
 msgstr ""
+"Ускладнює атаки перевстановлення ключа на стороні клієнта, відключаючи "
+"ретрансляцію кадрів EAPOL-Key, що використовуються для встановлення ключів. "
+"Може викликати проблеми сумісності та зниження стійкості узгодження ключа, "
+"особливо в середовищах з великою завантаженістю трафіку."
 
 msgid "Configuration"
 msgstr "Конфігурація"
 
 msgid "Configuration files will be kept."
-msgstr "Конфігураційні файли будуть збережені."
+msgstr "Конфігураційні файли буде збережено."
 
 msgid "Configuration has been applied."
-msgstr ""
+msgstr "Конфігурацію застосовано."
 
 msgid "Configuration has been rolled back!"
-msgstr ""
+msgstr "Конфігурацію було відкочено!"
 
 msgid "Confirmation"
 msgstr "Підтвердження"
@@ -700,7 +734,7 @@ msgid "Connect"
 msgstr "Підключити"
 
 msgid "Connected"
-msgstr "Ð\9fÑ\96дклÑ\8eÑ\87ений"
+msgstr "Ð\9fÑ\96дклÑ\8eÑ\87ено"
 
 msgid "Connection Limit"
 msgstr "Гранична кількість підключень"
@@ -713,6 +747,9 @@ msgid ""
 "changes. You might need to reconnect if you modified network related "
 "settings such as the IP address or wireless security credentials."
 msgstr ""
+"Після застосування змін конфігурації не вдалося відновити доступ до пристрою. "
+"Вам, можливо, знадобитися повторне підключення, якщо ви змінили налаштування "
+"мережі, такі як IP-адреса або облікові дані безпеки бездротової мережі."
 
 msgid "Country"
 msgstr "Країна"
@@ -745,26 +782,29 @@ msgid "Custom Interface"
 msgstr "Інтерфейс користувача"
 
 msgid "Custom delegated IPv6-prefix"
-msgstr ""
+msgstr "Користувацький делегований префікс IPv6"
 
 msgid ""
 "Custom feed definitions, e.g. private feeds. This file can be preserved in a "
 "sysupgrade."
-msgstr ""
+msgstr "Користувацькі визначення каналів, наприклад, приватних. Цей файл може "
+"бути збережено при оновленні системи."
 
 msgid "Custom feeds"
-msgstr ""
+msgstr "Користувацькі канали"
 
 msgid ""
 "Custom files (certificates, scripts) may remain on the system. To prevent "
 "this, perform a factory-reset first."
 msgstr ""
+"Користувацькі файли (сертифікати, скрипти) можуть залишитися в системі. Щоб "
+"запобігти цьому, спочатку виконайте скидання до заводських налаштувань."
 
 msgid ""
 "Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
 "\">LED</abbr>s if possible."
 msgstr ""
-"Настроювання поведінки <abbr title=\"Light Emitting Diode — світлодіод"
+"Налаштування поведінки <abbr title=\"Light Emitting Diode — світлодіод"
 "\">LED</abbr>, якщо це можливо."
 
 msgid "DHCP Leases"
@@ -786,49 +826,49 @@ msgid "DHCPv6 Leases"
 msgstr "Оренди DHCPv6"
 
 msgid "DHCPv6 client"
-msgstr ""
+msgstr "Клієнт DHCPv6"
 
 msgid "DHCPv6-Mode"
-msgstr ""
+msgstr "Режим DHCPv6"
 
 msgid "DHCPv6-Service"
-msgstr ""
+msgstr "Служба DHCPv6"
 
 msgid "DNS"
 msgstr "DNS"
 
 msgid "DNS forwardings"
-msgstr "СпÑ\80Ñ\8fмовÑ\83ваннÑ\8f DNS-запиÑ\82Ñ\96в"
+msgstr "Ð\9fеÑ\80еÑ\81пÑ\80Ñ\8fмовÑ\83ваннÑ\8f<br />запиÑ\82Ñ\96в DNS"
 
 msgid "DNS-Label / FQDN"
-msgstr ""
+msgstr "DNS-мітка / FQDN"
 
 msgid "DNSSEC"
 msgstr ""
 
 msgid "DNSSEC check unsigned"
-msgstr ""
+msgstr "перевірка непідписаного DNSSEC"
 
 msgid "DPD Idle Timeout"
-msgstr ""
+msgstr "Тайм-аут простою DPD"
 
 msgid "DS-Lite AFTR address"
-msgstr ""
+msgstr "AFTR-адреса DS-Lite"
 
 msgid "DSL"
-msgstr ""
+msgstr "DSL"
 
 msgid "DSL Status"
-msgstr ""
+msgstr "Стан DSL"
 
 msgid "DSL line mode"
-msgstr ""
+msgstr "Режим лінії DSL"
 
 msgid "DUID"
 msgstr "DUID"
 
 msgid "Data Rate"
-msgstr ""
+msgstr "Швидк. передавання"
 
 msgid "Debug"
 msgstr "Зневаджування"
@@ -840,7 +880,7 @@ msgid "Default gateway"
 msgstr "Типовий шлюз"
 
 msgid "Default is stateless + stateful"
-msgstr ""
+msgstr "Типовим є БЕЗ та ЗІ збереженням стану"
 
 msgid "Default state"
 msgstr "Типовий стан"
@@ -879,19 +919,19 @@ msgid "Device Configuration"
 msgstr "Конфігурація пристрою"
 
 msgid "Device is rebooting..."
-msgstr ""
+msgstr "Пристрій перезавантажується..."
 
 msgid "Device unreachable"
-msgstr ""
+msgstr "Пристрій недосяжний"
 
 msgid "Device unreachable!"
-msgstr ""
+msgstr "Пристрій недосяжний!"
 
 msgid "Diagnostics"
 msgstr "Діагностика"
 
 msgid "Dial number"
-msgstr ""
+msgstr "Набір номера"
 
 msgid "Directory"
 msgstr "Каталог"
@@ -907,25 +947,25 @@ msgstr ""
 "динамічної конфігурації вузла\">DHCP</abbr> для цього інтерфейсу."
 
 msgid "Disable DNS setup"
-msgstr "Вимкнути настроювання DNS"
+msgstr "Вимкнути налаштування DNS"
 
 msgid "Disable Encryption"
-msgstr ""
+msgstr "Вимкнути шифрування"
 
 msgid "Disabled"
 msgstr "Вимкнено"
 
 msgid "Disabled (default)"
-msgstr ""
+msgstr "Вимкнено (типово)"
 
 msgid "Discard upstream RFC1918 responses"
-msgstr "Відкидати RFC1918-відповіді від клієнта на сервер"
+msgstr "Відкидати висхідні RFC1918-відповіді"
 
 msgid "Dismiss"
-msgstr ""
+msgstr "Відхилити"
 
 msgid "Displaying only packages containing"
-msgstr "Ð\9fоказанÑ\96 Ñ\82Ñ\96лÑ\8cки Ð½ÐµÐ¿Ð¾Ñ\80ожнÑ\96 Ð¿Ð°ÐºÐµÑ\82и"
+msgstr "Ð\92Ñ\96добÑ\80аженнÑ\8f Ð»Ð¸Ñ\88е Ð½ÐµÐ¿Ð¾Ñ\80ожнÑ\96Ñ\85 Ð¿Ð°ÐºÐµÑ\82Ñ\96в"
 
 msgid "Distance Optimization"
 msgstr "Оптимізація за відстанню"
@@ -934,7 +974,7 @@ msgid "Distance to farthest network member in meters."
 msgstr "Відстань до найвіддаленішого вузла мережі в метрах."
 
 msgid "Distribution feeds"
-msgstr ""
+msgstr "Канали поширення"
 
 msgid "Diversity"
 msgstr "Різновидність"
@@ -948,7 +988,7 @@ msgstr ""
 "Dnsmasq являє собою комбінований <abbr title=\"Dynamic Host Configuration "
 "Protocol — протокол динамічної конфігурації вузла\">DHCP</abbr>-сервер і "
 "<abbr title=\"Domain Name System — система доменних імен\">DNS</abbr>-"
-"транспортер для брандмауерів <abbr title=\"Network Address Translation — "
+"проксі для брандмауерів <abbr title=\"Network Address Translation — "
 "перетворення (трансляція) мережевих адрес\">NAT</abbr>"
 
 msgid "Do not cache negative replies, e.g. for not existing domains"
@@ -956,11 +996,12 @@ msgstr "Не кешувати негативні відповіді, напри
 
 msgid "Do not forward requests that cannot be answered by public name servers"
 msgstr ""
-"Не спрямовувати запити, які не можуть бути оброблені публічними серверами "
+"Не переспрямовувати запити, які не може бути оброблено публічними серверами "
 "імен"
 
 msgid "Do not forward reverse lookups for local networks"
-msgstr "Не спрямовувати зворотний перегляд для локальних мереж"
+msgstr "Не переспрямовувати зворотні <abbr title=\"Domain Name System — "
+"система доменних імен\">DNS</abbr>-запити для локальних мереж"
 
 msgid "Domain required"
 msgstr "Потрібен домен"
@@ -969,13 +1010,13 @@ msgid "Domain whitelist"
 msgstr "\"Білий список\" доменів"
 
 msgid "Don't Fragment"
-msgstr ""
+msgstr "Не фрагментувати"
 
 msgid ""
 "Don't forward <abbr title=\"Domain Name System\">DNS</abbr>-Requests without "
 "<abbr title=\"Domain Name System\">DNS</abbr>-Name"
 msgstr ""
-"Ð\9dе Ð¿ÐµÑ\80еÑ\81илати <abbr title=\"Domain Name System — система доменних імен"
+"Ð\9dе Ð¿ÐµÑ\80еÑ\81пÑ\80Ñ\8fмовÑ\83вати <abbr title=\"Domain Name System — система доменних імен"
 "\">DNS</abbr>-запити без <abbr title=\"Domain Name System — система доменних "
 "імен\">DNS</abbr>-імені"
 
@@ -986,7 +1027,7 @@ msgid "Download backup"
 msgstr "Завантажити резервну копію"
 
 msgid "Downstream SNR offset"
-msgstr ""
+msgstr "Низхідний зсув SNR"
 
 msgid "Dropbear Instance"
 msgstr "Реалізація Dropbear"
@@ -1017,7 +1058,7 @@ msgstr ""
 "обслуговуватися тільки клієнти, які мають статичні оренди."
 
 msgid "EA-bits length"
-msgstr ""
+msgstr "Довжина EA-бітів"
 
 msgid "EAP-Method"
 msgstr "EAP-Метод"
@@ -1029,6 +1070,8 @@ msgid ""
 "Edit the raw configuration data above to fix any error and hit \"Save\" to "
 "reload the page."
 msgstr ""
+"Щоб виправити якусь помилку, відредагуйте вихідні дані конфігурації вище і "
+"натисніть \"Зберегти\", щоб перезавантажити сторінку."
 
 msgid "Edit this interface"
 msgstr "Редагувати цей інтерфейс"
@@ -1046,6 +1089,8 @@ msgid ""
 "Enable <abbr title=\"Internet Group Management Protocol\">IGMP</abbr> "
 "snooping"
 msgstr ""
+"Увімкнути відстеження <abbr title=\"Internet Group Management Protocol\">"
+"IGMP</abbr>"
 
 msgid "Enable <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
 msgstr "Увімкнути <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
@@ -1054,19 +1099,19 @@ msgid "Enable HE.net dynamic endpoint update"
 msgstr "Увімкнути динамічне оновлення кінцевої точки HE.net"
 
 msgid "Enable IPv6 negotiation"
-msgstr ""
+msgstr "Увімкнути узгодження IPv6"
 
 msgid "Enable IPv6 negotiation on the PPP link"
-msgstr "Увімкнути узгодження IPv6 для PPP-з'єднань"
+msgstr "Увімкнути узгодження IPv6 для PPP-зєднань"
 
 msgid "Enable Jumbo Frame passthrough"
 msgstr "Пропускати Jumbo-фрейми"
 
 msgid "Enable NTP client"
-msgstr "Увімкнути NTP-клієнт"
+msgstr "Увімкнути клієнта NTP"
 
 msgid "Enable Single DES"
-msgstr ""
+msgstr "Увімкнути Single DES"
 
 msgid "Enable TFTP server"
 msgstr "Увімкнути TFTP-сервер"
@@ -1075,28 +1120,28 @@ msgid "Enable VLAN functionality"
 msgstr "Увімкнути підтримку VLAN"
 
 msgid "Enable WPS pushbutton, requires WPA(2)-PSK"
-msgstr ""
+msgstr "Увімкнути кнопку WPS, потребує WPA(2)-PSK"
 
 msgid "Enable key reinstallation (KRACK) countermeasures"
-msgstr ""
+msgstr "Увімкнути протидію<br />перевстановленню ключів (KRACK)"
 
 msgid "Enable learning and aging"
 msgstr "Увімкнути learning та aging"
 
 msgid "Enable mirroring of incoming packets"
-msgstr ""
+msgstr "Увімкнути віддзеркалення вхідних пакетів"
 
 msgid "Enable mirroring of outgoing packets"
-msgstr ""
+msgstr "Увімкнути віддзеркалення вихідних пакетів"
 
 msgid "Enable the DF (Don't Fragment) flag of the encapsulating packets."
-msgstr ""
+msgstr "Увімкнути прапорець DF (Don't Fragment) для інкапсульованих пакетів"
 
 msgid "Enable this mount"
 msgstr "Увімкнути це монтування"
 
 msgid "Enable this swap"
-msgstr "Увімкнути це довантаження"
+msgstr "Увімкнути цей своп"
 
 msgid "Enable/Disable"
 msgstr "Увімкнено/Вимкнено"
@@ -1105,16 +1150,18 @@ msgid "Enabled"
 msgstr "Увімкнено"
 
 msgid "Enables IGMP snooping on this bridge"
-msgstr ""
+msgstr "Вмикає відстеження IGMP на цьому мосту"
 
 msgid ""
 "Enables fast roaming among access points that belong to the same Mobility "
 "Domain"
 msgstr ""
+"Вмикає швидкий роумінг між точками доступу, що належать до одного і "
+"того ж домену мобільності"
 
 msgid "Enables the Spanning Tree Protocol on this bridge"
 msgstr ""
-"УвÑ\96мкнÑ\83Ñ\82и <abbr title=\"Spanning Tree Protocol\">STP</abbr> на цьому мосту"
+"Ð\92микаÑ\94 <abbr title=\"Spanning Tree Protocol\">STP</abbr> на цьому мосту"
 
 msgid "Encapsulation mode"
 msgstr "Режим інкапсуляції"
@@ -1123,10 +1170,10 @@ msgid "Encryption"
 msgstr "Шифрування"
 
 msgid "Endpoint Host"
-msgstr ""
+msgstr "Хост кінцевої точки"
 
 msgid "Endpoint Port"
-msgstr ""
+msgstr "Порт кінцевої точки"
 
 msgid "Erasing..."
 msgstr "Видалення..."
@@ -1135,22 +1182,22 @@ msgid "Error"
 msgstr "Помилка"
 
 msgid "Errored seconds (ES)"
-msgstr ""
+msgstr "Секунд з помилками (<abbr title=\"Errored seconds\">ES</abbr>)"
 
 msgid "Ethernet Adapter"
-msgstr "Адаптер Ethernet"
+msgstr "Ethernet-адаптер"
 
 msgid "Ethernet Switch"
 msgstr "Ethernet-комутатор"
 
 msgid "Exclude interfaces"
-msgstr ""
+msgstr "Виключити інтерфейси"
 
 msgid "Expand hosts"
 msgstr "Розширення вузлів"
 
 msgid "Expires"
-msgstr "Ð\94Ñ\96йÑ\81ний Ñ\89е"
+msgstr "Ð\97бÑ\96гаÑ\94 Ð·Ð°"
 
 #, fuzzy
 msgid ""
@@ -1158,13 +1205,13 @@ msgid ""
 msgstr "Термін оренди адрес, мінімум 2 хвилини (<code>2m</code>)."
 
 msgid "External"
-msgstr ""
+msgstr "Зовнішнє"
 
 msgid "External R0 Key Holder List"
-msgstr ""
+msgstr "Зовнішній список власників ключів R0"
 
 msgid "External R1 Key Holder List"
-msgstr ""
+msgstr "Зовнішній список власників ключів R1"
 
 msgid "External system log server"
 msgstr "Зовнішній сервер системного журналу"
@@ -1173,28 +1220,28 @@ msgid "External system log server port"
 msgstr "Порт зовнішнього сервера системного журналу"
 
 msgid "External system log server protocol"
-msgstr ""
+msgstr "Протокол зовнішнього сервера системного журналу"
 
 msgid "Extra SSH command options"
-msgstr ""
+msgstr "Додаткові параметри команд SSH"
 
 msgid "FT over DS"
-msgstr ""
+msgstr "FT через DS"
 
 msgid "FT over the Air"
-msgstr ""
+msgstr "FT через повітря"
 
-msgid "FT protocol"
+msgid "Протокол FT"
 msgstr ""
 
 msgid "Failed to confirm apply within %ds, waiting for rollback…"
-msgstr ""
+msgstr "Не вдалося підтвердити застосування на протязі %d с, очікуємо відкату…"
 
 msgid "File"
 msgstr "Файл"
 
 msgid "Filename of the boot image advertised to clients"
-msgstr "І'мя завантажувального образу, що оголошується клієнтам"
+msgstr "Імя завантажувального образу, що оголошується клієнтам"
 
 msgid "Filesystem"
 msgstr "Файлова система"
@@ -1212,6 +1259,8 @@ msgid ""
 "Find all currently attached filesystems and swap and replace configuration "
 "with defaults based on what was detected"
 msgstr ""
+"Знайти всі файлові системи та свопи, які наразі підключено і замінити "
+"конфігурацію типовою на підставі того, що було виявлено"
 
 msgid "Find and join network"
 msgstr "Знайти мережу й приєднатися"
@@ -1226,37 +1275,37 @@ msgid "Firewall"
 msgstr "Брандмауер"
 
 msgid "Firewall Mark"
-msgstr ""
+msgstr "Позначка брандмауера"
 
 msgid "Firewall Settings"
-msgstr "Настройки брандмауера"
+msgstr "Налаштування брандмауера"
 
 msgid "Firewall Status"
-msgstr "Статус брандмауера"
+msgstr "Стан брандмауера"
 
 msgid "Firmware File"
-msgstr ""
+msgstr "Файл мікропрограми"
 
 msgid "Firmware Version"
-msgstr "Ð\92еÑ\80Ñ\81Ñ\96Ñ\8f Ð¿Ñ\80оÑ\88ивки"
+msgstr "Ð\92еÑ\80Ñ\81Ñ\96Ñ\8f Ð¼Ñ\96кÑ\80опÑ\80огÑ\80ами"
 
 msgid "Fixed source port for outbound DNS queries"
 msgstr "Фіксований порт для вихідних DNS-запитів"
 
 msgid "Flash Firmware"
-msgstr "Ð\97аливаÑ\94мо Ð¿Ñ\80оÑ\88ивку"
+msgstr "Ð\9fÑ\80оÑ\88иваÑ\94мо Ð¼Ñ\96кÑ\80опÑ\80огÑ\80аму"
 
 msgid "Flash image..."
-msgstr "Ð\92Ñ\96дванÑ\82ажити образ..."
+msgstr "Ð\9fÑ\80оÑ\88ити образ..."
 
 msgid "Flash new firmware image"
-msgstr "Ð\97алиÑ\82и Ð½Ð¾Ð²Ð¸Ð¹ Ð¾Ð±Ñ\80аз Ð¿Ñ\80оÑ\88ивки"
+msgstr "Ð\9fÑ\80оÑ\88иÑ\82и Ð½Ð¾Ð²Ð¸Ð¹ Ð¾Ð±Ñ\80аз Ð¼Ñ\96кÑ\80опÑ\80огÑ\80ами"
 
 msgid "Flash operations"
-msgstr "Ð\9eпеÑ\80аÑ\86Ñ\96Ñ\97 Ð·Ð°Ð»ивання"
+msgstr "Ð\9eпеÑ\80аÑ\86Ñ\96Ñ\97 Ð¿Ñ\80оÑ\88ивання"
 
 msgid "Flashing..."
-msgstr "Ð\97аливаємо..."
+msgstr "Ð\9fÑ\80оÑ\88иваємо..."
 
 msgid "Force"
 msgstr "Примусово"
@@ -1274,28 +1323,28 @@ msgid "Force TKIP and CCMP (AES)"
 msgstr "Примусово TKIP та CCMP (AES)"
 
 msgid "Force link"
-msgstr ""
+msgstr "Примусове з’єднання"
 
 msgid "Force use of NAT-T"
-msgstr ""
+msgstr "Примусово використовувати NAT-T"
 
 msgid "Form token mismatch"
-msgstr ""
+msgstr "Неузгодженість маркера форми"
 
 msgid "Forward DHCP traffic"
-msgstr "Спрямовувати DHCP-трафік"
+msgstr "Ð\9fеÑ\80еÑ\81прямовувати DHCP-трафік"
 
 msgid "Forward Error Correction Seconds (FECS)"
-msgstr ""
+msgstr "Секунди прямого коригування помилок (FECS)"
 
 msgid "Forward broadcast traffic"
-msgstr "Спрямовувати широкомовний трафік"
+msgstr "Ð\9fеÑ\80еÑ\81прямовувати широкомовний трафік"
 
 msgid "Forward mesh peer traffic"
-msgstr ""
+msgstr "Переспрямовувати одноранговий трафік"
 
 msgid "Forwarding mode"
-msgstr "Режим спрямовування"
+msgstr "Режим переспрямовування"
 
 msgid "Fragmentation Threshold"
 msgstr "Поріг фрагментації"
@@ -1311,7 +1360,7 @@ msgstr "Вільне місце"
 
 msgid ""
 "Further information about WireGuard interfaces and peers at <a href=\"http://"
-"wireguard.io\">wireguard.io</a>."
+"wireguard.com\">wireguard.com</a>."
 msgstr ""
 
 msgid "GHz"
@@ -1327,19 +1376,19 @@ msgid "Gateway ports"
 msgstr "Порти шлюзу"
 
 msgid "General Settings"
-msgstr "Ð\97агалÑ\8cнÑ\96 Ð½Ð°Ñ\81Ñ\82Ñ\80ойки"
+msgstr "Ð\97агалÑ\8cнÑ\96 Ð¿Ð°Ñ\80амеÑ\82Ñ\80и"
 
 msgid "General Setup"
-msgstr "Загальні настройки"
+msgstr "Загальні налаштування"
 
 msgid "General options for opkg"
-msgstr ""
+msgstr "Загальні параметри OPKG"
 
 msgid "Generate Config"
-msgstr ""
+msgstr "Cтворити конфігурацію"
 
 msgid "Generate PMK locally"
-msgstr ""
+msgstr "Генерувати PMK локально"
 
 msgid "Generate archive"
 msgstr "Cтворити архів"
@@ -1351,10 +1400,10 @@ msgid "Given password confirmation did not match, password not changed!"
 msgstr "Оскільки пароль і підтвердження не співпадають, то пароль не змінено!"
 
 msgid "Global Settings"
-msgstr ""
+msgstr "Загальні параметри"
 
 msgid "Global network options"
-msgstr ""
+msgstr "Глобальні параметри мережі"
 
 msgid "Go to password configuration..."
 msgstr "Перейти до конфігурації пароля..."
@@ -1363,19 +1412,19 @@ msgid "Go to relevant configuration page"
 msgstr "Перейти до відповідної сторінки конфігурації"
 
 msgid "Group Password"
-msgstr ""
+msgstr "Пароль групи"
 
 msgid "Guest"
-msgstr ""
+msgstr "Гість"
 
 msgid "HE.net password"
 msgstr "Пароль HE.net"
 
 msgid "HE.net username"
-msgstr ""
+msgstr "Ім’я користувача HE.net"
 
 msgid "HT mode (802.11n)"
-msgstr ""
+msgstr "Режим HT (802.11n)"
 
 msgid "Hang Up"
 msgstr "Призупинити"
@@ -1387,7 +1436,7 @@ msgid ""
 "Here you can configure the basic aspects of your device like its hostname or "
 "the timezone."
 msgstr ""
-"Тут ви можете настроїти основні параметри вигляду вашого пристрою, такі як "
+"Тут ви можете налаштувати основні параметри вигляду вашого пристрою, такі як "
 "назва (ім’я) вузла або часовий пояс."
 
 msgid ""
@@ -1406,7 +1455,7 @@ msgstr ""
 "розширеної служби послуг\">ESSID</abbr>"
 
 msgid "Host"
-msgstr ""
+msgstr "Вузол"
 
 msgid "Host entries"
 msgstr "Записи вузлів"
@@ -1418,10 +1467,10 @@ msgid "Host-<abbr title=\"Internet Protocol Address\">IP</abbr> or Network"
 msgstr "<abbr title=\"Internet Protocol Address\">IP</abbr> вузла або мережа"
 
 msgid "Hostname"
-msgstr "Назва (ім'я) вузла"
+msgstr "Назва (імя) вузла"
 
 msgid "Hostname to send when requesting DHCP"
-msgstr "Ім'я вузла для надсилання при запиті DHCP"
+msgstr "Імя вузла для надсилання при запиті DHCP"
 
 msgid "Hostnames"
 msgstr "Імена вузлів"
@@ -1433,7 +1482,7 @@ msgid "IKE DH Group"
 msgstr ""
 
 msgid "IP Addresses"
-msgstr ""
+msgstr "Адреси IP"
 
 msgid "IP address"
 msgstr "IP-адреса"
@@ -1444,8 +1493,8 @@ msgstr "IPv4"
 msgid "IPv4 Firewall"
 msgstr "Брандмауер IPv4"
 
-msgid "IPv4 WAN Status"
-msgstr "СÑ\82аÑ\82Ñ\83Ñ\81 IPv4 WAN"
+msgid "IPv4 Upstream"
+msgstr "Ð\92иÑ\81Ñ\85Ñ\96дне Ð·â\80\99Ñ\94днаннÑ\8f IPv4"
 
 msgid "IPv4 address"
 msgstr "Адреса IPv4"
@@ -1454,7 +1503,7 @@ msgid "IPv4 and IPv6"
 msgstr "IPv4 та IPv6"
 
 msgid "IPv4 assignment length"
-msgstr ""
+msgstr "Довжина присвоювання IPv4"
 
 msgid "IPv4 broadcast"
 msgstr "Широкомовний IPv4"
@@ -1487,25 +1536,27 @@ msgid "IPv6 Firewall"
 msgstr "Брандмауер IPv6"
 
 msgid "IPv6 Neighbours"
-msgstr ""
+msgstr "Сусіди IPv6"
 
 msgid "IPv6 Settings"
-msgstr ""
+msgstr "Налаштування IPv6"
 
 msgid "IPv6 ULA-Prefix"
 msgstr ""
+"<abbr title=\"Unique Local Address — унікальна локальна адреса\">ULA"
+"</abbr>-префікс IPv6"
 
-msgid "IPv6 WAN Status"
-msgstr "СÑ\82аÑ\82Ñ\83Ñ\81 IPv6 WAN"
+msgid "IPv6 Upstream"
+msgstr "Ð\92иÑ\81Ñ\85Ñ\96дне Ð·â\80\99Ñ\94днаннÑ\8f IPv6"
 
 msgid "IPv6 address"
 msgstr "Адреса IPv6"
 
 msgid "IPv6 assignment hint"
-msgstr ""
+msgstr "Натяк призначення IPv6"
 
 msgid "IPv6 assignment length"
-msgstr ""
+msgstr "Довжина призначення IPv6"
 
 msgid "IPv6 gateway"
 msgstr "Шлюз IPv6"
@@ -1520,10 +1571,10 @@ msgid "IPv6 prefix length"
 msgstr "Довжина префікса IPv6"
 
 msgid "IPv6 routed prefix"
-msgstr ""
+msgstr "Надісланий префікс IPv6"
 
 msgid "IPv6 suffix"
-msgstr ""
+msgstr "Суфікс IPv6"
 
 msgid "IPv6-Address"
 msgstr "IPv6-адреса"
@@ -1541,13 +1592,13 @@ msgid "IPv6-over-IPv4 (6to4)"
 msgstr "IPv6 через IPv4 (6to4)"
 
 msgid "Identity"
-msgstr "Ð\86денÑ\82иÑ\87нÑ\96Ñ\81Ñ\82Ñ\8c"
+msgstr "Ð\9fоÑ\81вÑ\96дÑ\87еннÑ\8f"
 
 msgid "If checked, 1DES is enabled"
-msgstr ""
+msgstr "Якщо позначено, 1DES увімкнено"
 
 msgid "If checked, encryption is disabled"
-msgstr ""
+msgstr "Якщо позначено, шифрування вимкнено"
 
 msgid ""
 "If specified, mount the device by its UUID instead of a fixed device node"
@@ -1559,11 +1610,11 @@ msgid ""
 "If specified, mount the device by the partition label instead of a fixed "
 "device node"
 msgstr ""
-"ЯкÑ\89о Ð¾Ð±Ñ\80ано, Ð¼Ð¾Ð½Ñ\82Ñ\83ваÑ\82и Ð¿Ñ\80иÑ\81Ñ\82Ñ\80Ñ\96й Ð·Ð° Ð½Ð°Ð·Ð²ою його розділу замість фіксованого "
+"ЯкÑ\89о Ð¾Ð±Ñ\80ано, Ð¼Ð¾Ð½Ñ\82Ñ\83ваÑ\82и Ð¿Ñ\80иÑ\81Ñ\82Ñ\80Ñ\96й Ð·Ð° Ð¼Ñ\96Ñ\82кою його розділу замість фіксованого "
 "вузла пристрою"
 
 msgid "If unchecked, no default route is configured"
-msgstr "Якщо не позначено, типовий маршрут не настроєно"
+msgstr "Якщо не позначено, типовий маршрут не налаштовано"
 
 msgid "If unchecked, the advertised DNS server addresses are ignored"
 msgstr "Якщо не позначено, оголошувані адреси DNS-серверів ігноруються"
@@ -1575,15 +1626,15 @@ msgid ""
 "slow process as the swap-device cannot be accessed with the high datarates "
 "of the <abbr title=\"Random Access Memory\">RAM</abbr>."
 msgstr ""
-"Якщо фізичної пам'яті недостатньо, невикористовувані дані можуть тимчасово "
+"Якщо фізичної памяті недостатньо, невикористовувані дані можуть тимчасово "
 "витіснятися на своп-пристрій, у результаті чого збільшується кількість "
-"корисної оперативної пам'яті (<abbr title=\"Random Access Memory\">RAM</"
+"корисної оперативної памяті (<abbr title=\"Random Access Memory\">RAM</"
 "abbr>). Майте на увазі, що свопінг даних є дуже повільним процесом, оскільки "
 "своп-пристрої не можуть бути доступні з такою високою швидкістю, як <abbr "
 "title=\"Random Access Memory\">RAM</abbr>."
 
 msgid "Ignore <code>/etc/hosts</code>"
-msgstr ""
+msgstr "Ігнорувати<code>/etc/hosts</code>"
 
 msgid "Ignore interface"
 msgstr "Ігнорувати интерфейс"
@@ -1601,6 +1652,9 @@ msgid ""
 "In order to prevent unauthorized access to the system, your request has been "
 "blocked. Click \"Continue »\" below to return to the previous page."
 msgstr ""
+"Щоб запобігти несанкціонованому доступу до системи, ваш запит було "
+"заблоковано. Натисніть \"Продовжити »\" нижче, щоб повернутися до "
+"попередньої сторінки."
 
 msgid "Inactivity timeout"
 msgstr "Тайм-аут бездіяльності"
@@ -1630,13 +1684,13 @@ msgid "Install protocol extensions..."
 msgstr "Інсталяція розширень протоколу..."
 
 msgid "Installed packages"
-msgstr "Інстальовані пакети"
+msgstr "Інстальовано пакети"
 
 msgid "Interface"
 msgstr "Інтерфейс"
 
 msgid "Interface %q device auto-migrated from %q to %q."
-msgstr ""
+msgstr "Пристрій інтерфейсу %q автоматичного мігрував із %q на %q."
 
 msgid "Interface Configuration"
 msgstr "Конфігурація інтерфейсу"
@@ -1651,10 +1705,10 @@ msgid "Interface is shutting down..."
 msgstr "Інтерфейс завершує роботу..."
 
 msgid "Interface name"
-msgstr ""
+msgstr "Ім’я інтерфейсу"
 
 msgid "Interface not present or not connected yet."
-msgstr "Інтерфейс відсутній або ще не підключений."
+msgstr "Інтерфейс відсутній або його ще не підключено."
 
 msgid "Interface reconnected"
 msgstr "Інтерфейс перепідключено"
@@ -1685,14 +1739,13 @@ msgid "Invalid username and/or password! Please try again."
 msgstr "Неприпустиме ім’я користувача та/або пароль! Спробуйте ще раз."
 
 msgid "Isolate Clients"
-msgstr ""
+msgstr "Ізолювати клієнтів"
 
-#, fuzzy
 msgid ""
 "It appears that you are trying to flash an image that does not fit into the "
 "flash memory, please verify the image file!"
 msgstr ""
-"СÑ\85оже, Ñ\89о Ð²Ð¸ Ð½Ð°Ð¼Ð°Ð³Ð°Ñ\94Ñ\82еÑ\81Ñ\8f Ð·Ð°Ð»Ð¸Ñ\82и Ð¾Ð±Ñ\80аз, Ñ\8fкий Ð½Ðµ Ð²Ð¼Ñ\96Ñ\89аÑ\94Ñ\82Ñ\8cÑ\81Ñ\8f Ñ\83 Ñ\84леÑ\88-пам'Ñ\8fÑ\82Ñ\8c! "
+"СÑ\85оже, Ñ\89о Ð²Ð¸ Ð½Ð°Ð¼Ð°Ð³Ð°Ñ\94Ñ\82еÑ\81Ñ\8f Ð¿Ñ\80оÑ\88иÑ\82и Ð¾Ð±Ñ\80аз, Ñ\8fкий Ð½Ðµ Ð²Ð¼Ñ\96Ñ\89аÑ\94Ñ\82Ñ\8cÑ\81Ñ\8f Ð´Ð¾ Ñ\84леÑ\88-памâ\80\99Ñ\8fÑ\82Ñ\96! "
 "Перевірте файл образу!"
 
 msgid "JavaScript required!"
@@ -1705,10 +1758,10 @@ msgid "Join Network: Wireless Scan"
 msgstr "Підключення до мережі: Сканування бездротових мереж"
 
 msgid "Joining Network: %q"
-msgstr ""
+msgstr "Приєднання до мережі: %q"
 
 msgid "Keep settings"
-msgstr "Зберегти настройки"
+msgstr "Зберегти налаштування"
 
 msgid "Kernel Log"
 msgstr "Журнал ядра"
@@ -1750,13 +1803,13 @@ msgid "Language and Style"
 msgstr "Мова та стиль"
 
 msgid "Latency"
-msgstr ""
+msgstr "Затримка"
 
 msgid "Leaf"
-msgstr ""
+msgstr "Лист"
 
 msgid "Lease time"
-msgstr ""
+msgstr "Час оренди"
 
 msgid "Lease validity time"
 msgstr "Час чинності оренди"
@@ -1781,9 +1834,11 @@ msgstr "Межа"
 
 msgid "Limit DNS service to subnets interfaces on which we are serving DNS."
 msgstr ""
+"Обмежувати службу DNS інтерфейсами підмереж, на яких ми обслуговуємо DNS."
 
 msgid "Limit listening to these interfaces, and loopback."
 msgstr ""
+"Обмежитися прослуховуванням цих інтерфейсів і повернутися до початку циклу."
 
 msgid "Line Attenuation (LATN)"
 msgstr ""
@@ -1798,14 +1853,14 @@ msgid "Line Uptime"
 msgstr ""
 
 msgid "Link On"
-msgstr "Зв'язок встановлено"
+msgstr "Звязок встановлено"
 
 msgid ""
 "List of <abbr title=\"Domain Name System\">DNS</abbr> servers to forward "
 "requests to"
 msgstr ""
-"Список <abbr title=\"Domain Name System\">DNS</abbr>-серверів, до яких "
-"пеÑ\80еÑ\81илаÑ\82и Ð·Ð°Ð¿Ð¸Ñ\82и"
+"Список <abbr title=\"Domain Name System\">DNS</abbr>-серверів для "
+"пеÑ\80еÑ\81пÑ\80Ñ\8fмовÑ\83ваннÑ\8f Ð·Ð°Ð¿Ð¸Ñ\82Ñ\96в"
 
 msgid ""
 "List of R0KHs in the same Mobility Domain. <br />Format: MAC-address,NAS-"
@@ -1814,6 +1869,13 @@ msgid ""
 "from the R0KH that the STA used during the Initial Mobility Domain "
 "Association."
 msgstr ""
+"Список власників ключів R0 у тому ж домені мобільності. <br />Формат: MAC-"
+"адреса,NAS-ідентифікатор,128-бітний ключ у вигляді шістнадцяткового рядка. "
+"<br />Цей список використовується для відображення <abbr title=\"ідентифікатор "
+"власника ключа R0\">R0KH-ID</abbr> (NAS-ідентифікатор) на MAC-адреси "
+"призначення при запиті ключа PMK-R1 від <abbr title=\"власник ключа R0\">R0KH"
+"</abbr>, як станції, що була використана під час початкової асоціації домену "
+"мобільності."
 
 msgid ""
 "List of R1KHs in the same Mobility Domain. <br />Format: MAC-address,R1KH-ID "
@@ -1822,21 +1884,30 @@ msgid ""
 "R0KH. This is also the list of authorized R1KHs in the MD that can request "
 "PMK-R1 keys."
 msgstr ""
+"Список власників ключів R1 у тому ж домені мобільності. <br />Формат: MAC-"
+"адреса,<abbr title=\"ідентифікатор власника ключа R1\">R1KH-ID</abbr> у формі "
+"6 октетів з двокрапками,128-бітний ключ у вигляді шістнадцяткового рядка. <br "
+"/>Цей список використовується для відображення <abbr title=\"ідентифікатор "
+"власника ключа R1\">R1KH-ID</abbr> на MAC-адреси призначення при передаванні "
+"ключа PMK-R1 від <abbr title=\"власник ключа R0\">R0KH</abbr>. Це також список "
+"авторизованих <abbr title=\"власник ключа R1\">R1KH</abbr> у формі <abbr title"
+"=\"Message Digest — дайджест повідомлення\">MD</abbr>, які можуть запитувати "
+"ключі PMK-R1."
 
 msgid "List of SSH key files for auth"
 msgstr ""
 
 msgid "List of domains to allow RFC1918 responses for"
-msgstr "Список доменів, для яких дозволені RFC1918-відповіді"
+msgstr "Список доменів, для яких дозволено RFC1918-відповіді"
 
 msgid "List of hosts that supply bogus NX domain results"
 msgstr "Список доменів, які підтримують результати підробки NX-доменів"
 
 msgid "Listen Interfaces"
-msgstr ""
+msgstr "Інтерфейси прослуховування"
 
 msgid "Listen Port"
-msgstr ""
+msgstr "Порти прослуховування"
 
 msgid "Listen only on the given interface or, if unspecified, on all"
 msgstr ""
@@ -1865,7 +1936,7 @@ msgid "Local IPv6 address"
 msgstr "Локальна адреса IPv6"
 
 msgid "Local Service Only"
-msgstr ""
+msgstr "Тільки локальна служба"
 
 msgid "Local Startup"
 msgstr "Локальний запуск"
@@ -1876,13 +1947,13 @@ msgstr "Місцевий час"
 msgid "Local domain"
 msgstr "Локальний домен"
 
-#, fuzzy
 msgid ""
 "Local domain specification. Names matching this domain are never forwarded "
 "and are resolved from DHCP or hosts files only"
 msgstr ""
-"Специфікація локальних доменів. Імена, зіставлені цьому домену, ніколи не "
-"спрямовуються і виділяються тільки через DHCP або файли hosts"
+"Специфікація локального домену. Імена, які зіставлено цьому домену, ніколи "
+"не пересилаються і вирізняються тільки з файлу DHCP (/etc/config/dhcp) або "
+"файлу hosts (/etc/hosts)"
 
 msgid "Local domain suffix appended to DHCP names and hosts file entries"
 msgstr ""
@@ -1896,7 +1967,7 @@ msgid ""
 "Localise hostname depending on the requesting subnet if multiple IPs are "
 "available"
 msgstr ""
-"Локалізувати ім'я хоста залежно від запитуючої підмережі, якщо доступні "
+"Локалізувати ім’я хоста залежно від запитуючої підмережі, якщо доступно "
 "кілька IP-адрес"
 
 msgid "Localise queries"
@@ -1988,34 +2059,34 @@ msgid "Mbit/s"
 msgstr "Мбіт/с"
 
 msgid "Memory"
-msgstr "Пам'ять"
+msgstr "Память"
 
 msgid "Memory usage (%)"
-msgstr "Використання пам'яті, %"
+msgstr "Використання памяті, %"
 
 msgid "Mesh Id"
-msgstr ""
+msgstr "Mesh Id"
 
 msgid "Metric"
 msgstr "Метрика"
 
 msgid "Mirror monitor port"
-msgstr ""
+msgstr "Дзеркало порту диспетчера"
 
 msgid "Mirror source port"
-msgstr ""
+msgstr "Дзеркало вихідного порту"
 
 msgid "Missing protocol extension for proto %q"
 msgstr "Відсутні розширення для протоколу %q"
 
 msgid "Mobility Domain"
-msgstr ""
+msgstr "Домен мобільності"
 
 msgid "Mode"
 msgstr "Режим"
 
 msgid "Model"
-msgstr ""
+msgstr "Модель"
 
 msgid "Modem device"
 msgstr "Модем"
@@ -2024,7 +2095,7 @@ msgid "Modem init timeout"
 msgstr "Тайм-аут ініціалізації модему"
 
 msgid "Monitor"
-msgstr "Ð\9cонÑ\96Ñ\82ор"
+msgstr "Ð\94иÑ\81пеÑ\82Ñ\87ер"
 
 msgid "Mount Entry"
 msgstr "Вхід монтування"
@@ -2036,20 +2107,20 @@ msgid "Mount Points"
 msgstr "Точки монтування"
 
 msgid "Mount Points - Mount Entry"
-msgstr "Точки монтування - Записи монтування"
+msgstr "Точки монтування  Записи монтування"
 
 msgid "Mount Points - Swap Entry"
-msgstr "Точки монтування - Вхід довантаження"
+msgstr "Точки монтування – Вхід свопу"
 
 msgid ""
 "Mount Points define at which point a memory device will be attached to the "
 "filesystem"
 msgstr ""
-"Точки монтування визначають, до якої точки пристрою пам'яті буде прикріплена "
-"файлова система"
+"Точки монтування визначають, до якої точки пристрою пам’яті буде прикріплено "
+"файлову систему"
 
 msgid "Mount filesystems not specifically configured"
-msgstr ""
+msgstr "Монтувати не конкретно налаштовані файлові системи"
 
 msgid "Mount options"
 msgstr "Опції монтування"
@@ -2058,10 +2129,10 @@ msgid "Mount point"
 msgstr "Точка монтування"
 
 msgid "Mount swap not specifically configured"
-msgstr ""
+msgstr "Монтувати не конкретно налаштований своп"
 
 msgid "Mounted file systems"
-msgstr "Змонтовані файлові системи"
+msgstr "Змонтовано файлові системи"
 
 msgid "Move down"
 msgstr "Вниз"
@@ -2091,16 +2162,16 @@ msgid "NT Domain"
 msgstr ""
 
 msgid "NTP server candidates"
-msgstr "Кандидати для синхронізації NTP-сервера"
+msgstr "Кандидати для синхронізації сервера NTP"
 
 msgid "Name"
-msgstr "Ім'я"
+msgstr "Імя"
 
 msgid "Name of the new interface"
-msgstr "Ім'я нового інтерфейсу"
+msgstr "Імя нового інтерфейсу"
 
 msgid "Name of the new network"
-msgstr "Назва (ім'я) нової мережі"
+msgstr "Назва (імя) нової мережі"
 
 msgid "Navigation"
 msgstr "Навігація"
@@ -2124,7 +2195,7 @@ msgid "Next »"
 msgstr "Наступний »"
 
 msgid "No DHCP Server configured for this interface"
-msgstr "Немає DHCP-сервера, настроєного для цього інтерфейсу"
+msgstr "Немає DHCP-сервера, налаштованого для цього інтерфейсу"
 
 msgid "No NAT-T"
 msgstr ""
@@ -2142,10 +2213,10 @@ msgid "No negative cache"
 msgstr "Ніяких негативних кешувань"
 
 msgid "No network configured on this device"
-msgstr "На цьому пристрої нема настроєної мережі"
+msgstr "На цьому пристрої немає налаштованої мережі"
 
 msgid "No network name specified"
-msgstr "Ім'я мережі не визначене"
+msgstr "Ім’я мережі не визначено"
 
 msgid "No package lists available"
 msgstr "Немає доступних списків пакетів"
@@ -2157,22 +2228,22 @@ msgid "No rules in this chain"
 msgstr "У цьму ланцюжку нема правил"
 
 msgid "No zone assigned"
-msgstr "Зона не призначена"
+msgstr "Зону не призначено"
 
 msgid "Noise"
 msgstr "Шум"
 
 msgid "Noise Margin (SNR)"
-msgstr ""
+msgstr "Співвідношення сигнал/шум"
 
 msgid "Noise:"
 msgstr "Шум:"
 
 msgid "Non Pre-emtive CRC errors (CRC_P)"
-msgstr ""
+msgstr "Не запобіжні помилки CRC (CRC_P)"
 
 msgid "Non-wildcard"
-msgstr ""
+msgstr "Без шаблону заміни"
 
 msgid "None"
 msgstr "Жоден"
@@ -2184,16 +2255,16 @@ msgid "Not Found"
 msgstr "Не знайдено"
 
 msgid "Not associated"
-msgstr "Не пов'язаний"
+msgstr "Не повязаний"
 
 msgid "Not connected"
 msgstr "Не підключено"
 
 msgid "Note: Configuration files will be erased."
-msgstr "Примітка: конфігураційні файли будуть видалені."
+msgstr "Примітка: конфігураційні файли буде видалено."
 
 msgid "Note: interface name length"
-msgstr ""
+msgstr "Примітка: довжина імені інтерфейсу"
 
 msgid "Notice"
 msgstr "Попередження"
@@ -2202,7 +2273,7 @@ msgid "Nslookup"
 msgstr "DNS-запит"
 
 msgid "Number of cached DNS entries (max is 10000, 0 is no caching)"
-msgstr ""
+msgstr "Кількість кешованих записів DNS (макс. - 10000, 0 - без кешування)"
 
 msgid "OK"
 msgstr "OK"
@@ -2211,13 +2282,13 @@ msgid "OPKG-Configuration"
 msgstr "Конфігурація OPKG"
 
 msgid "Obfuscated Group Password"
-msgstr ""
+msgstr "Обфусований груповий пароль"
 
 msgid "Obfuscated Password"
-msgstr ""
+msgstr "Обфусований пароль"
 
 msgid "Obtain IPv6-Address"
-msgstr ""
+msgstr "Отримати IPv6-адресу"
 
 msgid "Off-State Delay"
 msgstr "Затримка Off-State"
@@ -2230,18 +2301,18 @@ msgid ""
 "<samp>INTERFACE.VLANNR</samp> (<abbr title=\"for example\">e.g.</abbr>: "
 "<samp>eth0.1</samp>)."
 msgstr ""
-"На цій сторінці ви можете настроїти мережеві інтерфейси. Ви можете "
-"об'єднатиати кілька інтерфейсів мостом, відзначивши поле \"Об'єднати "
-"інтерфейси в міст\" та ввівши імена кількох мережевих інтерфейсів, розділені "
-"пÑ\80обÑ\96лами. Ð¢Ð°ÐºÐ¾Ð¶ Ð²Ð¸ Ð¼Ð¾Ð¶ÐµÑ\82е Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82овÑ\83ваÑ\82и <abbr title=\"Virtual Local Area "
-"Network — віртуальна локальна комп'ютерна мережа\">VLAN</abbr>-позначення "
-"<samp>ІНТЕРФЕЙС.НОМЕР_VLAN</samp> (наприклад, <samp>eth0.1</samp>)."
+"На цій сторінці ви можете налаштувати мережеві інтерфейси. Ви можете "
+"об’єднати кілька інтерфейсів мостом, відзначивши поле \"Об’єднати інтерфейси "
+"в міст\" та ввівши імена кількох мережевих інтерфейсів, розділені пробілами. "
+"Також Ð²Ð¸ Ð¼Ð¾Ð¶ÐµÑ\82е Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82овÑ\83ваÑ\82и <abbr title=\"Virtual Local Area Network â\80\94 "
+"віртуальна локальна комп’ютерна мережа\">VLAN</abbr>-позначення <samp>"
+"ІНТЕРФЕЙС.НОМЕР_VLAN</samp> (наприклад, <samp>eth0.1</samp>)."
 
 msgid "On-State Delay"
 msgstr "Затримка On-State"
 
 msgid "One of hostname or mac address must be specified!"
-msgstr "Ð\9cаÑ\94 Ð±Ñ\83Ñ\82и Ð²ÐºÐ°Ð·Ð°Ð½Ðµ Ð¾Ð´Ð½Ðµ Ð· Ð´Ð²Ð¾Ñ\85 - Ñ\96м'я вузла або МАС-адреса!"
+msgstr "Ð\9cаÑ\94 Ð±Ñ\83Ñ\82и Ð·Ð°Ð·Ð½Ð°Ñ\87ено Ð¾Ð´Ð½Ðµ Ð· Ð´Ð²Ð¾Ñ\85 â\80\93 Ñ\96мâ\80\99я вузла або МАС-адреса!"
 
 msgid "One or more fields contain invalid values!"
 msgstr "Одне або декілька полів містять неприпустимі значення!"
@@ -2250,7 +2321,7 @@ msgid "One or more invalid/required values on tab"
 msgstr ""
 
 msgid "One or more required fields have no value!"
-msgstr "Одне або декілька обов'язкових полів не мають значень!"
+msgstr "Одне або декілька обовязкових полів не мають значень!"
 
 msgid "Open list..."
 msgstr "Відкрити список..."
@@ -2259,7 +2330,7 @@ msgid "OpenConnect (CISCO AnyConnect)"
 msgstr ""
 
 msgid "Operating frequency"
-msgstr ""
+msgstr "Робоча частота"
 
 msgid "Option changed"
 msgstr "Опція змінена"
@@ -2268,12 +2339,14 @@ msgid "Option removed"
 msgstr "Опція видалена"
 
 msgid "Optional"
-msgstr ""
+msgstr "Необов’язково"
 
 msgid ""
 "Optional. 32-bit mark for outgoing encrypted packets. Enter value in hex, "
 "starting with <code>0x</code>."
 msgstr ""
+"Необов’язково. 32-бітна мітка для вихідних зашифрованих пакетів. Введіть "
+"значення в шістнадцятковому форматі, починаючи з <code>0x</code>."
 
 msgid ""
 "Optional. Allowed values: 'eui64', 'random', fixed value like '::1' or "
@@ -2281,25 +2354,34 @@ msgid ""
 "server, use the suffix (like '::1') to form the IPv6 address ('a:b:c:d::1') "
 "for the interface."
 msgstr ""
+"Необов’язково. Припустимі значення: 'eui64', 'random' чи фіксоване значення, "
+"наприклад '::1' або '::1:2'. Якщо префікс IPv6 (наприклад, 'a:b:c:d::') "
+"отримано від сервера делегування, для формування IPv6-адреси інтерфейсу  "
+"(наприклад, 'a:b:c:d::1') використовуйте суфікс ('::1')."
 
 msgid ""
 "Optional. Base64-encoded preshared key. Adds in an additional layer of "
 "symmetric-key cryptography for post-quantum resistance."
 msgstr ""
+"Необов’язково. Заздалегідь установлений Base64-кодований спільний ключ. "
+"Додавання додатково рівня шифрування із симетричним ключем для пост-квантової "
+"стійкості."
 
 msgid "Optional. Create routes for Allowed IPs for this peer."
-msgstr ""
+msgstr "Необов’язково. Створити для цього вузла маршрути для дозволених IP"
 
 msgid ""
 "Optional. Host of peer. Names are resolved prior to bringing up the "
 "interface."
 msgstr ""
+"Необов’язково. Хост вузла. Імена буде виділено до підняття інтерфейсу"
 
 msgid "Optional. Maximum Transmission Unit of tunnel interface."
 msgstr ""
+"Необов’язково. Максимальний блок передаваних даних тунельного інтерфейсу."
 
 msgid "Optional. Port of peer."
-msgstr ""
+msgstr "Необов’язково. Порт вузла."
 
 msgid ""
 "Optional. Seconds between keep alive messages. Default is 0 (disabled). "
@@ -2308,6 +2390,8 @@ msgstr ""
 
 msgid "Optional. UDP port used for outgoing and incoming packets."
 msgstr ""
+"Необов’язково. UDP-порт, який використовується для вихідних та вхідних "
+"пакетів."
 
 msgid "Options"
 msgstr "Опції"
@@ -2322,7 +2406,7 @@ msgid "Outbound:"
 msgstr "Вихідний:"
 
 msgid "Output Interface"
-msgstr ""
+msgstr "Вихідний інтерфейс"
 
 msgid "Override MAC address"
 msgstr "Перевизначити MAC-адресу"
@@ -2331,13 +2415,13 @@ msgid "Override MTU"
 msgstr "Перевизначити MTU"
 
 msgid "Override TOS"
-msgstr ""
+msgstr "Перевизначити TOS"
 
 msgid "Override TTL"
-msgstr ""
+msgstr "Перевизначити TTL"
 
 msgid "Override default interface name"
-msgstr ""
+msgstr "Перевизначення типового імені інтерфейсу"
 
 msgid "Override the gateway in DHCP responses"
 msgstr "Перевизначення шлюзу у відповідях DHCP"
@@ -2363,7 +2447,7 @@ msgid "PAP/CHAP password"
 msgstr "Пароль PAP/CHAP"
 
 msgid "PAP/CHAP username"
-msgstr "Ім'я користувача PAP/CHAP"
+msgstr "Імя користувача PAP/CHAP"
 
 msgid "PID"
 msgstr "<abbr title=\"Process Identifier — Ідентифікатор процесу\">PID</abbr>"
@@ -2374,7 +2458,7 @@ msgstr ""
 "номер\">>PIN</abbr>"
 
 msgid "PMK R1 Push"
-msgstr ""
+msgstr "Проштовхуваня PMK R1"
 
 msgid "PPP"
 msgstr "PPP"
@@ -2428,13 +2512,13 @@ msgid "Password of Private Key"
 msgstr "Пароль закритого ключа"
 
 msgid "Password of inner Private Key"
-msgstr ""
+msgstr "Пароль внутрішнього закритого ключа"
 
 msgid "Password successfully changed!"
 msgstr "Пароль успішно змінено!"
 
 msgid "Password2"
-msgstr ""
+msgstr "Пароль2"
 
 msgid "Path to CA-Certificate"
 msgstr "Шлях до центру сертифікції"
@@ -2446,25 +2530,25 @@ msgid "Path to Private Key"
 msgstr "Шлях до закритого ключа"
 
 msgid "Path to inner CA-Certificate"
-msgstr ""
+msgstr "Шлях до внутрішнього CA-сертифікату"
 
 msgid "Path to inner Client-Certificate"
-msgstr ""
+msgstr "Шлях до внутрішнього сертифікату клієнта"
 
 msgid "Path to inner Private Key"
-msgstr ""
+msgstr "Шлях до внутрішнього закритого ключа"
 
 msgid "Peak:"
 msgstr "Пік:"
 
 msgid "Peer IP address to assign"
-msgstr ""
+msgstr "Запит IP-адреси призначення"
 
 msgid "Peers"
-msgstr ""
+msgstr "Піри"
 
 msgid "Perfect Forward Secrecy"
-msgstr ""
+msgstr "Perfect Forward Secrecy"
 
 msgid "Perform reboot"
 msgstr "Виконати перезавантаження"
@@ -2473,7 +2557,7 @@ msgid "Perform reset"
 msgstr "Відновити"
 
 msgid "Persistent Keep Alive"
-msgstr ""
+msgstr "Завжди тримати ввімкненим"
 
 msgid "Phy Rate:"
 msgstr "Фізична швидкість:"
@@ -2488,7 +2572,7 @@ msgid "Pkts."
 msgstr "пакетів"
 
 msgid "Please enter your username and password."
-msgstr "Введіть ім'я користувача і пароль"
+msgstr "Введіть імя користувача і пароль"
 
 msgid "Policy"
 msgstr "Політика"
@@ -2497,25 +2581,25 @@ msgid "Port"
 msgstr "Порт"
 
 msgid "Port status:"
-msgstr "Статус порту:"
+msgstr "Стан порту:"
 
 msgid "Power Management Mode"
-msgstr ""
+msgstr "Режим керування живленням"
 
 msgid "Pre-emtive CRC errors (CRCP_P)"
-msgstr ""
+msgstr "Попереджувати помилки CRC (CRCP_P)"
 
 msgid "Prefer LTE"
-msgstr ""
+msgstr "Переважно LTE"
 
 msgid "Prefer UMTS"
-msgstr ""
+msgstr "Переважно UMTS"
 
 msgid "Prefix Delegated"
-msgstr ""
+msgstr "Делеговано префікс"
 
 msgid "Preshared Key"
-msgstr ""
+msgstr "Заздалегідь установлений спільний ключ"
 
 msgid ""
 "Presume peer to be dead after given amount of LCP echo failures, use 0 to "
@@ -2525,10 +2609,10 @@ msgstr ""
 "пакета LCP, використовуйте 0, щоб ігнорувати невдачі"
 
 msgid "Prevent listening on these interfaces."
-msgstr ""
+msgstr "Перешкоджати прослуховуванню цих інтерфейсів"
 
 msgid "Prevents client-to-client communication"
-msgstr "Ð\97апобÑ\96гаÑ\94 Ð·Ð²'Ñ\8fзкам клієнт-клієнт"
+msgstr "Ð\9fеÑ\80еÑ\88коджаÑ\82и Ñ\81пÑ\96лкÑ\83ваннÑ\8e клієнт-клієнт"
 
 msgid "Prism2/2.5/3 802.11b Wireless Controller"
 msgstr "Бездротовий 802.11b контролер Prism2/2.5/3"
@@ -2561,10 +2645,10 @@ msgid "Protocol support is not installed"
 msgstr "Підтримка протоколу не інстальована"
 
 msgid "Provide NTP server"
-msgstr "Забезпечувати NTP-сервер"
+msgstr "Забезпечувати сервер NTP"
 
 msgid "Provide new network"
-msgstr "Ð\9fоÑ\81Ñ\82аÑ\87иÑ\82и нову мережу"
+msgstr "УкажÑ\96Ñ\82Ñ\8c нову мережу"
 
 msgid "Pseudo Ad-Hoc (ahdemo)"
 msgstr "Псевдо Ad-Hoc (ahdemo)"
@@ -2582,10 +2666,10 @@ msgid "Quality"
 msgstr "Якість"
 
 msgid "R0 Key Lifetime"
-msgstr ""
+msgstr "Тривалість життя ключа R0"
 
 msgid "R1 Key Holder"
-msgstr ""
+msgstr "Власник ключа R1"
 
 msgid "RFC3947 NAT-T mode"
 msgstr ""
@@ -2624,45 +2708,41 @@ msgid ""
 "Read <code>/etc/ethers</code> to configure the <abbr title=\"Dynamic Host "
 "Configuration Protocol\">DHCP</abbr>-Server"
 msgstr ""
-"Читати <code>/etc/ethers</code> для настроювання <abbr title=\"Dynamic Host "
+"Читати <code>/etc/ethers</code> для налаштування <abbr title=\"Dynamic Host "
 "Configuration Protocol — Протокол динамічної конфігурації вузла\">DHCP</"
 "abbr>-сервера"
 
 msgid ""
-"Really delete this interface? The deletion cannot be undone!\\nYou might "
-"lose access to this device if you are connected via this interface."
+"Really delete this interface? The deletion cannot be undone! You might lose "
+"access to this device if you are connected via this interface."
 msgstr ""
-"Дійсно видалити цей інтерфейс? Скасувати видалення неможливо!\n"
-"Ви можете втратити доступ до цього пристрою, якщо ви підключені через цей "
-"інтерфейс."
+"Дійсно видалити цей інтерфейс? Скасувати видалення неможливо! Ви можете "
+"втратити доступ до цього пристрою, якщо вас підключено через цей інтерфейс."
 
 msgid ""
-"Really delete this wireless network? The deletion cannot be undone!\\nYou "
+"Really delete this wireless network? The deletion cannot be undone! You "
 "might lose access to this device if you are connected via this network."
 msgstr ""
-"Дійсно видалити цю бездротову мережу? Скасувати видалення неможливо!\n"
-"Ви можете втратити доступ до цього пристрою, якщо ви підключені через цю "
-"мережу."
+"Дійсно видалити цю бездротову мережу? Скасувати видалення неможливо! Ви "
+"можете втратити доступ до цього пристрою, якщо вас підключено через цю мережу."
 
 msgid "Really reset all changes?"
 msgstr "Дійсно скинути всі зміни?"
 
 #, fuzzy
 msgid ""
-"Really shut down network?\\nYou might lose access to this device if you are "
+"Really shut down network? You might lose access to this device if you are "
 "connected via this interface."
 msgstr ""
-"Дійсно вимкнути мережу?\n"
-"Ви можете втратити доступ до цього пристрою, якщо ви підключені через цю "
-"мережу."
+"Дійсно вимкнути мережу? Ви можете втратити доступ до цього пристрою, якщо вас "
+"підключено через цю мережу."
 
 msgid ""
-"Really shutdown interface \"%s\" ?\\nYou might lose access to this device if "
+"Really shutdown interface \"%s\"You might lose access to this device if "
 "you are connected via this interface."
 msgstr ""
-"Дійсно вимкнути інтерфейс \"%s\"?\n"
-"Ви можете втратити доступ до цього пристрою, якщо ви підключені через цей "
-"інтерфейс."
+"Дійсно вимкнути інтерфейс \"%s\"? Ви можете втратити доступ до цього "
+"пристрою, якщо вас підключено через цей інтерфейс."
 
 msgid "Really switch protocol?"
 msgstr "Дійсно змінити протокол?"
@@ -2683,10 +2763,10 @@ msgid "Realtime Wireless"
 msgstr "Бездротові мережі у реальному часі"
 
 msgid "Reassociation Deadline"
-msgstr ""
+msgstr "Кінцевий термін реассоціації"
 
 msgid "Rebind protection"
-msgstr "Захист від переприв'язки"
+msgstr "Захист від перепривязки"
 
 msgid "Reboot"
 msgstr "Перезавантаження"
@@ -2698,7 +2778,7 @@ msgid "Reboots the operating system of your device"
 msgstr "Перезавантажити операційну систему вашого пристрою"
 
 msgid "Receive"
-msgstr "Ð\9fÑ\80ийом"
+msgstr "Ð\9fÑ\80ийманнÑ\8f"
 
 msgid "Receiver Antenna"
 msgstr "Антена приймача"
@@ -2746,22 +2826,22 @@ msgid "Replace wireless configuration"
 msgstr "Замінити конфігурацію бездротової мережі"
 
 msgid "Request IPv6-address"
-msgstr ""
+msgstr "Запит IPv6-адреси"
 
 msgid "Request IPv6-prefix of length"
-msgstr ""
+msgstr "Запит довжини IPv6-префіксу"
 
 msgid "Required"
-msgstr ""
+msgstr "Потрібно"
 
 msgid "Required for certain ISPs, e.g. Charter with DOCSIS 3"
 msgstr "Потрібно для деяких провайдерів, наприклад, Charter із DOCSIS 3"
 
 msgid "Required. Base64-encoded private key for this interface."
-msgstr ""
+msgstr "Потрібно. Base64-закодований закритий ключ для цього інтерфейсу."
 
 msgid "Required. Base64-encoded public key of peer."
-msgstr ""
+msgstr "Потрібно. Base64-закодований публічний ключ вузла"
 
 msgid ""
 "Required. IP addresses and prefixes that this peer is allowed to use inside "
@@ -2773,6 +2853,8 @@ msgid ""
 "Requires the 'full' version of wpad/hostapd and support from the wifi driver "
 "<br />(as of Feb 2017: ath9k and ath10k, in LEDE also mwlwifi and mt76)"
 msgstr ""
+"Потребує \"повної\" версії wpad/hostapd та підтримки драйвером WiFi <br />"
+"(станом на лютий 2017 року: ath9k та ath10k, у LEDE також mwlwifi та mt76)"
 
 msgid ""
 "Requires upstream supports DNSSEC; verify unsigned domain responses really "
@@ -2807,16 +2889,16 @@ msgid "Reveal/hide password"
 msgstr "Показати/приховати пароль"
 
 msgid "Revert"
-msgstr "Скасувати зміни"
+msgstr "Скасувати"
 
 msgid "Revert changes"
-msgstr ""
+msgstr "Скасувати зміни"
 
 msgid "Revert request failed with status <code>%h</code>"
-msgstr ""
+msgstr "Сталася помилка запиту на скасування зі статусом <code>%h</code>"
 
 msgid "Reverting configuration…"
-msgstr ""
+msgstr "Відкат конфігурації…"
 
 msgid "Root"
 msgstr "Корінь"
@@ -2825,16 +2907,16 @@ msgid "Root directory for files served via TFTP"
 msgstr "Кореневий каталог для файлів TFTP"
 
 msgid "Root preparation"
-msgstr ""
+msgstr "Підготовка Root"
 
 msgid "Route Allowed IPs"
-msgstr ""
+msgstr "Маршрутизація дозволених IP-адрес"
 
 msgid "Route type"
-msgstr ""
+msgstr "Тип маршруту"
 
 msgid "Router Advertisement-Service"
-msgstr ""
+msgstr "Служба оголошень маршрутизатора"
 
 msgid "Router Password"
 msgstr "Пароль маршрутизатора"
@@ -2911,10 +2993,10 @@ msgid "Separate Clients"
 msgstr "Розділяти клієнтів"
 
 msgid "Server Settings"
-msgstr "Настройки сервера"
+msgstr "Налаштування сервера"
 
 msgid "Service Name"
-msgstr "Назва (ім'я) сервісу"
+msgstr "Назва (імя) сервісу"
 
 msgid "Service Type"
 msgstr "Тип сервісу"
@@ -2926,13 +3008,14 @@ msgid ""
 "Set interface properties regardless of the link carrier (If set, carrier "
 "sense events do not invoke hotplug handlers)."
 msgstr ""
+"Властивості інтерфейсу встановлюються незалежно від каналу зв’язку (якщо "
+"позначено, обробник автовизначення не викликається при змінах)."
 
-#, fuzzy
 msgid "Set up Time Synchronization"
-msgstr "Настройки синхронізації часу"
+msgstr "Налаштування синхронізації часу"
 
 msgid "Setup DHCP Server"
-msgstr "Настройки DHCP-сервера"
+msgstr "Налаштування DHCP-сервера"
 
 msgid "Severely Errored Seconds (SES)"
 msgstr ""
@@ -2965,7 +3048,7 @@ msgid "Size (.ipk)"
 msgstr ""
 
 msgid "Size of DNS query cache"
-msgstr ""
+msgstr "Розмір кешу запитів DNS"
 
 msgid "Skip"
 msgstr "Пропустити"
@@ -2989,7 +3072,7 @@ msgid "Some fields are invalid, cannot save values!"
 msgstr "Деякі поля є неприпустимими, неможливо зберегти значення!"
 
 msgid "Sorry, the object you requested was not found."
-msgstr "На жаль, об'єкт, який ви просили, не знайдено."
+msgstr "На жаль, обєкт, який ви просили, не знайдено."
 
 msgid "Sorry, the server encountered an unexpected error."
 msgstr "На жаль, на сервері сталася неочікувана помилка."
@@ -2999,9 +3082,9 @@ msgid ""
 "flashed manually. Please refer to the wiki for device specific install "
 "instructions."
 msgstr ""
-"Ð\9dа Ð¶Ð°Ð»Ñ\8c, Ð°Ð²Ñ\82омаÑ\82иÑ\87не Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ\8f Ñ\81иÑ\81Ñ\82еми Ð½Ðµ Ð¿Ñ\96дÑ\82Ñ\80имÑ\83Ñ\94Ñ\82Ñ\8cÑ\81Ñ\8f. Ð\9dовий Ð¾Ð±Ñ\80аз "
-"прошивки повинен бути залитий вручну. Зверніться до Wiki за інструкцією з "
-"інсталяції для конкретного пристрою."
+"Ð\9dа Ð¶Ð°Ð»Ñ\8c, Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ\8f Ñ\81иÑ\81Ñ\82еми Ð½Ðµ Ð¿Ñ\96дÑ\82Ñ\80имÑ\83Ñ\94Ñ\82Ñ\8cÑ\81Ñ\8f. Ð\9dовий Ð¾Ð±Ñ\80аз Ð¼Ñ\96кÑ\80опÑ\80огÑ\80ами "
+"слід прошити вручну. Зверніться до Wiki за інструкцією з інсталяції "
+"для конкретного пристрою."
 
 msgid "Sort"
 msgstr "Сортування"
@@ -3052,7 +3135,7 @@ msgid "Start priority"
 msgstr "Стартовий пріоритет"
 
 msgid "Starting configuration apply…"
-msgstr ""
+msgstr "Застосовується стартова конфігурація…"
 
 msgid "Startup"
 msgstr "Запуск"
@@ -3070,7 +3153,7 @@ msgid "Static Routes"
 msgstr "Статичні маршрути"
 
 msgid "Static address"
-msgstr "Статичні адреси"
+msgstr "Статична адреса"
 
 msgid ""
 "Static leases are used to assign fixed IP addresses and symbolic hostnames "
@@ -3083,7 +3166,7 @@ msgstr ""
 "орендою."
 
 msgid "Status"
-msgstr "Статус"
+msgstr "Стан"
 
 msgid "Stop"
 msgstr "Зупинити"
@@ -3095,16 +3178,16 @@ msgid "Submit"
 msgstr "Надіслати"
 
 msgid "Suppress logging"
-msgstr ""
+msgstr "Блокувати журналювання"
 
 msgid "Suppress logging of the routine operation of these protocols"
-msgstr ""
+msgstr "Блокувати ведення журналу звичайної роботи цих протоколів"
 
 msgid "Swap"
-msgstr ""
+msgstr "Своп"
 
 msgid "Swap Entry"
-msgstr "Вхід довантаження"
+msgstr "Вхід своп"
 
 msgid "Switch"
 msgstr "Комутатор"
@@ -3118,12 +3201,13 @@ msgstr "Комутатор %q (%s)"
 msgid ""
 "Switch %q has an unknown topology - the VLAN settings might not be accurate."
 msgstr ""
+"Комутатор %q має невідому топологію – параметри VLAN можуть бути неправильними"
 
 msgid "Switch Port Mask"
-msgstr ""
+msgstr "Маска портів комутатора"
 
 msgid "Switch VLAN"
-msgstr ""
+msgstr "VLAN комутатора"
 
 msgid "Switch protocol"
 msgstr "Протокол комутатора"
@@ -3150,7 +3234,7 @@ msgid "TCP:"
 msgstr "TCP:"
 
 msgid "TFTP Settings"
-msgstr "Настройки TFTP"
+msgstr "Налаштування TFTP"
 
 msgid "TFTP server root"
 msgstr "Корінь TFTP-сервера"
@@ -3181,11 +3265,11 @@ msgid ""
 "multi-SSID capable). Per network settings like encryption or operation mode "
 "are grouped in the <em>Interface Configuration</em>."
 msgstr ""
-"Розділ <em>Конфігурація пристрою</em> охоплює фізичні параметри радіо-"
-"апаратних засобів, такі, як канал, потужність передавача або вибір антени, "
-"які є спільними для всіх визначених бездротових мереж (якщо радіо-апаратні "
+"Розділ <em>Конфігурація пристрою</em> охоплює фізичні параметри апаратних "
+"радіо-засобів, такі, як канал, потужність передавача або вибір антени, "
+"які є спільними для всіх визначених бездротових мереж (якщо апаратні радіо-"
 "засоби здатні підтримувати кілька SSID). Параметри окремих мереж, такі, як "
-"шифрування або режим роботи, згруповані в розділі <em>Конфігурація "
+"шифрування або режим роботи, згруповано в розділі <em>Конфігурація "
 "інтерфейсу</em>."
 
 msgid ""
@@ -3193,7 +3277,7 @@ msgid ""
 "component for working wireless configuration!"
 msgstr ""
 "Пакет <em>libiwinfo-lua</em> не інстальований. Щоб мати можливість "
-"настроювати безпровідні мережі, слід інсталювати цей компонент!"
+"налаштувати безпровідні мережі, слід інсталювати цей компонент!"
 
 msgid ""
 "The HE.net endpoint update configuration changed, you must now use the plain "
@@ -3207,13 +3291,13 @@ msgstr ""
 msgid ""
 "The IPv6 prefix assigned to the provider, usually ends with <code>::</code>"
 msgstr ""
-"Призначений провайдеру IPv6-префікс, зазвичай закінчується на <code>::</code>"
+"Призначений провайдером IPv6-префікс, зазвичай закінчується на <code>::</code>"
 
 msgid ""
 "The allowed characters are: <code>A-Z</code>, <code>a-z</code>, <code>0-9</"
 "code> and <code>_</code>"
 msgstr ""
-"Дозволені символи: <code>A-Z</code>, <code>a-z</code>, <code>0-9</code> та "
+"Дозволено символи: <code>A-Z</code>, <code>a-z</code>, <code>0-9</code> та "
 "<code>_</code>"
 
 msgid "The configuration file could not be loaded due to the following error:"
@@ -3228,18 +3312,24 @@ msgid ""
 "or revert all pending changes to keep the currently working configuration "
 "state."
 msgstr ""
+"Пристрій недосяжний протягом %d секунд після застосування очікуючих змін, що "
+"призвело до відкочування конфигурації з міркувань безпеки. Проте, якщо ви "
+"впевнені, що зміни конфігурації є правильними, застосуйте неперевірену "
+"конфігурацію. Крім того, ви можете відхилити це попередження та відредагувати "
+"зміни, перш ніж намагатись застосувати їх знову, або ж скасувати всі очікуючі "
+"зміни, щоб зберегти поточну робочу конфігурацію."
 
 msgid ""
 "The device file of the memory or partition (<abbr title=\"for example\">e.g."
 "</abbr> <code>/dev/sda1</code>)"
-msgstr "Файл пристрою пам'яті або розділу (наприклад, <code>/dev/sda1</code>)"
+msgstr "Файл пристрою памяті або розділу (наприклад, <code>/dev/sda1</code>)"
 
 msgid ""
 "The filesystem that was used to format the memory (<abbr title=\"for example"
 "\">e.g.</abbr> <samp><abbr title=\"Third Extended Filesystem\">ext3</abbr></"
 "samp>)"
 msgstr ""
-"Файлова система, яка використовуватиметься для форматування пам'яті "
+"Файлова система, яка використовуватиметься для форматування памяті "
 "(наприклад, <samp><abbr title=\"Third Extended Filesystem\">ext3</abbr></"
 "samp>)"
 
@@ -3248,18 +3338,18 @@ msgid ""
 "compare them with the original file to ensure data integrity.<br /> Click "
 "\"Proceed\" below to start the flash procedure."
 msgstr ""
-"Ð\9eбÑ\80аз Ð·Ð°Ð²Ð°Ð½Ñ\82ажено. Ð\9dижÑ\87е Ð½Ð°Ð²ÐµÐ´ÐµÐ½Ð¾ ÐºÐ¾Ð½Ñ\82Ñ\80олÑ\8cнÑ\83 Ñ\81Ñ\83мÑ\83 Ñ\96 розмір файлу. Порівняйте "
-"їх з вихідним файлом для забезпечення цілісності даних.<br /> Натисніть "
-"\"Ð\9fÑ\80одовжиÑ\82и\", Ñ\89об Ñ\80озпоÑ\87аÑ\82и Ð¿Ñ\80оÑ\86едÑ\83Ñ\80Ñ\83 Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ\8f Ð¿Ñ\80оÑ\88ивки."
+"Ð\9eбÑ\80аз Ð·Ð°Ð²Ð°Ð½Ñ\82ажено. Ð\9dижÑ\87е Ð½Ð°Ð²ÐµÐ´ÐµÐ½Ð¾ ÐºÐ¾Ð½Ñ\82Ñ\80олÑ\8cнÑ\83 Ñ\81Ñ\83мÑ\83 Ñ\82а розмір файлу. Порівняйте "
+"їх з вихідним файлом, шоб переконатися в цілісності даних.<br /> Натисніть "
+"\"Ð\9fÑ\80одовжиÑ\82и\", Ñ\89об Ñ\80озпоÑ\87аÑ\82и Ð¿Ñ\80оÑ\86едÑ\83Ñ\80Ñ\83 Ð¿Ñ\80оÑ\88иваннÑ\8f."
 
 msgid "The following changes have been reverted"
-msgstr "Ð\9dижÑ\87е Ð½Ð°Ð²ÐµÐ´ÐµÐ½Ñ\96 Ð·Ð¼Ñ\96ни Ð±Ñ\83ли Ñ\81каÑ\81ованÑ\96"
+msgstr "Ð\9dаведенÑ\96 Ð½Ð¸Ð¶Ñ\87е Ð·Ð¼Ñ\96ни Ð±Ñ\83ло Ñ\81каÑ\81овано"
 
 msgid "The following rules are currently active on this system."
-msgstr "У Ð´Ð°Ð½Ð¸Ð¹ Ñ\87аÑ\81 Ñ\83 цій системі активні такі правила."
+msgstr "Ð\9dаÑ\80азÑ\96 Ð² цій системі активні такі правила."
 
 msgid "The given network name is not unique"
-msgstr "Задане мережеве ім'я не є унікальним"
+msgstr "Задане мережеве імя не є унікальним"
 
 #, fuzzy
 msgid ""
@@ -3288,12 +3378,12 @@ msgid ""
 "segments. Often there is by default one Uplink port for a connection to the "
 "next greater network like the internet and other ports for a local network."
 msgstr ""
-"Мережеві порти вашого пристрою можуть бути об'єднані у декілька <abbr title="
-"\"Virtual Local Area Network — віртуальна локальна комп'ютерна мережа"
-"\">VLAN</abbr>, у яких комп'ютери можуть напряму спілкуватися один з одним. "
-"<abbr title=\"Virtual Local Area Network — віртуальна локальна комп'ютерна "
+"Мережеві порти вашого пристрою може бути об’єднано у декілька <abbr title="
+"\"Virtual Local Area Network — віртуальна локальна компютерна мережа"
+"\">VLAN</abbr>, у яких компютери можуть напряму спілкуватися один з одним. "
+"<abbr title=\"Virtual Local Area Network — віртуальна локальна компютерна "
 "мережа\">VLAN</abbr> часто використовуються для розділення мережі на окремі "
-"сегменти. Зазвичай один виcхідний порт використовується для з'єднання з "
+"сегменти. Зазвичай один виcхідний порт використовується для зєднання з "
 "більшою мережею, такою наприклад, як Інтернет, а інші порти — для локальної "
 "мережі."
 
@@ -3319,8 +3409,8 @@ msgid ""
 msgstr ""
 "Система перепрошивається.<br /> <strong>НЕ ВИМИКАЙТЕ ЖИВЛЕННЯ ПРИСТРОЮ!</"
 "strong><br /> Зачекайте кілька хвилин перед тим, як пробувати знову "
-"з'Ñ\94днаÑ\82иÑ\81Ñ\8f. Ð\97алежно Ð²Ñ\96д Ð²Ð°Ñ\88иÑ\85 Ð½Ð°Ñ\81Ñ\82Ñ\80ойок, Ð¼Ð¾Ð¶Ð»Ð¸Ð²Ð¾, Ð²Ð°Ð¼ треба буде оновити "
-"адресу вашого комп'ютера, щоб знову отримати доступ до пристрою."
+"пÑ\96дâ\80\99Ñ\94днаÑ\82иÑ\81Ñ\8f. Ð\97алежно Ð²Ñ\96д Ð½Ð°Ð»Ð°Ñ\88Ñ\82Ñ\83ванÑ\8c, Ð¼Ð¾Ð¶Ð»Ð¸Ð²Ð¾, треба буде оновити "
+"адресу вашого компютера, щоб знову отримати доступ до пристрою."
 
 msgid ""
 "The uploaded image file does not contain a supported format. Make sure that "
@@ -3333,10 +3423,10 @@ msgid "There are no active leases."
 msgstr "Активних оренд немає."
 
 msgid "There are no changes to apply."
-msgstr ""
+msgstr "Немає жодних змін до застосування!"
 
 msgid "There are no pending changes to revert!"
-msgstr "Немає жодних змін до скасування!"
+msgstr "Ð\9dемаÑ\94 Ð¶Ð¾Ð´Ð½Ð¸Ñ\85 Ð¾Ñ\87Ñ\96кÑ\83Ñ\8eÑ\87иÑ\85 Ð·Ð¼Ñ\96н Ð´Ð¾ Ñ\81каÑ\81Ñ\83ваннÑ\8f!"
 
 msgid "There are no pending changes!"
 msgstr "Немає жодних очікуючих змін!"
@@ -3363,6 +3453,9 @@ msgid ""
 "'server=1.2.3.4' fordomain-specific or full upstream <abbr title=\"Domain "
 "Name System\">DNS</abbr> servers."
 msgstr ""
+"Цей файл може містити такі рядки, як 'server=/domain/1.2.3.4' або 'server="
+"1.2.3.4' для домен-орієнтованих або повних висхідних <abbr title=\"Domain "
+"Name System\">DNS</abbr>-серверів."
 
 msgid ""
 "This is a list of shell glob patterns for matching files and directories to "
@@ -3377,6 +3470,8 @@ msgid ""
 "This is either the \"Update Key\" configured for the tunnel or the account "
 "password if no update key has been configured"
 msgstr ""
+"Це або \"Update Key\", сконфігурований для тунелю, або пароль облікового "
+"запису, якщо ключ оновлення не налаштовано"
 
 msgid ""
 "This is the content of /etc/rc.local. Insert your own commands here (in "
@@ -3389,8 +3484,8 @@ msgid ""
 "This is the local endpoint address assigned by the tunnel broker, it usually "
 "ends with <code>...:2/64</code>"
 msgstr ""
-"Це локальна адреса кінцевої точки, присвоєна тунельним брокером, зазвичай "
-"закÑ\96нÑ\87Ñ\83Ñ\94Ñ\82Ñ\8cÑ\81Ñ\8f Ð½Ð° <code>...:2/64</code>"
+"Це локальна адреса кінцевої точки, яку присвоєно тунельним брокером, "
+"вона Ð·Ð°Ð·Ð²Ð¸Ñ\87ай Ð·Ð°ÐºÑ\96нÑ\87Ñ\83Ñ\94Ñ\82Ñ\8cÑ\81Ñ\8f Ð½Ð° <code>â\80¦:2/64</code>"
 
 msgid ""
 "This is the only <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</"
@@ -3400,11 +3495,13 @@ msgstr ""
 "динамічної конфігурації вузла\">DHCP</abbr> у локальній мережі"
 
 msgid "This is the plain username for logging into the account"
-msgstr ""
+msgstr "Це звичайне ім’я користувача для входу до облікового запису"
 
 msgid ""
 "This is the prefix routed to you by the tunnel broker for use by clients"
 msgstr ""
+"Це префікс, що надсилається до вас тунельним брокером для використання "
+"клієнтами"
 
 msgid "This is the system crontab in which scheduled tasks can be defined."
 msgstr ""
@@ -3414,15 +3511,14 @@ msgstr ""
 msgid ""
 "This is usually the address of the nearest PoP operated by the tunnel broker"
 msgstr ""
-"Зазвичай, це адреса найближчої точки присутності, що управляється тунелним "
+"Зазвичай, це адреса найближчої точки присутності, що управляється тунельним "
 "брокером"
 
 msgid ""
 "This list gives an overview over currently running system processes and "
 "their status."
 msgstr ""
-"У цьому списку наведені працюючі на даний момент системні процеси та їх "
-"статус."
+"У цьому списку наведено працюючі наразі системні процеси та їх стан."
 
 msgid "This page gives an overview over currently active network connections."
 msgstr "Ця сторінка надає огляд поточних активних мережних підключень."
@@ -3434,7 +3530,7 @@ msgid "Time Synchronization"
 msgstr "Синхронізація часу"
 
 msgid "Time Synchronization is not configured yet."
-msgstr "СинÑ\85Ñ\80онÑ\96заÑ\86Ñ\96Ñ\8f Ñ\87аÑ\81Ñ\83 Ð½Ðµ Ð½Ð°Ñ\81Ñ\82Ñ\80оÑ\94на."
+msgstr "СинÑ\85Ñ\80онÑ\96заÑ\86Ñ\96Ñ\8e Ñ\87аÑ\81Ñ\83 Ð½Ðµ Ð½Ð°Ð»Ð°Ñ\88Ñ\82овано."
 
 msgid "Timezone"
 msgstr "Часовий пояс"
@@ -3447,7 +3543,7 @@ msgstr ""
 "архів резервної копії."
 
 msgid "Tone"
-msgstr ""
+msgstr "Тоновий"
 
 msgid "Total Available"
 msgstr "Усього доступно"
@@ -3465,7 +3561,7 @@ msgid "Transmission Rate"
 msgstr "Швидкість передавання"
 
 msgid "Transmit"
-msgstr "Передача"
+msgstr "Передавання"
 
 msgid "Transmit Power"
 msgstr "Потужність передавача"
@@ -3486,7 +3582,7 @@ msgid "Tunnel Interface"
 msgstr "Інтерфейс тунелю"
 
 msgid "Tunnel Link"
-msgstr ""
+msgstr "Посилання тунелю"
 
 msgid "Tx-Power"
 msgstr "Потужність передавача"
@@ -3507,7 +3603,7 @@ msgid "USB Device"
 msgstr "USB-пристрій"
 
 msgid "USB Ports"
-msgstr ""
+msgstr "USB-порт"
 
 msgid "UUID"
 msgstr "UUID"
@@ -3516,7 +3612,7 @@ msgid "Unable to dispatch"
 msgstr "Не вдалося опрацювати запит"
 
 msgid "Unavailable Seconds (UAS)"
-msgstr ""
+msgstr "Недоступні секунди (<abbr title=\"Unavailable Seconds\">UAS</abbr>)"
 
 msgid "Unknown"
 msgstr "Невідомо"
@@ -3528,7 +3624,7 @@ msgid "Unmanaged"
 msgstr "Некерований"
 
 msgid "Unmount"
-msgstr ""
+msgstr "Демонтувати"
 
 msgid "Unsaved Changes"
 msgstr "Незбережені зміни"
@@ -3544,9 +3640,9 @@ msgid ""
 "Check \"Keep settings\" to retain the current configuration (requires a "
 "compatible firmware image)."
 msgstr ""
-"Ð\92Ñ\96дванÑ\82ажиÑ\82и sysupgrade-Ñ\81Ñ\83мÑ\96Ñ\81ний Ð¾Ð±Ñ\80аз, Ñ\89об Ð·Ð°Ð¼Ñ\96ниÑ\82и Ð¿Ð¾Ñ\82оÑ\87нÑ\83 Ð¿Ñ\80оÑ\88ивкÑ\83. Ð\94лÑ\8f "
-"збеÑ\80еженнÑ\8f Ð¿Ð¾Ñ\82оÑ\87ноÑ\97 ÐºÐ¾Ð½Ñ\84Ñ\96гÑ\83Ñ\80аÑ\86Ñ\96Ñ\97 Ð²Ñ\81Ñ\82ановÑ\96Ñ\82Ñ\8c Ð¿Ñ\80апоÑ\80еÑ\86Ñ\8c \"Ð\97беÑ\80егÑ\82и Ð½Ð°Ñ\81Ñ\82Ñ\80ойки"
-"\" (потрібен сумісний образ прошивки)."
+"Ð\92Ñ\96дванÑ\82ажиÑ\82и sysupgrade-Ñ\81Ñ\83мÑ\96Ñ\81ний Ð¾Ð±Ñ\80аз, Ñ\89об Ð·Ð°Ð¼Ñ\96ниÑ\82и Ð¿Ð¾Ñ\82оÑ\87нÑ\83 Ð¼Ñ\96кÑ\80опÑ\80огÑ\80амÑ\83. "
+"Ð\94лÑ\8f Ð·Ð±ÐµÑ\80еженнÑ\8f Ð¿Ð¾Ñ\82оÑ\87ноÑ\97 ÐºÐ¾Ð½Ñ\84Ñ\96гÑ\83Ñ\80аÑ\86Ñ\96Ñ\97 Ð²Ñ\81Ñ\82ановÑ\96Ñ\82Ñ\8c Ð¿Ñ\80апоÑ\80еÑ\86Ñ\8c \"Ð\97беÑ\80егÑ\82и "
+"налаштування\" (потрібен сумісний образ мікропрограми)."
 
 msgid "Upload archive..."
 msgstr "Відвантажити архів..."
@@ -3576,16 +3672,16 @@ msgid "Use TTL on tunnel interface"
 msgstr "Використовувати на тунельному інтерфейсі TTL"
 
 msgid "Use as external overlay (/overlay)"
-msgstr ""
+msgstr "Використовувати як зовнішній оверлей (/overlay)"
 
 msgid "Use as root filesystem (/)"
-msgstr ""
+msgstr "Використовувати як кореневу файлову систему (/)"
 
 msgid "Use broadcast flag"
 msgstr "Використовувати прапорець широкомовності"
 
 msgid "Use builtin IPv6-management"
-msgstr ""
+msgstr "Використовувати вбудоване керування IPv6"
 
 msgid "Use custom DNS servers"
 msgstr "Використовувати особливі DNS-сервери"
@@ -3608,8 +3704,8 @@ msgid ""
 msgstr ""
 "Використовуйте кнопку <em>Додати</em>, щоб додати новий запис оренди. "
 "<em>MAC-адреса</em> ідентифікує вузол, <em>IPv4-адреса</em> визначає "
-"фіксовану адресу, яка буде використовуватися, а <em>Назва (ім'я) вузла</em> "
-"призначає символічне ім'я вузла."
+"фіксовану адресу, яка буде використовуватися, а <em>Назва (імя) вузла</em> "
+"призначає символічне імя вузла."
 
 msgid "Used"
 msgstr "Використано"
@@ -3621,21 +3717,24 @@ msgid ""
 "Used for two different purposes: RADIUS NAS ID and 802.11r R0KH-ID. Not "
 "needed with normal WPA(2)-PSK."
 msgstr ""
+"Використовується для двох різних цілей: RADIUS NAS ID і 802.11r <abbr "
+"title=\"ідентифікатор власника ключа R0\">R0KH-ID</abbr>. Не потрібно за "
+"звичайного WPA(2)-PSK."
 
 msgid "User certificate (PEM encoded)"
-msgstr ""
+msgstr "Сертифікат користувача (PEM-кодований)"
 
 msgid "User key (PEM encoded)"
-msgstr ""
+msgstr "Ключ користувача (PEM-кодований)"
 
 msgid "Username"
-msgstr "Ім'я користувача"
+msgstr "Імя користувача"
 
 msgid "VC-Mux"
 msgstr "VC-Mux"
 
 msgid "VDSL"
-msgstr ""
+msgstr "VDSL"
 
 msgid "VLANs on %q"
 msgstr "VLAN на %q"
@@ -3644,25 +3743,25 @@ msgid "VLANs on %q (%s)"
 msgstr "VLAN на %q (%s)"
 
 msgid "VPN Local address"
-msgstr ""
+msgstr "Локальна адреса VPN"
 
 msgid "VPN Local port"
-msgstr ""
+msgstr "Локальний порт VPN"
 
 msgid "VPN Server"
 msgstr "VPN-сервер"
 
 msgid "VPN Server port"
-msgstr ""
+msgstr "Порт VPN-сервера"
 
 msgid "VPN Server's certificate SHA1 hash"
-msgstr ""
+msgstr "SHA1-геш сертифіката VPN-сервера"
 
 msgid "VPNC (CISCO 3000 (and others) VPN)"
-msgstr ""
+msgstr "VPNC (CISCO 3000 (та інш.) VPN)"
 
 msgid "Vendor"
-msgstr ""
+msgstr "Постачальник"
 
 msgid "Vendor Class to send when requesting DHCP"
 msgstr "Клас постачальника для відправки при запиті DHCP"
@@ -3686,7 +3785,7 @@ msgid "WEP passphrase"
 msgstr "Парольна фраза WEP"
 
 msgid "WMM Mode"
-msgstr "Режим WMM"
+msgstr "Режим <abbr title=\"Wi-Fi Multimedia\">WMM</abbr>"
 
 msgid "WPA passphrase"
 msgstr "Парольна фраза WPA"
@@ -3705,27 +3804,29 @@ msgid "Waiting for command to complete..."
 msgstr "Очікуємо завершення виконання команди..."
 
 msgid "Waiting for configuration to get applied… %ds"
-msgstr ""
+msgstr "Чекаємо на застосування конфігурації… %d c"
 
 msgid "Waiting for device..."
-msgstr ""
+msgstr "Очікуємо пристрій..."
 
 msgid "Warning"
 msgstr "Застереження"
 
 msgid "Warning: There are unsaved changes that will get lost on reboot!"
 msgstr ""
+"Застереження: Є незбережені зміни, які буде втрачено при перезавантаженні!"
 
 msgid ""
 "When using a PSK, the PMK can be generated locally without inter AP "
 "communications"
 msgstr ""
+"При використанні PSK, PMK може бути створений локально без взаємодії між AP"
 
 msgid "Width"
-msgstr ""
+msgstr "Ширина"
 
 msgid "WireGuard VPN"
-msgstr ""
+msgstr "WireGuard VPN"
 
 msgid "Wireless"
 msgstr "Бездротові мережі"
@@ -3743,19 +3844,19 @@ msgid "Wireless Security"
 msgstr "Безпека бездротової мережі"
 
 msgid "Wireless is disabled or not associated"
-msgstr "Бездротову мережу вимкнено або не пов'язано"
+msgstr "Бездротову мережу вимкнено або не повязано"
 
 msgid "Wireless is restarting..."
 msgstr "Бездротова мережа перезапускається..."
 
 msgid "Wireless network is disabled"
-msgstr "Бездротова мережа вимкнена"
+msgstr "Бездротову мережу вимкнено"
 
 msgid "Wireless network is enabled"
-msgstr "Бездротова мережа ввімкнена"
+msgstr "Бездротову мережу ввімкнено"
 
 msgid "Wireless restarted"
-msgstr "Бездротова мережа перезапущена"
+msgstr "Бездротову мережу перезапущено"
 
 msgid "Wireless shut down"
 msgstr "Бездротова мережа припинила роботу"
@@ -3764,7 +3865,7 @@ msgid "Write received DNS requests to syslog"
 msgstr "Записувати отримані DNS-запити до системного журналу"
 
 msgid "Write system log to file"
-msgstr ""
+msgstr "Записувати cистемний журнал до файлу"
 
 msgid ""
 "You can enable or disable installed init scripts here. Changes will applied "
@@ -3779,14 +3880,17 @@ msgstr ""
 msgid ""
 "You must enable JavaScript in your browser or LuCI will not work properly."
 msgstr ""
-"Ð\92и Ð¿Ð¾Ð²Ð¸Ð½Ð½Ñ\96 Ñ\83вÑ\96мкнÑ\83Ñ\82и JavaScript Ñ\83 Ð²Ð°Ñ\88омÑ\83 Ð±Ñ\80аÑ\83зеÑ\80Ñ\96, Ð°Ð±Ð¾ LuCI Ð½Ðµ Ð±Ñ\83де "
-"пÑ\80аÑ\86Ñ\8eваÑ\82и Ð½Ð°Ð»ÐµÐ¶Ð½Ð¸Ð¼ Ñ\87ином."
+"Ð\92ам Ñ\81лÑ\96д Ñ\83вÑ\96мкнÑ\83Ñ\82и JavaScript Ñ\83 Ð²Ð°Ñ\88омÑ\83 Ð±Ñ\80аÑ\83зеÑ\80Ñ\96, Ð°Ð±Ð¾ LuCI Ð½Ðµ Ð±Ñ\83де Ð¿Ñ\80аÑ\86Ñ\8eваÑ\82и "
+"належним чином."
 
 msgid ""
 "Your Internet Explorer is too old to display this page correctly. Please "
 "upgrade it to at least version 7 or use another browser like Firefox, Opera "
 "or Safari."
 msgstr ""
+"Ваш Internet Explorer занадто старий, щоб правильно відобразити цю сторінку. "
+"Поновіть його, принаймні, до версії 7 або скористайтесь іншим браузером, "
+"таким як Firefox, Opera або Safari."
 
 msgid "any"
 msgstr "будь-який"
@@ -3798,13 +3902,16 @@ msgid "baseT"
 msgstr "baseT"
 
 msgid "bridged"
-msgstr "зв'язано"
+msgstr "зв’язано"
+
+msgid "create"
+msgstr "створити"
 
 msgid "create:"
 msgstr "створити:"
 
 msgid "creates a bridge over specified interface(s)"
-msgstr "Створити міст через вказаний інтерфейс(и)"
+msgstr "Створює міст через зазначені інтерфейси"
 
 msgid "dB"
 msgstr "дБ"
@@ -3816,7 +3923,7 @@ msgid "disable"
 msgstr "вимкнено"
 
 msgid "disabled"
-msgstr ""
+msgstr "вимкнено"
 
 msgid "expired"
 msgstr "минув"
@@ -3829,7 +3936,7 @@ msgstr ""
 "Protocol — протокол динамічної конфігурації вузла\">DHCP</abbr>-оренди"
 
 msgid "forward"
-msgstr "пеÑ\80еÑ\81лати"
+msgstr "пеÑ\80еÑ\81пÑ\80Ñ\8fмÑ\83вати"
 
 msgid "full-duplex"
 msgstr "повний дуплекс"
@@ -3844,7 +3951,7 @@ msgid "hidden"
 msgstr "прихований"
 
 msgid "hybrid mode"
-msgstr ""
+msgstr "гібридний режим"
 
 msgid "if target is a network"
 msgstr "якщо мета — мережа"
@@ -3867,19 +3974,19 @@ msgstr ""
 "abbr>-файл"
 
 msgid "minutes"
-msgstr ""
+msgstr "хв."
 
 msgid "no"
 msgstr "ні"
 
 msgid "no link"
-msgstr "нема з'єднання"
+msgstr "нема зєднання"
 
 msgid "none"
 msgstr "нема нічого"
 
 msgid "not present"
-msgstr ""
+msgstr "не присутній"
 
 msgid "off"
 msgstr "вимкнено"
@@ -3890,35 +3997,38 @@ msgstr "увімкнено"
 msgid "open"
 msgstr "відкрита"
 
+msgid "output"
+msgstr "вихід"
+
 msgid "overlay"
-msgstr ""
+msgstr "оверлей"
 
 msgid "random"
-msgstr ""
+msgstr "випадковий"
 
 msgid "relay mode"
-msgstr ""
+msgstr "режим реле"
 
 msgid "routed"
 msgstr "спрямовано"
 
 msgid "server mode"
-msgstr ""
+msgstr "режим сервера"
 
 msgid "stateful-only"
-msgstr ""
+msgstr "тільки ЗІ збереженням стану"
 
 msgid "stateless"
-msgstr ""
+msgstr "БЕЗ збереження стану"
 
 msgid "stateless + stateful"
-msgstr ""
+msgstr "БЕЗ та ЗІ збереженням стану"
 
 msgid "tagged"
-msgstr "з Ð¿Ð¾Ð·Ð½Ð°Ñ\87коÑ\8e"
+msgstr "познаÑ\87ено"
 
 msgid "time units (TUs / 1.024 ms) [1000-65535]"
-msgstr ""
+msgstr "одиниці часу (TUs / 1.024 ms) [1000-65535]"
 
 msgid "unknown"
 msgstr "невідомий"
@@ -3933,121 +4043,10 @@ msgid "unspecified -or- create:"
 msgstr "не визначено -або- створити"
 
 msgid "untagged"
-msgstr "без Ð¿Ð¾Ð·Ð½Ð°Ñ\87ки"
+msgstr "не Ð¿Ð¾Ð·Ð½Ð°Ñ\87ено"
 
 msgid "yes"
 msgstr "так"
 
 msgid "« Back"
 msgstr "« Назад"
-
-#~ msgid "Apply"
-#~ msgstr "Застосувати"
-
-#~ msgid "Applying changes"
-#~ msgstr "Застосування змін"
-
-#~ msgid "Configuration applied."
-#~ msgstr "Конфігурація застосована."
-
-#~ msgid "Save &#38; Apply"
-#~ msgstr "Зберегти і застосувати"
-
-#~ msgid "The following changes have been committed"
-#~ msgstr "Нижче наведені зміни були застосовані"
-
-#~ msgid "There are no pending changes to apply!"
-#~ msgstr "Немає жодних змін до застосування!"
-
-#~ msgid "Action"
-#~ msgstr "Дія"
-
-#~ msgid "Buttons"
-#~ msgstr "Кнопки"
-
-#~ msgid "Handler"
-#~ msgstr "Обробник"
-
-#~ msgid "Maximum hold time"
-#~ msgstr "Максимальний час утримування"
-
-#~ msgid "Minimum hold time"
-#~ msgstr "Мінімальний час утримування"
-
-#~ msgid "Path to executable which handles the button event"
-#~ msgstr "Шлях до програми, яка обробляє натискання кнопки"
-
-#~ msgid "Specifies the button state to handle"
-#~ msgstr "Визначає стан кнопки для обробки"
-
-#~ msgid "This page allows the configuration of custom button actions"
-#~ msgstr "Ця сторінка дозволяє настроїти нетипові дії кнопки"
-
-#~ msgid "Leasetime"
-#~ msgstr "Час оренди"
-
-#~ msgid "AR Support"
-#~ msgstr "Підтримка AR"
-
-#~ msgid "Atheros 802.11%s Wireless Controller"
-#~ msgstr "Бездротовий 802.11%s контролер Atheros"
-
-#~ msgid "Background Scan"
-#~ msgstr "Сканування у фоновому режимі"
-
-#~ msgid "Compression"
-#~ msgstr "Стиснення"
-
-#~ msgid "Disable HW-Beacon timer"
-#~ msgstr "Вимкнути таймер HW-Beacon"
-
-#~ msgid "Do not send probe responses"
-#~ msgstr "Не надсилати відповіді на зондування"
-
-#~ msgid "Fast Frames"
-#~ msgstr "Швидкі фрейми"
-
-#~ msgid "Maximum Rate"
-#~ msgstr "Максимальна швидкість"
-
-#~ msgid "Minimum Rate"
-#~ msgstr "Мінімальна швидкість"
-
-#~ msgid "Multicast Rate"
-#~ msgstr "Швидкість багатоадресного потоку"
-
-#~ msgid "Outdoor Channels"
-#~ msgstr "Зовнішні канали"
-
-#~ msgid "Regulatory Domain"
-#~ msgstr "Регулятивний домен"
-
-#~ msgid "Separate WDS"
-#~ msgstr "Розділяти WDS"
-
-#~ msgid "Static WDS"
-#~ msgstr "Статичний WDS"
-
-#~ msgid "Turbo Mode"
-#~ msgstr "Режим Turbo"
-
-#~ msgid "XR Support"
-#~ msgstr "Підтримка XR"
-
-#~ msgid "An additional network will be created if you leave this unchecked."
-#~ msgstr "Якщо ви залишите це невибраним, буде створена додаткова мережа."
-
-#~ msgid "Join Network: Settings"
-#~ msgstr "Підключення до мережі: Настройки"
-
-#~ msgid "CPU"
-#~ msgstr "ЦП"
-
-#~ msgid "Port %d"
-#~ msgstr "Порт %d"
-
-#~ msgid "Port %d is untagged in multiple VLANs!"
-#~ msgstr "Порт %d нетегований у кількох VLAN-ах!"
-
-#~ msgid "VLAN Interface"
-#~ msgstr "VLAN-інтерфейс"
index b5e712ca367445a20b98e8d0b3816a78aa245a2a..0a2ccbf85a8df1e080cae738dd0e29457e7a6835 100644 (file)
@@ -49,6 +49,9 @@ msgstr ""
 msgid "-- match by uuid --"
 msgstr ""
 
+msgid "-- please select --"
+msgstr ""
+
 msgid "1 Minute Load:"
 msgstr ""
 
@@ -385,6 +388,9 @@ msgstr ""
 msgid "Apply unchecked"
 msgstr ""
 
+msgid "Architecture"
+msgstr ""
+
 msgid ""
 "Assign a part of given length of every public IPv6-prefix to this interface"
 msgstr ""
@@ -399,6 +405,9 @@ msgstr ""
 msgid "Associated Stations"
 msgstr ""
 
+msgid "Associations"
+msgstr ""
+
 msgid "Auth Group"
 msgstr ""
 
@@ -1253,7 +1262,7 @@ msgstr ""
 
 msgid ""
 "Further information about WireGuard interfaces and peers at <a href=\"http://"
-"wireguard.io\">wireguard.io</a>."
+"wireguard.com\">wireguard.com</a>."
 msgstr ""
 
 msgid "GHz"
@@ -1382,7 +1391,7 @@ msgstr ""
 msgid "IPv4 Firewall"
 msgstr ""
 
-msgid "IPv4 WAN Status"
+msgid "IPv4 Upstream"
 msgstr ""
 
 msgid "IPv4 address"
@@ -1433,7 +1442,7 @@ msgstr ""
 msgid "IPv6 ULA-Prefix"
 msgstr ""
 
-msgid "IPv6 WAN Status"
+msgid "IPv6 Upstream"
 msgstr ""
 
 msgid "IPv6 address"
@@ -2542,12 +2551,12 @@ msgstr ""
 "Configuration Protocol\">DHCP</abbr>-Server"
 
 msgid ""
-"Really delete this interface? The deletion cannot be undone!\\nYou might "
-"lose access to this device if you are connected via this interface."
+"Really delete this interface? The deletion cannot be undone! You might lose "
+"access to this device if you are connected via this interface."
 msgstr ""
 
 msgid ""
-"Really delete this wireless network? The deletion cannot be undone!\\nYou "
+"Really delete this wireless network? The deletion cannot be undone! You "
 "might lose access to this device if you are connected via this network."
 msgstr ""
 
@@ -2555,12 +2564,12 @@ msgid "Really reset all changes?"
 msgstr ""
 
 msgid ""
-"Really shut down network?\\nYou might lose access to this device if you are "
+"Really shut down network? You might lose access to this device if you are "
 "connected via this interface."
 msgstr ""
 
 msgid ""
-"Really shutdown interface \"%s\" ?\\nYou might lose access to this device if "
+"Really shutdown interface \"%s\"You might lose access to this device if "
 "you are connected via this interface."
 msgstr ""
 
@@ -3631,6 +3640,9 @@ msgstr ""
 msgid "bridged"
 msgstr ""
 
+msgid "create"
+msgstr ""
+
 msgid "create:"
 msgstr ""
 
@@ -3719,6 +3731,9 @@ msgstr ""
 msgid "open"
 msgstr ""
 
+msgid "output"
+msgstr ""
+
 msgid "overlay"
 msgstr ""
 
index e0ef2eec7128710f6d73693b4eb38eb3fc451c8c..751593f68f622077947cba6b9bfaba8ee4d064e5 100644 (file)
@@ -39,6 +39,9 @@ msgstr "-- 根据标签匹配 --"
 msgid "-- match by uuid --"
 msgstr "-- 根据 UUID 匹配 --"
 
+msgid "-- please select --"
+msgstr ""
+
 msgid "1 Minute Load:"
 msgstr "1 分钟负载:"
 
@@ -378,10 +381,13 @@ msgid "Any zone"
 msgstr "任意区域"
 
 msgid "Apply request failed with status <code>%h</code>"
-msgstr ""
+msgstr "应用请求失败,状态 <code>%h</code>"
 
 msgid "Apply unchecked"
-msgstr ""
+msgstr "应用未选中"
+
+msgid "Architecture"
+msgstr "架构"
 
 msgid ""
 "Assign a part of given length of every public IPv6-prefix to this interface"
@@ -397,6 +403,9 @@ msgstr "将此十六进制子 ID 前缀分配给此接口"
 msgid "Associated Stations"
 msgstr "已连接站点"
 
+msgid "Associations"
+msgstr "关联数"
+
 msgid "Auth Group"
 msgstr "认证组"
 
@@ -555,10 +564,10 @@ msgid "Changes"
 msgstr "修改数"
 
 msgid "Changes applied."
-msgstr "更改已应用"
+msgstr "更改已应用"
 
 msgid "Changes have been reverted."
-msgstr ""
+msgstr "更改已取消。"
 
 msgid "Changes the administrator password for accessing the device"
 msgstr "修改访问设备的管理员密码"
@@ -569,7 +578,7 @@ msgstr "信道"
 msgid ""
 "Channel %d is not available in the %s regulatory domain and has been auto-"
 "adjusted to %d."
-msgstr ""
+msgstr "信道 %d 在 %s 监管区域内不可用并已自动调整到 %d。"
 
 msgid "Check"
 msgstr "检查"
@@ -651,10 +660,10 @@ msgid "Configuration files will be kept."
 msgstr "配置文件将被保留。"
 
 msgid "Configuration has been applied."
-msgstr ""
+msgstr "配置已应用。"
 
 msgid "Configuration has been rolled back!"
-msgstr ""
+msgstr "配置已回滚!"
 
 msgid "Confirmation"
 msgstr "确认密码"
@@ -676,6 +685,8 @@ msgid ""
 "changes. You might need to reconnect if you modified network related "
 "settings such as the IP address or wireless security credentials."
 msgstr ""
+"应用配置更改后,无法重新获得对设备的访问权限。如果您修改了网络相关设置"
+"如 IP 地址或无线安全证书,则可能需要重新连接。"
 
 msgid "Country"
 msgstr "国家"
@@ -846,7 +857,7 @@ msgid "Device unreachable"
 msgstr "无法连接到设备"
 
 msgid "Device unreachable!"
-msgstr ""
+msgstr "无法连接到设备!"
 
 msgid "Diagnostics"
 msgstr "网络诊断"
@@ -883,7 +894,7 @@ msgid "Discard upstream RFC1918 responses"
 msgstr "丢弃 RFC1918 上行响应数据"
 
 msgid "Dismiss"
-msgstr ""
+msgstr "解除"
 
 msgid "Displaying only packages containing"
 msgstr "只显示有内容的软件包"
@@ -997,7 +1008,7 @@ msgstr "启用"
 msgid ""
 "Enable <abbr title=\"Internet Group Management Protocol\">IGMP</abbr> "
 "snooping"
-msgstr ""
+msgstr "启用 <abbr title=\"Internet Group Management Protocol\">IGMP</abbr> 窥探"
 
 msgid "Enable <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
 msgstr "开启 <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
@@ -1057,7 +1068,7 @@ msgid "Enabled"
 msgstr "启用"
 
 msgid "Enables IGMP snooping on this bridge"
-msgstr ""
+msgstr "在此桥接上启用 IGMP 窥探"
 
 msgid ""
 "Enables fast roaming among access points that belong to the same Mobility "
@@ -1138,7 +1149,7 @@ msgid "FT protocol"
 msgstr "FT 协议"
 
 msgid "Failed to confirm apply within %ds, waiting for rollback…"
-msgstr ""
+msgstr "在 %d 秒内确认应用失败,等待回滚..."
 
 msgid "File"
 msgstr "文件"
@@ -1261,10 +1272,10 @@ msgstr "空闲空间"
 
 msgid ""
 "Further information about WireGuard interfaces and peers at <a href=\"http://"
-"wireguard.io\">wireguard.io</a>."
+"wireguard.com\">wireguard.com</a>."
 msgstr ""
-"有关 WireGuard 接口和 Peer 的更多信息:<a href=\"http://wireguard.io"
-"\">wireguard.io</a>。"
+"有关 WireGuard 接口和 Peer 的更多信息:<a href=\"http://wireguard.com"
+"\">wireguard.com</a>。"
 
 msgid "GHz"
 msgstr "GHz"
@@ -1390,8 +1401,8 @@ msgstr "IPv4"
 msgid "IPv4 Firewall"
 msgstr "IPv4 防火墙"
 
-msgid "IPv4 WAN Status"
-msgstr "IPv4 WAN 状态"
+msgid "IPv4 Upstream"
+msgstr "IPv4 上游"
 
 msgid "IPv4 address"
 msgstr "IPv4 地址"
@@ -1441,8 +1452,8 @@ msgstr "IPv6 设置"
 msgid "IPv6 ULA-Prefix"
 msgstr "IPv6 ULA 前缀"
 
-msgid "IPv6 WAN Status"
-msgstr "IPv6 WAN 状态"
+msgid "IPv6 Upstream"
+msgstr "IPv6 上游"
 
 msgid "IPv6 address"
 msgstr "IPv6 地址"
@@ -2152,7 +2163,7 @@ msgid "Obfuscated Password"
 msgstr "混淆密码"
 
 msgid "Obtain IPv6-Address"
-msgstr ""
+msgstr "获取 IPv6 地址"
 
 msgid "Off-State Delay"
 msgstr "关闭时间"
@@ -2560,13 +2571,13 @@ msgstr ""
 "Configuration Protocol\">DHCP</abbr> 服务器"
 
 msgid ""
-"Really delete this interface? The deletion cannot be undone!\\nYou might "
-"lose access to this device if you are connected via this interface."
+"Really delete this interface? The deletion cannot be undone! You might lose "
+"access to this device if you are connected via this interface."
 msgstr ""
 "确定要删除此接口?删除操作无法撤销!\\n删除此接口,可能导致无法再访问路由器!"
 
 msgid ""
-"Really delete this wireless network? The deletion cannot be undone!\\nYou "
+"Really delete this wireless network? The deletion cannot be undone! You "
 "might lose access to this device if you are connected via this network."
 msgstr ""
 "确定要删除此无线网络?删除操作无法撤销!\\n删除此无线网络,可能导致无法再访问"
@@ -2576,14 +2587,14 @@ msgid "Really reset all changes?"
 msgstr "确定要放弃所有更改?"
 
 msgid ""
-"Really shut down network?\\nYou might lose access to this device if you are "
+"Really shut down network? You might lose access to this device if you are "
 "connected via this interface."
 msgstr ""
 "确定要关闭此网络?\\n如果您正在使用此接口连接路由器,关闭此网络可能导致连接断"
 "开!"
 
 msgid ""
-"Really shutdown interface \"%s\" ?\\nYou might lose access to this device if "
+"Really shutdown interface \"%s\"You might lose access to this device if "
 "you are connected via this interface."
 msgstr ""
 "确定要关闭接口 \"%s\"?\\n如果您正在使用此接口连接路由器,关闭此网络可能导致"
@@ -2736,16 +2747,16 @@ msgid "Reveal/hide password"
 msgstr "显示/隐藏 密码"
 
 msgid "Revert"
-msgstr "æ\94¾å¼\83"
+msgstr "æ\81¢å¤\8d"
 
 msgid "Revert changes"
-msgstr ""
+msgstr "恢复更改"
 
 msgid "Revert request failed with status <code>%h</code>"
-msgstr ""
+msgstr "恢复请求失败,状态 <code>%h</code>"
 
 msgid "Reverting configuration…"
-msgstr ""
+msgstr "正在恢复配置..."
 
 msgid "Root"
 msgstr "Root"
@@ -2810,7 +2821,7 @@ msgid "Save"
 msgstr "保存"
 
 msgid "Save & Apply"
-msgstr "保存&应用"
+msgstr "保存应用"
 
 msgid "Scan"
 msgstr "扫描"
@@ -2973,7 +2984,7 @@ msgid "Start priority"
 msgstr "启动优先级"
 
 msgid "Starting configuration apply…"
-msgstr ""
+msgstr "开始应用配置..."
 
 msgid "Startup"
 msgstr "启动项"
@@ -3140,6 +3151,9 @@ msgid ""
 "or revert all pending changes to keep the currently working configuration "
 "state."
 msgstr ""
+"在应用挂起的更改后 %d 秒内无法到达该设备,出于安全原因导致配置回滚。如果您认为配置更改仍"
+"然正确,请执行未选中的配置应用。或者您可以在尝试再次应用之前解除此警告并编辑更改,或者还原"
+"所有未完成的更改以保持当前正在工作的配置状态。"
 
 msgid ""
 "The device file of the memory or partition (<abbr title=\"for example\">e.g."
@@ -3229,7 +3243,7 @@ msgid "There are no active leases."
 msgstr "没有已分配的租约。"
 
 msgid "There are no changes to apply."
-msgstr ""
+msgstr "没有待生效的更改。"
 
 msgid "There are no pending changes to revert!"
 msgstr "没有可放弃的更改!"
@@ -3586,7 +3600,7 @@ msgid "Waiting for command to complete..."
 msgstr "等待命令执行完成..."
 
 msgid "Waiting for configuration to get applied… %ds"
-msgstr ""
+msgstr "等待应用配置... %d 秒"
 
 msgid "Waiting for device..."
 msgstr "等待设备..."
@@ -3679,6 +3693,9 @@ msgstr "baseT"
 msgid "bridged"
 msgstr "桥接的"
 
+msgid "create"
+msgstr ""
+
 msgid "create:"
 msgstr "创建:"
 
@@ -3767,11 +3784,14 @@ msgstr "开"
 msgid "open"
 msgstr "开放式"
 
+msgid "output"
+msgstr ""
+
 msgid "overlay"
 msgstr "覆盖"
 
 msgid "random"
-msgstr ""
+msgstr "随机"
 
 msgid "relay mode"
 msgstr "中继模式"
@@ -3817,3 +3837,9 @@ msgstr "是"
 
 msgid "« Back"
 msgstr "« 后退"
+
+#~ msgid "IPv4 WAN Status"
+#~ msgstr "IPv4 WAN 状态"
+
+#~ msgid "IPv6 WAN Status"
+#~ msgstr "IPv6 WAN 状态"
index 82415865a55247febe6125c422080355413b0a0e..653c093cdb811dc20d243499c4ce6424996d3700 100644 (file)
@@ -47,6 +47,9 @@ msgstr ""
 msgid "-- match by uuid --"
 msgstr ""
 
+msgid "-- please select --"
+msgstr ""
+
 msgid "1 Minute Load:"
 msgstr "1分鐘負載"
 
@@ -388,6 +391,9 @@ msgstr ""
 msgid "Apply unchecked"
 msgstr ""
 
+msgid "Architecture"
+msgstr ""
+
 msgid ""
 "Assign a part of given length of every public IPv6-prefix to this interface"
 msgstr ""
@@ -402,6 +408,9 @@ msgstr ""
 msgid "Associated Stations"
 msgstr "已連接站點"
 
+msgid "Associations"
+msgstr ""
+
 msgid "Auth Group"
 msgstr ""
 
@@ -1266,7 +1275,7 @@ msgstr "剩餘空間"
 
 msgid ""
 "Further information about WireGuard interfaces and peers at <a href=\"http://"
-"wireguard.io\">wireguard.io</a>."
+"wireguard.com\">wireguard.com</a>."
 msgstr ""
 
 msgid "GHz"
@@ -1393,8 +1402,8 @@ msgstr "IPv4版"
 msgid "IPv4 Firewall"
 msgstr "IPv4防火牆"
 
-msgid "IPv4 WAN Status"
-msgstr "IPv4寬頻連線狀態"
+msgid "IPv4 Upstream"
+msgstr ""
 
 msgid "IPv4 address"
 msgstr "IPv4位址"
@@ -1444,8 +1453,8 @@ msgstr ""
 msgid "IPv6 ULA-Prefix"
 msgstr ""
 
-msgid "IPv6 WAN Status"
-msgstr "IPv6寬頻連線狀態"
+msgid "IPv6 Upstream"
+msgstr ""
 
 msgid "IPv6 address"
 msgstr "IPv6位址"
@@ -2547,14 +2556,14 @@ msgstr ""
 "Configuration Protocol\">DHCP</abbr>-伺服器"
 
 msgid ""
-"Really delete this interface? The deletion cannot be undone!\\nYou might "
-"lose access to this device if you are connected via this interface."
+"Really delete this interface? The deletion cannot be undone! You might lose "
+"access to this device if you are connected via this interface."
 msgstr ""
 "真的要刪除這介面?無法復元刪除!\n"
 "假如您要透過這個介面連線您可能會無法存取這個設備."
 
 msgid ""
-"Really delete this wireless network? The deletion cannot be undone!\\nYou "
+"Really delete this wireless network? The deletion cannot be undone! You "
 "might lose access to this device if you are connected via this network."
 msgstr ""
 "真的要刪除這個無線網路?無法復元的刪除!\n"
@@ -2565,14 +2574,14 @@ msgstr "確定要重置回復原廠?"
 
 #, fuzzy
 msgid ""
-"Really shut down network?\\nYou might lose access to this device if you are "
+"Really shut down network? You might lose access to this device if you are "
 "connected via this interface."
 msgstr ""
 "真的要刪除這個網路 ?\n"
 "假如您是透過這個介面連線您可能會無法存取這個設備."
 
 msgid ""
-"Really shutdown interface \"%s\" ?\\nYou might lose access to this device if "
+"Really shutdown interface \"%s\"You might lose access to this device if "
 "you are connected via this interface."
 msgstr ""
 "真的要關閉這個介面 \"%s\" ?!\n"
@@ -3668,6 +3677,9 @@ msgstr "baseT"
 msgid "bridged"
 msgstr "已橋接"
 
+msgid "create"
+msgstr ""
+
 msgid "create:"
 msgstr "建立:"
 
@@ -3756,6 +3768,9 @@ msgstr "開啟"
 msgid "open"
 msgstr "打開"
 
+msgid "output"
+msgstr ""
+
 msgid "overlay"
 msgstr ""
 
@@ -3807,6 +3822,12 @@ msgstr "是的"
 msgid "« Back"
 msgstr "« 倒退"
 
+#~ msgid "IPv4 WAN Status"
+#~ msgstr "IPv4寬頻連線狀態"
+
+#~ msgid "IPv6 WAN Status"
+#~ msgstr "IPv6寬頻連線狀態"
+
 #~ msgid "Apply"
 #~ msgstr "套用"
 
index 38e5de7b39be75fad648db060b61c50c93917ac9..5c630bb5ce1499ed953fc7139679a0efaf6cd102 100644 (file)
@@ -351,7 +351,6 @@ if has_firewall then
 
        fwzone.template = "cbi/firewall_zonelist"
        fwzone.network = arg[1]
-       fwzone.rmempty = false
 
        function fwzone.cfgvalue(self, section)
                self.iface = section
@@ -360,22 +359,16 @@ if has_firewall then
        end
 
        function fwzone.write(self, section, value)
-               local zone = fw:get_zone(value)
-
-               if not zone and value == '-' then
-                       value = m:formvalue(self:cbid(section) .. ".newzone")
-                       if value and #value > 0 then
-                               zone = fw:add_zone(value)
-                       else
-                               fw:del_network(section)
-                       end
-               end
-
+               local zone = fw:get_zone(value) or fw:add_zone(value)
                if zone then
                        fw:del_network(section)
                        zone:add_network(section)
                end
        end
+
+       function fwzone.remove(self, section)
+               fw:del_network(section)
+       end
 end
 
 
index cacaa2595833c1ca93ad61baa0c704bb6f2b7f35..d51a72aba1d998ad65949c3b9bf9a5810ea7e6bd 100644 (file)
@@ -390,22 +390,16 @@ network.novirtual = true
 function network.write(self, section, value)
        local i = nw:get_interface(section)
        if i then
-               if value == '-' then
-                       value = m:formvalue(self:cbid(section) .. ".newnet")
-                       if value and #value > 0 then
-                               local n = nw:add_network(value, {proto="none"})
-                               if n then n:add_interface(i) end
-                       else
-                               local n = i:get_network()
-                               if n then n:del_interface(i) end
-                       end
-               else
-                       local v
-                       for _, v in ipairs(i:get_networks()) do
-                               v:del_interface(i)
-                       end
-                       for v in ut.imatch(value) do
-                               local n = nw:get_network(v)
+               local _, net, old, new = nil, nil, {}, {}
+
+               for _, net in ipairs(i:get_networks()) do
+                       old[net:name()] = true
+               end
+
+               for net in ut.imatch(value) do
+                       new[net] = true
+                       if not old[net] then
+                               local n = nw:get_network(net) or nw:add_network(net, { proto = "none" })
                                if n then
                                        if not n:is_empty() then
                                                n:set("type", "bridge")
@@ -414,6 +408,15 @@ function network.write(self, section, value)
                                end
                        end
                end
+
+               for net, _ in pairs(old) do
+                       if not new[net] then
+                               local n = nw:get_network(net)
+                               if n then
+                                       n:del_interface(i)
+                               end
+                       end
+               end
        end
 end
 
index 8277deb2f6f23b128f81b4ff40ffde717878536b..e8a305882656226d54129aebe7d1b5ef57952d40 100644 (file)
@@ -94,14 +94,9 @@ function newnet.parse(self, section)
        local net, zone
 
        if has_firewall then
-               local zval  = fwzone:formvalue(section)
-               zone = fw:get_zone(zval)
-
-               if not zone and zval == '-' then
-                       zval = m:formvalue(fwzone:cbid(section) .. ".newzone")
-                       if zval and #zval > 0 then
-                               zone = fw:add_zone(zval)
-                       end
+               local value = fwzone:formvalue(section)
+               if value and #value > 0 then
+                       zone = fw:get_zone(value) or fw:add_zone(value)
                end
        end
 
index 14be401697eef54f5b1f4722633f7ee2d0071c47..420e5879fa15b929b515c99bde43025e1e14f03f 100644 (file)
@@ -33,7 +33,7 @@
 <script type="text/javascript" src="<%=resource%>/cbi.js"></script>
 <script type="text/javascript">//<![CDATA[
        function iface_shutdown(id, reconnect) {
-               if (!reconnect && !confirm(String.format('<%_Really shutdown interface "%s" ?\nYou might lose access to this device if you are connected via this interface.%>', id)))
+               if (!reconnect && !confirm(<%=luci.http.write_json(translate('Really shutdown interface "%s"? You might lose access to this device if you are connected via this interface.'))%>.format(id)))
                        return;
 
                var d = document.getElementById(id + '-ifc-description');
@@ -67,7 +67,7 @@
        }
 
        function iface_delete(id) {
-               if (!confirm('<%:Really delete this interface? The deletion cannot be undone!\nYou might lose access to this device if you are connected via this interface.%>'))
+               if (!confirm(<%=luci.http.write_json(translate('Really delete this interface? The deletion cannot be undone! You might lose access to this device if you are connected via this interface.'))%>))
                        return;
 
                (new XHR()).post('<%=url('admin/network/iface_delete')%>/' + id, { token: '<%=token%>' },
index 31f1fed81f9fb6f55d98ddc55a1ea9a101fb318c..ceb810018b97f692644bf0002246f50859f6082d 100644 (file)
 <%+header%>
 
 <% if not has_iwinfo then %>
-       <div class="errorbox">
-               <strong><%:Package libiwinfo required!%></strong><br />
-               <%_The <em>libiwinfo-lua</em> package is not installed. You must install this component for working wireless configuration!%>
+       <div class="alert-message warning">
+               <h4><%:Package libiwinfo required!%></h4>
+               <p><%_The <em>libiwinfo-lua</em> package is not installed. You must install this component for working wireless configuration!%></p>
        </div>
 <% end %>
 
        function wifi_shutdown(id, toggle) {
                var reconnect = (toggle.getAttribute('active') == 'false');
 
-               if (!reconnect && !confirm(String.format('<%:Really shut down network?\nYou might lose access to this device if you are connected via this interface.%>')))
+               if (!reconnect && !confirm(<%=luci.http.write_json(translate('Really shut down network? You might lose access to this device if you are connected via this interface.'))%>))
                        return;
 
                is_reconnecting = true;
        }
 
        function wifi_delete(id) {
-               if (!confirm('<%:Really delete this wireless network? The deletion cannot be undone!\nYou might lose access to this device if you are connected via this network.%>'))
+               if (!confirm(<%=luci.http.write_json(translate('Really delete this wireless network? The deletion cannot be undone! You might lose access to this device if you are connected via this network.'))%>))
                        return;
 
                (new XHR()).post('<%=url('admin/network/wireless_delete')%>/' + id, { token: '<%=token%>' },
index a71926141baf2a14cb17d1edb367e3ee33c71dd6..a56e4826a95d3672f1a29e2dbbf157cd6f73b82f 100644 (file)
@@ -238,9 +238,9 @@ end
        <h2><%:Wireless Overview%></h2>
 
                <% if not has_iwinfo then %>
-                       <div class="errorbox">
-                               <strong><%:Package libiwinfo required!%></strong><br />
-                               <%_The <em>libiwinfo</em> package is not installed. You must install this component for working wireless configuration!%>
+                       <div class="alert-message warning">
+                               <h4><%:Package libiwinfo required!%></h4>
+                               <p><%_The <em>libiwinfo</em> package is not installed. You must install this component for working wireless configuration!%></p>
                        </div>
                <% end %>
 
index 46a8f49d976b7b187b9192a88486f17e99e9aabb..056f6a6e76d3ead9edf603be3902b403500dcb4b 100644 (file)
@@ -89,7 +89,7 @@ peers = map:section(
   "wireguard_" .. ifname,
   translate("Peers"),
   translate("Further information about WireGuard interfaces and peers " ..
-            "at <a href=\"http://wireguard.io\">wireguard.io</a>.")
+            "at <a href=\"http://wireguard.com\">wireguard.com</a>.")
 )
 peers.template = "cbi/tsection"
 peers.anonymous = true
index c8ce19aff103190d2ed6fc219bc231464be64c44..4a40f6d680f1fe24492fcd82235f4ce14325e380 100644 (file)
@@ -430,7 +430,6 @@ form .clearfix,
 form .cbi-value {
        margin-bottom: 18px;
        zoom: 1;
-       overflow: hidden;
 }
 
 form .clearfix:before, form .clearfix:after,
@@ -477,6 +476,7 @@ input[type=checkbox], input[type=radio] {
 input,
 textarea,
 select,
+.cbi-dropdown,
 .uneditable-input {
        display: inline-block;
        width: 210px;
@@ -487,6 +487,13 @@ select,
        color: #808080;
        border: 1px solid #ccc;
        border-radius: 3px;
+       box-sizing: border-box;
+}
+
+.cbi-dropdown {
+       min-width: 210px;
+       max-width: 400px;
+       width: auto;
 }
 
 select {
@@ -1332,6 +1339,159 @@ footer {
        background-image: url('../resources/cbi/download.gif'), linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
 }
 
+.cbi-dropdown {
+       border: 1px solid #ccc;
+       border-radius: 3px;
+       display: inline-flex;
+       padding: 0;
+       cursor: pointer;
+       height: auto;
+       background: linear-gradient(#fff 0%, #e9e8e6 100%);
+       position: relative;
+       color: #404040;
+}
+
+.cbi-dropdown:focus {
+       outline: 2px solid #4b6e9b;
+}
+
+.cbi-dropdown > ul {
+       margin: 0 !important;
+       padding: 0;
+       list-style: none;
+       overflow-x: hidden;
+       overflow-y: auto;
+       display: flex;
+       width: 100%;
+}
+
+.cbi-dropdown > ul.preview {
+       display: none;
+}
+
+.cbi-dropdown > .open,
+.cbi-dropdown > .more {
+       flex-grow: 0;
+       flex-shrink: 0;
+       display: flex;
+       flex-direction: column;
+       justify-content: center;
+       text-align: center;
+       line-height: 2em;
+       padding: 0 .25em;
+}
+
+.cbi-dropdown > .more,
+.cbi-dropdown > ul > li[placeholder] {
+       color: #777;
+       font-weight: bold;
+       text-shadow: 1px 1px 0px #fff;
+       display: none;
+}
+
+.cbi-dropdown > ul > li {
+       display: none;
+       padding: .25em;
+       white-space: nowrap;
+       overflow: hidden;
+       text-overflow: ellipsis;
+       flex-shrink: 1;
+       flex-grow: 1;
+       align-items: center;
+       align-self: center;
+       color: #404040;
+       min-height: 20px;
+}
+
+.cbi-dropdown > ul > li .hide-open { display: initial; }
+.cbi-dropdown > ul > li .hide-close { display: none; }
+
+.cbi-dropdown > ul > li[display]:not([display="0"]) {
+       border-left: 1px solid #ccc;
+}
+
+.cbi-dropdown[empty] > ul {
+       max-width: 1px;
+}
+
+.cbi-dropdown > ul > li > form {
+       display: none;
+       margin: 0;
+       padding: 0;
+       pointer-events: none;
+}
+
+.cbi-dropdown > ul > li img {
+       vertical-align: middle;
+       margin-right: .25em;
+}
+
+.cbi-dropdown > ul > li > form > input[type="checkbox"] {
+       margin: 0;
+}
+
+.cbi-dropdown > ul > li input[type="text"] {
+       height: 20px;
+}
+
+.cbi-dropdown[open] {
+       position: relative;
+}
+
+.cbi-dropdown[open] > ul.dropdown {
+       display: block;
+       background: #f6f6f5;
+       border: 1px solid #918e8c;
+       box-shadow: 0 0 4px #918e8c;
+       position: absolute;
+       z-index: 1000;
+       max-width: none;
+       min-width: 100%;
+       width: auto;
+}
+
+.cbi-dropdown > ul > li[display],
+.cbi-dropdown[open] > ul.preview,
+.cbi-dropdown[open] > ul.dropdown > li,
+.cbi-dropdown[multiple] > ul > li > label,
+.cbi-dropdown[multiple][open] > ul.dropdown > li,
+.cbi-dropdown[multiple][more] > .more,
+.cbi-dropdown[multiple][empty] > .more {
+       flex-grow: 1;
+       display: flex;
+}
+
+.cbi-dropdown[empty] > ul > li,
+.cbi-dropdown[optional][open] > ul.dropdown > li[placeholder],
+.cbi-dropdown[multiple][open] > ul.dropdown > li > form {
+       display: block;
+}
+
+.cbi-dropdown[open] > ul.dropdown > li .hide-open { display: none; }
+.cbi-dropdown[open] > ul.dropdown > li .hide-close { display: initial; }
+
+.cbi-dropdown[open] > ul.dropdown > li {
+       border-bottom: 1px solid #ccc;
+}
+
+.cbi-dropdown[open] > ul.dropdown > li[selected] {
+       background: #b0d0f0;
+}
+
+.cbi-dropdown[open] > ul.dropdown > li.focus {
+       background: linear-gradient(90deg, #a3c2e8 0%, #84aad9 100%);
+}
+
+.cbi-dropdown[open] > ul.dropdown > li:last-child {
+       margin-bottom: 0;
+       border-bottom: none;
+}
+
+.cbi-dropdown[disabled] {
+       pointer-events: none;
+       opacity: .6;
+}
+
 .btn.active, .btn:active {
        box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);
 }
@@ -1423,7 +1583,7 @@ button.btn::-moz-focus-inner, input[type=submit].btn::-moz-focus-inner {
        opacity: 0.4;
 }
 
-.alert-message, .errorbox {
+.alert-message {
        position: relative;
        padding: 7px 15px;
        margin-bottom: 18px;
@@ -1646,7 +1806,6 @@ table table td,
        background-color: #FFFFFF;
        border: 1px solid #CCCCCC;
        padding: 2px;
-       margin-left: 2px;
        background-image: linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
        text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75);
        border-radius: 4px;
@@ -1712,7 +1871,7 @@ table table td,
 
 .zonebadge > em,
 .zonebadge > strong {
-       margin: 5px;
+       margin: 0 2px;
        display: inline-block;
 }
 
@@ -1720,6 +1879,10 @@ table table td,
        width: 6em;
 }
 
+.zonebadge > .ifacebadge {
+       margin-left: 2px;
+}
+
 .zonebadge-empty {
        border: 1px dashed #AAAAAA;
        color: #AAAAAA;
@@ -1801,3 +1964,7 @@ div.cbi-value var,
        line-height: 6px;
        border: none;
 }
+
+html body.apply-overlay-active {
+       height: calc(100vh - 63px);
+}
index 39a55551ff3b0c91c7305fe268b06e96a90984e7..aaacf56b844967807850090fcc509cd68b0fdfb4 100644 (file)
                        </div>
                </header>
 
-               <%- if luci.sys.process.info("uid") == 0 and luci.sys.user.getuser("root") and not luci.sys.user.getpasswd("root") then -%>
-                       <div class="container">
+               <div id="maincontent" class="container">
+                       <%- if luci.sys.process.info("uid") == 0 and luci.sys.user.getuser("root") and not luci.sys.user.getpasswd("root") then -%>
                                <div class="alert-message warning">
                                        <h4><%:No password set!%></h4>
-                                       <%:There is no password set on this router. Please configure a root password to protect the web interface and enable SSH.%><br>
-                                       <a href="<%=pcdata(luci.dispatcher.build_url("admin/system/admin"))%>"><%:Go to password configuration...%></a>
+                                       <p><%:There is no password set on this router. Please configure a root password to protect the web interface and enable SSH.%></p>
+                                       <div class="right"><a class="btn" href="<%=url("admin/system/admin")%>"><%:Go to password configuration...%></a></div>
                                </div>
-                       </div>
-               <%- end -%>
+                       <%- end -%>
 
-               <noscript>
-                       <div class="alert-message warning">
-                               <strong><%:JavaScript required!%></strong><br />
-                               <%:You must enable JavaScript in your browser or LuCI will not work properly.%>
-                       </div>
-               </noscript>
+                       <noscript>
+                               <div class="alert-message warning">
+                                       <h4><%:JavaScript required!%></h4>
+                                       <p><%:You must enable JavaScript in your browser or LuCI will not work properly.%></p>
+                               </div>
+                       </noscript>
 
-               <div id="maincontent" class="container">
                        <% if category then render_tabmenu(category, cattree) end %>
index cc9caac5569aea8b58baab6b800a1cb58a3f3db8..a9585cf40ec2b1a4fcb6410d3c235c10cf501fdd 100755 (executable)
@@ -107,7 +107,8 @@ select {
 }
 
 select,
-input {
+input,
+.cbi-dropdown {
     background-color: transparent;
     color: rgba(0, 0, 0, .87);
     border: none;
@@ -157,7 +158,7 @@ header {
     transition: box-shadow .2s;
     float: left;
     position: fixed;
-    z-index: 101;
+    z-index: 2000;
 }
 
 footer {
@@ -287,10 +288,9 @@ header > .container > .brand {
     color: black;
 }
 
-.errorbox,
 .alert-message {
     margin: 2rem 0 0 0;
-    padding: 2rem;
+    padding: 1rem;
     border: 0;
     font-weight: normal;
     font-style: normal;
@@ -303,16 +303,19 @@ header > .container > .brand {
     box-shadow: 0 2px 2px 0 rgba(0, 0, 0, .16), 0 0 2px 0 rgba(0, 0, 0, .12);
 }
 
-.errorbox {
-    color: #fff;
-    background-color: #f0ad4e;
-    border-color: #eea236;
-}
-
 .error {
     color: red;
 }
 
+.alert-message > h4 {
+    font-weight: bold;
+    font-size: 110%;
+}
+
+.alert-message > * {
+    margin: .5rem 0;
+}
+
 #maincontent > .container > div:nth-child(1).alert-message.warning > a {
     font: inherit;
     overflow: visible;
@@ -450,11 +453,7 @@ fieldset {
     font-style: normal;
     line-height: 1;
     font-family: inherit;
-
     min-width: inherit;
-    overflow-x: auto;
-    overflow-y: hidden;
-
     border-radius: 0;
     background-color: #FFF;
     box-shadow: 0 2px 2px 0 rgba(0, 0, 0, .16), 0 0 2px 0 rgba(0, 0, 0, .12);
@@ -565,7 +564,7 @@ td > table > tbody > tr > td,
 
 /* button style */
 
-.cbi-button {
+.btn, .cbi-button {
     -webkit-appearance: none;
     text-transform: uppercase;
     color: rgba(0, 0, 0, 0.87);
@@ -588,8 +587,13 @@ td > table > tbody > tr > td,
     user-select: none;
     font-size: 0.8rem;
     width: auto !important;
+    display: inline-block;
+    text-decoration: none;
 }
 
+.btn:hover,
+.btn:focus,
+.btn:active,
 .cbi-button:hover,
 .cbi-button:focus,
 .cbi-button:active {
@@ -599,15 +603,19 @@ td > table > tbody > tr > td,
     color: rgba(0, 0, 0, 0.87);
 }
 
+.btn:hover,
+.btn:focus,
 .cbi-button:hover,
 .cbi-button:focus {
     box-shadow: 0 0px 2px rgba(0, 0, 0, 0.12), 0 2px 2px rgba(0, 0, 0, 0.2);
 }
 
+.btn:active,
 .cbi-button:active {
     box-shadow: 0 10px 20px rgba(0, 0, 0, 0.19), 0 6px 6px rgba(0, 0, 0, 0.23);
 }
 
+.btn:disabled,
 .cbi-button:disabled {
     cursor: not-allowed;
     pointer-events: none;
@@ -615,6 +623,7 @@ td > table > tbody > tr > td,
     box-shadow: none;
 }
 
+.btn + .btn,
 form.inline + form.inline,
 .cbi-button + .cbi-button {
     margin-left: 0.6rem;
@@ -793,6 +802,172 @@ form.inline + form.inline,
     font-size: small;
 }
 
+
+.cbi-dropdown {
+    display: inline-flex;
+    cursor: pointer;
+    position: relative;
+    padding: 0;
+    height: auto;
+}
+
+.cbi-dropdown:focus {
+    outline: 2px solid #4b6e9b;
+}
+
+.cbi-dropdown > ul {
+    margin: 0 !important;
+    padding: 0;
+    list-style: none;
+    overflow-x: hidden;
+    overflow-y: auto;
+    display: flex;
+    width: 100%;
+}
+
+.cbi-dropdown > ul.preview {
+    display: none;
+}
+
+.cbi-dropdown > .open {
+    border: 2px outset #eee;
+    flex-basis: 15px;
+    background: #eee;
+}
+
+.cbi-dropdown > .open,
+.cbi-dropdown > .more {
+    flex-grow: 0;
+    flex-shrink: 0;
+    display: flex;
+    flex-direction: column;
+    justify-content: center;
+    text-align: center;
+    line-height: 2em;
+    padding: 0 .25em;
+}
+
+.cbi-dropdown > .more,
+.cbi-dropdown > ul > li[placeholder] {
+    color: #777;
+    font-weight: bold;
+    text-shadow: 1px 1px 0px #fff;
+    display: none;
+}
+
+.cbi-dropdown > ul > li {
+    display: none;
+    padding: .25em;
+    white-space: nowrap;
+    overflow: hidden;
+    text-overflow: ellipsis;
+    flex-shrink: 1;
+    flex-grow: 1;
+    align-items: center;
+    align-self: center;
+    min-height: 20px;
+}
+
+.cbi-dropdown > ul > li .hide-open { display: initial; }
+.cbi-dropdown > ul > li .hide-close { display: none; }
+
+.cbi-dropdown > ul > li[display]:not([display="0"]) {
+    border-left: 1px solid #ccc;
+}
+
+.cbi-dropdown[empty] > ul {
+    max-width: 1px;
+}
+
+.cbi-dropdown > ul > li > form {
+    display: none;
+    margin: 0;
+    padding: 0;
+    pointer-events: none;
+}
+
+.cbi-dropdown > ul > li img {
+    vertical-align: middle;
+    margin-right: .25em;
+}
+
+.cbi-dropdown > ul > li > form > input[type="checkbox"] {
+    margin: 0;
+    height: auto;
+}
+
+.cbi-dropdown > ul > li input[type="text"] {
+    height: 20px;
+}
+
+.cbi-dropdown[open] {
+    position: relative;
+}
+
+.cbi-dropdown[open] > ul.dropdown {
+    display: block;
+    background: #f6f6f5;
+    border: 1px solid #918e8c;
+    box-shadow: 0 0 4px #918e8c;
+    position: absolute;
+    z-index: 1000;
+    max-width: none;
+    min-width: 100%;
+    width: auto;
+}
+
+.cbi-dropdown > ul > li[display],
+.cbi-dropdown[open] > ul.preview,
+.cbi-dropdown[open] > ul.dropdown > li,
+.cbi-dropdown[multiple] > ul > li > label,
+.cbi-dropdown[multiple][open] > ul.dropdown > li,
+.cbi-dropdown[multiple][more] > .more,
+.cbi-dropdown[multiple][empty] > .more {
+    flex-grow: 1;
+    display: flex;
+    align-items: center;
+}
+
+.cbi-dropdown[empty] > ul > li,
+.cbi-dropdown[optional][open] > ul.dropdown > li[placeholder],
+.cbi-dropdown[multiple][open] > ul.dropdown > li > form {
+    display: block;
+}
+
+.cbi-dropdown[open] > ul.dropdown > li .hide-open { display: none; }
+.cbi-dropdown[open] > ul.dropdown > li .hide-close { display: initial; }
+
+.cbi-dropdown[open] > ul.dropdown > li {
+    border-bottom: 1px solid #ccc;
+}
+
+.cbi-dropdown[open] > ul.dropdown > li[selected] {
+    background: #b0d0f0;
+}
+
+.cbi-dropdown[open] > ul.dropdown > li.focus {
+    background: linear-gradient(90deg, #a3c2e8 0%, #84aad9 100%);
+}
+
+.cbi-dropdown[open] > ul.dropdown > li:last-child {
+    margin-bottom: 0;
+    border-bottom: none;
+}
+
+.cbi-dropdown[disabled] {
+    pointer-events: none;
+    opacity: .6;
+}
+
+.cbi-dropdown .zonebadge {
+    width: 100%;
+}
+
+.cbi-dropdown[open] .zonebadge {
+    width: auto;
+}
+
+
 /* luci */
 
 .hidden {
@@ -828,17 +1003,20 @@ form.inline + form.inline,
 }
 
 /* select */
-.cbi-value-field .cbi-input-select {
+.cbi-value-field .cbi-dropdown {
     min-width: 15rem;
 }
 
+.cbi-value-field .cbi-input-select {
+    width: 15rem;
+}
+
 .ifacebadge {
     display: inline-flex;
     border-bottom: 1px solid #CCCCCC;
     padding: 0.5rem 1rem;
-    -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
-    -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
     box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
+    background: #fff;
 }
 
 td > .ifacebadge,
@@ -847,12 +1025,17 @@ td > .ifacebadge,
     font-size: 0.9rem;
 }
 
+.ifacebadge > em,
 .ifacebadge > img {
-    float: right;
-    margin: 0 0.3rem;
+    display: inline-block;
+    margin: 0 .2rem;
     align-self: start;
 }
 
+.ifacebadge > img + img {
+    margin: 0 .2rem 0 0;
+}
+
 .network-status-table {
     display: flex;
     flex-wrap: wrap;
@@ -1027,8 +1210,8 @@ td > .ifacebadge,
 }
 
 .zonebadge > .ifacebadge {
-    padding: 0.2rem 1rem;
-    margin: 0.3rem;
+    padding: .2rem .3rem;
+    margin: 0.1rem 0.2rem;
     border: 1px solid #6C6C6C;
 }
 
@@ -1038,6 +1221,12 @@ td > .ifacebadge,
     margin-top: 0.3rem;
 }
 
+.zonebadge > em,
+.zonebadge > strong {
+    margin: 0 0.2rem;
+    display: inline-block;
+}
+
 .cbi-value-field .cbi-input-checkbox,
 .cbi-value-field .cbi-input-radio {
     margin-top: 0.5rem;
@@ -1062,10 +1251,14 @@ td > .ifacebadge,
     margin-top: -0.5rem;
 }
 
-.cbi-section-table-row > .cbi-value-field .cbi-input-select {
+.cbi-section-table-row > .cbi-value-field .cbi-dropdown {
     min-width: 7rem;
 }
 
+.cbi-section-table-row > .cbi-value-field .cbi-input-select {
+    width: 7rem;
+}
+
 .cbi-section-create > .cbi-button-add {
     margin: 0.5rem;
 }
@@ -1336,6 +1529,7 @@ body.lang_pl.node-main-login .cbi-value-title {
         width: calc(100% - 13rem);
     }
 
+    .btn,
     .cbi-button {
         padding: 0.3rem 0.6rem;
         font-size: 0.8rem;
@@ -1595,8 +1789,6 @@ body.lang_pl.node-main-login .cbi-value-title {
         line-height: 1;
         font-family: inherit;
         min-width: inherit;
-        overflow-x: auto;
-        overflow-y: hidden;
         border-radius: 0;
         background-color: #FFF;
         box-shadow: 0 2px 2px 0 rgba(0, 0, 0, .16), 0 0 2px 0 rgba(0, 0, 0, .12);
@@ -1615,33 +1807,36 @@ body.lang_pl.node-main-login .cbi-value-title {
 
 @media screen and (min-width: 992px) {
     .cbi-value input[type="password"],
-    .cbi-value input[type="text"] {
-        min-width: 20rem;
+    .cbi-value input[type="text"],
+    .cbi-value-field .cbi-input-select {
+        width: 20rem;
     }
 
-    .cbi-value-field .cbi-input-select {
+    .cbi-value-field .cbi-dropdown {
         min-width: 20rem;
     }
 }
 
 @media screen and (min-width: 1280px) {
     .cbi-value input[type="password"],
-    .cbi-value input[type="text"] {
-        min-width: 22rem;
+    .cbi-value input[type="text"],
+    .cbi-value-field .cbi-input-select {
+        width: 22rem;
     }
 
-    .cbi-value-field .cbi-input-select {
+    .cbi-value-field .cbi-dropdown {
         min-width: 22rem;
     }
 }
 
 @media screen and (min-width: 1600px) {
     .cbi-value input[type="password"],
-    .cbi-value input[type="text"] {
-        min-width: 25rem;
+    .cbi-value input[type="text"],
+    .cbi-value-field .cbi-input-select {
+        width: 25rem;
     }
 
-    .cbi-value-field .cbi-input-select {
+    .cbi-value-field .cbi-dropdown {
         min-width: 25rem;
     }
 }
index 0aca882c05397207eaf4febe6e651836f443c487..b6341a2c35ae26ab0092f7ea9f6b1ca28faa74b9 100644 (file)
 <!DOCTYPE html>
 <html lang="<%=luci.i18n.context.lang%>">
 <head>
-    <meta charset="utf-8">
-    <title><%=striptags( (boardinfo.hostname or "?") .. ( (node and node.title) and ' - ' .. translate(node.title) or '')) %> - LuCI</title>
-    <meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0" name="viewport"/>
-    <meta name="format-detection" content="telephone=no, email=no"/>
-    <meta name="apple-mobile-web-app-capable" content="yes">
-    <meta name="mobile-web-app-capable" content="yes">
-    <meta name="x5-fullscreen" content="true">
-    <meta name="full-screen" content="yes">
-    <meta name="x5-page-mode" content="app">
-    <meta name="browsermode" content="application">
-    <meta name="theme-color" content="#0099CC">
-    <meta name="msapplication-tap-highlight" content="no">
-    <meta name="msapplication-TileColor" content="#0099CC">
-
-    <meta name="application-name" content="<%=striptags( (boardinfo.hostname or "?") ) %> - LuCI">
-    <meta name="apple-mobile-web-app-title" content="<%=striptags( (boardinfo.hostname or "?") ) %> - LuCI">
-    <meta name="msapplication-TileImage" content="<%=media%>/logo.png"/>
-    <link rel="icon" href="<%=media%>/logo.png" sizes="144x144">
-    <link rel="apple-touch-icon-precomposed" href="<%=media%>/logo.png" sizes="144x144">
-
-    <link rel="stylesheet" href="<%=media%>/css/style.css">
-    <link rel="shortcut icon" href="<%=media%>/favicon.ico">
-    <% if node and node.css then %>
-        <link rel="stylesheet" href="<%=resource%>/<%=node.css%>">
-    <% end -%>
-    <% if css then %>
-        <style title="text/css"><%= css %></style>
-    <% end -%>
-    <script src="<%=resource%>/xhr.js"></script>
+       <meta charset="utf-8">
+       <title><%=striptags( (boardinfo.hostname or "?") .. ( (node and node.title) and ' - ' .. translate(node.title) or '')) %> - LuCI</title>
+       <meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0" name="viewport"/>
+       <meta name="format-detection" content="telephone=no, email=no"/>
+       <meta name="apple-mobile-web-app-capable" content="yes">
+       <meta name="mobile-web-app-capable" content="yes">
+       <meta name="x5-fullscreen" content="true">
+       <meta name="full-screen" content="yes">
+       <meta name="x5-page-mode" content="app">
+       <meta name="browsermode" content="application">
+       <meta name="theme-color" content="#0099CC">
+       <meta name="msapplication-tap-highlight" content="no">
+       <meta name="msapplication-TileColor" content="#0099CC">
+
+       <meta name="application-name" content="<%=striptags( (boardinfo.hostname or "?") ) %> - LuCI">
+       <meta name="apple-mobile-web-app-title" content="<%=striptags( (boardinfo.hostname or "?") ) %> - LuCI">
+       <meta name="msapplication-TileImage" content="<%=media%>/logo.png"/>
+       <link rel="icon" href="<%=media%>/logo.png" sizes="144x144">
+       <link rel="apple-touch-icon-precomposed" href="<%=media%>/logo.png" sizes="144x144">
+
+       <link rel="stylesheet" href="<%=media%>/css/style.css">
+       <link rel="shortcut icon" href="<%=media%>/favicon.ico">
+       <% if node and node.css then %>
+               <link rel="stylesheet" href="<%=resource%>/<%=node.css%>">
+       <% end -%>
+       <% if css then %>
+               <style title="text/css"><%= css %></style>
+       <% end -%>
+       <script src="<%=resource%>/xhr.js"></script>
 </head>
 <body class="lang_<%=luci.i18n.context.lang%> <%- if node then %><%= striptags( node.title ) %><%- end %> <% if luci.dispatcher.context.authsession then %>logged-in<% end %>">
 <header>
        </div>
 </header>
 <div class="main">
-        <div style="" class="loading"><span><div class="loading-img"></div>Loading...</span></div>
-        <div class="main-left">
+       <div style="" class="loading"><span><div class="loading-img"></div>Loading...</span></div>
+       <div class="main-left">
                <% render_topmenu() %>
-        </div>
+       </div>
        <div class="main-right">
-                <div class="darkMask"></div>
-                <div id="maincontent">
-                        <div class="container">
-                                <%- if luci.sys.process.info("uid") == 0 and luci.sys.user.getuser("root") and not luci.sys.user.getpasswd("root") then -%>
-                                        <div class="alert-message warning">
-                                                <h4><%:No password set!%></h4>
-                                                <%:There is no password set on this router. Please configure a root password to protect the web interface and enable SSH.%><br>
-                                                <a href="<%=pcdata(luci.dispatcher.build_url("admin/system/admin"))%>"><%:Go to password configuration...%></a>
-                                        </div>
-                                <%- end -%>
-                                <% if category then render_tabmenu(category, cattree) end %>
+               <div class="darkMask"></div>
+               <div id="maincontent">
+                       <div class="container">
+                               <%- if luci.sys.process.info("uid") == 0 and luci.sys.user.getuser("root") and not luci.sys.user.getpasswd("root") then -%>
+                                       <div class="alert-message warning">
+                                               <h4><%:No password set!%></h4>
+                                               <p><%:There is no password set on this router. Please configure a root password to protect the web interface and enable SSH.%></p>
+                                               <div class="right"><a class="btn" href="<%=url("admin/system/admin")%>"><%:Go to password configuration...%></a></div>
+                                       </div>
+                               <%- end -%>
 
                                <noscript>
                                        <div class="alert-message warning">
-                                               <strong><%:JavaScript required!%></strong><br />
-                                               <%:You must enable JavaScript in your browser or LuCI will not work properly.%>
+                                               <h4><%:JavaScript required!%></h4>
+                                               <p><%:You must enable JavaScript in your browser or LuCI will not work properly.%></p>
                                        </div>
-                               </noscript>                     
+                               </noscript>
+
+                               <% if category then render_tabmenu(category, cattree) end %>
index b474bb9fe1d3b94e6158a20456944339dbef9451..1d5ac8ab242c1de3ce06c5bffb520d62c6e78238 100644 (file)
@@ -27,6 +27,7 @@ body {
 * {
        margin: 0;
        padding: 0;
+       box-sizing: border-box;
 }
 
 .table { display: table; }
@@ -181,6 +182,33 @@ code {
        background-color: white;
 }
 
+.alert-message {
+       font-size: 9pt;
+       font-weight: normal;
+       padding: .5em;
+       border-radius: 3px;
+       color: #000;
+}
+
+.alert-message.notice {
+       background: linear-gradient(#ccc 0%, #eee 100%);
+       color: #4a6b7c;
+}
+
+.alert-message.warning {
+       background: linear-gradient(#dda 0%, #dd8 100%);
+       color: #c00;
+}
+
+.alert-message > * {
+       margin: .5em;
+}
+
+.alert-message > h4 {
+       font-weight: bold;
+       font-size: 10pt;
+}
+
 div.hostinfo {
        float: left;
        margin: 0;
@@ -429,13 +457,20 @@ select:hover {
        color: #000000;
 }
 
+input[type=text],
+input[type=password] {
+       padding: 1px 3px;
+}
+
 select,
 input[type=text],
 input[type=password] {
+       font-size: inherit;
        width: 20em;
 }
 
 .td select,
+.td .cbi-dropdown,
 .td input[type=text],
 .td input[type=password] {
        width: 99%;
@@ -447,18 +482,23 @@ img.cbi-image-button {
        vertical-align: middle;
 }
 
-.cbi-button {
+.btn, .cbi-button {
        padding: 2px;
        border-radius: 3px;
        border: 1px solid #aaa;
        background: #eee 1px center no-repeat;
+       text-decoration: none;
+       color: #000;
+       display: inline-block;
 }
 
-.cbi-button:hover {
+.btn:hover, .cbi-button:hover {
        border-color: #4a6b7c;
        background-color: #fff;
 }
 
+.btn[disabled],
+.btn[disabled]:hover,
 .cbi-button[disabled],
 .cbi-button[disabled]:hover {
        opacity: .6;
@@ -741,6 +781,7 @@ div.cbi-section-create {
        vertical-align: top;
 }
 
+div.cbi-section-create .btn,
 div.cbi-section-create .cbi-button {
        margin: 0.25em;
 }
@@ -812,13 +853,6 @@ div.cbi-section-remove {
        vertical-align: bottom;
 }
 
-div.cbi-error {
-       font-size: 95%;
-       font-weight: bold;
-       color: #ff0000;
-       background-color: #ffffff;
-}
-
 .td.cbi-value-error {
        border-color: red;
 }
@@ -894,6 +928,169 @@ div.cbi-tab-descr {
        padding: 0.5em 0.5em 0.5em 2em;
 }
 
+
+.cbi-dropdown {
+       border: 1px inset #000;
+       display: inline-flex;
+       cursor: pointer;
+       background: #eee;
+       position: relative;
+       padding: 0;
+       color: #000;
+       min-width: 20em;
+}
+
+.cbi-dropdown:hover {
+       background: #fff;
+}
+
+.cbi-dropdown:focus {
+       outline: 2px solid #4b6e9b;
+}
+
+.cbi-dropdown > ul {
+       margin: 0 !important;
+       padding: 0;
+       list-style: none;
+       overflow-x: hidden;
+       overflow-y: auto;
+       display: flex;
+       width: 100%;
+}
+
+.cbi-dropdown > ul.preview {
+       display: none;
+}
+
+.cbi-dropdown > .open {
+       border: 2px outset #eee;
+       flex-basis: 15px;
+}
+
+.cbi-dropdown > .open,
+.cbi-dropdown > .more {
+       flex-grow: 0;
+       flex-shrink: 0;
+       display: flex;
+       flex-direction: column;
+       justify-content: center;
+       text-align: center;
+       line-height: 2em;
+       padding: 0 .25em;
+}
+
+.cbi-dropdown > .more,
+.cbi-dropdown > ul > li[placeholder] {
+       color: #777;
+       font-weight: bold;
+       text-shadow: 1px 1px 0px #fff;
+       display: none;
+}
+
+.cbi-dropdown > ul > li {
+       display: none;
+       padding: .25em;
+       white-space: nowrap;
+       overflow: hidden;
+       text-overflow: ellipsis;
+       flex-shrink: 1;
+       flex-grow: 1;
+       align-items: center;
+       align-self: center;
+       min-height: 20px;
+}
+
+.cbi-dropdown > ul > li .hide-open { display: initial; }
+.cbi-dropdown > ul > li .hide-close { display: none; }
+
+.cbi-dropdown > ul > li[display]:not([display="0"]) {
+       border-left: 1px solid #ccc;
+}
+
+.cbi-dropdown[empty] > ul {
+       max-width: 1px;
+}
+
+.cbi-dropdown > ul > li > form {
+       display: none;
+       margin: 0;
+       padding: 0;
+       pointer-events: none;
+}
+
+.cbi-dropdown > ul > li img {
+       vertical-align: middle;
+       margin-right: .25em;
+}
+
+.cbi-dropdown > ul > li > form > input[type="checkbox"] {
+       margin: 0;
+}
+
+.cbi-dropdown > ul > li input[type="text"] {
+       height: 20px;
+}
+
+.cbi-dropdown[open] {
+       position: relative;
+}
+
+.cbi-dropdown[open] > ul.dropdown {
+       display: block;
+       background: #f6f6f5;
+       border: 1px solid #918e8c;
+       box-shadow: 0 0 4px #918e8c;
+       position: absolute;
+       z-index: 1000;
+       max-width: none;
+       min-width: 100%;
+       width: auto;
+}
+
+.cbi-dropdown > ul > li[display],
+.cbi-dropdown[open] > ul.preview,
+.cbi-dropdown[open] > ul.dropdown > li,
+.cbi-dropdown[multiple] > ul > li > label,
+.cbi-dropdown[multiple][open] > ul.dropdown > li,
+.cbi-dropdown[multiple][more] > .more,
+.cbi-dropdown[multiple][empty] > .more {
+       flex-grow: 1;
+       display: flex;
+       align-items: center;
+}
+
+.cbi-dropdown[empty] > ul > li,
+.cbi-dropdown[optional][open] > ul.dropdown > li[placeholder],
+.cbi-dropdown[multiple][open] > ul.dropdown > li > form {
+       display: block;
+}
+
+.cbi-dropdown[open] > ul.dropdown > li .hide-open { display: none; }
+.cbi-dropdown[open] > ul.dropdown > li .hide-close { display: initial; }
+
+.cbi-dropdown[open] > ul.dropdown > li {
+       border-bottom: 1px solid #ccc;
+}
+
+.cbi-dropdown[open] > ul.dropdown > li[selected] {
+       background: #b0d0f0;
+}
+
+.cbi-dropdown[open] > ul.dropdown > li.focus {
+       background: linear-gradient(90deg, #a3c2e8 0%, #84aad9 100%);
+}
+
+.cbi-dropdown[open] > ul.dropdown > li:last-child {
+       margin-bottom: 0;
+       border-bottom: none;
+}
+
+.cbi-dropdown[disabled] {
+       pointer-events: none;
+       opacity: .6;
+}
+
+
 .left {
        text-align: left !important;
 }
@@ -934,17 +1131,6 @@ div.cbi-tab-descr {
        padding: 0.5em;
 }
 
-.errorbox {
-       border: 1px solid #FF0000;
-       background-color: #FFCCCC;
-       padding: 5px;
-       margin-bottom: 5px;
-}
-
-.errorbox a {
-       color: #000000 !important;
-}
-
 
 .ifacebadge, .ifacebox {
        display: inline-flex;
@@ -964,9 +1150,16 @@ div.cbi-tab-descr {
        background: #90c0e0;
 }
 
-.ifacebadge > img {
+.ifacebadge, .zonebadge {
+       align-items: center;
+}
+
+.ifacebadge > img,
+.ifacebadge > em {
        margin-right: 5px;
        align-self: start;
+       display: inline-block;
+       height: 16px;
 }
 
 .ifacebadge-active {
@@ -1000,7 +1193,7 @@ div.cbi-tab-descr {
 .network-status-table .ifacebox-body {
        display: flex;
        flex-direction: column;
-       height: 100%;
+       flex: 1 0;
 }
 
 .network-status-table .ifacebox-body > span {
@@ -1026,12 +1219,12 @@ div.cbi-tab-descr {
        display: inline-block;
        white-space: nowrap;
        cursor: pointer;
+       border-radius: 3px;
 }
 
-.zonebadge em,
-.zonebadge strong {
+.zonebadge em,
+.zonebadge strong {
        margin: 3px;
-       display: inline-block;
 }
 
 .zonebadge input {
@@ -1039,6 +1232,18 @@ div.cbi-tab-descr {
        height: 1.5em;
 }
 
+.zonebadge .ifacebadge,
+.cbi-dropdown .ifacebadge {
+       margin: 0 .125em;
+}
+
+.zonebadge .ifacebadge img,
+.zonebadge .ifacebadge em,
+.cbi-dropdown .ifacebadge img,
+.cbi-dropdown .ifacebadge em {
+       margin: 0 1px;
+}
+
 .zonebadge-empty {
        border: 1px dashed #AAAAAA;
        color: #AAAAAA;
index 5b39f05af789d000413be95e0465b3100e0e4e42..cbf02a76cd5cf5f210b8dfcea64acd73e136941c 100644 (file)
 
        <div id="maincontent">
                <noscript>
-                       <div class="errorbox">
-                               <strong><%:JavaScript required!%></strong><br />
-                               <%:You must enable JavaScript in your browser or LuCI will not work properly.%>
+                       <div class="alert-message warning">
+                               <h4><%:JavaScript required!%></h4>
+                               <p><%:You must enable JavaScript in your browser or LuCI will not work properly.%></p>
                        </div>
                </noscript>
 
                <%- if luci.sys.process.info("uid") == 0 and luci.sys.user.getuser("root") and not luci.sys.user.getpasswd("root") and category ~= "failsafe" then -%>
-               <div class="errorbox">
-                       <strong><%:No password set!%></strong><br />
-                       <%:There is no password set on this router. Please configure a root password to protect the web interface and enable SSH.%><br />
-                       <a href="<%=pcdata(luci.dispatcher.build_url("admin/system/admin"))%>"><%:Go to password configuration...%></a>
+               <div class="alert-message warning">
+                       <h4><%:No password set!%></h4>
+                       <p><%:There is no password set on this router. Please configure a root password to protect the web interface and enable SSH.%></p>
+                       <div class="right"><a class="btn" href="<%=url("admin/system/admin")%>"><%:Go to password configuration...%></a></div>
                </div>
                <%- end -%>