diff options
20 files changed, 930 insertions, 721 deletions
diff --git a/applications/luci-app-acl/po/mr/acl.po b/applications/luci-app-acl/po/mr/acl.po index b2fabb1f50..dee44d4a9c 100644 --- a/applications/luci-app-acl/po/mr/acl.po +++ b/applications/luci-app-acl/po/mr/acl.po @@ -1,120 +1,127 @@ msgid "" msgstr "" -"Content-Type: text/plain; charset=UTF-8\n" "Project-Id-Version: PACKAGE VERSION\n" -"Last-Translator: Automatically generated\n" -"Language-Team: none\n" +"PO-Revision-Date: 2020-10-01 08:41+0000\n" +"Last-Translator: Prachi Joshi <josprachi@yahoo.com>\n" +"Language-Team: Marathi <https://hosted.weblate.org/projects/openwrt/" +"luciapplicationsacl/mr/>\n" "Language: mr\n" "MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.3-dev\n" #: applications/luci-app-acl/root/usr/share/luci/menu.d/luci-app-acl.json:3 msgid "ACL Settings" -msgstr "" +msgstr "एसीएल सेटिंग्ज" #: applications/luci-app-acl/htdocs/luci-static/resources/view/system/acl.js:78 msgid "ACL group" -msgstr "" +msgstr "एसीएल गट" #: applications/luci-app-acl/htdocs/luci-static/resources/view/system/acl.js:80 #: applications/luci-app-acl/htdocs/luci-static/resources/view/system/acl.js:303 msgid "Access level" -msgstr "" +msgstr "प्रवेश स्तर" #: applications/luci-app-acl/htdocs/luci-static/resources/view/system/acl.js:267 msgid "Cannot encrypt plaintext password since uhttpd is not installed." msgstr "" +"Uhttpd स्थापित केलेला नसल्यामुळे साधा मजकूर संकेतशब्द कूटबद्ध करू शकत नाही." #: applications/luci-app-acl/htdocs/luci-static/resources/view/system/acl.js:79 msgid "Description" -msgstr "" +msgstr "वर्णन" #: applications/luci-app-acl/root/usr/share/rpcd/acl.d/luci-app-acl.json:3 msgid "Grant access to ACL configuration" -msgstr "" +msgstr "एसीएल कॉन्फिगरेशनमध्ये प्रवेश मंजूर करा" #: applications/luci-app-acl/htdocs/luci-static/resources/view/system/acl.js:212 msgid "Login name" -msgstr "" +msgstr "लॉगिन नाव" #: applications/luci-app-acl/htdocs/luci-static/resources/view/system/acl.js:202 #: applications/luci-app-acl/htdocs/luci-static/resources/view/system/acl.js:209 msgid "LuCI Logins" -msgstr "" +msgstr "LuCI लॉगिन" #: applications/luci-app-acl/htdocs/luci-static/resources/view/system/acl.js:209 msgid "New account" -msgstr "" +msgstr "नवीन खाते" #: applications/luci-app-acl/htdocs/luci-static/resources/view/system/acl.js:244 msgid "Password value" -msgstr "" +msgstr "संकेतशब्द मूल्य" #: applications/luci-app-acl/htdocs/luci-static/resources/view/system/acl.js:215 msgid "Password variant" -msgstr "" +msgstr "संकेतशब्द प्रकार" #: applications/luci-app-acl/htdocs/luci-static/resources/view/system/acl.js:297 msgid "Read access" -msgstr "" +msgstr "वाचन प्रवेश" #: applications/luci-app-acl/htdocs/luci-static/resources/view/system/acl.js:289 msgid "Session timeout" -msgstr "" +msgstr "सत्र कालबाह्य वेळ" #: applications/luci-app-acl/htdocs/luci-static/resources/view/system/acl.js:86 msgctxt "Set all permissions in the table below to one of the given values" msgid "Set all:" -msgstr "" +msgstr "सर्व सेट करा:" #: applications/luci-app-acl/htdocs/luci-static/resources/view/system/acl.js:175 msgid "" "The LuCI ACL management is in an experimental stage! It does not yet work " "reliably with all applications" msgstr "" +"LuCI ACL व्यवस्थापन प्रायोगिक अवस्थेत आहे! हे अद्याप सर्व अनुप्रयोगांसह " +"विश्वसनीयरित्या कार्य करत नाही" #: applications/luci-app-acl/htdocs/luci-static/resources/view/system/acl.js:259 msgid "The password may not start with \"$p$\"." -msgstr "" +msgstr "संकेतशब्द \"$p$\" ने प्रारंभ होणार नाही." #: applications/luci-app-acl/htdocs/luci-static/resources/view/system/acl.js:232 msgid "The system account to use the password from" -msgstr "" +msgstr "ज्यातून संकेतशब्द वापरायचा असे सिस्टिम खाते" #: applications/luci-app-acl/htdocs/luci-static/resources/view/system/acl.js:232 msgid "UNIX account" -msgstr "" +msgstr "UNIX खाते" #: applications/luci-app-acl/htdocs/luci-static/resources/view/system/acl.js:282 msgid "Unable to encrypt plaintext password: %s" -msgstr "" +msgstr "साधा मजकूर : %s संकेतशब्द कूटबद्ध करण्यात अक्षम" #: applications/luci-app-acl/htdocs/luci-static/resources/view/system/acl.js:217 msgid "Use UNIX password in /etc/shadow" -msgstr "" +msgstr "UNIX संकेतशब्द /etc/shadow मधून वापरा" #: applications/luci-app-acl/htdocs/luci-static/resources/view/system/acl.js:218 msgid "Use encrypted password hash" -msgstr "" +msgstr "कूटबद्ध संकेतशब्द हॅश वापरा" #: applications/luci-app-acl/htdocs/luci-static/resources/view/system/acl.js:219 msgid "Use plain password" -msgstr "" +msgstr "साधा संकेतशब्द वापरा" #: applications/luci-app-acl/htdocs/luci-static/resources/view/system/acl.js:300 msgid "Write access" -msgstr "" +msgstr "लेखन प्रवेश" #: applications/luci-app-acl/htdocs/luci-static/resources/view/system/acl.js:67 #: applications/luci-app-acl/htdocs/luci-static/resources/view/system/acl.js:89 #: applications/luci-app-acl/htdocs/luci-static/resources/view/system/acl.js:110 msgctxt "No permissions granted" msgid "denied" -msgstr "" +msgstr "नाकारले" #: applications/luci-app-acl/htdocs/luci-static/resources/view/system/acl.js:294 msgid "does not expire" -msgstr "" +msgstr "कालबाह्य होत नाही" #: applications/luci-app-acl/htdocs/luci-static/resources/view/system/acl.js:63 #: applications/luci-app-acl/htdocs/luci-static/resources/view/system/acl.js:95 @@ -122,21 +129,21 @@ msgstr "" #: applications/luci-app-acl/htdocs/luci-static/resources/view/system/acl.js:305 msgctxt "All permissions granted" msgid "full" -msgstr "" +msgstr "संपूर्ण" #: applications/luci-app-acl/htdocs/luci-static/resources/view/system/acl.js:307 msgctxt "Select individual permissions manually" msgid "individual" -msgstr "" +msgstr "वैयक्तिक" #: applications/luci-app-acl/htdocs/luci-static/resources/view/system/acl.js:65 msgctxt "Some permissions granted" msgid "partial (%d/%d)" -msgstr "" +msgstr "आंशिक (%d/%d)" #: applications/luci-app-acl/htdocs/luci-static/resources/view/system/acl.js:92 #: applications/luci-app-acl/htdocs/luci-static/resources/view/system/acl.js:111 #: applications/luci-app-acl/htdocs/luci-static/resources/view/system/acl.js:306 msgctxt "Only read permissions granted" msgid "readonly" -msgstr "" +msgstr "फक्त वाचा" diff --git a/applications/luci-app-adblock/po/pl/adblock.po b/applications/luci-app-adblock/po/pl/adblock.po index f8ff18b46b..994c06fcc9 100644 --- a/applications/luci-app-adblock/po/pl/adblock.po +++ b/applications/luci-app-adblock/po/pl/adblock.po @@ -1,7 +1,7 @@ msgid "" msgstr "" -"PO-Revision-Date: 2020-09-27 12:38+0000\n" -"Last-Translator: Atrate <Atrate@protonmail.com>\n" +"PO-Revision-Date: 2020-10-02 14:41+0000\n" +"Last-Translator: Krzysiek Fulko <kfulko@gmail.com>\n" "Language-Team: Polish <https://hosted.weblate.org/projects/openwrt/" "luciapplicationsadblock/pl/>\n" "Language: pl\n" @@ -266,15 +266,15 @@ msgstr "Licznik powiadomień email" #: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:465 msgid "E-Mail Profile" -msgstr "Profil email" +msgstr "Profil E-mail" #: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:325 msgid "E-Mail Receiver Address" -msgstr "Adres email odbiorcy" +msgstr "Adres E-mail odbiorcy" #: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:457 msgid "E-Mail Sender Address" -msgstr "Adres email nadawcy" +msgstr "Adres E-mail nadawcy" #: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:461 msgid "E-Mail Topic" diff --git a/applications/luci-app-adblock/po/tr/adblock.po b/applications/luci-app-adblock/po/tr/adblock.po index 33ee5ef996..a4c1b4ca39 100644 --- a/applications/luci-app-adblock/po/tr/adblock.po +++ b/applications/luci-app-adblock/po/tr/adblock.po @@ -1,6 +1,6 @@ msgid "" msgstr "" -"PO-Revision-Date: 2020-09-28 13:26+0000\n" +"PO-Revision-Date: 2020-10-02 14:41+0000\n" "Last-Translator: Mehmet Çetin <excom_zkko@hotmail.com>\n" "Language-Team: Turkish <https://hosted.weblate.org/projects/openwrt/" "luciapplicationsadblock/tr/>\n" @@ -29,11 +29,11 @@ msgstr "Reklam engelleme eylemi" #: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:11 msgid "Add Blacklist Domain" -msgstr "Kara Listeye Ekle" +msgstr "Alan Adını Kara Listeye Ekle" #: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:46 msgid "Add Whitelist Domain" -msgstr "İzin verilen listesine Alan Adı ekle" +msgstr "Alan Adını İzin Verilen Listesine Ekle" #: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:12 msgid "Add this (sub-)domain to your local blacklist." @@ -45,7 +45,7 @@ msgstr "Bu (alt)alan adını yerel izin verilen listenize ekleyin." #: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:414 msgid "Additional Jail Blocklist" -msgstr "Ek Engelleme listesi" +msgstr "Ek \"Hapis\" Engelleme listesi" #: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:269 msgid "Additional Settings" @@ -54,8 +54,7 @@ msgstr "Ek Ayarlar" #: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:341 msgid "Additional trigger delay in seconds before adblock processing begins." msgstr "" -"Reklam engelleme işlemi başlamadan önce saniye cinsinden ek tetikleme " -"gecikmesi." +"Reklam engelleme işlemi başlamadan önce saniye cinsinden gecikme süresi." #: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:270 msgid "Advanced DNS Settings" @@ -75,19 +74,19 @@ msgstr "Cevap" #: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:362 msgid "Backup Directory" -msgstr "Yedek Dizini" +msgstr "Yedekleme Dizini" #: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:353 msgid "Base Temp Directory" -msgstr "Geçici dosyalar icin temel Dizini" +msgstr "Geçici dosyalar icin temel Dizin" #: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:353 msgid "" "Base Temp Directory for all adblock related runtime operations, e.g. " "downloading, sorting, merging etc." msgstr "" -"Reklam engelleyici ile ilişkili tüm gerçek zamanlı operasyonlar için Temel " -"Geçici Dizin, ör. indirme, sıralama, birleştirme vb." +"Reklam engelleyici ile ilişkili tüm gerçek zamanlı işlemler için Temel " +"Geçici Dizin, örn. indirme, sıralama, birleştirme vb." #: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/blacklist.js:15 #: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:34 @@ -132,10 +131,10 @@ msgid "" "those listed in the whitelist. Please note: You can use this restrictive " "blocklist e.g. for guest wifi or kidsafe configurations." msgstr "" -"İzin verilen alan adları listesinde listelenenler dışındaki tüm alan " -"adlarına erişimi engellemek için ek bir DNS engelleme listesi oluşturur. " -"Lütfen dikkat: Bu kısıtlayıcı engelleme listesini misafir veya cocuk wifi " -"yapılandırmaları için kullanabilirsiniz." +"İzin verilen alan adları listesindekiler dışındaki tüm alan adlarına erişimi " +"engellemek için ek bir DNS engelleme listesi oluşturur. Not: Bu kısıtlayıcı " +"engelleme listesini misafir veya çocuk wifi yapılandırmaları için " +"kullanabilirsiniz." #: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:22 #: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:57 @@ -151,7 +150,7 @@ msgid "" "><p> </p>" msgstr "" "Bu sekmedeki değişikliklerin yürürlüğe girmesi için reklam engelleme " -"hizmetinin yeniden başlatılması gerekir..<br />2<p>3 4</p>" +"hizmetinin yeniden başlatılması gerekir.<br /><p> </p>" #: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:254 msgid "Client" @@ -168,7 +167,7 @@ msgstr "" "alanlarını engelleyecek şekilde yapılandırılması. Daha fazla bilgi için <a " "href=\"https://github.com/openwrt/packages/blob/master/net/adblock/files/" "README.md\" target=\"_blank\" rel=\"noreferrer noopener\" > çevrimiçi " -"belgelere </a> bakın" +"belgelere </a> bakın." #: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:205 #: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:207 @@ -181,7 +180,7 @@ msgid "" "Create compressed blocklist backups, they will be used in case of download " "errors or during startup." msgstr "" -"Sıkıştırılmış blok listesi yedekleri oluşturun, indirme hataları veya " +"Sıkıştırılmış kara liste yedekleri oluşturun, bunlar indirme hataları ve " "başlatma sırasında kullanılacaktır." #: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:219 diff --git a/applications/luci-app-banip/po/tr/banip.po b/applications/luci-app-banip/po/tr/banip.po index ff3038f191..ebf97c5170 100644 --- a/applications/luci-app-banip/po/tr/banip.po +++ b/applications/luci-app-banip/po/tr/banip.po @@ -1,6 +1,6 @@ msgid "" msgstr "" -"PO-Revision-Date: 2020-09-28 13:26+0000\n" +"PO-Revision-Date: 2020-10-02 14:41+0000\n" "Last-Translator: Mehmet Çetin <excom_zkko@hotmail.com>\n" "Language-Team: Turkish <https://hosted.weblate.org/projects/openwrt/" "luciapplicationsbanip/tr/>\n" @@ -37,7 +37,7 @@ msgstr "" #: applications/luci-app-banip/luasrc/model/cbi/banip/overview_tab.lua:94 #: applications/luci-app-banip/luasrc/view/banip/runtime.htm:138 msgid "Backup Directory" -msgstr "Yedek Dizini" +msgstr "Yedekleme Dizini" #: applications/luci-app-banip/luasrc/model/cbi/banip/overview_tab.lua:115 msgid "" diff --git a/applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js b/applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js index 46f33d0923..28c96da381 100644 --- a/applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js +++ b/applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js @@ -1,4 +1,5 @@ 'use strict'; +'require ui'; 'require view'; 'require dom'; 'require poll'; @@ -8,43 +9,40 @@ 'require form'; 'require tools.widgets as widgets'; -var callGetLogServices, callInitAction, callDDnsGetStatus; - -var NextUpdateStrings = {}; - -NextUpdateStrings = { - 'Verify' : _("Verify"), - 'Run once' : _("Run once"), - 'Disabled' : _("Disabled"), - 'Stopped' : _("Stopped") -} +return view.extend({ -var time_res = {}; -time_res['seconds'] = 1; -time_res['minutes'] = 60; -time_res['hours'] = 3600; + NextUpdateStrings : { + 'Verify' : _("Verify"), + 'Run once' : _("Run once"), + 'Disabled' : _("Disabled"), + 'Stopped' : _("Stopped") + }, -callGetLogServices = rpc.declare({ - object: 'luci.ddns', - method: 'get_services_log', - params: [ 'service_name' ], - expect: { }, -}); + time_res : { + seconds : 1, + minutes : 60, + hours : 3600, + }, -callInitAction = rpc.declare({ - object: 'luci', - method: 'setInitAction', - params: [ 'name', 'action' ], - expect: { result: false } -}); + callGetLogServices: rpc.declare({ + object: 'luci.ddns', + method: 'get_services_log', + params: [ 'service_name' ], + expect: { }, + }), -callDDnsGetStatus = rpc.declare({ - object: 'luci.ddns', - method: 'get_ddns_state', - expect: { } -}); + callInitAction: rpc.declare({ + object: 'luci', + method: 'setInitAction', + params: [ 'name', 'action' ], + expect: { result: false } + }), -return view.extend({ + callDDnsGetStatus: rpc.declare({ + object: 'luci.ddns', + method: 'get_ddns_state', + expect: { } + }), callDDnsGetEnv: rpc.declare({ object: 'luci.ddns', @@ -58,14 +56,137 @@ return view.extend({ expect: { } }), + services: {}, + + /* + * Services list is gen by 3 different source: + * 1. /usr/share/ddns/default contains the service installed by opkg + * 2. /usr/share/ddns/custom contains any service installed by the + * user or the ddns script (for example when service are + * downloaded) + * 3. /usr/share/ddns/list contains all the service that can be + * downloaded by using the ddns script ('service on demand' feature) + * + * (Special services that requires a dedicated package ARE NOT + * supported by the 'service on demand' feature) + */ + callGenServiceList: function(m, ev) { + return Promise.all([ + L.resolveDefault(fs.list('/usr/share/ddns/default'), []), + L.resolveDefault(fs.list('/usr/share/ddns/custom'), []), + L.resolveDefault(fs.read('/usr/share/ddns/list'), null) + ]).then(L.bind(function (data) { + var default_service = data[0], + custom_service = data[1], + list_service = data[2] && data[2].split("\n") || [], + _this = this; + + this.services = {}; + + default_service.forEach(function (service) { + _this.services[service.name.replace('.json','')] = true + }); + + custom_service.forEach(function (service) { + _this.services[service.name.replace('.json','')] = true + }); + + list_service.forEach(function (service) { + if (!_this.services[service]) + _this.services[service] = false; + }); + }, this)) + }, + + /* + * Check if the service is supported. + * If the script doesn't find any json assume a 'service on demand' install. + * If a json is found check if the ip type is supported. + * Invalidate the service_name if is not supported. + */ + handleCheckService : function(s, service_name, ipv6, ev, section_id) { + + var value = service_name.formvalue(section_id); + s.service_supported = null; + service_name.triggerValidation(section_id); + + return this.handleGetServiceData(value) + .then(L.bind(function (service_data) { + if (value != '-' && service_data) { + service_data = JSON.parse(service_data); + if (ipv6.formvalue(section_id) == "1" && !service_data.ipv6) { + s.service_supported = false; + return; + } + } + s.service_supported = true; + }, service_name)) + .then(L.bind(service_name.triggerValidation, service_name, section_id)) + }, + + handleGetServiceData: function(service) { + return Promise.all([ + L.resolveDefault(fs.read('/usr/share/ddns/custom/'+service+'.json'), null), + L.resolveDefault(fs.read('/usr/share/ddns/default/'+service+'.json'), null) + ]).then(function(data) { + return data[0] || data[1] || null; + }) + }, + + handleInstallService: function(m, service_name, section_id, section, _this, ev) { + var service = service_name.formvalue(section_id) + return fs.exec('/usr/bin/ddns', ['service', 'install', service]) + .then(L.bind(_this.callGenServiceList, _this)) + .then(L.bind(m.render, m)) + .then(L.bind(this.renderMoreOptionsModal, this, section)) + .catch(function(e) { ui.addNotification(null, E('p', e.message)) }); + }, + + handleRefreshServicesList: function(m, ev) { + return fs.exec('/usr/bin/ddns', ['service', 'update']) + .then(L.bind(this.load, this)) + .then(L.bind(this.render, this)) + .catch(function(e) { ui.addNotification(null, E('p', e.message)) }); + }, + + handleReloadDDnsRule: function(m, section_id, ev) { + return fs.exec('/usr/lib/ddns/dynamic_dns_lucihelper.sh', + [ '-S', section_id, '--', 'start' ]) + .then(L.bind(m.load, m)) + .then(L.bind(m.render, m)) + .catch(function(e) { ui.addNotification(null, E('p', e.message)) }); + }, + + HandleStopDDnsRule: function(m, section_id, ev) { + return fs.exec('/usr/lib/ddns/dynamic_dns_lucihelper.sh', + [ '-S', section_id, '--', 'start' ]) + .then(L.bind(m.render, m)) + .catch(function(e) { ui.addNotification(null, E('p', e.message)) }); + }, + + handleToggleDDns: function(m, ev) { + return this.callInitAction('ddns', 'enabled') + .then(L.bind(function (action) { return this.callInitAction('ddns', action ? 'disable' : 'enable')}, this)) + .then(L.bind(function (action) { return this.callInitAction('ddns', action ? 'stop' : 'start')}, this)) + .then(L.bind(m.render, m)) + .catch(function(e) { ui.addNotification(null, E('p', e.message)) }); + }, + + handleRestartDDns: function(m, ev) { + return this.callInitAction('ddns', 'restart') + .then(L.bind(m.render, m)); + }, + poll_status: function(map, data) { var status = data[1] || [], service = data[0] || [], rows = map.querySelectorAll('.cbi-section-table-row[data-sid]'), section_id, cfg_detail_ip, cfg_update, cfg_status, host, ip, last_update, next_update, service_status, reload, cfg_enabled, stop, ddns_enabled = map.querySelector('[data-name="_enabled"]').querySelector('.cbi-value-field'), - ddns_toggle = map.querySelector('[data-name="_toggle"]').querySelector('button'); + ddns_toggle = map.querySelector('[data-name="_toggle"]').querySelector('button'), + services_list = map.querySelector('[data-name="_services_list"]').querySelector('.cbi-value-field'); ddns_toggle.innerHTML = status['_enabled'] ? _('Stop DDNS') : _('Start DDNS') + services_list.innerHTML = status['_services_list']; dom.content(ddns_enabled, function() { return E([], [ @@ -101,7 +222,7 @@ return view.extend({ if (service[section_id].last_update) last_update = service[section_id].last_update; if (service[section_id].next_update) - next_update = NextUpdateStrings[service[section_id].next_update] || service[section_id].next_update; + next_update = this.NextUpdateStrings[service[section_id].next_update] || service[section_id].next_update; if (service[section_id].pid) service_status = '<b>' + _('Running') + '</b> : ' + service[section_id].pid; } @@ -117,10 +238,9 @@ return view.extend({ load: function() { return Promise.all([ this.callDDnsGetServicesStatus(), - callDDnsGetStatus(), + this.callDDnsGetStatus(), this.callDDnsGetEnv(), - fs.lines('/etc/ddns/services'), - fs.lines('/etc/ddns/services_ipv6'), + this.callGenServiceList(), uci.load('ddns') ]); }, @@ -131,20 +251,7 @@ return view.extend({ var env = data[2] || []; var logdir = uci.get('ddns', 'global', 'ddns_logdir') || "/var/log/ddns"; - var services4 = []; - var services6 = []; - - data[3].forEach(function(item) { - if (!item.startsWith("#")) { - services4.push(item.split('\t')[0].slice(1,-1)); - } - }); - - data[4].forEach(function(item) { - if (!item.startsWith("#")) { - services6.push(item.split('\t')[0].slice(1,-1)); - } - }); + var _this = this; var m, s, o; @@ -170,33 +277,29 @@ return view.extend({ return res ? _('DDNS Autostart enabled') : _('DDNS Autostart disabled') }; - o = s.taboption('info', form.DummyValue, '_toggle', ' '); - o.cfgvalue = function() { - var action = status['_enabled'] ? 'stop' : 'start'; - return E([], [ - E('button', { - 'class': 'cbi-button cbi-button-apply', - 'click': L.ui.createHandlerFn(this, function() { - return callDDnsGetStatus().then(L.bind(function(data) { - return callInitAction('ddns', action == 'stop' ? 'disable' : 'enable').then(function() { - return callInitAction('ddns', action); - }); - }, this)).then(L.bind(m.render, m)); - }) - }, _(action.toUpperCase() + ' DDns'))]); - }; + o = s.taboption('info', form.Button, '_toggle'); + o.title = ' '; + o.inputtitle = _((status['_enabled'] ? 'stop' : 'start').toUpperCase() + ' DDns'); + o.inputstyle = 'apply'; + o.onclick = L.bind(this.handleToggleDDns, this, m); - o = s.taboption('info', form.DummyValue, '_restart', ' '); + o = s.taboption('info', form.Button, '_restart'); + o.title = ' '; + o.inputtitle = _('Restart DDns'); + o.inputstyle = 'apply'; + o.onclick = L.bind(this.handleRestartDDns, this, m); + + o = s.taboption('info', form.DummyValue, '_services_list', _('Services list last update')); o.cfgvalue = function() { - return E([], [ - E('button', { - 'class': 'cbi-button cbi-button-apply', - 'click': L.ui.createHandlerFn(this, function() { - return callInitAction('ddns', 'restart').then(L.bind(m.render, m)); - }) - }, _('Restart DDns'))]); + return status[this.option]; }; + o = s.taboption('info', form.Button, '_refresh_services'); + o.title = ' '; + o.inputtitle = _('Update DDns Services List'); + o.inputstyle = 'apply'; + o.onclick = L.bind(this.handleRefreshServicesList, this, m); + // DDns hints if (!env['has_ipv6']) { @@ -344,6 +447,14 @@ return view.extend({ } + o = s.taboption('global', form.Value, 'cacert', _('Ca Certs path')); + o.description = _('Ca Certs path that will be used to download services data. Set IGNORE to skip certificate validation.'); + o.placeholder = 'IGNORE'; + + o = s.taboption('global', form.Value, 'services_url', _('Services URL Download')); + o.description = _('Url used to download services file. By default is the master openwrt ddns package repo.'); + o.placeholder = 'https://raw.githubusercontent.com/openwrt/packages/master/net/ddns-scripts/files'; + // DDns services s = m.section(form.GridSection, 'service', _('Services')); s.anonymous = true; @@ -354,9 +465,25 @@ return view.extend({ s.addremove = true; s.sortable = true; + s.handleCreateDDnsRule = function(m, name, service_name, ipv6, ev) { + var section_id = name.isValid('_new_') ? name.formvalue('_new_') : null, + service_value = service_name.isValid('_new_') ? service_name.formvalue('_new_') : null, + ipv6_value = ipv6.isValid('_new_') ? ipv6.formvalue('_new_') : null; + + if (section_id == null || section_id == '' || service_value == null || section_id == '' || ipv6_value == null || ipv6_value == '') + return; + + return m.save(function() { + uci.add('ddns', 'service', section_id); + uci.set('ddns', section_id, 'service_name', service_value); + uci.set('ddns', section_id, 'use_ipv6', ipv6_value); + }).then(L.bind(m.children[1].renderMoreOptionsModal, m.children[1], section_id)); + }; + s.handleAdd = function(ev) { var m2 = new form.Map('ddns'), - s2 = m2.section(form.NamedSection, '_new_'); + s2 = m2.section(form.NamedSection, '_new_'), + name, ipv6, service_name; s2.render = function() { return Promise.all([ @@ -376,26 +503,41 @@ return view.extend({ return true; }; + ipv6 = s2.option( form.ListValue, 'use_ipv6', + _("IP address version"), + _("Defines which IP address 'IPv4/IPv6' is send to the DDNS provider")); + ipv6.default = '0'; + ipv6.value("0", _("IPv4-Address")) + if (env["has_ipv6"]) { + ipv6.value("1", _("IPv6-Address")) + } + + service_name = s2.option(form.ListValue, 'service_name', + String.format('%s', _("DDNS Service provider"))); + service_name.value('-',"-- " + _("custom") + " --"); + for (var elem in _this.services) + service_name.value(elem); + service_name.validate = function(section_id, value) { + if (value == '') return _("Select a service"); + if (s2.service_supported == null) return _("Checking the service support..."); + if (!s2.service_supported) return _("Service doesn't support this ip type"); + return true; + }; + + ipv6.onchange = L.bind(_this.handleCheckService, _this, s2, service_name, ipv6); + service_name.onchange = L.bind(_this.handleCheckService, _this, s2, service_name, ipv6); + m2.render().then(L.bind(function(nodes) { - L.ui.showModal(_('Add new services...'), [ + ui.showModal(_('Add new services...'), [ nodes, E('div', { 'class': 'right' }, [ E('button', { 'class': 'btn', - 'click': L.ui.hideModal + 'click': ui.hideModal }, _('Cancel')), ' ', E('button', { 'class': 'cbi-button cbi-button-positive important', - 'click': L.ui.createHandlerFn(this, function(ev) { - var nameval = name.isValid('_new_') ? name.formvalue('_new_') : null; - - if (nameval == null || nameval == '') - return; - - return m.save(function() { - uci.add('ddns', 'service', nameval); - }).then(L.bind(m.children[1].renderMoreOptionsModal, m.children[1], nameval)); - }) + 'click': ui.createHandlerFn(this, 'handleCreateDDnsRule', m, name, service_name, ipv6) }, _('Create service')) ]) ], 'cbi-modal'); @@ -409,18 +551,12 @@ return view.extend({ cfg_enabled = uci.get('ddns', section_id, 'enabled'), reload_opt = { 'class': 'cbi-button cbi-button-neutral reload', - 'click': L.ui.createHandlerFn(this, function() { - return fs.exec('/usr/lib/ddns/dynamic_dns_lucihelper.sh', - [ '-S', section_id, '--', 'start' ]).then(L.bind(m.render, m)); - }), + 'click': ui.createHandlerFn(_this, 'handleReloadDDnsRule', m, section_id), 'title': _('Reload this service'), }, stop_opt = { 'class': 'cbi-button cbi-button-neutral stop', - 'click': L.ui.createHandlerFn(this, function() { - return fs.exec('/usr/lib/ddns/dynamic_dns_lucihelper.sh', - [ '-S', section_id, '--', 'start' ]).then(L.bind(m.render, m)); - }), + 'click': ui.createHandlerFn(_this, 'HandleStopDDnsRule', m, section_id), 'title': _('Stop this service'), }; @@ -442,11 +578,544 @@ return view.extend({ return tdEl; }; + s.modaltitle = function(section_id) { + return _('DDns Service') + ' » ' + section_id; + }; + + s.addModalOptions = function(s, section_id) { + + var service = uci.get('ddns', section_id, 'service_name') || '-', + ipv6 = uci.get('ddns', section_id, 'use_ipv6'), service_name, use_ipv6; + + return _this.handleGetServiceData(service).then(L.bind(function (service_data) { + s.service_available = true; + s.service_supported = true; + + if (service != '-') { + if (!service_data) + s.service_available = false; + else { + service_data = JSON.parse(service_data); + if (ipv6 == "1" && !service_data.ipv6) + s.service_supported = false; + } + } + + s.tab('basic', _('Basic Settings')); + s.tab('advanced', _('Advanced Settings')); + s.tab('timer', _('Timer Settings')); + s.tab('logview', _('Log File Viewer')); + + o = s.taboption('basic', form.Flag, 'enabled', + _('Enabled'), + _("If this service section is disabled it could not be started.") + + "<br />" + + _("Neither from LuCI interface nor from console.")); + o.modalonly = true; + o.rmempty = false; + o.default = '1'; + + o = s.taboption('basic', form.Value, 'lookup_host', + _("Lookup Hostname"), + _("Hostname/FQDN to validate, if IP update happen or necessary")); + o.rmempty = false; + o.placeholder = "myhost.example.com"; + o.datatype = 'and(minlength(3),hostname("strict"))'; + o.modalonly = true; + + use_ipv6 = s.taboption('basic', form.ListValue, 'use_ipv6', + _("IP address version"), + _("Defines which IP address 'IPv4/IPv6' is send to the DDNS provider")); + use_ipv6.default = '0'; + use_ipv6.modalonly = true; + use_ipv6.rmempty = false; + use_ipv6.value("0", _("IPv4-Address")) + if (env["has_ipv6"]) { + use_ipv6.value("1", _("IPv6-Address")) + } + + service_name = s.taboption('basic', form.ListValue, 'service_name', + String.format('%s', _("DDNS Service provider"))); + service_name.modalonly = true; + service_name.value('-',"-- " + _("custom") + " --"); + for (var elem in _this.services) + service_name.value(elem); + service_name.cfgvalue = function(section_id) { + return uci.get('ddns', section_id, 'service_name') || '-'; + }; + service_name.write = function(section_id, service) { + if (service != '-') { + uci.set('ddns', section_id, 'update_url', null); + uci.set('ddns', section_id, 'update_script', null); + return uci.set('ddns', section_id, 'service_name', service); + } + return uci.set('ddns', section_id, 'service_name', null); + }; + service_name.validate = function(section_id, value) { + if (value == '') return _("Select a service"); + if (s.service_available == null) return _("Checking the service support..."); + if (!s.service_available) return _('Service not installed'); + if (!s.service_supported) return _("Service doesn't support this ip type"); + return true; + }; + + service_name.onchange = L.bind(_this.handleCheckService, _this, s, service_name, use_ipv6); + use_ipv6.onchange = L.bind(_this.handleCheckService, _this, s, service_name, use_ipv6); + + if (!s.service_available) { + o = s.taboption('basic', form.Button, '_download_service'); + o.modalonly = true; + o.title = _('Service not installed'); + o.inputtitle = _('Install Service'); + o.inputstyle = 'apply'; + o.onclick = L.bind(_this.handleInstallService, + this, m, service_name, section_id, s.section, _this) + } + + if (!s.service_supported) { + o = s.taboption('basic', form.DummyValue, '_not_supported', ' '); + o.cfgvalue = function () { + return _("Service doesn't support this ip type") + }; + } + + var service_switch = s.taboption('basic', form.Button, '_switch_proto'); + service_switch.modalonly = true; + service_switch.title = _('Really switch service?'); + service_switch.inputtitle = _('Switch service'); + service_switch.inputstyle = 'apply'; + service_switch.onclick = L.bind(function(ev) { + if (!s.service_supported) return; + + return s.map.save() + .then(L.bind(m.load, m)) + .then(L.bind(m.render, m)) + .then(L.bind(this.renderMoreOptionsModal, this, s.section)); + }, this); + + if (s.service_available && s.service_supported) { + + o = s.taboption('basic', form.Value, 'update_url', + _("Custom update-URL"), + _("Update URL to be used for updating your DDNS Provider.") + + "<br />" + + _("Follow instructions you will find on their WEB page.")); + o.modalonly = true; + o.rmempty = true; + o.optional = true; + o.depends("service_name","-"); + o.validate = function(section_id, value) { + var other = this.section.children.filter(function(o) { return o.option == 'update_script' })[0].formvalue(section_id); + + if ((value == "" && other == "") || (value != "" && other != "")) { + return _("Insert a Update Script OR a Update URL"); + } + + return true; + }; + + o = s.taboption('basic', form.Value, 'update_script', + _("Custom update-script"), + _("Custom update script to be used for updating your DDNS Provider.")); + o.modalonly = true; + o.rmempty = true; + o.optional = true; + o.depends("service_name","-"); + o.validate = function(section_id, value) { + var other = this.section.children.filter(function(o) { return o.option == 'update_url' })[0].formvalue(section_id); + + if ((value == "" && other == "") || (value != "" && other != "")) { + return _("Insert a Update Script OR a Update URL"); + } + + return true; + }; + + o = s.taboption('basic', form.Value, 'domain', + _("Domain"), + _("Replaces [USERNAME] in Update-URL (URL-encoded)")); + o.modalonly = true; + o.rmempty = false; + + o = s.taboption('basic', form.Value, 'username', + _("Username"), + _("Replaces [USERNAME] in Update-URL (URL-encoded)")); + o.modalonly = true; + o.rmempty = false; + + o = s.taboption('basic', form.Value, 'password', + _("Password"), + _("Replaces [PASSWORD] in Update-URL (URL-encoded)")); + o.password = true; + o.modalonly = true; + o.rmempty = false; + + o = s.taboption('basic', form.Value, 'param_enc', + _("Optional Encoded Parameter"), + _("Optional: Replaces [PARAMENC] in Update-URL (URL-encoded)")); + o.optional = true; + o.modalonly = true; + + o = s.taboption('basic', form.Value, 'param_opt', + _("Optional Parameter"), + _("Optional: Replaces [PARAMOPT] in Update-URL (NOT URL-encoded)")); + o.optional = true; + o.modalonly = true; + + if (env['has_ssl']) { + o = s.taboption('basic', form.Flag, 'use_https', + _("Use HTTP Secure"), + _("Enable secure communication with DDNS provider")); + o.optional = true; + o.modalonly = true; + + o = s.taboption('basic', form.Value, 'cacert', + _("Path to CA-Certificate"), + _("directory or path/file") + + "<br />" + + _("or") + + '<b>' + " IGNORE " + '</b>' + + _("to run HTTPS without verification of server certificates (insecure)")); + o.modalonly = true; + o.depends("use_https", "1"); + o.placeholder = "/etc/ssl/certs"; + o.rmempty = false; + }; + + + o = s.taboption('advanced', form.ListValue, 'ip_source', + _("IP address source"), + _("Defines the source to read systems IP-Address from, that will be send to the DDNS provider")); + o.modalonly = true; + o.default = "network"; + o.value("network", _("Network")); + o.value("web", _("URL")); + o.value("interface", _("Interface")); + o.value("script", _("Script")); + o.write = function(section_id, formvalue) { + switch(formvalue) { + case 'network': + uci.set('ddns', section_id, "ip_url",null); + uci.set('ddns', section_id, "ip_interface",null); + uci.set('ddns', section_id, "ip_script",null); + break; + case 'web': + uci.set('ddns', section_id, "ip_network",null); + uci.set('ddns', section_id, "ip_interface",null); + uci.set('ddns', section_id, "ip_script",null); + break; + case 'interface': + uci.set('ddns', section_id, "ip_network",null); + uci.set('ddns', section_id, "ip_url",null); + uci.set('ddns', section_id, "ip_script",null); + break; + case 'script': + uci.set('ddns', section_id, "ip_network",null); + uci.set('ddns', section_id, "ip_url",null); + uci.set('ddns', section_id, "ip_interface",null); + break; + default: + break; + }; + + return uci.set('ddns', section_id, 'ip_source', formvalue ) + }; + + o = s.taboption('advanced', widgets.NetworkSelect, 'ip_network', + _("Network"), + _("Defines the network to read systems IP-Address from")); + o.depends('ip_source','network'); + o.modalonly = true; + o.default = 'wan'; + o.multiple = false; + + o = s.taboption('advanced', form.Value, 'ip_url', + _("URL to detect"), + _("Defines the Web page to read systems IP-Address from.") + + '<br />' + + String.format('%s %s', _('Example for IPv4'), ': http://checkip.dyndns.com') + + '<br />' + + String.format('%s %s', _('Example for IPv6'), ': http://checkipv6.dyndns.com')); + o.depends("ip_source", "web") + o.modalonly = true; + + o = s.taboption('advanced', widgets.DeviceSelect, 'ip_interface', + _("Interface"), + _("Defines the interface to read systems IP-Address from")); + o.modalonly = true; + o.depends("ip_source", "interface") + o.multiple = false; + o.default = 'wan'; + + o = s.taboption('advanced', form.Value, 'ip_script', + _("Script"), + _("User defined script to read systems IP-Address")); + o.modalonly = true; + o.depends("ip_source", "script") + o.placeholder = "/path/to/script.sh" + + o = s.taboption('advanced', widgets.DeviceSelect, 'interface', + _("Event Network"), + _("Network on which the ddns-updater scripts will be started")); + o.modalonly = true; + o.multiple = false; + o.default = 'wan'; + o.depends("ip_source", "web"); + o.depends("ip_source", "script"); + + o = s.taboption('advanced', form.DummyValue, '_interface', + _("Event Network"), + _("Network on which the ddns-updater scripts will be started")); + o.depends("ip_source", "interface"); + o.depends("ip_source", "network"); + o.forcewrite = true; + o.modalonly = true; + o.cfgvalue = function(section_id) { + return uci.get('ddns', section_id, 'interface') || _('This will be autoset to the selected interface'); + }; + o.write = function(section_id) { + var opt = this.section.children.filter(function(o) { return o.option == 'ip_source' })[0].formvalue(section_id); + var val = this.section.children.filter(function(o) { return o.option == 'ip_'+opt })[0].formvalue(section_id); + return uci.set('ddns', section_id, 'interface', val); + }; + + if (env['has_bindnet']) { + o = s.taboption('advanced', widgets.ZoneSelect, 'bind_network', + _("Bind Network"), + _('OPTIONAL: Network to use for communication') + + '<br />' + + _("Network on which the ddns-updater scripts will be started")); + o.depends("ip_source", "web"); + o.optional = true; + o.rmempty = true; + o.modalonly = true; + } + + if (env['has_forceip']) { + o = s.taboption('advanced', form.Flag, 'force_ipversion', + _("Force IP Version"), + _('OPTIONAL: Force the usage of pure IPv4/IPv6 only communication.')); + o.optional = true; + o.rmempty = true; + o.modalonly = true; + } + + if (env['has_dnsserver']) { + o = s.taboption("advanced", form.Value, "dns_server", + _("DNS-Server"), + _("OPTIONAL: Use non-default DNS-Server to detect 'Registered IP'.") + + "<br />" + + _("Format: IP or FQDN")); + o.placeholder = "mydns.lan" + o.optional = true; + o.rmempty = true; + o.modalonly = true; + } + + if (env['has_bindhost']) { + o = s.taboption("advanced", form.Flag, "force_dnstcp", + _("Force TCP on DNS"), + _("OPTIONAL: Force the use of TCP instead of default UDP on DNS requests.")); + o.optional = true; + o.rmempty = true; + o.modalonly = true; + } + + if (env['has_proxy']) { + o = s.taboption("advanced", form.Value, "proxy", + _("PROXY-Server"), + _("OPTIONAL: Proxy-Server for detection and updates.") + + "<br />" + + String.format('%s: <b>%s</b>', _("Format"), "[user:password@]proxyhost:port") + + "<br />" + + String.format('%s: <b>%s</b>', _("IPv6 address must be given in square brackets"), "[2001:db8::1]:8080")); + o.optional = true; + o.rmempty = true; + o.modalonly = true; + } + + o = s.taboption("advanced", form.ListValue, "use_syslog", + _("Log to syslog"), + _("Writes log messages to syslog. Critical Errors will always be written to syslog.")); + o.modalonly = true; + o.default = "2" + o.optional = true; + o.value("0", _("No logging")) + o.value("1", _("Info")) + o.value("2", _("Notice")) + o.value("3", _("Warning")) + o.value("4", _("Error")) + + o = s.taboption("advanced", form.Flag, "use_logfile", + _("Log to file")); + o.default = '1'; + o.optional = true; + o.modalonly = true; + o.cfgvalue = function(section_id) { + this.description = _("Writes detailed messages to log file. File will be truncated automatically.") + "<br />" + + _("File") + ': "' + logdir + '/' + section_id + '.log"'; + return uci.get('ddns', section_id, 'use_logfile'); + }; + + + o = s.taboption("timer", form.Value, "check_interval", + _("Check Interval")); + o.placeholder = "30"; + o.modalonly = true; + o.datatype = 'uinteger'; + o.validate = function(section_id, formvalue) { + var unit = this.section.children.filter(function(o) { return o.option == 'check_unit' })[0].formvalue(section_id), + time_to_sec = _this.time_res[unit || 'minutes'] * formvalue; + + if (formvalue && time_to_sec < 300) + return _('Values below 5 minutes == 300 seconds are not supported'); + + return true; + }; + + o = s.taboption("timer", form.ListValue, "check_unit", + _('Check Unit'), + _("Interval unit to check for changed IP")); + o.modalonly = true; + o.default = "minutes" + o.value("seconds", _("seconds")); + o.value("minutes", _("minutes")); + o.value("hours", _("hours")); + + o = s.taboption("timer", form.Value, "force_interval", + _("Force Interval"), + _("Interval to force updates send to DDNS Provider") + + "<br />" + + _("Setting this parameter to 0 will force the script to only run once")); + o.placeholder = "72"; + o.optional = true; + o.modalonly = true; + o.datatype = 'uinteger'; + o.validate = function(section_id, formvalue) { + + if (!formvalue) + return true; + + var check_unit = this.section.children.filter(function(o) { return o.option == 'check_unit' })[0].formvalue(section_id), + check_val = this.section.children.filter(function(o) { return o.option == 'check_interval' })[0].formvalue(section_id), + force_unit = this.section.children.filter(function(o) { return o.option == 'force_unit' })[0].formvalue(section_id), + check_to_sec = _this.time_res[check_unit || 'minutes'] * ( check_val || '30'), + force_to_sec = _this.time_res[force_unit || 'minutes'] * formvalue; + + if (force_to_sec != 0 && force_to_sec < check_to_sec) + return _("Values lower 'Check Interval' except '0' are not supported"); + + return true; + }; + + o = s.taboption("timer", form.ListValue, "force_unit", + _('Force Unit'), + _("Interval unit to force updates send to DDNS Provider")); + o.modalonly = true; + o.optional = true; + o.default = "minutes" + o.value("minutes", _("minutes")); + o.value("hours", _("hours")); + o.value("days", _("days")); + + o = s.taboption("timer", form.Value, "retry_count", + _("Error Retry Counter"), + _("On Error the script will stop execution after given number of retrys") + + "<br />" + + _("The default setting of '0' will retry infinite.")); + o.placeholder = "0"; + o.optional = true; + o.modalonly = true; + o.datatype = 'uinteger'; + + o = s.taboption("timer", form.Value, "retry_interval", + _("Error Retry Interval"), + _("On Error the script will stop execution after given number of retrys") + + "<br />" + + _("The default setting of '0' will retry infinite.")); + o.placeholder = "60"; + o.optional = true; + o.modalonly = true; + o.datatype = 'uinteger'; + + o = s.taboption("timer", form.ListValue, "retry_unit", + _('Retry Unit'), + _("On Error the script will retry the failed action after given time")); + o.modalonly = true; + o.optional = true; + o.default = "seconds" + o.value("seconds", _("seconds")); + o.value("minutes", _("minutes")); + + o = s.taboption('logview', form.Button, '_read_log'); + o.title = ''; + o.depends('use_logfile','1'); + o.modalonly = true; + o.inputtitle = _('Read / Reread log file'); + o.inputstyle = 'apply'; + o.onclick = L.bind(function(ev, section_id) { + return _this.callGetLogServices(section_id).then(L.bind(log_box.update_log, log_box)); + }, this); + + var log_box = s.taboption("logview", form.DummyValue, "_logview"); + log_box.depends('use_logfile','1'); + log_box.modalonly = true; + + log_box.update_log = L.bind(function(view, log_data) { + return document.getElementById('log_area').textContent = log_data.result; + }, o, this); + + log_box.render = L.bind(function() { + return E([ + E('p', {}, _('This is the current content of the log file in ') + logdir + ' for this service.'), + E('p', {}, E('textarea', { 'style': 'width:100%', 'rows': 20, 'readonly' : 'readonly', 'id' : 'log_area' }, _('Please press [Read] button') )) + ]); + }, o, this); + } + + for (var i = 0; i < s.children.length; i++) { + o = s.children[i]; + switch (o.option) { + case '_switch_proto': + o.depends({ service_name : service, use_ipv6: ipv6, "!reverse": true }) + continue; + case 'enabled': + case 'service_name': + case 'use_ipv6': + case 'update_script': + case 'update_url': + case 'lookup_host': + continue; + + default: + if (o.deps.length) + for (var j = 0; j < o.deps.length; j++) { + o.deps[j].service_name = service; + o.deps[j].use_ipv6 = ipv6; + } + else + o.depends({service_name: service, use_ipv6: ipv6 }); + } + } + }, this) + )}; + + o = s.option(form.DummyValue, '_cfg_status', _('Status')); + o.modalonly = false; + o.textvalue = function(section_id) { + var text = '<b>' + _('Not Running') + '</b>'; + + if (resolved[section_id] && resolved[section_id].pid) + text = '<b>' + _('Running') + '</b> : ' + resolved[section_id].pid; + + return text; + }; + o = s.option(form.DummyValue, '_cfg_name', _('Name')); o.modalonly = false; o.textvalue = function(section_id) { return '<b>' + section_id + '</b>'; - } + }; o = s.option(form.DummyValue, '_cfg_detail_ip', _('Lookup Hostname') + "<br />" + _('Registered IP')); o.rawhtml = true; @@ -474,496 +1143,17 @@ return view.extend({ if (resolved[section_id].last_update) last_update = resolved[section_id].last_update; if (resolved[section_id].next_update) - next_update = NextUpdateStrings[resolved[section_id].next_update] || resolved[section_id].next_update; + next_update = _this.NextUpdateStrings[resolved[section_id].next_update] || resolved[section_id].next_update; } return last_update + '<br />' + next_update; }; - s.modaltitle = function(section_id) { - return _('DDns Service') + ' » ' + section_id; - }; - - o = s.option(form.DummyValue, '_cfg_status', _('Status')); - o.modalonly = false; - o.textvalue = function(section_id) { - var text = '<b>' + _('Not Running') + '</b>'; - - if (resolved[section_id] && resolved[section_id].pid) - text = '<b>' + _('Running') + '</b> : ' + resolved[section_id].pid; - - return text; - } - - - s.tab('basic', _('Basic Settings')); - s.tab('advanced', _('Advanced Settings')); - s.tab('timer', _('Timer Settings')); - s.tab('logview', _('Log File Viewer')); - - o = s.taboption('basic', form.Flag, 'enabled', - _('Enabled'), - _("If this service section is disabled it could not be started.") - + "<br />" + - _("Neither from LuCI interface nor from console.")); - o.modalonly = true; - o.rmempty = false; - o.default = '1'; - - o = s.taboption('basic', form.Value, 'lookup_host', - _("Lookup Hostname"), - _("Hostname/FQDN to validate, if IP update happen or necessary")); - o.rmempty = false; - o.placeholder = "myhost.example.com"; - o.datatype = 'and(minlength(3),hostname("strict"))'; - o.modalonly = true; - - o = s.taboption('basic', form.ListValue, 'use_ipv6', - _("IP address version"), - _("Defines which IP address 'IPv4/IPv6' is send to the DDNS provider")); - o.default = '0'; - o.modalonly = true; - o.rmempty = false; - o.value("0", _("IPv4-Address")) - if (env["has_ipv6"]) { - o.value("1", _("IPv6-Address")) - } - - o = s.taboption('basic', form.ListValue, 'ipv4_service_name', - String.format('%s %s', _("DDNS Service provider"), "[IPv4]")); - o.depends("use_ipv6", "0") - o.modalonly = true; - o.value('-',"-- " + _("custom") + " --"); - for (var i = 0; i < services4.length; i++) - o.value(services4[i]); - o.cfgvalue = function(section_id) { - return uci.get('ddns', section_id, 'service_name') || '-'; - }; - o.write = function(section_id, formvalue) { - if (formvalue != '-') { - uci.set('ddns', section_id, 'update_url', null); - uci.set('ddns', section_id, 'update_script', null); - return uci.set('ddns', section_id, 'service_name', formvalue); - } - return uci.set('ddns', section_id, 'service_name', null); - }; - - o = s.taboption('basic', form.ListValue, 'ipv6_service_name', - String.format('%s %s', _("DDNS Service provider"), "[IPv6]")); - o.depends("use_ipv6", "1") - o.modalonly = true; - o.value('-',"-- " + _("custom") + " --"); - for (var i = 0; i < services6.length; i++) { - o.value(services6[i]); - } - o.cfgvalue = function(section_id) { - var service = uci.get('ddns', section_id, 'service_name'), - update_script = uci.get('ddns', section_id, 'update_script'), - update_url = uci.get('ddns', section_id, 'update_url'); - - if (!service && (update_script || update_url)) - return "-"; - - return service; - }; - o.write = function(section_id, formvalue) { - if (formvalue != '-') { - uci.set('ddns', section_id, 'update_url', null); - uci.set('ddns', section_id, 'update_script', null); - return uci.set('ddns', section_id, 'service_name', formvalue); - } - return uci.set('ddns', section_id, 'service_name', null); - }; - - o = s.taboption('basic', form.Value, 'update_url', - _("Custom update-URL"), - _("Update URL to be used for updating your DDNS Provider.") - + "<br />" + - _("Follow instructions you will find on their WEB page.")); - o.modalonly = true; - o.rmempty = true; - o.optional = true; - o.depends("ipv6_service_name","-"); - o.depends("ipv4_service_name","-"); - o.validate = function(section_id, value) { - var other = this.section.children.filter(function(o) { return o.option == 'update_script' })[0].formvalue(section_id); - - if ((value == "" && other == "") || (value != "" && other != "")) { - return _("Insert a Update Script OR a Update URL"); - } - - return true; - }; - - o = s.taboption('basic', form.Value, 'update_script', - _("Custom update-script"), - _("Custom update script to be used for updating your DDNS Provider.")); - o.modalonly = true; - o.rmempty = true; - o.optional = true; - o.depends("ipv6_service_name","-"); - o.depends("ipv4_service_name","-"); - o.validate = function(section_id, value) { - var other = this.section.children.filter(function(o) { return o.option == 'update_url' })[0].formvalue(section_id); - - if ((value == "" && other == "") || (value != "" && other != "")) { - return _("Insert a Update Script OR a Update URL"); - } - - return true; - }; - - o = s.taboption('basic', form.Value, 'domain', - _("Domain"), - _("Replaces [USERNAME] in Update-URL (URL-encoded)")); - o.modalonly = true; - o.rmempty = false; - - o = s.taboption('basic', form.Value, 'username', - _("Username"), - _("Replaces [USERNAME] in Update-URL (URL-encoded)")); - o.modalonly = true; - o.rmempty = false; - - o = s.taboption('basic', form.Value, 'password', - _("Password"), - _("Replaces [PASSWORD] in Update-URL (URL-encoded)")); - o.password = true; - o.modalonly = true; - o.rmempty = false; - - o = s.taboption('basic', form.Value, 'param_enc', - _("Optional Encoded Parameter"), - _("Optional: Replaces [PARAMENC] in Update-URL (URL-encoded)")); - o.optional = true; - o.modalonly = true; - - o = s.taboption('basic', form.Value, 'param_opt', - _("Optional Parameter"), - _("Optional: Replaces [PARAMOPT] in Update-URL (NOT URL-encoded)")); - o.optional = true; - o.modalonly = true; - - if (env['has_ssl']) { - o = s.taboption('basic', form.Flag, 'use_https', - _("Use HTTP Secure"), - _("Enable secure communication with DDNS provider")); - o.optional = true; - o.modalonly = true; - - o = s.taboption('basic', form.Value, 'cacert', - _("Path to CA-Certificate"), - _("directory or path/file") - + "<br />" + - _("or") - + '<b>' + " IGNORE " + '</b>' + - _("to run HTTPS without verification of server certificates (insecure)")); - o.modalonly = true; - o.depends("use_https", "1"); - o.placeholder = "/etc/ssl/certs"; - o.rmempty = false; - }; - - - o = s.taboption('advanced', form.ListValue, 'ip_source', - _("IP address source"), - _("Defines the source to read systems IP-Address from, that will be send to the DDNS provider")); - o.modalonly = true; - o.default = "network"; - o.value("network", _("Network")); - o.value("web", _("URL")); - o.value("interface", _("Interface")); - o.value("script", _("Script")); - o.write = function(section_id, formvalue) { - switch(formvalue) { - case 'network': - uci.set('ddns', section_id, "ip_url",null); - uci.set('ddns', section_id, "ip_interface",null); - uci.set('ddns', section_id, "ip_script",null); - break; - case 'web': - uci.set('ddns', section_id, "ip_network",null); - uci.set('ddns', section_id, "ip_interface",null); - uci.set('ddns', section_id, "ip_script",null); - break; - case 'interface': - uci.set('ddns', section_id, "ip_network",null); - uci.set('ddns', section_id, "ip_url",null); - uci.set('ddns', section_id, "ip_script",null); - break; - case 'script': - uci.set('ddns', section_id, "ip_network",null); - uci.set('ddns', section_id, "ip_url",null); - uci.set('ddns', section_id, "ip_interface",null); - break; - default: - break; - }; - - return uci.set('ddns', section_id, 'ip_source', formvalue ) - }; - - o = s.taboption('advanced', widgets.NetworkSelect, 'ip_network', - _("Network"), - _("Defines the network to read systems IP-Address from")); - o.depends('ip_source','network'); - o.modalonly = true; - o.default = 'wan'; - o.multiple = false; - - o = s.taboption('advanced', form.Value, 'ip_url', - _("URL to detect"), - _("Defines the Web page to read systems IP-Address from.") - + '<br />' + - String.format('%s %s', _('Example for IPv4'), ': http://checkip.dyndns.com') - + '<br />' + - String.format('%s %s', _('Example for IPv6'), ': http://checkipv6.dyndns.com')); - o.depends("ip_source", "web") - o.modalonly = true; - - o = s.taboption('advanced', widgets.DeviceSelect, 'ip_interface', - _("Interface"), - _("Defines the interface to read systems IP-Address from")); - o.modalonly = true; - o.depends("ip_source", "interface") - o.multiple = false; - o.default = 'wan'; - - o = s.taboption('advanced', form.Value, 'ip_script', - _("Script"), - _("User defined script to read systems IP-Address")); - o.modalonly = true; - o.depends("ip_source", "script") - o.placeholder = "/path/to/script.sh" - - o = s.taboption('advanced', widgets.DeviceSelect, 'interface', - _("Event Network"), - _("Network on which the ddns-updater scripts will be started")); - o.modalonly = true; - o.multiple = false; - o.default = 'wan'; - o.depends("ip_source", "web"); - o.depends("ip_source", "script"); - - o = s.taboption('advanced', form.DummyValue, '_interface', - _("Event Network"), - _("Network on which the ddns-updater scripts will be started")); - o.depends("ip_source", "interface"); - o.depends("ip_source", "network"); - o.forcewrite = true; - o.modalonly = true; - o.cfgvalue = function(section_id) { - return uci.get('ddns', section_id, 'interface') || _('This will be autoset to the selected interface'); - }; - o.write = function(section_id) { - var opt = this.section.children.filter(function(o) { return o.option == 'ip_source' })[0].formvalue(section_id); - var val = this.section.children.filter(function(o) { return o.option == 'ip_'+opt })[0].formvalue(section_id); - return uci.set('ddns', section_id, 'interface', val); - }; - - if (env['has_bindnet']) { - o = s.taboption('advanced', widgets.ZoneSelect, 'bind_network', - _("Bind Network"), - _('OPTIONAL: Network to use for communication') - + '<br />' + - _("Network on which the ddns-updater scripts will be started")); - o.depends("ip_source", "web"); - o.optional = true; - o.rmempty = true; - o.modalonly = true; - } - - if (env['has_forceip']) { - o = s.taboption('advanced', form.Flag, 'force_ipversion', - _("Force IP Version"), - _('OPTIONAL: Force the usage of pure IPv4/IPv6 only communication.')); - o.optional = true; - o.rmempty = true; - o.modalonly = true; - } - - if (env['has_dnsserver']) { - o = s.taboption("advanced", form.Value, "dns_server", - _("DNS-Server"), - _("OPTIONAL: Use non-default DNS-Server to detect 'Registered IP'.") - + "<br />" + - _("Format: IP or FQDN")); - o.placeholder = "mydns.lan" - o.optional = true; - o.rmempty = true; - o.modalonly = true; - } - - if (env['has_bindhost']) { - o = s.taboption("advanced", form.Flag, "force_dnstcp", - _("Force TCP on DNS"), - _("OPTIONAL: Force the use of TCP instead of default UDP on DNS requests.")); - o.optional = true; - o.rmempty = true; - o.modalonly = true; - } - - if (env['has_proxy']) { - o = s.taboption("advanced", form.Value, "proxy", - _("PROXY-Server"), - _("OPTIONAL: Proxy-Server for detection and updates.") - + "<br />" + - String.format('%s: <b>%s</b>', _("Format"), "[user:password@]proxyhost:port") - + "<br />" + - String.format('%s: <b>%s</b>', _("IPv6 address must be given in square brackets"), "[2001:db8::1]:8080")); - o.optional = true; - o.rmempty = true; - o.modalonly = true; - } - - o = s.taboption("advanced", form.ListValue, "use_syslog", - _("Log to syslog"), - _("Writes log messages to syslog. Critical Errors will always be written to syslog.")); - o.modalonly = true; - o.default = "2" - o.optional = true; - o.value("0", _("No logging")) - o.value("1", _("Info")) - o.value("2", _("Notice")) - o.value("3", _("Warning")) - o.value("4", _("Error")) - - o = s.taboption("advanced", form.Flag, "use_logfile", - _("Log to file")); - o.default = '1'; - o.optional = true; - o.modalonly = true; - o.cfgvalue = function(section_id) { - this.description = _("Writes detailed messages to log file. File will be truncated automatically.") + "<br />" + - _("File") + ': "' + logdir + '/' + section_id + '.log"'; - return uci.get('ddns', section_id, 'use_logfile'); - }; - - - o = s.taboption("timer", form.Value, "check_interval", - _("Check Interval")); - o.placeholder = "30"; - o.modalonly = true; - o.datatype = 'uinteger'; - o.validate = function(section_id, formvalue) { - var unit = this.section.children.filter(function(o) { return o.option == 'check_unit' })[0].formvalue(section_id), - time_to_sec = time_res[unit || 'minutes'] * formvalue; - - if (formvalue && time_to_sec < 300) - return _('Values below 5 minutes == 300 seconds are not supported'); - - return true; - }; - - o = s.taboption("timer", form.ListValue, "check_unit", - _('Check Unit'), - _("Interval unit to check for changed IP")); - o.modalonly = true; - o.default = "minutes" - o.value("seconds", _("seconds")); - o.value("minutes", _("minutes")); - o.value("hours", _("hours")); - - o = s.taboption("timer", form.Value, "force_interval", - _("Force Interval"), - _("Interval to force updates send to DDNS Provider") - + "<br />" + - _("Setting this parameter to 0 will force the script to only run once")); - o.placeholder = "72"; - o.optional = true; - o.modalonly = true; - o.datatype = 'uinteger'; - o.validate = function(section_id, formvalue) { - - if (!formvalue) - return true; - - var check_unit = this.section.children.filter(function(o) { return o.option == 'check_unit' })[0].formvalue(section_id), - check_val = this.section.children.filter(function(o) { return o.option == 'check_interval' })[0].formvalue(section_id), - force_unit = this.section.children.filter(function(o) { return o.option == 'force_unit' })[0].formvalue(section_id), - check_to_sec = time_res[check_unit || 'minutes'] * ( check_val || '30'), - force_to_sec = time_res[force_unit || 'minutes'] * formvalue; - - if (force_to_sec != 0 && force_to_sec < check_to_sec) - return _("Values lower 'Check Interval' except '0' are not supported"); - - return true; - }; - - o = s.taboption("timer", form.ListValue, "force_unit", - _('Force Unit'), - _("Interval unit to force updates send to DDNS Provider")); - o.modalonly = true; - o.optional = true; - o.default = "minutes" - o.value("minutes", _("minutes")); - o.value("hours", _("hours")); - o.value("days", _("days")); - - o = s.taboption("timer", form.Value, "retry_count", - _("Error Retry Counter"), - _("On Error the script will stop execution after given number of retrys") - + "<br />" + - _("The default setting of '0' will retry infinite.")); - o.placeholder = "0"; - o.optional = true; - o.modalonly = true; - o.datatype = 'uinteger'; - - o = s.taboption("timer", form.Value, "retry_interval", - _("Error Retry Interval"), - _("On Error the script will stop execution after given number of retrys") - + "<br />" + - _("The default setting of '0' will retry infinite.")); - o.placeholder = "60"; - o.optional = true; - o.modalonly = true; - o.datatype = 'uinteger'; - - o = s.taboption("timer", form.ListValue, "retry_unit", - _('Retry Unit'), - _("On Error the script will retry the failed action after given time")); - o.modalonly = true; - o.optional = true; - o.default = "seconds" - o.value("seconds", _("seconds")); - o.value("minutes", _("minutes")); - - - o = s.taboption("logview", form.DummyValue, '_read_log', ''); - o.depends('use_logfile','1'); - o.modalonly = true; - o.cfgvalue = function(section_id) { - return E([], [ - E('button', { - 'class': 'cbi-button cbi-button-apply', - 'click': L.ui.createHandlerFn(this, function() { - var o = this.section.children.filter(function(o) { return o.option == '_logview' })[0]; - return callGetLogServices(section_id).then(L.bind(o.update_log, o)); - }) - }, _('Read / Reread log file'))]); - }; - - o = s.taboption("logview", form.DummyValue, "_logview"); - o.depends('use_logfile','1'); - o.modalonly = true; - - o.update_log = L.bind(function(view, log_data) { - return document.getElementById('log_area').textContent = log_data.result; - }, o, this) - - o.render = L.bind(function() { - return E([ - E('p', {}, _('This is the current content of the log file in ') + logdir + ' for this service.'), - E('p', {}, E('textarea', { 'style': 'width:100%', 'rows': 20, 'readonly' : 'readonly', 'id' : 'log_area' }, _('Please press [Read] button') )) - ]); - }, o, this) - return m.render().then(L.bind(function(m, nodes) { poll.add(L.bind(function() { return Promise.all([ this.callDDnsGetServicesStatus(), - callDDnsGetStatus() + this.callDDnsGetStatus() ]).then(L.bind(this.poll_status, this, nodes)); }, this), 5); return nodes; diff --git a/applications/luci-app-ddns/root/usr/libexec/rpcd/luci.ddns b/applications/luci-app-ddns/root/usr/libexec/rpcd/luci.ddns index 7710ee66f4..0a60142e6f 100755 --- a/applications/luci-app-ddns/root/usr/libexec/rpcd/luci.ddns +++ b/applications/luci-app-ddns/root/usr/libexec/rpcd/luci.ddns @@ -7,6 +7,7 @@ local UCI = require "luci.model.uci" local sys = require "luci.sys" local util = require "luci.util" +local ddns_package_path = "/usr/share/ddns" local luci_helper = "/usr/lib/ddns/dynamic_dns_lucihelper.sh" local srv_name = "ddns-scripts" @@ -155,6 +156,7 @@ local methods = { local ipkg = require "luci.model.ipkg" local uci = UCI.cursor() local dateformat = uci:get("ddns", "global", "ddns_dateformat") or "%F %R" + local services_mtime = fs.stat(ddns_package_path .. "/list", 'mtime') uci:unload("ddns") local ver, srv_ver_cmd local res = {} @@ -169,6 +171,7 @@ local methods = { res['_version'] = ver and #ver > 0 and ver or nil res['_enabled'] = sys.init.enabled("ddns") res['_curr_dateformat'] = os.date(dateformat) + res['_services_list'] = services_mtime and os.date(dateformat, services_mtime) or 'NO_LIST' return res end diff --git a/applications/luci-app-ddns/root/usr/share/rpcd/acl.d/luci-app-ddns.json b/applications/luci-app-ddns/root/usr/share/rpcd/acl.d/luci-app-ddns.json index 94952792f0..298378452d 100644 --- a/applications/luci-app-ddns/root/usr/share/rpcd/acl.d/luci-app-ddns.json +++ b/applications/luci-app-ddns/root/usr/share/rpcd/acl.d/luci-app-ddns.json @@ -7,8 +7,12 @@ "luci": [ "setInitAction" ] }, "file": { - "/etc/ddns/services": [ "read" ], - "/etc/ddns/services_ipv6": [ "read" ], + "/usr/share/ddns/default": [ "list" ], + "/usr/share/ddns/default/*": [ "read" ], + "/usr/share/ddns/custom": [ "list" ], + "/usr/share/ddns/custom/*": [ "read" ], + "/usr/share/ddns/list": [ "read" ], + "/usr/bin/ddns": [ "exec" ], "/usr/lib/ddns/dynamic_dns_lucihelper.sh": [ "exec" ] }, "uci": [ "ddns" ] diff --git a/applications/luci-app-mwan3/po/pt/mwan3.po b/applications/luci-app-mwan3/po/pt/mwan3.po index 9443d2ac3c..810779f4de 100644 --- a/applications/luci-app-mwan3/po/pt/mwan3.po +++ b/applications/luci-app-mwan3/po/pt/mwan3.po @@ -1,6 +1,6 @@ msgid "" msgstr "" -"PO-Revision-Date: 2020-07-19 09:43+0000\n" +"PO-Revision-Date: 2020-10-02 14:41+0000\n" "Last-Translator: ssantos <ssantos@web.de>\n" "Language-Team: Portuguese <https://hosted.weblate.org/projects/openwrt/" "luciapplicationsmwan3/pt/>\n" @@ -8,7 +8,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 4.2-dev\n" +"X-Generator: Weblate 4.3-dev\n" #: applications/luci-app-mwan3/luasrc/model/cbi/mwan/interfaceconfig.lua:176 #: applications/luci-app-mwan3/luasrc/model/cbi/mwan/interfaceconfig.lua:192 @@ -725,11 +725,11 @@ msgid "" "Physical device name which interface went up or down (e.g. \"eth0\" or " "\"wwan0\")<br /><br />" msgstr "" -"Esta seção permite modificar o conteúdo de \"/etc/mwan3.user\".<br />O " +"Esta secção permite modificar o conteúdo de \"/etc/mwan3.user\".<br />O " "ficheiro também é preservado durante o sysupgrade.<br /><br />Notas:<br /" ">Este ficheiro é interpretado como um script de shell.<br />A primeira linha " "do script deve ser "#!/bin/sh" sem as aspas.<br />Linhas começando " -"com # são comentários e não são executadas.<br />Pouse sua ação mwan3 " +"com # são comentários e não são executadas.<br />Pouse a sua ação mwan3 " "personalizada aqui, elas serão executadas com cada evento netifd da " "interface hotplug<br />em interfaces para as quais o mwan3 está ativado.<br /" "><br />Existem três variáveis de ambiente principais que são passadas a este " @@ -737,9 +737,9 @@ msgstr "" "mwan3track <br />* \"ifdown\" É chamado pelo netifd e mwan3track <br />** " "\"connected\" Só é chamado pelo mwan3track se o rastreamento foi bem " "sucedido <br />* \"disconnected\" Só é chamado pelo mwan3track se o " -"rastreamento falhou <br />$INTERFACE Nome da interface que foi up ou down (e." -"g. \"wan\" ou \"wwan\")<br />$DEVICE Nome do aparelho físico cuja interface " -"foi up ou down (e.g. \"eth0\" ou \"wwan0\")<br /><br />" +"rastreamento falhou <br />$INTERFACE Nome da interface que foi up ou down (" +"e.g. \"wan\" ou \"wwan\")<br />$DEVICE Nome do aparelho físico cuja " +"interface foi up ou down (e.g. \"eth0\" ou \"wwan0\")<br /><br />" #: applications/luci-app-mwan3/luasrc/model/cbi/mwan/interfaceconfig.lua:37 msgid "Tracking hostname or IP address" diff --git a/applications/luci-app-nut/po/pt/nut.po b/applications/luci-app-nut/po/pt/nut.po index 36b181fe13..04c34d63e1 100644 --- a/applications/luci-app-nut/po/pt/nut.po +++ b/applications/luci-app-nut/po/pt/nut.po @@ -1,7 +1,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" -"PO-Revision-Date: 2020-05-03 18:57+0000\n" +"PO-Revision-Date: 2020-10-02 14:41+0000\n" "Last-Translator: ssantos <ssantos@web.de>\n" "Language-Team: Portuguese <https://hosted.weblate.org/projects/openwrt/" "luciapplicationsnut/pt/>\n" @@ -10,7 +10,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 4.1-dev\n" +"X-Generator: Weblate 4.3-dev\n" #: applications/luci-app-nut/luasrc/model/cbi/nut_server.lua:216 msgid "Additional Shutdown Time(s)" @@ -520,7 +520,7 @@ msgstr "Comunicação Síncrona" #: applications/luci-app-nut/luasrc/model/cbi/nut_server.lua:115 msgid "The name of this section will be used as UPS name elsewhere" -msgstr "O nome desta seção será usado como o nome do UPS em outros lugares" +msgstr "O nome desta secção será usado como o nome do UPS em outros lugares" #: applications/luci-app-nut/luasrc/model/cbi/nut_server.lua:96 msgid "Time in seconds between driver start retry attempts." diff --git a/applications/luci-app-openvpn/po/pt/openvpn.po b/applications/luci-app-openvpn/po/pt/openvpn.po index de47bede31..7b3ce25107 100644 --- a/applications/luci-app-openvpn/po/pt/openvpn.po +++ b/applications/luci-app-openvpn/po/pt/openvpn.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-05-26 19:03+0200\n" -"PO-Revision-Date: 2020-05-02 10:21+0000\n" +"PO-Revision-Date: 2020-10-02 14:41+0000\n" "Last-Translator: ssantos <ssantos@web.de>\n" "Language-Team: Portuguese <https://hosted.weblate.org/projects/openwrt/" "luciapplicationsopenvpn/pt/>\n" @@ -12,7 +12,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.1-dev\n" +"X-Generator: Weblate 4.3-dev\n" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:364 msgid "'net30', 'p2p', or 'subnet'" @@ -165,7 +165,7 @@ msgstr "Parametros Diffie-Hellman" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:427 msgid "Directory for custom client config files" -msgstr "Directório para configurações personalizadas dos clientes" +msgstr "Diretório para ficheiros de configurações personalizadas de clientes" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:24 msgid "Disable Paging" @@ -390,7 +390,7 @@ msgstr "Numero de buffers de broadcast alocados" #: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:360 msgid "Number of lines for log file history" -msgstr "Numero de linhas para o historico do registo" +msgstr "Numero de linhas para o histórico de ficheiros de registo" #: applications/luci-app-openvpn/luasrc/view/openvpn/cbi-select-input-add.htm:95 msgid "OVPN configuration file upload" diff --git a/applications/luci-app-privoxy/po/pt/privoxy.po b/applications/luci-app-privoxy/po/pt/privoxy.po index 3048966fff..e6a738f1b1 100644 --- a/applications/luci-app-privoxy/po/pt/privoxy.po +++ b/applications/luci-app-privoxy/po/pt/privoxy.po @@ -1,6 +1,6 @@ msgid "" msgstr "" -"PO-Revision-Date: 2020-07-20 11:41+0000\n" +"PO-Revision-Date: 2020-10-02 14:41+0000\n" "Last-Translator: ssantos <ssantos@web.de>\n" "Language-Team: Portuguese <https://hosted.weblate.org/projects/openwrt/" "luciapplicationsprivoxy/pt/>\n" @@ -8,7 +8,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 4.2-dev\n" +"X-Generator: Weblate 4.3-dev\n" #: applications/luci-app-privoxy/luasrc/model/cbi/privoxy.lua:236 msgid "" @@ -65,7 +65,7 @@ msgstr "Interface de utilizador CGI" #: applications/luci-app-privoxy/luasrc/model/cbi/privoxy.lua:857 msgid "Common Log Format" -msgstr "Formato de registros (log) comum" +msgstr "Formato de registos (log) comum" #: applications/luci-app-privoxy/luasrc/model/cbi/privoxy.lua:92 msgid "" @@ -209,22 +209,22 @@ msgstr "Visualizador de ficheiro de log" #: applications/luci-app-privoxy/luasrc/model/cbi/privoxy.lua:895 msgid "Log all data read from the network" -msgstr "Registrar todos os dados lidos da rede" +msgstr "Registar todos os dados lidos da rede" #: applications/luci-app-privoxy/luasrc/model/cbi/privoxy.lua:827 msgid "Log all data written to the network" -msgstr "Registrar todos os dados gravados na rede" +msgstr "Registar todos os dados gravados na rede" #: applications/luci-app-privoxy/luasrc/model/cbi/privoxy.lua:901 msgid "Log the applying actions" -msgstr "Registrar as ações aplicadas" +msgstr "Registar as ações aplicadas" #: applications/luci-app-privoxy/luasrc/model/cbi/privoxy.lua:803 msgid "" "Log the destination for each request Privoxy let through. See also 'Debug " "1024'." msgstr "" -"Registrar o destino para cada pedido que o Privoxy deixou passar. Consulte " +"Registar o destino para cada pedido que o Privoxy deixou passar. Consulte " "também 'Debug 1024'." #: applications/luci-app-privoxy/luasrc/model/cbi/privoxy.lua:863 @@ -232,8 +232,7 @@ msgid "" "Log the destination for requests Privoxy didn't let through, and the reason " "why." msgstr "" -"Registrar o destino para os pedidos que o Privoxy não deixou passar, e a " -"razão pela qual." +"Registar o destino para os pedidos que o Privoxy não deixou passar e porque." #: applications/luci-app-privoxy/luasrc/model/cbi/privoxy.lua:104 msgid "Logging" @@ -355,7 +354,7 @@ msgid "" "tells Privoxy where to find those other files." msgstr "" "Privoxy pode (e normalmente o faz) utilizar uma série de outros ficheiros de " -"configuração, ajuda e de registros. Esta seção do ficheiro de configuração " +"configuração, ajuda e de registos. Esta secção do ficheiro de configuração " "informa o Privoxy onde encontrar os outros ficheiros." #: applications/luci-app-privoxy/luasrc/controller/privoxy.lua:32 @@ -458,7 +457,7 @@ msgid "" "The directory where all logging takes place (i.e. where the logfile is " "located)." msgstr "" -"O diretório onde todos os registros ocorrem (ex: onde o ficheiro de log está " +"O diretório onde todos os registos ocorrem (ex: onde o ficheiro de log está " "localizado)." #: applications/luci-app-privoxy/luasrc/model/cbi/privoxy.lua:289 @@ -481,7 +480,7 @@ msgstr "O nome da máquina mostrado nas páginas de CGI." #: applications/luci-app-privoxy/luasrc/model/cbi/privoxy.lua:274 msgid "The log file to use. File name, relative to log directory." msgstr "" -"O ficheiro de registros a ser usado. O nome do ficheiro, relativo ao " +"O ficheiro de registos a ser usado. O nome do ficheiro, relativo ao " "diretório de log." #: applications/luci-app-privoxy/luasrc/model/cbi/privoxy.lua:784 diff --git a/applications/luci-app-simple-adblock/po/pl/simple-adblock.po b/applications/luci-app-simple-adblock/po/pl/simple-adblock.po index daa5fddc45..124c4615b2 100644 --- a/applications/luci-app-simple-adblock/po/pl/simple-adblock.po +++ b/applications/luci-app-simple-adblock/po/pl/simple-adblock.po @@ -1,7 +1,7 @@ msgid "" msgstr "" -"PO-Revision-Date: 2020-09-10 17:36+0000\n" -"Last-Translator: Marcin Net <marcin.net@linux.pl>\n" +"PO-Revision-Date: 2020-10-01 08:41+0000\n" +"Last-Translator: Atrate <Atrate@protonmail.com>\n" "Language-Team: Polish <https://hosted.weblate.org/projects/openwrt/" "luciapplicationssimple-adblock/pl/>\n" "Language: pl\n" @@ -60,7 +60,7 @@ msgstr "" #: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:234 msgid "Automatic Config Update" -msgstr "" +msgstr "Automatyczna aktualizacja konfiguracji" #: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:232 msgid "Basic Configuration" @@ -261,6 +261,7 @@ msgstr "Ustawienia szczegółowości danych wyjściowych" #: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:234 msgid "Perform config update before downloading the block/allow-lists." msgstr "" +"Wykonaj aktualizację konfiguracji przed pobraniem list blokowania/zezwoleń." #: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:267 msgid "" @@ -412,7 +413,7 @@ msgstr "nie udało się pobrać" #: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:156 msgid "failed to download Config Update file" -msgstr "" +msgstr "nie udało się pobrać pliku aktualizacji konfiguracji" #: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:147 msgid "failed to format data file" @@ -436,7 +437,7 @@ msgstr "nie można przeanalizować" #: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:158 msgid "failed to parse Config Update file" -msgstr "" +msgstr "nie udało się przetworzyć pliku aktualizacji konfiguracji" #: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:146 msgid "failed to process allow-list" diff --git a/applications/luci-app-statistics/po/pt/statistics.po b/applications/luci-app-statistics/po/pt/statistics.po index 12bc60e84c..0bc4f535d2 100644 --- a/applications/luci-app-statistics/po/pt/statistics.po +++ b/applications/luci-app-statistics/po/pt/statistics.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-05-26 19:03+0200\n" -"PO-Revision-Date: 2020-08-04 18:32+0000\n" +"PO-Revision-Date: 2020-10-02 14:41+0000\n" "Last-Translator: ssantos <ssantos@web.de>\n" "Language-Team: Portuguese <https://hosted.weblate.org/projects/openwrt/" "luciapplicationsstatistics/pt/>\n" @@ -12,7 +12,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.2-dev\n" +"X-Generator: Weblate 4.3-dev\n" #: applications/luci-app-statistics/htdocs/luci-static/resources/statistics/rrdtool/definitions/apcups.js:7 #: applications/luci-app-statistics/root/usr/share/luci/statistics/plugins/apcups.json:2 @@ -195,7 +195,7 @@ msgstr "Intervalo da coleta de dados" #: applications/luci-app-statistics/htdocs/luci-static/resources/view/statistics/collectd.js:71 msgid "Datasets definition file" -msgstr "Arquivo com a definição de dados" +msgstr "Ficheiro com a definição de dados" #: applications/luci-app-statistics/htdocs/luci-static/resources/view/statistics/plugins/cpufreq.js:22 msgid "Detailled CPU frequency monitoring enabled" @@ -571,7 +571,7 @@ msgstr "Monitoras discos e partições" #: applications/luci-app-statistics/htdocs/luci-static/resources/view/statistics/plugins/df.js:59 msgid "Monitor filesystem types" -msgstr "Monitorar tipos de sistemas de arquivos" +msgstr "Monitorar tipos de sistemas de ficheiros" #: applications/luci-app-statistics/htdocs/luci-static/resources/view/statistics/plugins/apcups.js:14 msgid "Monitor host" @@ -1061,7 +1061,7 @@ msgstr "Diretório de armazenamento" #: applications/luci-app-statistics/htdocs/luci-static/resources/view/statistics/plugins/csv.js:14 msgid "Storage directory for the csv files" -msgstr "Diretório para armazenamento dos arquivos csv" +msgstr "Diretório para armazenamento dos ficheiros csv" #: applications/luci-app-statistics/htdocs/luci-static/resources/view/statistics/plugins/csv.js:18 msgid "Store data values as rates instead of absolute values" @@ -1170,8 +1170,8 @@ msgid "" "The csv plugin stores collected data in csv file format for further " "processing by external programs." msgstr "" -"O plugin csv armazena os dados coletados em um arquivo no formato csv para " -"um futuro processamento por outros programas." +"O plugin csv armazena os dados coletados num ficheiro no formato csv para um " +"futuro processamento por outros programas." #: applications/luci-app-statistics/htdocs/luci-static/resources/view/statistics/plugins/df.js:8 msgid "" @@ -1179,7 +1179,7 @@ msgid "" "devices, mount points or filesystem types." msgstr "" "O plugin df coleta estatísticas sobre a utilização de espaço em disco em " -"diferentes dispositivos, pontos de montagem ou tipos de sistemas de arquivos." +"diferentes aparelhos, pontos de montagem ou tipos de sistemas de ficheiros." #: applications/luci-app-statistics/htdocs/luci-static/resources/view/statistics/plugins/disk.js:8 msgid "" @@ -1309,10 +1309,10 @@ msgid "" "values will result in a very high memory consumption in the temporary " "directory. This can render the device unusable!</strong>" msgstr "" -"O plugin rrdtool armazena os dados coletados no arquivo de banco de dados " -"rrd.<br /><br /><strong>Aviso: A má configuração desses valores, resultará " -"em um valor muito elevado no consumo de memória no diretório temporário. " -"Isso pode tornar o equipamento inutilizável!</strong>" +"O plugin rrdtool armazena os dados coletados no ficheiro de banco de dados " +"rrd.<br /><br /><strong>Aviso: a má configuração desses valores, resultará " +"num valor muito elevado no consumo de memória no diretório temporário. Isso " +"pode tornar o equipamento inutilizável!</strong>" #: applications/luci-app-statistics/htdocs/luci-static/resources/view/statistics/plugins/sensors.js:16 msgid "" @@ -1391,14 +1391,14 @@ msgid "" "This section defines on which interfaces collectd will wait for incoming " "connections." msgstr "" -"Esta seção define em quais interfaces o collectd irá aguardar para receber " +"Esta secção define em quais interfaces o collectd irá aguardar para receber " "conexões." #: applications/luci-app-statistics/htdocs/luci-static/resources/view/statistics/plugins/network.js:51 msgid "" "This section defines to which servers the locally collected data is sent to." msgstr "" -"Esta seção define para qual servidor os dados coletados localmente serão " +"Esta secção define para qual servidor os dados coletados localmente serão " "enviados." #: applications/luci-app-statistics/htdocs/luci-static/resources/view/statistics/collectd.js:80 @@ -1450,7 +1450,7 @@ msgstr "Use um esquema de nomeação melhorado" #: applications/luci-app-statistics/htdocs/luci-static/resources/view/statistics/collectd.js:68 msgid "Used PID file" -msgstr "Arquivo PID usado" +msgstr "Ficheiro PID usado" #: applications/luci-app-statistics/htdocs/luci-static/resources/view/statistics/plugins/exec.js:27 #: applications/luci-app-statistics/htdocs/luci-static/resources/view/statistics/plugins/exec.js:47 diff --git a/applications/luci-app-tinyproxy/po/pt/tinyproxy.po b/applications/luci-app-tinyproxy/po/pt/tinyproxy.po index f183b637fb..2247c3786f 100644 --- a/applications/luci-app-tinyproxy/po/pt/tinyproxy.po +++ b/applications/luci-app-tinyproxy/po/pt/tinyproxy.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-05-26 19:03+0200\n" -"PO-Revision-Date: 2020-07-20 11:41+0000\n" +"PO-Revision-Date: 2020-10-01 08:41+0000\n" "Last-Translator: ssantos <ssantos@web.de>\n" "Language-Team: Portuguese <https://hosted.weblate.org/projects/openwrt/" "luciapplicationstinyproxy/pt/>\n" @@ -12,7 +12,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.2-dev\n" +"X-Generator: Weblate 4.3-dev\n" #: applications/luci-app-tinyproxy/luasrc/model/cbi/tinyproxy.lua:219 msgid "" @@ -57,8 +57,8 @@ msgid "" "By default, filter strings are treated as case-insensitive. Enable this to " "make the matching case-sensitive" msgstr "" -"Por padrão, as regras são tratadas como insensíveis a caixa. Ative esta " -"opção para diferenciar maiúsculas e minúsculas" +"Por predefinição, as regras são tratadas como não sensíveis a maiúsculas e " +"minúsculas. Ative esta opção para diferenciar maiúsculas e minúsculas" #: applications/luci-app-tinyproxy/luasrc/model/cbi/tinyproxy.lua:145 msgid "" diff --git a/applications/luci-app-travelmate/po/pl/travelmate.po b/applications/luci-app-travelmate/po/pl/travelmate.po index c65b6bdcf9..d42e2b7db0 100644 --- a/applications/luci-app-travelmate/po/pl/travelmate.po +++ b/applications/luci-app-travelmate/po/pl/travelmate.po @@ -1,7 +1,7 @@ msgid "" msgstr "" -"PO-Revision-Date: 2020-09-27 12:38+0000\n" -"Last-Translator: Atrate <Atrate@protonmail.com>\n" +"PO-Revision-Date: 2020-10-02 14:41+0000\n" +"Last-Translator: Krzysiek Fulko <kfulko@gmail.com>\n" "Language-Team: Polish <https://hosted.weblate.org/projects/openwrt/" "luciapplicationstravelmate/pl/>\n" "Language: pl\n" @@ -13,23 +13,24 @@ msgstr "" #: applications/luci-app-travelmate/htdocs/luci-static/resources/view/travelmate/overview.js:73 msgid "-- AP Selection --" -msgstr "" +msgstr "-- Wybór AP --" #: applications/luci-app-travelmate/htdocs/luci-static/resources/view/travelmate/overview.js:261 +#, fuzzy msgid "AP QR-Codes..." -msgstr "" +msgstr "Kody QR AP..." #: applications/luci-app-travelmate/htdocs/luci-static/resources/view/travelmate/stations.js:823 msgid "Add Uplink %q" -msgstr "" +msgstr "Dodaj Uplink %q" #: applications/luci-app-travelmate/htdocs/luci-static/resources/view/travelmate/stations.js:679 msgid "Add Uplink..." -msgstr "" +msgstr "Dodaj Uplink..." #: applications/luci-app-travelmate/htdocs/luci-static/resources/view/travelmate/overview.js:280 msgid "Additional Settings" -msgstr "" +msgstr "Ustawienia dodatkowe" #: applications/luci-app-travelmate/htdocs/luci-static/resources/view/travelmate/overview.js:321 msgid "" @@ -72,8 +73,9 @@ msgid "" msgstr "" #: applications/luci-app-travelmate/htdocs/luci-static/resources/view/travelmate/overview.js:380 +#, fuzzy msgid "Automatically handle VPN (re-) connections." -msgstr "" +msgstr "Automatyczna obsługa połączeń VPN." #: applications/luci-app-travelmate/htdocs/luci-static/resources/view/travelmate/stations.js:252 #: applications/luci-app-travelmate/htdocs/luci-static/resources/view/travelmate/stations.js:415 @@ -121,8 +123,9 @@ msgid "" msgstr "" #: applications/luci-app-travelmate/htdocs/luci-static/resources/view/travelmate/stations.js:437 +#, fuzzy msgid "Connection End" -msgstr "" +msgstr "Koniec połączenia" #: applications/luci-app-travelmate/htdocs/luci-static/resources/view/travelmate/stations.js:466 msgid "Connection End Expiry" @@ -173,15 +176,15 @@ msgstr "" #: applications/luci-app-travelmate/htdocs/luci-static/resources/view/travelmate/overview.js:422 msgid "E-Mail Profile" -msgstr "" +msgstr "Profil E-mail" #: applications/luci-app-travelmate/htdocs/luci-static/resources/view/travelmate/overview.js:407 msgid "E-Mail Receiver Address" -msgstr "" +msgstr "Adres E-mail odbiorcy" #: applications/luci-app-travelmate/htdocs/luci-static/resources/view/travelmate/overview.js:412 msgid "E-Mail Sender Address" -msgstr "" +msgstr "Adres E-mail nadawcy" #: applications/luci-app-travelmate/htdocs/luci-static/resources/view/travelmate/overview.js:282 msgid "E-Mail Settings" @@ -230,12 +233,12 @@ msgstr "" #: applications/luci-app-travelmate/htdocs/luci-static/resources/view/travelmate/overview.js:290 msgid "Enable verbose debug logging in case of any processing errors." -msgstr "" +msgstr "Włącz pełne rejestrowanie debugowania w przypadku błędów przetwarzania." #: applications/luci-app-travelmate/htdocs/luci-static/resources/view/travelmate/overview.js:287 #: applications/luci-app-travelmate/htdocs/luci-static/resources/view/travelmate/stations.js:233 msgid "Enabled" -msgstr "" +msgstr "Włączone" #: applications/luci-app-travelmate/htdocs/luci-static/resources/view/travelmate/stations.js:256 #: applications/luci-app-travelmate/htdocs/luci-static/resources/view/travelmate/stations.js:575 @@ -262,7 +265,7 @@ msgstr "" #: applications/luci-app-travelmate/htdocs/luci-static/resources/view/travelmate/overview.js:279 msgid "General Settings" -msgstr "" +msgstr "Ustawienia główne" #: applications/luci-app-travelmate/htdocs/luci-static/resources/view/travelmate/overview.js:314 msgid "Generate a random unicast MAC address for each uplink connection." @@ -317,7 +320,7 @@ msgstr "Ostatnie uruchomienie" #: applications/luci-app-travelmate/root/usr/share/luci/menu.d/luci-app-travelmate.json:35 msgid "Log View" -msgstr "" +msgstr "Widok dziennika" #: applications/luci-app-travelmate/htdocs/luci-static/resources/view/travelmate/stations.js:363 #: applications/luci-app-travelmate/htdocs/luci-static/resources/view/travelmate/stations.js:791 @@ -473,7 +476,7 @@ msgstr "Limit powtórzeń do połączenia." #: applications/luci-app-travelmate/htdocs/luci-static/resources/view/travelmate/overview.js:241 msgid "Run Flags" -msgstr "" +msgstr "Uruchomione flagi" #: applications/luci-app-travelmate/htdocs/luci-static/resources/view/travelmate/stations.js:248 #: applications/luci-app-travelmate/htdocs/luci-static/resources/view/travelmate/stations.js:404 @@ -517,7 +520,7 @@ msgstr "" #: applications/luci-app-travelmate/htdocs/luci-static/resources/view/travelmate/overview.js:277 msgid "Settings" -msgstr "" +msgstr "Ustawienia" #: applications/luci-app-travelmate/htdocs/luci-static/resources/view/travelmate/overview.js:331 msgid "Signal Quality Threshold" @@ -549,7 +552,7 @@ msgstr "" #: applications/luci-app-travelmate/htdocs/luci-static/resources/view/travelmate/overview.js:226 msgid "Status / Version" -msgstr "" +msgstr "Status/Wersja" #: applications/luci-app-travelmate/htdocs/luci-static/resources/view/travelmate/stations.js:571 msgid "Strength" @@ -663,7 +666,7 @@ msgstr "" #: applications/luci-app-travelmate/htdocs/luci-static/resources/view/travelmate/overview.js:290 msgid "Verbose Debug Logging" -msgstr "" +msgstr "Pełne rejestrowanie debugowania" #: applications/luci-app-travelmate/htdocs/luci-static/resources/view/travelmate/stations.js:271 #: applications/luci-app-travelmate/htdocs/luci-static/resources/view/travelmate/stations.js:764 diff --git a/applications/luci-app-travelmate/po/pt/travelmate.po b/applications/luci-app-travelmate/po/pt/travelmate.po index 5ba9e45566..e39c776cf2 100644 --- a/applications/luci-app-travelmate/po/pt/travelmate.po +++ b/applications/luci-app-travelmate/po/pt/travelmate.po @@ -1,6 +1,6 @@ msgid "" msgstr "" -"PO-Revision-Date: 2020-09-29 14:41+0000\n" +"PO-Revision-Date: 2020-10-01 08:41+0000\n" "Last-Translator: ssantos <ssantos@web.de>\n" "Language-Team: Portuguese <https://hosted.weblate.org/projects/openwrt/" "luciapplicationstravelmate/pt/>\n" @@ -515,7 +515,7 @@ msgstr "" #: applications/luci-app-travelmate/htdocs/luci-static/resources/view/travelmate/overview.js:277 msgid "Settings" -msgstr "" +msgstr "Configurações" #: applications/luci-app-travelmate/htdocs/luci-static/resources/view/travelmate/overview.js:331 msgid "Signal Quality Threshold" diff --git a/applications/luci-app-vpn-policy-routing/po/pl/vpn-policy-routing.po b/applications/luci-app-vpn-policy-routing/po/pl/vpn-policy-routing.po index 370936bb5e..3131f80843 100644 --- a/applications/luci-app-vpn-policy-routing/po/pl/vpn-policy-routing.po +++ b/applications/luci-app-vpn-policy-routing/po/pl/vpn-policy-routing.po @@ -1,7 +1,7 @@ msgid "" msgstr "" -"PO-Revision-Date: 2020-08-18 20:32+0000\n" -"Last-Translator: Marcin Net <marcin.net@linux.pl>\n" +"PO-Revision-Date: 2020-10-01 08:41+0000\n" +"Last-Translator: Atrate <Atrate@protonmail.com>\n" "Language-Team: Polish <https://hosted.weblate.org/projects/openwrt/" "luciapplicationsvpn-policy-routing/pl/>\n" "Language: pl\n" @@ -9,7 +9,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " "|| n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 4.2-dev\n" +"X-Generator: Weblate 4.3-dev\n" #: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:63 msgid "%s (disabled)" @@ -186,7 +186,7 @@ msgstr "Wymuszenie interfejsu protokołu ICMP." #: applications/luci-app-vpn-policy-routing/root/usr/share/rpcd/acl.d/luci-app-vpn-policy-routing.json:3 msgid "Grant UCI and file access for luci-app-vpn-policy-routing" -msgstr "" +msgstr "Przyznaj dostęp do plików i UCI dla luci-app-vpn-policy-routing" #: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:214 msgid "IP Rules Support" @@ -429,6 +429,8 @@ msgstr "Tłumienie/Brak wyjścia" #: applications/luci-app-vpn-policy-routing/luasrc/view/vpn-policy-routing/status-gateways.htm:15 msgid "The %s represents the default gateway. See the %sREADME%s for details." msgstr "" +"%s reprezentuje bramę domyślną. Szczegółowe informacje można znaleźć w " +"%sREADME%s." #: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:186 msgid "The ipset option for local policies" diff --git a/applications/luci-app-vpn-policy-routing/po/pt/vpn-policy-routing.po b/applications/luci-app-vpn-policy-routing/po/pt/vpn-policy-routing.po index 42e1c137f0..e0905527dc 100644 --- a/applications/luci-app-vpn-policy-routing/po/pt/vpn-policy-routing.po +++ b/applications/luci-app-vpn-policy-routing/po/pt/vpn-policy-routing.po @@ -1,6 +1,6 @@ msgid "" msgstr "" -"PO-Revision-Date: 2020-09-29 14:41+0000\n" +"PO-Revision-Date: 2020-10-02 14:41+0000\n" "Last-Translator: ssantos <ssantos@web.de>\n" "Language-Team: Portuguese <https://hosted.weblate.org/projects/openwrt/" "luciapplicationsvpn-policy-routing/pt/>\n" @@ -29,7 +29,7 @@ msgid "" "caution!%s" msgstr "" "%sADVERTÊNCIA:%s Consulte o %sREADME%s antes de alterar qualquer coisa nesta " -"seção! Altere qualquer uma das configurações abaixo com extrema cautela!%s" +"secção! Altere qualquer uma das configurações abaixo com extrema cautela!%s" #: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:214 msgid "" diff --git a/applications/luci-app-vpnbypass/po/pl/vpnbypass.po b/applications/luci-app-vpnbypass/po/pl/vpnbypass.po index 647080a813..627d94e5d5 100644 --- a/applications/luci-app-vpnbypass/po/pl/vpnbypass.po +++ b/applications/luci-app-vpnbypass/po/pl/vpnbypass.po @@ -1,7 +1,7 @@ msgid "" msgstr "" -"PO-Revision-Date: 2020-08-18 20:32+0000\n" -"Last-Translator: Marcin Net <marcin.net@linux.pl>\n" +"PO-Revision-Date: 2020-10-01 08:41+0000\n" +"Last-Translator: Atrate <Atrate@protonmail.com>\n" "Language-Team: Polish <https://hosted.weblate.org/projects/openwrt/" "luciapplicationsvpnbypass/pl/>\n" "Language: pl\n" @@ -9,7 +9,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " "|| n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 4.2-dev\n" +"X-Generator: Weblate 4.3-dev\n" #: applications/luci-app-vpnbypass/luasrc/model/cbi/vpnbypass.lua:40 msgid "%s (disabled)" @@ -39,8 +39,9 @@ msgid "Enable" msgstr "Włącz" #: applications/luci-app-vpnbypass/root/usr/share/rpcd/acl.d/luci-app-vpnbypass.json:3 +#, fuzzy msgid "Grant UCI and file access for luci-app-vpnbypass" -msgstr "" +msgstr "Przyznaj dostęp do plików i UCI dla luci-app-vpnbypass" #: applications/luci-app-vpnbypass/luasrc/view/vpnbypass/js.htm:51 msgid "Loading" diff --git a/applications/luci-app-yggdrasil/po/pt/yggdrasil.po b/applications/luci-app-yggdrasil/po/pt/yggdrasil.po index 100dead5c8..c9f1567acf 100644 --- a/applications/luci-app-yggdrasil/po/pt/yggdrasil.po +++ b/applications/luci-app-yggdrasil/po/pt/yggdrasil.po @@ -1,6 +1,6 @@ msgid "" msgstr "" -"PO-Revision-Date: 2020-07-17 19:42+0000\n" +"PO-Revision-Date: 2020-10-02 14:41+0000\n" "Last-Translator: ssantos <ssantos@web.de>\n" "Language-Team: Portuguese <https://hosted.weblate.org/projects/openwrt/" "luciapplicationsyggdrasil/pt/>\n" @@ -8,7 +8,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 4.2-dev\n" +"X-Generator: Weblate 4.3-dev\n" #: applications/luci-app-yggdrasil/htdocs/luci-static/resources/view/yggdrasil/status.js:33 msgid "Active peers" @@ -204,10 +204,10 @@ msgid "" "that SOCKS peerings will NOT be affected by this option and should go in the " "\"Peers\" section instead." msgstr "" -"Lista de cadieas de carácteres de conexão para conexões peer de saída no " +"Lista de cadeias de caracteres de conexão para conexões peer de saída no " "formato URI, organizada por interface de origem, por exemplo, { \"eth0\": [ " "tcp://a.b.c.d:e ] }. Observe que as conexões SOCKS NÃO serão afetados por " -"essa opção e devem ir na seção \"Peers\"." +"essa opção e devem ir à secção \"Peers\"." #: applications/luci-app-yggdrasil/htdocs/luci-static/resources/view/yggdrasil/peers.js:12 msgid "" @@ -216,10 +216,10 @@ msgid "" "the operating system routing table, therefore you should use this section " "when you may connect via different interfaces." msgstr "" -"Lista de strings de conexão para conexões pares de saída no formato URI, por " +"Lista de cadeias de conexão para conexões pares de saída no formato URI, por " "exemplo, tcp://a.b.c.d:e ou meias://a.b.c.d:e/f.g.h.i:j. Essas conexões " "obedecerão à tabela de roteamento do sistema operacional, portanto deve usar " -"esta seção quando se pode conectar através de diferentes interfaces." +"esta secção quando se pode conectar através de diferentes interfaces." #: applications/luci-app-yggdrasil/htdocs/luci-static/resources/view/yggdrasil/settings.js:50 msgid "Listen addresses" |