diff --git a/cloudflared-next/Makefile b/cloudflared-next/Makefile index 6cdd430f4..f35c6df02 100644 --- a/cloudflared-next/Makefile +++ b/cloudflared-next/Makefile @@ -5,8 +5,8 @@ include $(TOPDIR)/rules.mk PKG_NAME:=cloudflared-next -PKG_VERSION:=2026.10.1 -PKG_RELEASE:=4 +PKG_VERSION:=2026.10.2 +PKG_RELEASE:=5 # Architecture mapping for pre-built binaries ifeq ($(ARCH),x86_64) diff --git a/dae/Makefile b/dae/Makefile index 571b0a8ea..40f6e7394 100644 --- a/dae/Makefile +++ b/dae/Makefile @@ -5,10 +5,10 @@ include $(TOPDIR)/rules.mk PKG_NAME:=dae -PKG_VERSION:=2026.09.30 -PKG_RELEASE:=50 +PKG_VERSION:=2026.10.18 +PKG_RELEASE:=51 -PKG_SOURCE:=dae-src-2026.09.30-30538527b146.tar.gz +PKG_SOURCE:=dae-src-2026.10.18-9ec2736d61b0.tar.gz PKG_SOURCE_URL:=https://github.com/kenzok8/openwrt-daede/releases/download/dae-src PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION) PKG_HASH:=skip diff --git a/daed/Makefile b/daed/Makefile index 46167289d..5a828bab0 100644 --- a/daed/Makefile +++ b/daed/Makefile @@ -5,10 +5,10 @@ include $(TOPDIR)/rules.mk PKG_NAME:=daed -PKG_VERSION:=2026.09.30 -PKG_RELEASE:=61 +PKG_VERSION:=2026.10.18 +PKG_RELEASE:=62 -PKG_SOURCE:=daed-src-2026.09.30-84f171fef875.tar.gz +PKG_SOURCE:=daed-src-2026.10.18-b7827fb4b582.tar.gz PKG_SOURCE_URL:=https://github.com/kenzok8/openwrt-daede/releases/download/daed-src PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION) PKG_HASH:=skip diff --git a/luci-app-amlogic/Makefile b/luci-app-amlogic/Makefile index 0b92b1184..9a943d3a1 100644 --- a/luci-app-amlogic/Makefile +++ b/luci-app-amlogic/Makefile @@ -22,11 +22,11 @@ PKG_NAME:=luci-app-amlogic # DD = day (01 = 1st) # NN = daily release sequence (01 = first release of the day, 02 = second, ...) # Example below: 26.10.0101 = October 1, 2026, 1st release of the day -PKG_VERSION:=26.10.1603 +PKG_VERSION:=26.10.2002 # PKG_RELEASE marks the LuCI variant; onekey-install.sh relies on it (do NOT bump) # 1 = Lua version (lua branch) → tag: 26.10.0101 # 2 = JS version (main branch) → tag: 26.10.0101-js -PKG_RELEASE:=23 +PKG_RELEASE:=24 PKG_LICENSE:=GPL-2.0 License PKG_MAINTAINER:=ophub diff --git a/luci-app-amlogic/root/usr/share/rpcd/ucode/luci.amlogic b/luci-app-amlogic/root/usr/share/rpcd/ucode/luci.amlogic index 91c462a12..6bd303ff8 100644 --- a/luci-app-amlogic/root/usr/share/rpcd/ucode/luci.amlogic +++ b/luci-app-amlogic/root/usr/share/rpcd/ucode/luci.amlogic @@ -453,8 +453,11 @@ function m_start_plugin() { + ' fi\n' + ' # Restart services so the newly installed files take effect immediately,\n' + ' # avoiding the need for users to manually clear browser cache.\n' - + ' /etc/init.d/rpcd restart >> "$LOG" 2>&1\n' + + ' # Restart uhttpd before rpcd: this cleanup runs as a child of rpcd, so\n' + + ' # restarting rpcd last avoids tearing down the bridge while uhttpd is\n' + + ' # still being reconfigured.\n' + ' /etc/init.d/uhttpd restart >> "$LOG" 2>&1\n' + + ' /etc/init.d/rpcd restart >> "$LOG" 2>&1\n' + ' ) &\n' + 'else\n' + ' echo "--- INSTALLATION FAILED! ---" >> "$LOG"\n' diff --git a/luci-app-daede/Makefile b/luci-app-daede/Makefile index b3d60bc5c..fccf6dcd5 100644 --- a/luci-app-daede/Makefile +++ b/luci-app-daede/Makefile @@ -6,7 +6,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=luci-app-daede PKG_VERSION:=1.15 -PKG_RELEASE:=51 +PKG_RELEASE:=52 PKG_MAINTAINER:=kenzok8 PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME) diff --git a/luci-app-daede/htdocs/luci-static/resources/view/daede/updates.js b/luci-app-daede/htdocs/luci-static/resources/view/daede/updates.js index 4ece1ae5b..811f4dbde 100644 --- a/luci-app-daede/htdocs/luci-static/resources/view/daede/updates.js +++ b/luci-app-daede/htdocs/luci-static/resources/view/daede/updates.js @@ -122,7 +122,7 @@ function probeFile(path) { function probePkg(pkg) { return fs.exec('/usr/share/luci-app-daede/pkg-info.sh', [pkg]).then(function(res) { - const out = (res.stdout || '').trim().split('\t'); + const out = (res.stdout || '').replace(/[\r\n]+$/, '').split('\t'); return { installed: out[0] || '', latest: out[1] || '' }; }).catch(function() { return { installed: '', latest: '' }; diff --git a/luci-app-ddns/po/ca/ddns.po b/luci-app-ddns/po/ca/ddns.po index c89cab21c..39d104ba6 100644 --- a/luci-app-ddns/po/ca/ddns.po +++ b/luci-app-ddns/po/ca/ddns.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: luci-app-ddns 2.4.0-1\n" "POT-Creation-Date: 2016-01-30 11:07+0100\n" -"PO-Revision-Date: 2026-05-30 00:53+0000\n" -"Last-Translator: Roger Pueyo Centelles \n" +"PO-Revision-Date: 2026-10-13 15:11+0000\n" +"Last-Translator: Pavel Borecki \n" "Language-Team: Catalan \n" "Language: ca\n" @@ -11,7 +11,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 2026.6.dev0\n" +"X-Generator: Weblate 2026.11.dev0\n" #: applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js:423 msgid "\"../\" not allowed in path for Security Reason." @@ -171,7 +171,7 @@ msgstr "" #: applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js:18 msgid "Disabled" -msgstr "" +msgstr "Inhabilitat" #: applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js:746 msgid "Domain" diff --git a/luci-app-ddns/po/da/ddns.po b/luci-app-ddns/po/da/ddns.po index dbf58223a..f0efe9a06 100644 --- a/luci-app-ddns/po/da/ddns.po +++ b/luci-app-ddns/po/da/ddns.po @@ -1,14 +1,14 @@ msgid "" msgstr "" -"PO-Revision-Date: 2024-01-25 02:53+0000\n" -"Last-Translator: drax red \n" +"PO-Revision-Date: 2026-10-05 07:56+0000\n" +"Last-Translator: Hosted Weblate user 168028 \n" "Language-Team: Danish \n" "Language: da\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 5.4-dev\n" +"X-Generator: Weblate 2026.10.1.dev0\n" #: applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js:423 msgid "\"../\" not allowed in path for Security Reason." @@ -604,7 +604,7 @@ msgstr "" #: applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js:231 #: applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js:1119 msgid "Running" -msgstr "" +msgstr "Running" #: applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js:811 #: applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js:868 @@ -659,7 +659,7 @@ msgstr "State" #: applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js:1116 msgid "Status" -msgstr "Status" +msgstr "Statusstatus" #: applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js:410 msgid "Status directory" @@ -842,7 +842,7 @@ msgstr "" #: applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js:513 #: applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js:640 msgid "custom" -msgstr "" +msgstr "brugerdefinerede" #: applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js:1036 msgid "days" diff --git a/luci-app-ddns/po/el/ddns.po b/luci-app-ddns/po/el/ddns.po index 4f158966b..6c89092a8 100644 --- a/luci-app-ddns/po/el/ddns.po +++ b/luci-app-ddns/po/el/ddns.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: luci-app-ddns 2.4.0-1\n" "POT-Creation-Date: 2016-01-30 11:07+0100\n" -"PO-Revision-Date: 2025-05-03 17:07+0000\n" -"Last-Translator: george kitsoukakis \n" +"PO-Revision-Date: 2026-10-13 15:11+0000\n" +"Last-Translator: Pavel Borecki \n" "Language-Team: Greek \n" "Language: el\n" @@ -11,7 +11,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 5.12-dev\n" +"X-Generator: Weblate 2026.11.dev0\n" #: applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js:423 msgid "\"../\" not allowed in path for Security Reason." @@ -171,7 +171,7 @@ msgstr "" #: applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js:18 msgid "Disabled" -msgstr "" +msgstr "Απενεργοποιημένο" #: applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js:746 msgid "Domain" diff --git a/luci-app-ddns/po/ga/ddns.po b/luci-app-ddns/po/ga/ddns.po index 496e2a02f..76d356376 100644 --- a/luci-app-ddns/po/ga/ddns.po +++ b/luci-app-ddns/po/ga/ddns.po @@ -1,6 +1,6 @@ msgid "" msgstr "" -"PO-Revision-Date: 2026-09-02 17:27+0000\n" +"PO-Revision-Date: 2026-10-08 15:51+0000\n" "Last-Translator: Aindriú Mac Giolla Eoin \n" "Language-Team: Irish \n" @@ -9,7 +9,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=5; plural=n==1 ? 0 : n==2 ? 1 : (n>2 && n<7) ? 2 :(n>" "6 && n<11) ? 3 : 4;\n" -"X-Generator: Weblate 2026.9.dev0\n" +"X-Generator: Weblate 2026.10.1.dev0\n" #: applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js:423 msgid "\"../\" not allowed in path for Security Reason." @@ -17,7 +17,7 @@ msgstr "Ní cheadaítear “../” ar an gcosán ar Chúis Slándála." #: applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js:761 msgid "A.k.a. the TOKEN at e.g. afraid.org" -msgstr "A.k.a. an TOKEN ag e.g. eagla.org" +msgstr "Ar a dtugtar an TOKEN freisin, ag, mar shampla, afraid.org" #: applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js:458 #: applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js:526 diff --git a/luci-app-ddns/po/ja/ddns.po b/luci-app-ddns/po/ja/ddns.po index 1d435d4a4..93c6e4972 100644 --- a/luci-app-ddns/po/ja/ddns.po +++ b/luci-app-ddns/po/ja/ddns.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: luci-app-ddns 2.4.0-1\n" "POT-Creation-Date: 2016-01-30 11:07+0100\n" -"PO-Revision-Date: 2025-11-08 23:11+0000\n" +"PO-Revision-Date: 2026-10-18 16:40+0000\n" "Last-Translator: Monarch " "\n" "Language-Team: Japanese \n" +"PO-Revision-Date: 2026-10-18 18:18+0000\n" +"Last-Translator: Hyeonjeong Lee \n" "Language-Team: Korean \n" "Language: ko\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 2026.10.dev0\n" +"X-Generator: Weblate 2026.11.dev0\n" #: applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js:423 msgid "\"../\" not allowed in path for Security Reason." @@ -16,7 +16,7 @@ msgstr "\"../\"는 보안상의 이유로 경로에 사용될 수 없습니다." #: applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js:761 msgid "A.k.a. the TOKEN at e.g. afraid.org" -msgstr "" +msgstr "예: afraid.org의 토큰(TOKEN) 등" #: applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js:458 #: applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js:526 @@ -41,7 +41,7 @@ msgstr "바인드 네트워크" #: applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js:332 msgid "Binding to a specific network not supported" -msgstr "" +msgstr "특정 네트워크 바인딩 미지원" #: applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js:361 msgid "" @@ -56,6 +56,8 @@ msgid "" "BusyBox's nslookup in the current compiled version does not handle given DNS " "Servers correctly!" msgstr "" +"현재 컴파일된 버전의 BusyBox nslookup은 지정된 DNS 서버를 올바르게 처리하지 " +"못합니다!" #: applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js:443 msgid "CA cert bundle file" @@ -109,8 +111,7 @@ msgstr "현재 설정:" #: applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js:209 #: applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js:276 msgid "Currently DDNS updates are not started at boot or on interface events." -msgstr "" -"현재 DDNS 업데이트가 부팅 또는 인터페이스 이벤트에서 시작되지 않습니다." +msgstr "현재 DDNS 업데이트가 부팅 시 또는 인터페이스 이벤트 시 시작되지 않습니다." #: applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js:725 msgid "Custom update script for updating your DDNS Provider." @@ -150,7 +151,7 @@ msgstr "DDNS 서비스" #: applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js:360 msgid "DNS requests via TCP not supported" -msgstr "TCP를 통한 DNS 요청이 지원되지 않음" +msgstr "TCP를 통한 DNS 요청 미지원" #: applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js:923 msgid "DNS-Server" @@ -162,15 +163,15 @@ msgstr "날짜 형식" #: applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js:851 msgid "Defines the Web page to read systems IP-Address from." -msgstr "시스템의 IP 주소를 가져올 웹페이지를 지정합니다." +msgstr "시스템 IP 주소를 가져올 웹페이지를 지정합니다." #: applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js:861 msgid "Defines the interface to read systems IP-Address from" -msgstr "시스템의 IP 주소를 가져올 인터페이스를 지정합니다" +msgstr "시스템 IP 주소를 가져올 인터페이스를 지정합니다" #: applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js:843 msgid "Defines the network to read systems IP-Address from" -msgstr "시스템의 IP 주소를 가져올 네트워크를 지정합니다" +msgstr "시스템 IP 주소를 가져올 네트워크를 지정합니다" #: applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js:18 msgid "Disabled" @@ -238,7 +239,7 @@ msgstr "제공업체의 웹페이지 안내를 참고하세요." #: applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js:403 msgid "For supported codes look here" -msgstr "" +msgstr "지원되는 코드는 여기를 참고하세요" #: applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js:914 msgid "Force IP Version" @@ -269,8 +270,8 @@ msgid "" "GNU Wget will use the IP of given network, cURL will use the physical " "interface." msgstr "" -"GNU Wget은 주어진 네트워크의 IP를 사용하고, cURL은 물리적 인터페이스를 사용합" -"니다." +"GNU Wget은 지정된 네트워크의 IP를 사용하며, cURL은 물리적 인터페이스를 " +"사용합니다." #: applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js:265 msgid "Global Settings" @@ -286,11 +287,11 @@ msgstr "HTTPS 미지원" #: applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js:620 msgid "Hostname/FQDN to validate, whether an IP update is necessary" -msgstr "" +msgstr "IP 갱신 필요 여부를 확인하는 데 사용할 호스트 이름/FQDN입니다" #: applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js:804 msgid "IP address source" -msgstr "" +msgstr "IP 주소 출처" #: applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js:503 #: applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js:627 @@ -308,7 +309,7 @@ msgstr "IPv6 주소는 대괄호로 지정해야 합니다" #: applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js:311 msgid "IPv6 is not supported by this system" -msgstr "IPv6은 이 시스템에서 지원되지 않습니다" +msgstr "이 시스템에서 IPv6를 지원하지 않습니다" #: applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js:310 msgid "IPv6 not supported" @@ -327,11 +328,11 @@ msgstr "Wget과 cURL 패키지가 설치된 경우 기본적으로 통신에 Wge #: applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js:611 msgid "If this service section is disabled it will not be started." -msgstr "" +msgstr "이 서비스 섹션을 비활성화하면 시작되지 않습니다." #: applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js:384 msgid "If using secure communication you should verify server certificates!" -msgstr "" +msgstr "보안 통신을 사용하는 경우 서버 인증서를 검증해야 합니다!" #: applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js:325 #: applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js:341 @@ -339,6 +340,8 @@ msgstr "" msgid "" "In some versions cURL/libcurl in OpenWrt is compiled without proxy support." msgstr "" +"OpenWrt의 일부 버전에서는 cURL/libcurl이 프록시 지원 없이 컴파일되어 " +"있습니다." #: applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js:962 msgid "Info" @@ -353,6 +356,8 @@ msgid "" "Install 'bind-host' or 'knot-host' or 'drill' package if you know you need " "TCP for DNS requests." msgstr "" +"DNS 요청에 TCP가 필요한 경우 'bind-host' 또는 'knot-host' 또는 'drill' " +"패키지를 설치하세요." #: applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js:386 msgid "" @@ -415,7 +420,7 @@ msgstr "조회 호스트 이름" #: applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js:805 msgid "Method used to determine the system IP-Address to send in updates" -msgstr "" +msgstr "업데이트 시 전송할 시스템 IP 주소를 결정하는 데 사용할 방식입니다" #: applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js:491 #: applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js:1123 @@ -427,20 +432,20 @@ msgid "" "Neither GNU Wget with SSL nor cURL is installed to select a network to use " "for communication." msgstr "" -"통신에 사용할 네트워크를 선택하기 위한, SSL이 포함된 GNU Wget이나 cURL이 설치" -"되어 있지 않습니다." +"통신에 사용할 네트워크를 선택하기 위한, SSL 지원 GNU Wget 또는 cURL이 " +"설치되어 있지 않습니다." #: applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js:321 msgid "" "Neither GNU Wget with SSL nor cURL is installed to support secure updates " "via HTTPS protocol." msgstr "" -"HTTPS 프로토콜을 통한 보안 업데이트를 지원하기 위한, SSL 포함 GNU Wget이나 " +"HTTPS 프로토콜을 통한 보안 업데이트를 지원하는, SSL 지원 GNU Wget 또는 " "cURL이 설치되어 있지 않습니다." #: applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js:613 msgid "Neither from LuCI interface nor from console." -msgstr "LuCI 인터페이스도 콘솔에서도 마찬가지로 안 됩니다." +msgstr "LuCI 인터페이스나 콘솔을 통해서도 실행되지 않습니다." #: applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js:808 #: applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js:842 @@ -452,7 +457,7 @@ msgstr "네트워크" #: applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js:887 #: applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js:905 msgid "Network on which the ddns-updater scripts will be started" -msgstr "" +msgstr "ddns-updater 스크립트가 실행될 네트워크입니다" #: applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js:228 #: applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js:1148 @@ -488,7 +493,7 @@ msgstr "기록 안 함" #: applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js:393 msgid "Non-public and by default blocked IPs" -msgstr "" +msgstr "기본적으로 차단되는 비공인 IP" #: applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js:231 #: applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js:1120 @@ -501,7 +506,7 @@ msgstr "알림(Notice)" #: applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js:429 msgid "Number of last lines stored in log files" -msgstr "" +msgstr "로그 파일에 저장할 최근 로그 줄 수입니다" #: applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js:915 msgid "OPTIONAL: Force the usage of pure IPv4/IPv6 only communication." @@ -563,7 +568,7 @@ msgstr "CA 인증서 경로" #: applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js:312 msgid "" "Please follow the instructions on OpenWrt's homepage to enable IPv6 support" -msgstr "IPv6 지원을 활성화하려면 OpenWrt 홈페이지 상의 지침을 따르세요" +msgstr "IPv6 지원을 활성화하려면 OpenWrt 홈페이지의 안내를 따르세요" #: applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js:1085 msgid "Please press [Read] button" @@ -572,7 +577,7 @@ msgstr "[읽기] 버튼을 누르세요" #: applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js:717 #: applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js:739 msgid "Provide either an Update Script OR an Update URL" -msgstr "" +msgstr "업데이트 스크립트 또는 업데이트 URL 중 하나만 입력" #: applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js:1068 msgid "Read / Reread log file" @@ -666,6 +671,8 @@ msgid "" "Source URL for services file. Defaults to the master openwrt ddns package " "repo." msgstr "" +"서비스 파일의 원본 URL입니다. 기본값은 OpenWrt DDNS 패키지 저장소의 master " +"브랜치입니다." #: applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js:201 msgid "Start DDNS" @@ -681,7 +688,7 @@ msgstr "상태" #: applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js:410 msgid "Status directory" -msgstr "" +msgstr "상태 디렉터리" #: applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js:564 msgid "Stop" @@ -724,10 +731,12 @@ msgid "" "This is only a problem with multiple WAN interfaces and your DDNS provider " "is unreachable via one of them." msgstr "" +"이는 WAN 인터페이스가 여러 개 있고 그중 하나를 통해 DDNS 서비스에 접근할 수 " +"없는 경우에만 문제가 됩니다." #: applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js:1084 msgid "This is the current content of the log file in %h for this service." -msgstr "" +msgstr "이 서비스의 %h 내 로그 파일 현재 내용입니다." #: applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js:210 #: applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js:277 @@ -735,6 +744,8 @@ msgid "" "This is the default if you run DDNS scripts by yourself (i.e. via cron with " "force_interval set to '0')" msgstr "" +"이는 DDNS 스크립트를 별도로 실행하는 경우의 기본값입니다. (예: " +"force_interval을 '0'으로 설정한 cron을 통해)" #: applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js:892 msgid "This will be autoset to the selected interface" @@ -782,7 +793,7 @@ msgstr "cURL 사용" #: applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js:869 msgid "User defined script to read system IP-Address" -msgstr "" +msgstr "시스템 IP 주소를 읽어오는 사용자 정의 스크립트입니다" #: applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js:752 msgid "Username" @@ -790,7 +801,7 @@ msgstr "사용자 이름" #: applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js:371 msgid "Using specific DNS Server not supported" -msgstr "특정 DNS 서버 사용이 지원되지 않습니다." +msgstr "특정 DNS 서버 사용 미지원" #: applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js:989 msgid "Values below 5 minutes == 300 seconds are not supported" @@ -811,7 +822,7 @@ msgstr "경고(Warning)" #: applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js:504 #: applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js:628 msgid "Which record type to update at the DDNS provider (A/AAAA)" -msgstr "" +msgstr "DDNS 서비스에 갱신할 레코드 유형 (A/AAAA)입니다" #: applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js:1058 msgid "Which time units to use for retry counters." @@ -835,29 +846,33 @@ msgid "" "You should install 'bind-host' or 'knot-host' or 'drill' or 'hostip' " "package, if you need to specify a DNS server to detect your registered IP." msgstr "" +"등록된 IP를 감지하기 위해 DNS 서버를 지정해야 하는 경우 'bind-host' 또는 " +"'knot-host' 또는 'drill' 또는 'hostip' 패키지를 설치해야 합니다." #: applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js:323 msgid "" "You should install 'wget' or 'curl' or 'uclient-fetch' with 'libustream-" "*ssl' package." msgstr "" +"'wget' 또는 'curl'를 설치하거나, 'libustream-*ssl' 패키지와 함께 'uclient-" +"fetch'를 설치해야 합니다." #: applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js:337 msgid "You should install 'wget' or 'curl' package." -msgstr "" +msgstr "'wget' 또는 'curl' 패키지를 설치해야 합니다." #: applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js:351 msgid "" "You should install 'wget' or 'uclient-fetch' package or replace libcurl." -msgstr "" +msgstr "'wget' 또는 'uclient-fetch' 패키지를 설치하거나 libcurl을 교체해야 합니다." #: applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js:349 msgid "cURL is installed, but libcurl was compiled without proxy support." -msgstr "cURL이 설치되었지만, libcurl이 프록시 지원 없이 컴파일되었습니다." +msgstr "cURL이 설치되어 있지만, libcurl이 프록시 지원 없이 컴파일되었습니다." #: applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js:348 msgid "cURL without Proxy Support" -msgstr "" +msgstr "프록시 미지원 cURL" #: applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js:513 #: applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js:640 @@ -889,7 +904,7 @@ msgstr "또는" #: applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js:313 msgid "or update your system to the latest OpenWrt Release" -msgstr "" +msgstr "또는 시스템을 최신 OpenWrt 릴리스로 업데이트하세요" #: applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js:999 #: applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js:1061 diff --git a/luci-app-ddns/po/ru/ddns.po b/luci-app-ddns/po/ru/ddns.po index 922d13f5a..33ac9dd30 100644 --- a/luci-app-ddns/po/ru/ddns.po +++ b/luci-app-ddns/po/ru/ddns.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: LuCI: ddns\n" "POT-Creation-Date: 2017-10-17 21:00+0300\n" -"PO-Revision-Date: 2026-08-28 22:28+0000\n" +"PO-Revision-Date: 2026-10-01 12:16+0000\n" "Last-Translator: SnIPeRSnIPeR " "\n" "Language-Team: Russian =2 && " "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -"X-Generator: Weblate 2026.9.dev0\n" +"X-Generator: Weblate 2026.10.dev0\n" "Project-Info: Это технический перевод, не дословный. Главное-удобный русский " "интерфейс, все проверялось в графическом режиме, совместим с другими apps\n" @@ -795,7 +795,7 @@ msgstr "URL для обнаружения" #: applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js:1150 #: applications/luci-app-ddns/htdocs/luci-static/resources/view/status/include/70_ddns.js:38 msgid "Unknown" -msgstr "Неизвестный" +msgstr "Неизвестно" #: applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js:301 msgid "Update DDns Services List" diff --git a/luci-app-dockerman/po/bg/dockerman.po b/luci-app-dockerman/po/bg/dockerman.po index baa34582f..05c7f5fee 100644 --- a/luci-app-dockerman/po/bg/dockerman.po +++ b/luci-app-dockerman/po/bg/dockerman.po @@ -1,14 +1,14 @@ msgid "" msgstr "" -"PO-Revision-Date: 2026-03-15 08:27+0000\n" -"Last-Translator: Daniel Konstantinov \n" +"PO-Revision-Date: 2026-10-13 15:11+0000\n" +"Last-Translator: Pavel Borecki \n" "Language-Team: Bulgarian \n" "Language: bg\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 5.17-dev\n" +"X-Generator: Weblate 2026.11.dev0\n" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:505 msgid "/mnt/path" @@ -510,7 +510,7 @@ msgstr "" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:521 msgid "Devices" -msgstr "" +msgstr "Устройства" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:565 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:1059 @@ -1669,7 +1669,7 @@ msgstr "" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/events.js:249 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/network.js:62 msgid "Scope" -msgstr "" +msgstr "Обхват" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/events.js:91 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/events.js:336 diff --git a/luci-app-dockerman/po/da/dockerman.po b/luci-app-dockerman/po/da/dockerman.po index c0e7b6077..296a3cc1a 100644 --- a/luci-app-dockerman/po/da/dockerman.po +++ b/luci-app-dockerman/po/da/dockerman.po @@ -1,14 +1,14 @@ msgid "" msgstr "" -"PO-Revision-Date: 2022-11-25 14:34+0000\n" -"Last-Translator: drax red \n" +"PO-Revision-Date: 2026-10-05 13:33+0000\n" +"Last-Translator: Hosted Weblate user 168028 \n" "Language-Team: Danish \n" "Language: da\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.15-dev\n" +"X-Generator: Weblate 2026.10.1.dev0\n" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:505 msgid "/mnt/path" @@ -216,7 +216,7 @@ msgstr "" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:678 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/overview.js:169 msgid "CPUs" -msgstr "" +msgstr "CPU'er" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:1934 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:517 @@ -241,7 +241,7 @@ msgstr "" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:1189 msgid "Clear" -msgstr "" +msgstr "Ryd" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/images.js:617 msgid "Click to add a new tag to this image" @@ -316,7 +316,7 @@ msgstr "" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:1521 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:1533 msgid "Connected" -msgstr "" +msgstr "Forbundet" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:1063 msgid "Connected to container console" @@ -510,7 +510,7 @@ msgstr "" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:521 msgid "Devices" -msgstr "" +msgstr "Enheder" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:565 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:1059 @@ -531,7 +531,7 @@ msgstr "" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:1539 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:1558 msgid "Disconnected" -msgstr "" +msgstr "Afbrudt" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/images.js:536 msgid "Do you want to remove the tag \"%s\"?" @@ -625,7 +625,7 @@ msgstr "" #: applications/luci-app-dockerman/htdocs/luci-static/resources/dockerman/common.js:422 msgid "Edit" -msgstr "" +msgstr "Rediger" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:315 msgid "Edit Mount" @@ -733,7 +733,7 @@ msgstr "" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/overview.js:90 msgid "Failed to execute \"/etc/init.d/%s %s\" action: %s" -msgstr "" +msgstr "Fejl i udførelsen af \"/etc/init.d/%s %s %s\" handling: %s" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/events.js:321 msgid "Failed to load events: %s" @@ -1095,11 +1095,11 @@ msgstr "" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:1159 msgid "Logs" -msgstr "" +msgstr "Log ind" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:582 msgid "MAC Address" -msgstr "" +msgstr "MAC-adresse" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/network_new.js:44 msgid "MAC VLAN" @@ -1275,7 +1275,7 @@ msgstr "" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:679 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:249 msgid "No" -msgstr "" +msgstr "Nej" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:1878 msgid "No additional networks available to connect" @@ -1419,7 +1419,7 @@ msgstr "" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/configuration.js:120 msgid "Password" -msgstr "" +msgstr "Adgangskode" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:896 msgid "Path" @@ -1648,7 +1648,7 @@ msgstr "" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/containers.js:84 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/containers.js:141 msgid "Running" -msgstr "" +msgstr "Running" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:833 msgid "Running Processes" @@ -1669,7 +1669,7 @@ msgstr "" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/events.js:249 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/network.js:62 msgid "Scope" -msgstr "" +msgstr "Omfang" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/events.js:91 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/events.js:336 @@ -1744,7 +1744,7 @@ msgstr "" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:721 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:840 msgid "Status" -msgstr "Status" +msgstr "Statusstatus" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:1109 msgid "Stderr" @@ -1914,7 +1914,7 @@ msgstr "" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/volumes.js:45 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/volumes.js:111 msgid "Total" -msgstr "" +msgstr "Total" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/overview.js:170 msgid "Total Memory" @@ -2021,7 +2021,7 @@ msgstr "" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/overview.js:240 msgid "Version" -msgstr "" +msgstr "Version" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:374 msgid "Volume (named)" @@ -2059,7 +2059,7 @@ msgstr "" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:679 msgid "Yes" -msgstr "" +msgstr "Ja" #: applications/luci-app-dockerman/htdocs/luci-static/resources/dockerman/common.js:323 msgid "attach" diff --git a/luci-app-dockerman/po/el/dockerman.po b/luci-app-dockerman/po/el/dockerman.po index 955bca0b7..c0fa70ef8 100644 --- a/luci-app-dockerman/po/el/dockerman.po +++ b/luci-app-dockerman/po/el/dockerman.po @@ -1,14 +1,14 @@ msgid "" msgstr "" -"PO-Revision-Date: 2025-05-03 17:07+0000\n" -"Last-Translator: george kitsoukakis \n" +"PO-Revision-Date: 2026-10-13 15:11+0000\n" +"Last-Translator: Pavel Borecki \n" "Language-Team: Greek \n" "Language: el\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 5.12-dev\n" +"X-Generator: Weblate 2026.11.dev0\n" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:505 msgid "/mnt/path" @@ -109,7 +109,7 @@ msgstr "" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/overview.js:139 msgid "Available" -msgstr "" +msgstr "Διαθέσιμο" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:431 msgid "Back to Containers" @@ -510,7 +510,7 @@ msgstr "" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:521 msgid "Devices" -msgstr "" +msgstr "Συσκευές" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:565 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:1059 diff --git a/luci-app-dockerman/po/es/dockerman.po b/luci-app-dockerman/po/es/dockerman.po index 393056f1a..7663d5ab9 100644 --- a/luci-app-dockerman/po/es/dockerman.po +++ b/luci-app-dockerman/po/es/dockerman.po @@ -1,6 +1,6 @@ msgid "" msgstr "" -"PO-Revision-Date: 2026-09-28 18:23+0000\n" +"PO-Revision-Date: 2026-10-01 12:16+0000\n" "Last-Translator: Franco Castillo \n" "Language-Team: Spanish \n" @@ -2030,7 +2030,7 @@ msgstr "Actualizado" #: applications/luci-app-dockerman/htdocs/luci-static/resources/dockerman/common.js:428 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:948 msgid "Upload" -msgstr "Carga" +msgstr "Cargar" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:1610 msgid "Uploading file to container…" diff --git a/luci-app-dockerman/po/fa/dockerman.po b/luci-app-dockerman/po/fa/dockerman.po index 79cd71226..6f84da313 100644 --- a/luci-app-dockerman/po/fa/dockerman.po +++ b/luci-app-dockerman/po/fa/dockerman.po @@ -1,14 +1,14 @@ msgid "" msgstr "" -"PO-Revision-Date: 2025-12-20 14:35+0000\n" -"Last-Translator: Ashkan Azoun \n" +"PO-Revision-Date: 2026-10-13 21:56+0000\n" +"Last-Translator: Pavel Borecki \n" "Language-Team: Persian \n" "Language: fa\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 5.15.1\n" +"X-Generator: Weblate 2026.11.dev0\n" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:505 msgid "/mnt/path" @@ -516,7 +516,7 @@ msgstr "دستگاه(--device)" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:521 msgid "Devices" -msgstr "" +msgstr "افزاره‌ها" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:565 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:1059 @@ -1681,7 +1681,7 @@ msgstr "" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/events.js:249 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/network.js:62 msgid "Scope" -msgstr "" +msgstr "محدوده" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/events.js:91 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/events.js:336 diff --git a/luci-app-dockerman/po/fi/dockerman.po b/luci-app-dockerman/po/fi/dockerman.po index 577e7c55a..91bd79dde 100644 --- a/luci-app-dockerman/po/fi/dockerman.po +++ b/luci-app-dockerman/po/fi/dockerman.po @@ -1,14 +1,14 @@ msgid "" msgstr "" -"PO-Revision-Date: 2025-07-24 15:20+0000\n" -"Last-Translator: Ricky Tigg \n" +"PO-Revision-Date: 2026-10-13 21:56+0000\n" +"Last-Translator: Pavel Borecki \n" "Language-Team: Finnish \n" "Language: fi\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 5.13-dev\n" +"X-Generator: Weblate 2026.11.dev0\n" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:505 msgid "/mnt/path" @@ -510,7 +510,7 @@ msgstr "" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:521 msgid "Devices" -msgstr "" +msgstr "Laitteet" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:565 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:1059 @@ -625,7 +625,7 @@ msgstr "" #: applications/luci-app-dockerman/htdocs/luci-static/resources/dockerman/common.js:422 msgid "Edit" -msgstr "" +msgstr "Muokkaa" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:315 msgid "Edit Mount" @@ -733,7 +733,7 @@ msgstr "" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/overview.js:90 msgid "Failed to execute \"/etc/init.d/%s %s\" action: %s" -msgstr "" +msgstr "Komento \"/etc/init.d/%s %s\" epäonnistui: %s" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/events.js:321 msgid "Failed to load events: %s" @@ -1099,7 +1099,7 @@ msgstr "Lokitiedot" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:582 msgid "MAC Address" -msgstr "" +msgstr "MAC-osoite" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/network_new.js:44 msgid "MAC VLAN" @@ -1107,7 +1107,7 @@ msgstr "" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/network.js:122 msgid "Mac Address" -msgstr "" +msgstr "MAC-osoite" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:341 msgid "Manage and view container configuration" @@ -1419,7 +1419,7 @@ msgstr "" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/configuration.js:120 msgid "Password" -msgstr "" +msgstr "Salasana" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:896 msgid "Path" @@ -1669,7 +1669,7 @@ msgstr "" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/events.js:249 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/network.js:62 msgid "Scope" -msgstr "" +msgstr "Laajuus" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/events.js:91 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/events.js:336 diff --git a/luci-app-dockerman/po/fr/dockerman.po b/luci-app-dockerman/po/fr/dockerman.po index 9799a276b..5e94ee8cd 100644 --- a/luci-app-dockerman/po/fr/dockerman.po +++ b/luci-app-dockerman/po/fr/dockerman.po @@ -1,14 +1,14 @@ msgid "" msgstr "" -"PO-Revision-Date: 2026-05-02 12:03+0000\n" -"Last-Translator: sllk \n" +"PO-Revision-Date: 2026-10-13 21:56+0000\n" +"Last-Translator: Pavel Borecki \n" "Language-Team: French \n" "Language: fr\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 5.17.1\n" +"X-Generator: Weblate 2026.11.dev0\n" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:505 msgid "/mnt/path" @@ -519,7 +519,7 @@ msgstr "Périphérique(--périphérique)" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:521 msgid "Devices" -msgstr "" +msgstr "Appareils" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:565 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:1059 @@ -742,7 +742,7 @@ msgstr "" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/overview.js:90 msgid "Failed to execute \"/etc/init.d/%s %s\" action: %s" -msgstr "" +msgstr "Impossible d'exécuter l'action \"/etc/init.d/%s %s\" action : %s" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/events.js:321 msgid "Failed to load events: %s" @@ -1688,7 +1688,7 @@ msgstr "" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/events.js:249 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/network.js:62 msgid "Scope" -msgstr "" +msgstr "Portée" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/events.js:91 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/events.js:336 diff --git a/luci-app-dockerman/po/hu/dockerman.po b/luci-app-dockerman/po/hu/dockerman.po index 159ee927e..af0846aea 100644 --- a/luci-app-dockerman/po/hu/dockerman.po +++ b/luci-app-dockerman/po/hu/dockerman.po @@ -1,14 +1,14 @@ msgid "" msgstr "" -"PO-Revision-Date: 2026-03-08 17:31+0000\n" -"Last-Translator: hmzs \n" +"PO-Revision-Date: 2026-10-13 21:56+0000\n" +"Last-Translator: Pavel Borecki \n" "Language-Team: Hungarian \n" "Language: hu\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 5.17-dev\n" +"X-Generator: Weblate 2026.11.dev0\n" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:505 msgid "/mnt/path" @@ -510,7 +510,7 @@ msgstr "" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:521 msgid "Devices" -msgstr "" +msgstr "Eszközök" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:565 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:1059 @@ -733,7 +733,7 @@ msgstr "" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/overview.js:90 msgid "Failed to execute \"/etc/init.d/%s %s\" action: %s" -msgstr "" +msgstr "Nem sikerült végrehajtani az „/etc/init.d/%s %s” műveletet: %s" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/events.js:321 msgid "Failed to load events: %s" @@ -1670,7 +1670,7 @@ msgstr "" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/events.js:249 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/network.js:62 msgid "Scope" -msgstr "" +msgstr "Hatókör" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/events.js:91 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/events.js:336 diff --git a/luci-app-dockerman/po/it/dockerman.po b/luci-app-dockerman/po/it/dockerman.po index e330888a5..e870dc3bc 100644 --- a/luci-app-dockerman/po/it/dockerman.po +++ b/luci-app-dockerman/po/it/dockerman.po @@ -1,14 +1,14 @@ msgid "" msgstr "" -"PO-Revision-Date: 2026-05-26 15:21+0000\n" -"Last-Translator: Stefano Mora \n" +"PO-Revision-Date: 2026-10-13 21:56+0000\n" +"Last-Translator: Pavel Borecki \n" "Language-Team: Italian \n" "Language: it\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 2026.6.dev0\n" +"X-Generator: Weblate 2026.11.dev0\n" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:505 msgid "/mnt/path" @@ -1674,7 +1674,7 @@ msgstr "" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/events.js:249 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/network.js:62 msgid "Scope" -msgstr "" +msgstr "Ambito di applicazione" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/events.js:91 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/events.js:336 diff --git a/luci-app-dockerman/po/ja/dockerman.po b/luci-app-dockerman/po/ja/dockerman.po index 52d4c2918..95c3de7b4 100644 --- a/luci-app-dockerman/po/ja/dockerman.po +++ b/luci-app-dockerman/po/ja/dockerman.po @@ -1,6 +1,6 @@ msgid "" msgstr "" -"PO-Revision-Date: 2026-08-05 02:03+0000\n" +"PO-Revision-Date: 2026-10-18 16:40+0000\n" "Last-Translator: Monarch " "\n" "Language-Team: Japanese Docker endpoint API support." msgstr "" +"選択した API が Docker エンドポイントのサポートする API より新しい場合は" +"エラーになります。" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:890 msgid "Changes" -msgstr "" +msgstr "変更" #: applications/luci-app-dockerman/htdocs/luci-static/resources/dockerman/common.js:420 msgid "Clean" -msgstr "" +msgstr "クリーン" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/images.js:257 msgid "Cleaned build cache" -msgstr "" +msgstr "ビルドキャッシュを削除しました" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:1189 msgid "Clear" -msgstr "" +msgstr "クリア" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/images.js:617 msgid "Click to add a new tag to this image" -msgstr "" +msgstr "クリックしてこのイメージに新しいタグを追加" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/images.js:531 msgid "Click to remove this tag" -msgstr "" +msgstr "クリックしてこのタグを削除" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/networks.js:213 msgid "Click to view this network" -msgstr "" +msgstr "クリックしてこのネットワークを表示" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/configuration.js:81 msgid "Client connection" @@ -267,29 +273,29 @@ msgstr "コマンド" #: applications/luci-app-dockerman/htdocs/luci-static/resources/dockerman/common.js:1152 msgid "Command cancelled" -msgstr "" +msgstr "コマンドをキャンセルしました" #: applications/luci-app-dockerman/htdocs/luci-static/resources/dockerman/common.js:1131 #: applications/luci-app-dockerman/htdocs/luci-static/resources/dockerman/common.js:1142 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/overview.js:86 msgid "Command failed" -msgstr "" +msgstr "コマンドが失敗しました" #: applications/luci-app-dockerman/htdocs/luci-static/resources/dockerman/common.js:1119 msgid "Command successful" -msgstr "" +msgstr "コマンドが成功しました" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:1020 msgid "Command:" -msgstr "" +msgstr "コマンド:" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/network.js:80 msgid "Config Only" -msgstr "" +msgstr "設定のみ" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/network.js:76 msgid "ConfigFrom" -msgstr "" +msgstr "設定元" #: applications/luci-app-dockerman/root/usr/share/luci/menu.d/luci-app-dockerman.json:31 msgid "Configuration" @@ -312,20 +318,20 @@ msgstr "ネットワークに接続" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:1964 msgid "Connect network" -msgstr "" +msgstr "ネットワークに接続" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:1521 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:1533 msgid "Connected" -msgstr "" +msgstr "接続済み" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:1063 msgid "Connected to container console" -msgstr "" +msgstr "コンテナのコンソールに接続しました" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:1406 msgid "Connecting…" -msgstr "" +msgstr "接続中…" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:1006 msgid "Console" @@ -333,34 +339,34 @@ msgstr "コンソール" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:1008 msgid "Console Connection" -msgstr "" +msgstr "コンソール接続" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:1523 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:1774 msgid "Console connected" -msgstr "" +msgstr "コンソールに接続しました" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:1516 msgid "Console connection closed" -msgstr "" +msgstr "コンソール接続が閉じられました" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:1560 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:1795 msgid "Console disconnected" -msgstr "" +msgstr "コンソールが切断されました" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:1580 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:1595 msgid "Console is not connected" -msgstr "" +msgstr "コンソールが接続されていません" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/containers.js:160 msgid "Container" -msgstr "" +msgstr "コンテナ" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:976 msgid "Container Inspect" -msgstr "" +msgstr "コンテナの詳細情報" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:1201 msgid "Container Logs" @@ -372,11 +378,11 @@ msgstr "コンテナ名" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:826 msgid "Container Statistics" -msgstr "" +msgstr "コンテナの統計" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:985 msgid "Container created" -msgstr "" +msgstr "コンテナを作成しました" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:446 msgid "Container detail" @@ -384,34 +390,34 @@ msgstr "コンテナの詳細" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:985 msgid "Container duplicated" -msgstr "" +msgstr "コンテナを複製しました" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:714 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:721 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:840 msgid "Container is not running" -msgstr "" +msgstr "コンテナが実行されていません" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:1094 msgid "Container is not running. Cannot connect to WebSocket console." -msgstr "" +msgstr "コンテナが実行されていません。WebSocket コンソールに接続できません。" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:1015 msgid "Container is not running. Cannot connect to console." -msgstr "" +msgstr "コンテナが実行されていません。コンソールに接続できません。" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:1386 msgid "Container rename" -msgstr "" +msgstr "コンテナ名の変更" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:1394 msgid "Container rename failed" -msgstr "" +msgstr "コンテナ名の変更に失敗しました" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:1355 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:1371 msgid "Container update failed" -msgstr "" +msgstr "コンテナの更新に失敗しました" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/images.js:577 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/network.js:84 @@ -425,35 +431,35 @@ msgstr "コンテナ" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/containers.js:100 msgid "Containers overview" -msgstr "" +msgstr "コンテナの概要" #: applications/luci-app-dockerman/htdocs/luci-static/resources/dockerman/common.js:421 msgid "Create" -msgstr "" +msgstr "作成" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:979 msgid "Create container" -msgstr "" +msgstr "コンテナを作成" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:1000 msgid "Create container failed" -msgstr "" +msgstr "コンテナの作成に失敗しました" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/network_new.js:234 msgid "Create network" -msgstr "" +msgstr "ネットワークを作成" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/network_new.js:249 msgid "Create network failed" -msgstr "" +msgstr "ネットワークの作成に失敗しました" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:63 msgid "Create new docker container" -msgstr "" +msgstr "新しい Docker コンテナを作成" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/network_new.js:30 msgid "Create new docker network" -msgstr "" +msgstr "新しい Docker ネットワークを作成" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:467 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/containers.js:168 @@ -461,7 +467,7 @@ msgstr "" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/network.js:61 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/volumes.js:267 msgid "Created" -msgstr "" +msgstr "作成日時" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:535 msgid "DNS" @@ -469,7 +475,7 @@ msgstr "DNS" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:588 msgid "DNS Names" -msgstr "" +msgstr "DNS 名" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/configuration.js:73 msgid "Debug" @@ -477,7 +483,7 @@ msgstr "デバッグ" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:753 msgid "Default (daemon)" -msgstr "" +msgstr "デフォルト (デーモン)" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/configuration.js:57 msgid "Default bridge" @@ -485,25 +491,27 @@ msgstr "デフォルトのブリッジ" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/configuration.js:26 msgid "Default ps flags" -msgstr "" +msgstr "デフォルトの ps フラグ" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:606 msgid "Delete this volume mount" -msgstr "" +msgstr "このボリュームマウントを削除" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/configuration.js:104 msgid "" "Destinations prefixed with a Registry host matching an entry in this table " "invoke its corresponding credentials." msgstr "" +"レジストリホストがこの表のエントリと一致する宛先には、対応する認証情報が使用" +"されます。" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:1589 msgid "Detach signal sent (Ctrl+D)" -msgstr "" +msgstr "デタッチシグナルを送信しました (Ctrl+D)" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/network.js:96 msgid "Detail" -msgstr "" +msgstr "詳細" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:654 msgid "Device(--device)" @@ -511,7 +519,7 @@ msgstr "デバイス(--device)" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:521 msgid "Devices" -msgstr "" +msgstr "デバイス" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:565 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:1059 @@ -521,60 +529,60 @@ msgstr "切断" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:1863 msgid "Disconnect network" -msgstr "" +msgstr "ネットワークを切断" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:1853 msgid "Disconnect network \"%s\" from container?" -msgstr "" +msgstr "コンテナからネットワーク \"%s\" を切断しますか?" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:1125 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:1509 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:1539 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:1558 msgid "Disconnected" -msgstr "" +msgstr "切断済み" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/images.js:536 msgid "Do you want to remove the tag \"%s\"?" -msgstr "" +msgstr "タグ \"%s\" を削除しますか?" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/configuration.js:16 msgid "Docker - Configuration" -msgstr "" +msgstr "Docker - 設定" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:336 msgid "Docker - Container" -msgstr "" +msgstr "Docker - コンテナ" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:201 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/containers.js:49 msgid "Docker - Containers" -msgstr "" +msgstr "Docker - コンテナ" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/events.js:54 msgid "Docker - Events" -msgstr "" +msgstr "Docker - イベント" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/images.js:36 msgid "Docker - Images" -msgstr "" +msgstr "Docker - イメージ" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/network.js:44 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/networks.js:57 msgid "Docker - Networks" -msgstr "" +msgstr "Docker - ネットワーク" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/network_new.js:26 msgid "Docker - New Network" -msgstr "" +msgstr "Docker - 新規ネットワーク" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/overview.js:144 msgid "Docker - Overview" -msgstr "" +msgstr "Docker - 概要" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/volumes.js:56 msgid "Docker - Volumes" -msgstr "" +msgstr "Docker - ボリューム" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:228 msgid "Docker Image" @@ -583,7 +591,7 @@ msgstr "Docker イメージ" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/configuration.js:49 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/overview.js:171 msgid "Docker Root Dir" -msgstr "" +msgstr "Docker ルートディレクトリ" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/overview.js:167 msgid "Docker Version" @@ -591,11 +599,11 @@ msgstr "Docker バージョン" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/configuration.js:17 msgid "DockerMan is a simple docker manager client for LuCI" -msgstr "" +msgstr "DockerMan は LuCI 用のシンプルな Docker 管理クライアントです" #: applications/luci-app-dockerman/root/usr/share/luci/menu.d/luci-app-dockerman.json:3 msgid "Dockerman JS" -msgstr "" +msgstr "Dockerman JS" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:953 msgid "Download" @@ -603,7 +611,7 @@ msgstr "ダウンロード" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/images.js:276 msgid "Download a valid remote image tar." -msgstr "" +msgstr "有効なリモートイメージの tar をダウンロードします。" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/network.js:63 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/network_new.js:41 @@ -614,27 +622,27 @@ msgstr "ドライバ" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:687 msgid "Dropped Capabilities" -msgstr "" +msgstr "削除されたケーパビリティ" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:407 msgid "Duplicate/Edit" -msgstr "" +msgstr "複製/編集" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:66 msgid "Duplicate/Edit Container: %s" -msgstr "" +msgstr "コンテナの複製/編集: %s" #: applications/luci-app-dockerman/htdocs/luci-static/resources/dockerman/common.js:422 msgid "Edit" -msgstr "" +msgstr "編集" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:315 msgid "Edit Mount" -msgstr "" +msgstr "マウントを編集" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/containers.js:196 msgid "Edit this container" -msgstr "" +msgstr "このコンテナを編集" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/network_new.js:122 msgid "Enable IPv6" @@ -642,19 +650,19 @@ msgstr "IPv6 を有効化" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/images.js:623 msgid "Enter a new tag for image %s:" -msgstr "" +msgstr "イメージ %s の新しいタグを入力してください:" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/volumes.js:119 msgid "Enter an optional name and labels for the new volume" -msgstr "" +msgstr "新しいボリュームの名前とラベルを入力してください (任意)" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:397 msgid "Enter volume name or pick existing" -msgstr "" +msgstr "ボリューム名を入力するか、既存のものを選択してください" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/overview.js:250 msgid "Entry" -msgstr "" +msgstr "エントリー" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:500 msgid "Env" @@ -662,7 +670,7 @@ msgstr "環境" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/overview.js:246 msgid "Environment" -msgstr "" +msgstr "環境" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:300 msgid "Environmental Variable(-e)" @@ -693,7 +701,7 @@ msgstr "エラー" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:1682 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:1696 msgid "Error loading logs:" -msgstr "" +msgstr "ログの読み込みエラー:" #: applications/luci-app-dockerman/root/usr/share/luci/menu.d/luci-app-dockerman.json:392 msgid "Events" @@ -701,11 +709,11 @@ msgstr "イベント" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/configuration.js:65 msgid "Example:" -msgstr "" +msgstr "例:" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/configuration.js:84 msgid "Example: tcp://0.0.0.0:2375" -msgstr "" +msgstr "例: tcp://0.0.0.0:2375" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/network_new.js:118 msgid "Exclude IPs" @@ -714,52 +722,52 @@ msgstr "IP を除外" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:417 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/images.js:386 msgid "Export" -msgstr "" +msgstr "エクスポート" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/containers.js:273 msgid "Export this container" -msgstr "" +msgstr "このコンテナをエクスポート" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:646 msgid "Exposed All Ports(-P)" -msgstr "" +msgstr "全ポートを公開(-P)" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:625 msgid "Exposed Ports(-p)" -msgstr "" +msgstr "公開ポート(-p)" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:1779 msgid "Failed to connect to console" -msgstr "" +msgstr "コンソールへの接続に失敗しました" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/overview.js:90 msgid "Failed to execute \"/etc/init.d/%s %s\" action: %s" -msgstr "" +msgstr "\"/etc/init.d/%s %s\"の実行に失敗しました: %s" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/events.js:321 msgid "Failed to load events: %s" -msgstr "" +msgstr "イベントの読み込みに失敗しました: %s" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:1684 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:1695 msgid "Failed to load logs" -msgstr "" +msgstr "ログの読み込みに失敗しました" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/volumes.js:25 msgid "Failed to load volumes" -msgstr "" +msgstr "ボリュームの読み込みに失敗しました" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:1577 msgid "Failed to send data" -msgstr "" +msgstr "データの送信に失敗しました" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:1592 msgid "Failed to send detach signal" -msgstr "" +msgstr "デタッチシグナルの送信に失敗しました" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:1731 msgid "Failed to start console" -msgstr "" +msgstr "コンソールの起動に失敗しました" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/configuration.js:77 msgid "Fatal" @@ -771,11 +779,11 @@ msgstr "ファイル" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:1611 msgid "File uploaded to" -msgstr "" +msgstr "ファイルのアップロード先" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:893 msgid "Filesystem Changes" -msgstr "" +msgstr "ファイルシステムの変更" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:469 msgid "Finish Time" @@ -785,10 +793,12 @@ msgstr "終了時間" msgid "" "Flags passed to docker top (ps). Leave empty to use the built-in default." msgstr "" +"docker top (ps) に渡すフラグです。空欄にすると組み込みのデフォルトを使用しま" +"す。" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/configuration.js:50 msgid "For local dockerd socket instances only." -msgstr "" +msgstr "ローカルの dockerd ソケットインスタンスのみ。" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/containers.js:301 msgid "Force Remove" @@ -796,17 +806,17 @@ msgstr "強制削除" #: applications/luci-app-dockerman/htdocs/luci-static/resources/dockerman/common.js:423 msgid "Force remove" -msgstr "" +msgstr "強制削除" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:1314 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:771 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/network_new.js:153 msgid "Form is not ready yet." -msgstr "" +msgstr "フォームの準備がまだできていません。" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/events.js:96 msgid "From" -msgstr "" +msgstr "開始日時" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:584 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/network.js:105 @@ -817,7 +827,7 @@ msgstr "ゲートウェイ" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:580 msgid "Global IPv6 Address" -msgstr "" +msgstr "グローバル IPv6 アドレス" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/configuration.js:21 msgid "Global settings" @@ -825,7 +835,7 @@ msgstr "グローバル設定" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/configuration.js:23 msgid "Globals" -msgstr "" +msgstr "グローバル" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/overview.js:262 msgid "Go to relevant configuration page" @@ -837,15 +847,15 @@ msgstr "luci-app-dockermanにUCIアクセスを許可" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:476 msgid "Health Status" -msgstr "" +msgstr "ヘルス状態" #: applications/luci-app-dockerman/htdocs/luci-static/resources/dockerman/common.js:424 msgid "History" -msgstr "" +msgstr "履歴" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:448 msgid "Host Directory" -msgstr "" +msgstr "ホストディレクトリ" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:489 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:640 @@ -870,7 +880,7 @@ msgstr "IP 範囲" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/network.js:98 msgid "IPAM Driver" -msgstr "" +msgstr "IPAM ドライバ" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:576 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:267 @@ -880,21 +890,21 @@ msgstr "IPv4 アドレス" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:1920 msgid "IPv4 Address (optional):" -msgstr "" +msgstr "IPv4 アドレス (任意):" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/network.js:64 msgid "IPv6" -msgstr "" +msgstr "IPv6" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:578 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:272 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/network.js:129 msgid "IPv6 Address" -msgstr "" +msgstr "IPv6 アドレス" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:1922 msgid "IPv6 Address (optional):" -msgstr "" +msgstr "IPv6 アドレス (任意):" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:586 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/network_new.js:134 @@ -903,7 +913,7 @@ msgstr "IPv6 ゲートウェイ" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:277 msgid "IPv6 Link-Local Address" -msgstr "" +msgstr "IPv6 リンクローカルアドレス" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/network_new.js:128 msgid "IPv6 Subnet" @@ -915,24 +925,24 @@ msgstr "イメージ" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:375 msgid "Image (from image)" -msgstr "" +msgstr "イメージ (イメージから)" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:462 msgid "Image ID" -msgstr "" +msgstr "イメージ ID" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/images.js:113 msgid "Image create completed" -msgstr "" +msgstr "イメージの作成が完了しました" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/images.js:231 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/images.js:699 msgid "Image loaded successfully" -msgstr "" +msgstr "イメージを読み込みました" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/images.js:188 msgid "Image push completed" -msgstr "" +msgstr "イメージのプッシュが完了しました" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/overview.js:199 #: applications/luci-app-dockerman/root/usr/share/luci/menu.d/luci-app-dockerman.json:237 @@ -951,15 +961,15 @@ msgstr "インポート" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/overview.js:212 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/overview.js:222 msgid "In Use:" -msgstr "" +msgstr "使用中:" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:1113 msgid "Include logs" -msgstr "" +msgstr "ログを含める" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/overview.js:172 msgid "Index Server Address" -msgstr "" +msgstr "インデックスサーバーのアドレス" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/configuration.js:74 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:453 @@ -982,6 +992,8 @@ msgstr "イングレス" msgid "" "Ingress network is the network which provides the routing-mesh in swarm mode" msgstr "" +"イングレスネットワークは、Swarm モードでルーティングメッシュを提供する" +"ネットワークです" #: applications/luci-app-dockerman/htdocs/luci-static/resources/dockerman/common.js:425 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:958 @@ -989,11 +1001,11 @@ msgstr "" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:992 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/network.js:134 msgid "Inspect" -msgstr "" +msgstr "詳細確認" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:216 msgid "Interactive (-i)" -msgstr "" +msgstr "インタラクティブ (-i)" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/network.js:67 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/network_new.js:88 @@ -1007,7 +1019,7 @@ msgstr "ipvlan モード" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/configuration.js:64 msgid "" "It replaces the daemon registry mirrors with a new set of registry mirrors" -msgstr "" +msgstr "デーモンのレジストリミラーを新しいレジストリミラーのセットに置き換えます" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:382 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:1805 @@ -1016,11 +1028,11 @@ msgstr "強制終了" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/containers.js:261 msgid "Kill this container" -msgstr "" +msgstr "このコンテナを強制終了" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:896 msgid "Kind" -msgstr "" +msgstr "種類" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/network_new.js:68 msgid "L2 bridge" @@ -1032,7 +1044,7 @@ msgstr "L3 ブリッジ" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/configuration.js:94 msgid "LAN connection" -msgstr "" +msgstr "LAN 接続" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/network.js:92 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/network_new.js:84 @@ -1040,11 +1052,11 @@ msgstr "" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/volumes.js:132 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/volumes.js:243 msgid "Labels" -msgstr "" +msgstr "ラベル" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:1171 msgid "Lines to show:" -msgstr "" +msgstr "表示する行数:" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:514 msgid "Links" @@ -1056,27 +1068,27 @@ msgstr "他のコンテナとのリンク" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/events.js:309 msgid "Load Events" -msgstr "" +msgstr "イベントを読み込む" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:1184 msgid "Load Logs" -msgstr "" +msgstr "ログを読み込む" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:1677 msgid "Loading logs…" -msgstr "" +msgstr "ログを読み込み中…" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/configuration.js:34 msgid "Lock API endpoint to a specific version (helps guarantee behaviour)." -msgstr "" +msgstr "API エンドポイントを特定のバージョンに固定します (動作の保証に役立ちます)。" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:1163 msgid "Log Controls" -msgstr "" +msgstr "ログ操作" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:693 msgid "Log Driver" -msgstr "" +msgstr "ログドライバ" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/configuration.js:71 msgid "Log Level" @@ -1084,11 +1096,11 @@ msgstr "ログレベル" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:696 msgid "Log Options" -msgstr "" +msgstr "ログオプション" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:751 msgid "Log driver" -msgstr "" +msgstr "ログドライバ" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:745 msgid "Log driver options" @@ -1100,7 +1112,7 @@ msgstr "ログ" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:582 msgid "MAC Address" -msgstr "" +msgstr "MAC アドレス" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/network_new.js:44 msgid "MAC VLAN" @@ -1108,37 +1120,37 @@ msgstr "MAC ベース VLAN" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/network.js:122 msgid "Mac Address" -msgstr "" +msgstr "Mac アドレス" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:341 msgid "Manage and view container configuration" -msgstr "" +msgstr "コンテナの設定を管理・表示" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:739 msgid "Mem Stats" -msgstr "" +msgstr "メモリ統計" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:709 msgid "Memory" -msgstr "メモリ" +msgstr "メモリー" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:651 msgid "Memory + Swap" -msgstr "" +msgstr "メモリ + スワップ" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:635 msgid "Memory Limit" -msgstr "" +msgstr "メモリ制限" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:662 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:725 msgid "Memory Reservation" -msgstr "" +msgstr "メモリ予約" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:758 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:789 msgid "Memory Usage" -msgstr "" +msgstr "メモリ使用量" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:710 msgid "" @@ -1151,19 +1163,19 @@ msgstr "" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:762 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:793 msgid "Memory usage data unavailable" -msgstr "" +msgstr "メモリ使用量のデータがありません" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:803 msgid "Metric" -msgstr "" +msgstr "メトリック" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:697 msgid "Microseconds of CPU time that the container can get in a CPU period" -msgstr "" +msgstr "CPU 周期ごとにコンテナが使用できる CPU 時間 (マイクロ秒)" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:1658 msgid "Missing header or CORS interfering" -msgstr "" +msgstr "ヘッダーがないか、CORS が干渉しています" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:430 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/network_new.js:55 @@ -1172,7 +1184,7 @@ msgstr "モード" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:501 msgid "Mount Path" -msgstr "" +msgstr "マウントパス" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/volumes.js:254 msgid "Mount Point" @@ -1184,11 +1196,11 @@ msgstr "tmpfs ディレクトリをマウント" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:305 msgid "Mount(--mount)" -msgstr "" +msgstr "マウント(--mount)" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:549 msgid "Mounts/Binds" -msgstr "" +msgstr "マウント/バインド" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:455 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:567 @@ -1202,7 +1214,7 @@ msgstr "名前" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:213 msgid "Name of the container that can be selected during container creation" -msgstr "" +msgstr "コンテナ作成時に選択できるコンテナ名" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/network_new.js:38 msgid "Name of the network that can be selected during container creation" @@ -1210,15 +1222,15 @@ msgstr "ネットワーク名は、コンテナー作成中に選択できます #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:738 msgid "Net Stats" -msgstr "" +msgstr "ネットワーク統計" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:282 msgid "Network Aliases" -msgstr "" +msgstr "ネットワークエイリアス" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/network.js:100 msgid "Network Configurations" -msgstr "" +msgstr "ネットワーク設定" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/network.js:59 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/network_new.js:37 @@ -1227,23 +1239,23 @@ msgstr "ネットワーク名" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:1968 msgid "Network connected" -msgstr "" +msgstr "ネットワークに接続しました" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/network_new.js:242 msgid "Network created" -msgstr "" +msgstr "ネットワークを作成しました" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/network_new.js:240 msgid "Network created with warning" -msgstr "" +msgstr "ネットワークを作成しました (警告あり)" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:1867 msgid "Network disconnected" -msgstr "" +msgstr "ネットワークを切断しました" #: applications/luci-app-dockerman/htdocs/luci-static/resources/dockerman/common.js:1143 msgid "Network error" -msgstr "" +msgstr "ネットワークエラー" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:557 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:254 @@ -1256,15 +1268,15 @@ msgstr "ネットワーク" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/network.js:49 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/networks.js:62 msgid "Networks overview" -msgstr "" +msgstr "ネットワークの概要" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:987 msgid "New container duplicated from" -msgstr "" +msgstr "新しいコンテナの複製元" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:988 msgid "New container has been created." -msgstr "" +msgstr "新しいコンテナを作成しました。" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/images.js:622 msgid "New tag" @@ -1272,80 +1284,82 @@ msgstr "新規タグ" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/volumes.js:118 msgid "New volume" -msgstr "" +msgstr "新しいボリューム" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:484 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:679 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:249 msgid "No" -msgstr "" +msgstr "いいえ" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:1878 msgid "No additional networks available to connect" -msgstr "" +msgstr "接続できる追加のネットワークがありません" #: applications/luci-app-dockerman/htdocs/luci-static/resources/dockerman/common.js:877 msgid "No changes needed" -msgstr "" +msgstr "変更は不要です" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:348 msgid "No copy (nocopy)" -msgstr "" +msgstr "コピーしない (nocopy)" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/events.js:251 msgid "No events found" -msgstr "" +msgstr "イベントが見つかりません" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:898 msgid "No filesystem changes detected" -msgstr "" +msgstr "ファイルシステムの変更は検出されませんでした" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/images.js:161 msgid "No image tags available" -msgstr "" +msgstr "利用できるイメージタグがありません" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/images.js:386 msgid "No images selected" -msgstr "" +msgstr "イメージが選択されていません" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:1688 msgid "No logs available" -msgstr "" +msgstr "ログがありません" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:972 msgid "No name specified." -msgstr "" +msgstr "名前が指定されていません。" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:1946 msgid "No network selected" -msgstr "" +msgstr "ネットワークが選択されていません" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:855 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:1281 msgid "No processes running" -msgstr "" +msgstr "実行中のプロセスはありません" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:805 msgid "No statistics available" -msgstr "" +msgstr "統計情報がありません" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:614 msgid "No volumes available" -msgstr "" +msgstr "利用できるボリュームがありません" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/configuration.js:83 msgid "" "Note that dockerd no longer listens on IP:port without TLS options after v27." msgstr "" +"v27 以降、dockerd は TLS オプションなしでは IP:ポートで待ち受けないことに注意" +"してください。" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/containers.js:51 msgid "Note: docker provides no container import facility." -msgstr "" +msgstr "注: Docker にはコンテナをインポートする機能はありません。" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/events.js:116 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/events.js:151 msgid "Now" -msgstr "" +msgstr "現在" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:679 msgid "Number of CPUs. Number is a fractional number. 0.000 means no limit" @@ -1356,38 +1370,40 @@ msgstr "CPU 数。 数値は小数です。 0.000 は無制限を意味します #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:1363 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/network_new.js:242 msgid "OK" -msgstr "" +msgstr "OK" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:673 msgid "OOM Kill Disable" -msgstr "" +msgstr "OOM Kill を無効化" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:487 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:252 msgid "On failure" -msgstr "" +msgstr "失敗時" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/images.js:37 msgid "" "On this page all images are displayed that are available on the system and " "with which a container can be created." msgstr "" +"このページには、システム上で利用可能で、コンテナの作成に使用できるすべての" +"イメージが表示されます。" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:263 msgid "Only for user-defined networks" -msgstr "" +msgstr "ユーザー定義ネットワークのみ" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/containers.js:351 msgid "Open in browser" -msgstr "" +msgstr "ブラウザで開く" #: applications/luci-app-dockerman/htdocs/luci-static/resources/dockerman/common.js:899 msgid "Operation failed" -msgstr "" +msgstr "操作に失敗しました" #: applications/luci-app-dockerman/htdocs/luci-static/resources/dockerman/common.js:542 msgid "Operational Output" -msgstr "" +msgstr "実行結果の出力" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:466 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:495 @@ -1398,7 +1414,7 @@ msgstr "オプション" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/network_new.js:46 msgid "Overlay network" -msgstr "" +msgstr "オーバーレイネットワーク" #: applications/luci-app-dockerman/root/usr/share/luci/menu.d/luci-app-dockerman.json:19 msgid "Overview" @@ -1406,11 +1422,11 @@ msgstr "概要" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:847 msgid "PID" -msgstr "" +msgstr "PID" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:737 msgid "PID Stats" -msgstr "" +msgstr "PID 統計" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/networks.js:189 msgid "Parent Interface" @@ -1418,11 +1434,11 @@ msgstr "親インターフェース" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/network_new.js:62 msgid "Pass-through (Mirror physical device to single MAC VLAN)" -msgstr "" +msgstr "パススルー (物理デバイスを単一の MAC VLAN にミラー)" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/configuration.js:120 msgid "Password" -msgstr "" +msgstr "パスワード" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:896 msgid "Path" @@ -1433,67 +1449,67 @@ msgstr "パス" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:1664 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:1665 msgid "Path error" -msgstr "" +msgstr "パスエラー" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:936 msgid "Path:" -msgstr "" +msgstr "パス:" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:396 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:1806 msgid "Pause" -msgstr "" +msgstr "一時停止" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/containers.js:207 msgid "Pause this container" -msgstr "" +msgstr "このコンテナを一時停止" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/containers.js:86 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/containers.js:143 msgid "Paused" -msgstr "" +msgstr "一時停止中" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:742 msgid "Per CPU Stats" -msgstr "" +msgstr "CPU ごとの統計" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:550 msgid "Please choose a directory or enter a volume name" -msgstr "" +msgstr "ディレクトリを選択するか、ボリューム名を入力してください" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:555 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:563 msgid "Please enter a mount path" -msgstr "" +msgstr "マウントパスを入力してください" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:559 msgid "Please enter a subpath" -msgstr "" +msgstr "サブパスを入力してください" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/images.js:293 msgid "Please enter an image repo tag" -msgstr "" +msgstr "イメージのリポジトリタグを入力してください" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/images.js:299 msgid "Please enter an image source" -msgstr "" +msgstr "イメージのソースを入力してください" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/images.js:102 msgid "Please enter an image tag" -msgstr "" +msgstr "イメージタグを入力してください" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/images.js:176 msgid "Please select an image tag to push" -msgstr "" +msgstr "プッシュするイメージタグを選択してください" #: applications/luci-app-dockerman/htdocs/luci-static/resources/dockerman/common.js:1029 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:1622 msgid "Please specify a path" -msgstr "" +msgstr "パスを指定してください" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:1035 msgid "Port:" -msgstr "" +msgstr "ポート:" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:507 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/containers.js:164 @@ -1502,7 +1518,7 @@ msgstr "ポート" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/network_new.js:60 msgid "Private (Prevent communication between MAC VLANs)" -msgstr "" +msgstr "プライベート (MAC VLAN 同士の通信を禁止)" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:240 msgid "Privileged" @@ -1510,39 +1526,39 @@ msgstr "特権" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:678 msgid "Privileged Mode" -msgstr "" +msgstr "特権モード" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:830 msgid "Processes" -msgstr "" +msgstr "プロセス" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:337 msgid "Propagation: private" -msgstr "" +msgstr "伝播: private" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:338 msgid "Propagation: rprivate" -msgstr "" +msgstr "伝播: rprivate" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:340 msgid "Propagation: rshared" -msgstr "" +msgstr "伝播: rshared" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:342 msgid "Propagation: rslave" -msgstr "" +msgstr "伝播: rslave" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:339 msgid "Propagation: shared" -msgstr "" +msgstr "伝播: shared" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:341 msgid "Propagation: slave" -msgstr "" +msgstr "伝播: slave" #: applications/luci-app-dockerman/htdocs/luci-static/resources/dockerman/common.js:429 msgid "Prune" -msgstr "" +msgstr "不要データ削除" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:626 msgid "Publish container's port(s) to the host" @@ -1554,35 +1570,37 @@ msgstr "プル" #: applications/luci-app-dockerman/htdocs/luci-static/resources/dockerman/common.js:362 msgid "Push" -msgstr "" +msgstr "プッシュ" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/images.js:143 msgid "" "Push an image to a registry. Select an image tag from all available tags on " "the system." msgstr "" +"イメージをレジストリにプッシュします。システム上で利用可能なすべてのタグから" +"イメージタグを選択してください。" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:817 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:881 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:913 msgid "Raw JSON" -msgstr "" +msgstr "生の JSON" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:335 msgid "Read-only (ro)" -msgstr "" +msgstr "読み取り専用 (ro)" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:336 msgid "Read-write (rw)" -msgstr "" +msgstr "読み書き (rw)" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/configuration.js:125 msgid "Registry" -msgstr "" +msgstr "レジストリ" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/configuration.js:100 msgid "Registry Auth" -msgstr "" +msgstr "レジストリ認証" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/configuration.js:63 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/overview.js:173 @@ -1597,7 +1615,7 @@ msgstr "削除" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:1815 msgid "Remove container?" -msgstr "" +msgstr "コンテナを削除しますか?" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/images.js:535 msgid "Remove tag" @@ -1605,16 +1623,16 @@ msgstr "タグを削除" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/images.js:625 msgid "Repository" -msgstr "" +msgstr "リポジトリ" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/images.js:658 msgid "Repository cannot be empty" -msgstr "" +msgstr "リポジトリを空にすることはできません" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:755 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:787 msgid "Resource Usage" -msgstr "" +msgstr "リソース使用量" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:607 msgid "Resources" @@ -1629,7 +1647,7 @@ msgstr "再起動" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/overview.js:154 msgctxt "daemon restart action" msgid "Restart" -msgstr "" +msgstr "再起動" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:482 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:246 @@ -1638,7 +1656,7 @@ msgstr "再起動ポリシー" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/containers.js:238 msgid "Restart this container" -msgstr "" +msgstr "このコンテナを再起動" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/network_new.js:88 msgid "Restrict external access to the network" @@ -1651,50 +1669,50 @@ msgstr "コマンドを実行" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/containers.js:84 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/containers.js:141 msgid "Running" -msgstr "" +msgstr "実行中" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:833 msgid "Running Processes" -msgstr "" +msgstr "実行中のプロセス" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/overview.js:192 msgid "Running:" -msgstr "" +msgstr "実行中:" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:847 msgid "STAT" -msgstr "" +msgstr "STAT" #: applications/luci-app-dockerman/htdocs/luci-static/resources/dockerman/common.js:427 msgid "Save locally" -msgstr "" +msgstr "ローカルに保存" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/events.js:249 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/network.js:62 msgid "Scope" -msgstr "" +msgstr "スコープ" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/events.js:91 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/events.js:336 msgid "Select Type First" -msgstr "" +msgstr "先にタイプを選択してください" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/images.js:159 msgid "Select image tag" -msgstr "" +msgstr "イメージタグを選択" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:1918 msgid "Select network to connect:" -msgstr "" +msgstr "接続するネットワークを選択:" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:361 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:474 msgid "Select options..." -msgstr "" +msgstr "オプションを選択..." #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:1150 msgid "Send" -msgstr "" +msgstr "送信" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:291 msgid "Set custom DNS servers" @@ -1702,7 +1720,7 @@ msgstr "カスタム DNS サーバーを設定" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:301 msgid "Set environment variables inside the container" -msgstr "" +msgstr "コンテナ内の環境変数を設定" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/configuration.js:72 msgid "Set the logging level" @@ -1713,6 +1731,8 @@ msgid "" "Set your LAN interface when docker listens on all addresses like 0.0.0.0 " "or ::." msgstr "" +"Docker が 0.0.0.0 や :: などすべてのアドレスで待ち受ける場合は、LAN " +"インターフェースを設定してください。" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:423 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/images.js:599 @@ -1723,7 +1743,7 @@ msgstr "サイズ" msgid "" "Specifies where the Docker daemon will listen for client connections. " "default:" -msgstr "" +msgstr "Docker デーモンがクライアント接続を待ち受ける場所を指定します。デフォルト:" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:354 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:1802 @@ -1732,11 +1752,11 @@ msgstr "開始" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/containers.js:208 msgid "Start this container" -msgstr "" +msgstr "このコンテナを開始" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/containers.js:161 msgid "State" -msgstr "" +msgstr "状態" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:703 msgid "Stats" @@ -1751,15 +1771,15 @@ msgstr "状態" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:1109 msgid "Stderr" -msgstr "" +msgstr "Stderr" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:1101 msgid "Stdin" -msgstr "" +msgstr "Stdin" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:1105 msgid "Stdout" -msgstr "" +msgstr "Stdout" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:372 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:1804 @@ -1769,20 +1789,20 @@ msgstr "停止" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/overview.js:155 msgctxt "daemon stop action" msgid "Stop" -msgstr "" +msgstr "停止" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/containers.js:249 msgid "Stop this container" -msgstr "" +msgstr "このコンテナを停止" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/containers.js:88 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/containers.js:145 msgid "Stopped" -msgstr "" +msgstr "停止中" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:1098 msgid "Streams:" -msgstr "" +msgstr "ストリーム:" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/network.js:104 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/network_new.js:103 @@ -1792,24 +1812,24 @@ msgstr "サブネット" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:460 msgid "Subpath" -msgstr "" +msgstr "サブパス" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/events.js:81 msgid "Subtype" -msgstr "" +msgstr "サブタイプ" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:1523 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:1774 msgid "Success" -msgstr "" +msgstr "成功" #: applications/luci-app-dockerman/htdocs/luci-static/resources/dockerman/common.js:1012 msgid "Successful" -msgstr "" +msgstr "成功" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:542 msgid "Sysctl Settings" -msgstr "" +msgstr "Sysctl 設定" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:666 msgid "Sysctl(--sysctl)" @@ -1825,23 +1845,23 @@ msgstr "TTY (-t)" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:1764 msgid "TTYd may still be starting up" -msgstr "" +msgstr "TTYd がまだ起動中の可能性があります" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/images.js:635 msgid "Tag" -msgstr "" +msgstr "タグ" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/images.js:670 msgid "Tag added successfully" -msgstr "" +msgstr "タグを追加しました" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/images.js:554 msgid "Tag removed successfully" -msgstr "" +msgstr "タグを削除しました" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/configuration.js:105 msgid "The first match is used." -msgstr "" +msgstr "最初に一致したものが使用されます。" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:641 msgid "The hostname to use for the container" @@ -1849,7 +1869,7 @@ msgstr "コンテナに使用するホスト名" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:691 msgid "The length of a CPU period in microseconds" -msgstr "" +msgstr "CPU 周期の長さ (マイクロ秒)" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:746 msgid "The logging configuration for this container" @@ -1859,13 +1879,15 @@ msgstr "このコンテナーのロギング構成" msgid "" "The user that commands are run as inside the container. (format: name|" "uid[:group|gid])" -msgstr "" +msgstr "コンテナ内でコマンドを実行するユーザー (形式: name|uid[:group|gid])" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/containers.js:50 msgid "" "This page displays all docker Containers that have been created on the " "connected docker host." msgstr "" +"このページには、接続中の Docker ホスト上で作成されたすべての Docker コンテナ" +"が表示されます。" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/network.js:45 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/networks.js:58 @@ -1873,16 +1895,20 @@ msgid "" "This page displays all docker networks that have been created on the " "connected docker host." msgstr "" +"このページには、接続中の Docker ホスト上で作成されたすべての Docker " +"ネットワークが表示されます。" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/volumes.js:57 msgid "" "This page displays all docker volumes that have been created on the " "connected docker host." msgstr "" +"このページには、接続中の Docker ホスト上で作成されたすべての Docker " +"ボリュームが表示されます。" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/events.js:249 msgid "Time" -msgstr "" +msgstr "時刻" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:376 msgid "Tmpfs" @@ -1890,7 +1916,7 @@ msgstr "Tmpfs" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:528 msgid "Tmpfs Directories" -msgstr "" +msgstr "Tmpfs ディレクトリ" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:660 msgid "Tmpfs(--tmpfs)" @@ -1898,15 +1924,15 @@ msgstr "Tmpfs(--tmpfs)" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/events.js:131 msgid "To" -msgstr "" +msgstr "終了日時" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/configuration.js:138 msgid "Token" -msgstr "" +msgstr "トークン" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/configuration.js:107 msgid "Tokes and Passwords are not encrypted in the uci configuration." -msgstr "" +msgstr "トークンとパスワードは UCI 設定内で暗号化されません。" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/containers.js:82 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/containers.js:139 @@ -1917,7 +1943,7 @@ msgstr "" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/volumes.js:45 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/volumes.js:111 msgid "Total" -msgstr "" +msgstr "合計" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/overview.js:170 msgid "Total Memory" @@ -1928,45 +1954,45 @@ msgstr "総メモリ" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/overview.js:210 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/overview.js:220 msgid "Total:" -msgstr "" +msgstr "合計:" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:498 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/events.js:63 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/events.js:249 msgid "Type" -msgstr "" +msgstr "タイプ" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:1135 msgid "Type command here... (Ctrl+D to detach)" -msgstr "" +msgstr "ここにコマンドを入力... (Ctrl+D でデタッチ)" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:847 msgid "USER" -msgstr "" +msgstr "USER" #: applications/luci-app-dockerman/htdocs/luci-static/resources/dockerman/common.js:980 msgid "Unexpected error" -msgstr "" +msgstr "予期しないエラー" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:1355 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:1640 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:1683 msgid "Unknown error" -msgstr "" +msgstr "不明なエラー" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:485 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:250 msgid "Unless stopped" -msgstr "" +msgstr "停止されない限り" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:396 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:1807 msgid "Unpause" -msgstr "" +msgstr "再開" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/containers.js:208 msgid "Unpause this container" -msgstr "" +msgstr "このコンテナを再開" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:582 msgid "Update" @@ -1974,7 +2000,7 @@ msgstr "更新" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:1359 msgid "Updated" -msgstr "" +msgstr "更新済み" #: applications/luci-app-dockerman/htdocs/luci-static/resources/dockerman/common.js:428 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:948 @@ -1983,20 +2009,20 @@ msgstr "アップロード" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:1610 msgid "Uploading file to container…" -msgstr "" +msgstr "コンテナにファイルをアップロード中…" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/images.js:698 msgid "Uploading image…" -msgstr "" +msgstr "イメージをアップロード中…" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:1609 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/images.js:697 msgid "Uploading…" -msgstr "" +msgstr "アップロード中…" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/configuration.js:103 msgid "Used for push/pull operations on custom registries." -msgstr "" +msgstr "カスタムレジストリでのプッシュ/プル操作に使用されます。" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/configuration.js:115 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:479 @@ -2010,29 +2036,29 @@ msgstr "ユーザー(-u)" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/network_new.js:61 msgid "VEPA (Virtual Ethernet Port Aggregator)" -msgstr "" +msgstr "VEPA (Virtual Ethernet Port Aggregator)" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:847 msgid "VSZ" -msgstr "" +msgstr "VSZ" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:803 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/overview.js:244 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/overview.js:251 msgid "Value" -msgstr "" +msgstr "値" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/overview.js:240 msgid "Version" -msgstr "" +msgstr "バージョン" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:374 msgid "Volume (named)" -msgstr "" +msgstr "ボリューム (名前付き)" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:401 msgid "Volume Name" -msgstr "" +msgstr "ボリューム名" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/overview.js:219 #: applications/luci-app-dockerman/root/usr/share/luci/menu.d/luci-app-dockerman.json:348 @@ -2041,7 +2067,7 @@ msgstr "ボリューム" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/volumes.js:61 msgid "Volumes overview" -msgstr "" +msgstr "ボリュームの概要" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/configuration.js:75 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:1764 @@ -2050,51 +2076,51 @@ msgstr "警告" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:1078 msgid "WebSocket" -msgstr "" +msgstr "WebSocket" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:1087 msgid "WebSocket Console" -msgstr "" +msgstr "WebSocket コンソール" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:1500 msgid "WebSocket error" -msgstr "" +msgstr "WebSocket エラー" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:679 msgid "Yes" -msgstr "" +msgstr "はい" #: applications/luci-app-dockerman/htdocs/luci-static/resources/dockerman/common.js:323 msgid "attach" -msgstr "" +msgstr "アタッチ" #: applications/luci-app-dockerman/htdocs/luci-static/resources/dockerman/common.js:404 msgid "builder" -msgstr "" +msgstr "ビルダー" #: applications/luci-app-dockerman/htdocs/luci-static/resources/dockerman/common.js:324 msgid "commit" -msgstr "" +msgstr "コミット" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:1836 msgid "completed" -msgstr "" +msgstr "完了" #: applications/luci-app-dockerman/htdocs/luci-static/resources/dockerman/common.js:405 msgid "config" -msgstr "" +msgstr "設定" #: applications/luci-app-dockerman/htdocs/luci-static/resources/dockerman/common.js:372 msgid "connect" -msgstr "" +msgstr "接続" #: applications/luci-app-dockerman/htdocs/luci-static/resources/dockerman/common.js:406 msgid "container" -msgstr "" +msgstr "コンテナ" #: applications/luci-app-dockerman/htdocs/luci-static/resources/dockerman/common.js:325 msgid "copy" -msgstr "" +msgstr "コピー" #: applications/luci-app-dockerman/htdocs/luci-static/resources/dockerman/common.js:326 #: applications/luci-app-dockerman/htdocs/luci-static/resources/dockerman/common.js:357 @@ -2102,109 +2128,111 @@ msgstr "" #: applications/luci-app-dockerman/htdocs/luci-static/resources/dockerman/common.js:382 #: applications/luci-app-dockerman/htdocs/luci-static/resources/dockerman/common.js:391 msgid "create" -msgstr "" +msgstr "作成" #: applications/luci-app-dockerman/htdocs/luci-static/resources/dockerman/common.js:407 msgid "daemon" -msgstr "" +msgstr "デーモン" #: applications/luci-app-dockerman/htdocs/luci-static/resources/dockerman/common.js:358 msgid "delete" -msgstr "" +msgstr "削除" #: applications/luci-app-dockerman/htdocs/luci-static/resources/dockerman/common.js:327 #: applications/luci-app-dockerman/htdocs/luci-static/resources/dockerman/common.js:374 #: applications/luci-app-dockerman/htdocs/luci-static/resources/dockerman/common.js:385 msgid "destroy" -msgstr "" +msgstr "破棄" #: applications/luci-app-dockerman/htdocs/luci-static/resources/dockerman/common.js:328 msgid "detach" -msgstr "" +msgstr "デタッチ" #: applications/luci-app-dockerman/htdocs/luci-static/resources/dockerman/common.js:329 msgid "die" -msgstr "" +msgstr "終了" #: applications/luci-app-dockerman/htdocs/luci-static/resources/dockerman/common.js:373 msgid "disconnect" -msgstr "" +msgstr "切断" #: applications/luci-app-dockerman/htdocs/luci-static/resources/dockerman/common.js:330 msgid "exec_create" -msgstr "" +msgstr "exec 作成" #: applications/luci-app-dockerman/htdocs/luci-static/resources/dockerman/common.js:331 msgid "exec_detach" -msgstr "" +msgstr "exec デタッチ" #: applications/luci-app-dockerman/htdocs/luci-static/resources/dockerman/common.js:333 msgid "exec_die" -msgstr "" +msgstr "exec 終了" #: applications/luci-app-dockerman/htdocs/luci-static/resources/dockerman/common.js:332 msgid "exec_start" -msgstr "" +msgstr "exec 開始" #: applications/luci-app-dockerman/htdocs/luci-static/resources/dockerman/common.js:334 msgid "export" -msgstr "" +msgstr "エクスポート" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/images.js:206 msgid "git repositories require git installed on the docker host." msgstr "" +"git リポジトリを使用するには、Docker ホストに git がインストールされている必" +"要があります。" #: applications/luci-app-dockerman/htdocs/luci-static/resources/dockerman/common.js:335 msgid "health_status" -msgstr "" +msgstr "ヘルス状態" #: applications/luci-app-dockerman/htdocs/luci-static/resources/dockerman/common.js:408 msgid "image" -msgstr "" +msgstr "イメージ" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:755 msgid "json-file" -msgstr "" +msgstr "json-file" #: applications/luci-app-dockerman/htdocs/luci-static/resources/dockerman/common.js:336 msgid "kill" -msgstr "" +msgstr "強制終了" #: applications/luci-app-dockerman/htdocs/luci-static/resources/dockerman/common.js:360 msgid "load" -msgstr "" +msgstr "読み込み" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:754 msgid "local" -msgstr "" +msgstr "local" #: applications/luci-app-dockerman/htdocs/luci-static/resources/dockerman/common.js:383 msgid "mount" -msgstr "" +msgstr "マウント" #: applications/luci-app-dockerman/htdocs/luci-static/resources/dockerman/common.js:409 msgid "network" -msgstr "" +msgstr "ネットワーク" #: applications/luci-app-dockerman/htdocs/luci-static/resources/dockerman/common.js:410 msgid "node" -msgstr "" +msgstr "ノード" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:757 msgid "none" -msgstr "" +msgstr "none" #: applications/luci-app-dockerman/htdocs/luci-static/resources/dockerman/common.js:337 msgid "oom" -msgstr "" +msgstr "メモリ不足 (OOM)" #: applications/luci-app-dockerman/htdocs/luci-static/resources/dockerman/common.js:338 msgid "pause" -msgstr "" +msgstr "一時停止" #: applications/luci-app-dockerman/htdocs/luci-static/resources/dockerman/common.js:411 msgid "plugin" -msgstr "" +msgstr "プラグイン" #: applications/luci-app-dockerman/htdocs/luci-static/resources/dockerman/common.js:318 #: applications/luci-app-dockerman/htdocs/luci-static/resources/dockerman/common.js:347 @@ -2212,99 +2240,99 @@ msgstr "" #: applications/luci-app-dockerman/htdocs/luci-static/resources/dockerman/common.js:377 #: applications/luci-app-dockerman/htdocs/luci-static/resources/dockerman/common.js:386 msgid "prune" -msgstr "" +msgstr "不要データ削除" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:869 msgid "ps flags:" -msgstr "" +msgstr "ps フラグ:" #: applications/luci-app-dockerman/htdocs/luci-static/resources/dockerman/common.js:352 msgid "reload" -msgstr "" +msgstr "再読み込み" #: applications/luci-app-dockerman/htdocs/luci-static/resources/dockerman/common.js:376 #: applications/luci-app-dockerman/htdocs/luci-static/resources/dockerman/common.js:393 msgid "remove" -msgstr "" +msgstr "削除" #: applications/luci-app-dockerman/htdocs/luci-static/resources/dockerman/common.js:339 msgid "rename" -msgstr "" +msgstr "名前変更" #: applications/luci-app-dockerman/htdocs/luci-static/resources/dockerman/common.js:340 msgid "resize" -msgstr "" +msgstr "サイズ変更" #: applications/luci-app-dockerman/htdocs/luci-static/resources/dockerman/common.js:341 msgid "restart" -msgstr "" +msgstr "再起動" #: applications/luci-app-dockerman/htdocs/luci-static/resources/dockerman/common.js:363 msgid "save" -msgstr "" +msgstr "保存" #: applications/luci-app-dockerman/htdocs/luci-static/resources/dockerman/common.js:412 msgid "secret" -msgstr "" +msgstr "シークレット" #: applications/luci-app-dockerman/htdocs/luci-static/resources/dockerman/common.js:413 msgid "service" -msgstr "" +msgstr "サービス" #: applications/luci-app-dockerman/htdocs/luci-static/resources/dockerman/common.js:342 msgid "start" -msgstr "" +msgstr "開始" #: applications/luci-app-dockerman/htdocs/luci-static/resources/dockerman/common.js:343 msgid "stop" -msgstr "" +msgstr "停止" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:756 msgid "syslog" -msgstr "" +msgstr "syslog" #: applications/luci-app-dockerman/htdocs/luci-static/resources/dockerman/common.js:364 msgid "tag" -msgstr "" +msgstr "タグ付け" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:437 msgid "tmpfs Options" -msgstr "" +msgstr "tmpfs オプション" #: applications/luci-app-dockerman/htdocs/luci-static/resources/dockerman/common.js:344 msgid "top" -msgstr "" +msgstr "top" #: applications/luci-app-dockerman/htdocs/luci-static/resources/dockerman/common.js:384 msgid "unmount" -msgstr "" +msgstr "アンマウント" #: applications/luci-app-dockerman/htdocs/luci-static/resources/dockerman/common.js:345 msgid "unpause" -msgstr "" +msgstr "再開" #: applications/luci-app-dockerman/htdocs/luci-static/resources/dockerman/common.js:365 msgid "untag" -msgstr "" +msgstr "タグ解除" #: applications/luci-app-dockerman/htdocs/luci-static/resources/dockerman/common.js:346 #: applications/luci-app-dockerman/htdocs/luci-static/resources/dockerman/common.js:375 #: applications/luci-app-dockerman/htdocs/luci-static/resources/dockerman/common.js:392 msgid "update" -msgstr "" +msgstr "更新" #: applications/luci-app-dockerman/htdocs/luci-static/resources/dockerman/common.js:414 msgid "volume" -msgstr "" +msgstr "ボリューム" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/volumes.js:126 msgid "volume name" -msgstr "" +msgstr "ボリューム名" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:1361 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:991 msgid "with warnings" -msgstr "" +msgstr "警告あり" #~ msgid "Auto create macvlan interface in Openwrt" #~ msgstr "OpenWrt で macvlan インターフェースを自動作成" diff --git a/luci-app-dockerman/po/ms/dockerman.po b/luci-app-dockerman/po/ms/dockerman.po index ded0fbb21..511fe8ec1 100644 --- a/luci-app-dockerman/po/ms/dockerman.po +++ b/luci-app-dockerman/po/ms/dockerman.po @@ -1,14 +1,14 @@ msgid "" msgstr "" -"PO-Revision-Date: 2025-04-25 17:47+0000\n" -"Last-Translator: Abdul Muizz Bin Abdul Jalil \n" +"PO-Revision-Date: 2026-10-13 15:11+0000\n" +"Last-Translator: Pavel Borecki \n" "Language-Team: Malay \n" "Language: ms\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 5.12-dev\n" +"X-Generator: Weblate 2026.11.dev0\n" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:505 msgid "/mnt/path" @@ -109,7 +109,7 @@ msgstr "" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/overview.js:139 msgid "Available" -msgstr "" +msgstr "Boleh didapati" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:431 msgid "Back to Containers" @@ -510,7 +510,7 @@ msgstr "" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:521 msgid "Devices" -msgstr "" +msgstr "Peranti" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:565 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:1059 diff --git a/luci-app-dockerman/po/nb_NO/dockerman.po b/luci-app-dockerman/po/nb_NO/dockerman.po index 505f1bdaa..c2db148b7 100644 --- a/luci-app-dockerman/po/nb_NO/dockerman.po +++ b/luci-app-dockerman/po/nb_NO/dockerman.po @@ -1,14 +1,14 @@ msgid "" msgstr "" -"PO-Revision-Date: 2024-01-26 16:51+0000\n" -"Last-Translator: Allan Nordhøy \n" +"PO-Revision-Date: 2026-10-13 15:11+0000\n" +"Last-Translator: Pavel Borecki \n" "Language-Team: Norwegian Bokmål \n" +"luciapplicationsdockerman/nb/>\n" "Language: nb_NO\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 5.4-dev\n" +"X-Generator: Weblate 2026.11.dev0\n" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:505 msgid "/mnt/path" @@ -511,7 +511,7 @@ msgstr "" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:521 msgid "Devices" -msgstr "" +msgstr "Enheter" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:565 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:1059 diff --git a/luci-app-dockerman/po/nl/dockerman.po b/luci-app-dockerman/po/nl/dockerman.po index 9329056e6..b80931e2f 100644 --- a/luci-app-dockerman/po/nl/dockerman.po +++ b/luci-app-dockerman/po/nl/dockerman.po @@ -1,14 +1,14 @@ msgid "" msgstr "" -"PO-Revision-Date: 2023-05-11 11:52+0000\n" -"Last-Translator: xtz1983 \n" +"PO-Revision-Date: 2026-10-14 10:34+0000\n" +"Last-Translator: Hannu Nyman \n" "Language-Team: Dutch \n" "Language: nl\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.18-dev\n" +"X-Generator: Weblate 2026.11.dev0\n" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:505 msgid "/mnt/path" @@ -522,7 +522,7 @@ msgstr "Apparaat(--apparaat)" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:521 msgid "Devices" -msgstr "" +msgstr "Apparaten" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:565 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:1059 @@ -745,7 +745,7 @@ msgstr "" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/overview.js:90 msgid "Failed to execute \"/etc/init.d/%s %s\" action: %s" -msgstr "" +msgstr "Kan de actie \"/etc/init.d/%s %s\" niet uitvoeren: %s" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/events.js:321 msgid "Failed to load events: %s" @@ -1690,7 +1690,7 @@ msgstr "" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/events.js:249 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/network.js:62 msgid "Scope" -msgstr "" +msgstr "Scope" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/events.js:91 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/events.js:336 diff --git a/luci-app-dockerman/po/pt/dockerman.po b/luci-app-dockerman/po/pt/dockerman.po index 949ef2cec..7d81d28ef 100644 --- a/luci-app-dockerman/po/pt/dockerman.po +++ b/luci-app-dockerman/po/pt/dockerman.po @@ -1,14 +1,14 @@ msgid "" msgstr "" -"PO-Revision-Date: 2026-09-28 19:26+0000\n" -"Last-Translator: Pavel Borecki \n" +"PO-Revision-Date: 2026-10-13 13:19+0000\n" +"Last-Translator: Pavel Borecki \n" "Language-Team: Portuguese \n" "Language: pt\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 2026.10.dev0\n" +"X-Generator: Weblate 2026.11.dev0\n" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:505 msgid "/mnt/path" @@ -1687,7 +1687,7 @@ msgstr "" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/events.js:249 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/network.js:62 msgid "Scope" -msgstr "" +msgstr "Escopo" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/events.js:91 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/events.js:336 diff --git a/luci-app-dockerman/po/pt_BR/dockerman.po b/luci-app-dockerman/po/pt_BR/dockerman.po index 57f25a889..d6c567dc6 100644 --- a/luci-app-dockerman/po/pt_BR/dockerman.po +++ b/luci-app-dockerman/po/pt_BR/dockerman.po @@ -1,14 +1,15 @@ msgid "" msgstr "" -"PO-Revision-Date: 2026-09-29 17:59+0000\n" -"Last-Translator: Pavel Borecki \n" +"PO-Revision-Date: 2026-10-18 16:40+0000\n" +"Last-Translator: Janderson Vieira Santos " +"\n" "Language-Team: Portuguese (Brazil) \n" "Language: pt_BR\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 2026.10.dev0\n" +"X-Generator: Weblate 2026.11.dev0\n" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:505 msgid "/mnt/path" @@ -539,7 +540,7 @@ msgstr "" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:1539 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:1558 msgid "Disconnected" -msgstr "" +msgstr "Desconectado" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/images.js:536 msgid "Do you want to remove the tag \"%s\"?" @@ -606,7 +607,7 @@ msgstr "Dockerman JS" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:953 msgid "Download" -msgstr "Download" +msgstr "Baixar" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/images.js:276 msgid "Download a valid remote image tar." @@ -1288,7 +1289,7 @@ msgstr "" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:679 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:249 msgid "No" -msgstr "" +msgstr "Não" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:1878 msgid "No additional networks available to connect" @@ -1917,7 +1918,7 @@ msgstr "" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/configuration.js:138 msgid "Token" -msgstr "" +msgstr "Token" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/configuration.js:107 msgid "Tokes and Passwords are not encrypted in the uci configuration." @@ -1932,7 +1933,7 @@ msgstr "" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/volumes.js:45 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/volumes.js:111 msgid "Total" -msgstr "" +msgstr "Total" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/overview.js:170 msgid "Total Memory" @@ -2077,7 +2078,7 @@ msgstr "" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:679 msgid "Yes" -msgstr "" +msgstr "Sim" #: applications/luci-app-dockerman/htdocs/luci-static/resources/dockerman/common.js:323 msgid "attach" diff --git a/luci-app-dockerman/po/ro/dockerman.po b/luci-app-dockerman/po/ro/dockerman.po index c7709e8cf..430740800 100644 --- a/luci-app-dockerman/po/ro/dockerman.po +++ b/luci-app-dockerman/po/ro/dockerman.po @@ -1,7 +1,7 @@ msgid "" msgstr "" -"PO-Revision-Date: 2026-04-22 23:36+0000\n" -"Last-Translator: CRISTIAN ANDREI \n" +"PO-Revision-Date: 2026-10-13 21:56+0000\n" +"Last-Translator: Pavel Borecki \n" "Language-Team: Romanian \n" "Language: ro\n" @@ -9,7 +9,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < " "20)) ? 1 : 2;\n" -"X-Generator: Weblate 5.17.1-dev\n" +"X-Generator: Weblate 2026.11.dev0\n" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:505 msgid "/mnt/path" @@ -520,7 +520,7 @@ msgstr "Dispozitiv(--device)" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:521 msgid "Devices" -msgstr "" +msgstr "Dispozitive" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:565 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:1059 @@ -743,7 +743,7 @@ msgstr "" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/overview.js:90 msgid "Failed to execute \"/etc/init.d/%s %s\" action: %s" -msgstr "" +msgstr "Nu a reușit să execute acțiunea \"/etc/init.d/%s %s\": %s" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/events.js:321 msgid "Failed to load events: %s" @@ -1689,7 +1689,7 @@ msgstr "" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/events.js:249 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/network.js:62 msgid "Scope" -msgstr "" +msgstr "Domeniul de aplicare" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/events.js:91 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/events.js:336 diff --git a/luci-app-dockerman/po/ru/dockerman.po b/luci-app-dockerman/po/ru/dockerman.po index 85d4d2c15..d00436880 100644 --- a/luci-app-dockerman/po/ru/dockerman.po +++ b/luci-app-dockerman/po/ru/dockerman.po @@ -1,6 +1,6 @@ msgid "" msgstr "" -"PO-Revision-Date: 2026-09-16 15:38+0000\n" +"PO-Revision-Date: 2026-10-01 12:16+0000\n" "Last-Translator: SnIPeRSnIPeR " "\n" "Language-Team: Russian \n" +"PO-Revision-Date: 2026-10-13 15:11+0000\n" +"Last-Translator: Pavel Borecki \n" "Language-Team: Slovak \n" "Language: sk\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" -"X-Generator: Weblate 5.0-dev\n" +"Plural-Forms: nplurals=3; plural=((n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2);\n" +"X-Generator: Weblate 2026.11.dev0\n" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:505 msgid "/mnt/path" @@ -511,7 +511,7 @@ msgstr "" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:521 msgid "Devices" -msgstr "" +msgstr "Zariadenia" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:565 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:1059 diff --git a/luci-app-dockerman/po/ta/dockerman.po b/luci-app-dockerman/po/ta/dockerman.po index b9c9ff9a0..12eecdf17 100644 --- a/luci-app-dockerman/po/ta/dockerman.po +++ b/luci-app-dockerman/po/ta/dockerman.po @@ -1,14 +1,14 @@ msgid "" msgstr "" -"PO-Revision-Date: 2026-08-23 19:31+0000\n" -"Last-Translator: Pavel Borecki \n" +"PO-Revision-Date: 2026-10-13 13:20+0000\n" +"Last-Translator: Pavel Borecki \n" "Language-Team: Tamil \n" "Language: ta\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 2026.9.dev0\n" +"X-Generator: Weblate 2026.11.dev0\n" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:505 msgid "/mnt/path" @@ -480,7 +480,7 @@ msgstr "" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/configuration.js:73 msgid "Debug" -msgstr "பிழைத்திருத்தம்" +msgstr "பிழை நீக்கு" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:753 msgid "Default (daemon)" @@ -518,7 +518,7 @@ msgstr "சாதனம் (-சாதனம்)" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:521 msgid "Devices" -msgstr "" +msgstr "சாதனங்கள்" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:565 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:1059 @@ -741,7 +741,7 @@ msgstr "" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/overview.js:90 msgid "Failed to execute \"/etc/init.d/%s %s\" action: %s" -msgstr "" +msgstr "\"/Etc/init.d/%s %s\" செயல்: %s" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/events.js:321 msgid "Failed to load events: %s" @@ -1682,7 +1682,7 @@ msgstr "" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/events.js:249 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/network.js:62 msgid "Scope" -msgstr "" +msgstr "நோக்கம்" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/events.js:91 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/events.js:336 diff --git a/luci-app-dockerman/po/tr/dockerman.po b/luci-app-dockerman/po/tr/dockerman.po index 4f0d6a418..6823690aa 100644 --- a/luci-app-dockerman/po/tr/dockerman.po +++ b/luci-app-dockerman/po/tr/dockerman.po @@ -1,14 +1,14 @@ msgid "" msgstr "" -"PO-Revision-Date: 2026-09-06 21:01+0000\n" -"Last-Translator: egemen <95934830+projectaccc@users.noreply.github.com>\n" +"PO-Revision-Date: 2026-10-13 13:19+0000\n" +"Last-Translator: Pavel Borecki \n" "Language-Team: Turkish \n" "Language: tr\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 2026.9.1.dev0\n" +"X-Generator: Weblate 2026.11.dev0\n" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:505 msgid "/mnt/path" @@ -20,7 +20,7 @@ msgstr "/klasör_yolu/içindeki/görsel" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/events.js:127 msgid "0" -msgstr "" +msgstr "0" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/configuration.js:106 msgid "A Token is preferred over a Password." diff --git a/luci-app-dockerman/po/uk/dockerman.po b/luci-app-dockerman/po/uk/dockerman.po index a164ab098..6a84106cc 100644 --- a/luci-app-dockerman/po/uk/dockerman.po +++ b/luci-app-dockerman/po/uk/dockerman.po @@ -1,7 +1,7 @@ msgid "" msgstr "" -"PO-Revision-Date: 2026-07-08 15:16+0000\n" -"Last-Translator: Dan \n" +"PO-Revision-Date: 2026-10-04 08:24+0000\n" +"Last-Translator: Karakurt \n" "Language-Team: Ukrainian \n" "Language: uk\n" @@ -9,7 +9,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -"X-Generator: Weblate 2026.7.1.dev0\n" +"X-Generator: Weblate 2026.10.1.dev0\n" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:505 msgid "/mnt/path" @@ -1951,7 +1951,7 @@ msgstr "Токени та паролі не шифруються в конфіг #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/volumes.js:45 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/volumes.js:111 msgid "Total" -msgstr "Усього" +msgstr "Загалом" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/overview.js:170 msgid "Total Memory" diff --git a/luci-app-dockerman/po/vi/dockerman.po b/luci-app-dockerman/po/vi/dockerman.po index 8c5f4303c..c3766d02f 100644 --- a/luci-app-dockerman/po/vi/dockerman.po +++ b/luci-app-dockerman/po/vi/dockerman.po @@ -1,14 +1,14 @@ msgid "" msgstr "" -"PO-Revision-Date: 2026-06-09 01:01+0000\n" -"Last-Translator: Mytai20100 \n" +"PO-Revision-Date: 2026-10-13 21:56+0000\n" +"Last-Translator: Pavel Borecki \n" "Language-Team: Vietnamese \n" "Language: vi\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 2026.6\n" +"X-Generator: Weblate 2026.11.dev0\n" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:505 msgid "/mnt/path" @@ -520,7 +520,7 @@ msgstr "Thiết bị (--device)" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:521 msgid "Devices" -msgstr "" +msgstr "Các thiết bị" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:565 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:1059 @@ -743,7 +743,7 @@ msgstr "" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/overview.js:90 msgid "Failed to execute \"/etc/init.d/%s %s\" action: %s" -msgstr "" +msgstr "Thất bại khi thực thi \"/etc/init.d/%s %s\" hành động: %s" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/events.js:321 msgid "Failed to load events: %s" @@ -1149,7 +1149,7 @@ msgstr "" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:758 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:789 msgid "Memory Usage" -msgstr "" +msgstr "Mức sử dụng bộ nhớ RAM" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:710 msgid "" @@ -1685,7 +1685,7 @@ msgstr "" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/events.js:249 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/network.js:62 msgid "Scope" -msgstr "" +msgstr "Phạm vi" #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/events.js:91 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/events.js:336 diff --git a/luci-app-fchomo/.prepare.sh b/luci-app-fchomo/.prepare.sh index d80640403..e8f822eb2 100755 --- a/luci-app-fchomo/.prepare.sh +++ b/luci-app-fchomo/.prepare.sh @@ -50,6 +50,11 @@ cat "$PKG_BUILD_DIR"/base64 tail -n +$(( $p +1 )) "$PKG_BUILD_DIR"/htdocs/luci-static/resources/fchomo.js } > "$PKG_BUILD_DIR"/htdocs/luci-static/resources/fchomo.js.new mv -f "$PKG_BUILD_DIR"/htdocs/luci-static/resources/fchomo.js.new "$PKG_BUILD_DIR"/htdocs/luci-static/resources/fchomo.js +# md5 +pushd "$PKG_BUILD_DIR"/htdocs/luci-static/resources/fchomo/ +cp "$(readlink -f md5.js)" md5.js.new +rm -f md5.js && mv -f md5.js.new md5.js && rm -rf js-md5 +popd if [ -d "$CURDIR/.git" ]; then config="$CURDIR/.git/config" diff --git a/luci-app-fchomo/htdocs/luci-static/resources/fchomo/md5.js b/luci-app-fchomo/htdocs/luci-static/resources/fchomo/md5.js index 0dd0592da..ec4604762 120000 --- a/luci-app-fchomo/htdocs/luci-static/resources/fchomo/md5.js +++ b/luci-app-fchomo/htdocs/luci-static/resources/fchomo/md5.js @@ -1 +1 @@ -../../../../../js-md5/build/md5-lite.min.js \ No newline at end of file +js-md5/build/md5-lite.min.js \ No newline at end of file diff --git a/luci-app-package-manager/po/cs/package-manager.po b/luci-app-package-manager/po/cs/package-manager.po index 7d6fcef3a..75ce66aa6 100644 --- a/luci-app-package-manager/po/cs/package-manager.po +++ b/luci-app-package-manager/po/cs/package-manager.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: \n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2026-08-27 18:20+0000\n" -"Last-Translator: Martin Olmer \n" +"PO-Revision-Date: 2026-10-03 15:10+0000\n" +"Last-Translator: Pavel Borecki \n" "Language-Team: Czech \n" "Language: cs\n" @@ -11,7 +11,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=((n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2);\n" -"X-Generator: Weblate 2026.9.dev0\n" +"X-Generator: Weblate 2026.10.1.dev0\n" #: applications/luci-app-package-manager/htdocs/luci-static/resources/view/package-manager.js:943 #: applications/luci-app-package-manager/htdocs/luci-static/resources/view/package-manager.js:1008 @@ -266,7 +266,7 @@ msgstr "Odstranit…" #: applications/luci-app-package-manager/htdocs/luci-static/resources/view/package-manager.js:822 msgid "Require approx. %1024mB size for %d package(s) to install." -msgstr "Vyžaduje přibližně %1024mB velikosti pro instalaci %d balíčků." +msgstr "Vyžaduje přibližně %1024mB místa pro instalaci %d balíčků." #: applications/luci-app-package-manager/htdocs/luci-static/resources/view/package-manager.js:558 #: applications/luci-app-package-manager/htdocs/luci-static/resources/view/package-manager.js:577 diff --git a/luci-app-package-manager/po/da/package-manager.po b/luci-app-package-manager/po/da/package-manager.po index 9404376b2..60d62dd8f 100644 --- a/luci-app-package-manager/po/da/package-manager.po +++ b/luci-app-package-manager/po/da/package-manager.po @@ -1,29 +1,30 @@ msgid "" msgstr "" -"PO-Revision-Date: 2024-10-24 13:06+0000\n" -"Last-Translator: Allan Nordhøy \n" +"PO-Revision-Date: 2026-10-05 07:31+0000\n" +"Last-Translator: Hosted Weblate user 168028 \n" "Language-Team: Danish \n" "Language: da\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 5.8.2-dev\n" +"X-Generator: Weblate 2026.10.1.dev0\n" #: applications/luci-app-package-manager/htdocs/luci-static/resources/view/package-manager.js:943 #: applications/luci-app-package-manager/htdocs/luci-static/resources/view/package-manager.js:1008 #: applications/luci-app-package-manager/htdocs/luci-static/resources/view/package-manager.js:1022 msgid "%s Configuration" -msgstr "" +msgstr "%s Konfiguration" #: applications/luci-app-package-manager/htdocs/luci-static/resources/view/package-manager.js:1205 msgid "%s used (%1024mB used of %1024mB, %1024mB free)" -msgstr "" +msgstr "%s i brug (%1024mB i brug ud af %1024mB, %1024mB ledig)" #: applications/luci-app-package-manager/htdocs/luci-static/resources/view/package-manager.js:1245 msgid "" "Warning! Package operations can break your system." msgstr "" +"Advarsel! Pakkehandlinger kan ødelægge dit system." #: applications/luci-app-package-manager/htdocs/luci-static/resources/view/package-manager.js:1273 msgid "Actions" @@ -47,6 +48,9 @@ msgid "" "The configuration in the other files may be changed but is usually not " "preserved by sysupgrade." msgstr "" +"Herunder følger en oversigt over de forskellige konfigurationsfiler, som " +"apk benytter. Konfigurationen i de øvrige filer kan ændres, men bevares " +"normalt ikke af sysupgrade." #: applications/luci-app-package-manager/htdocs/luci-static/resources/view/package-manager.js:979 msgid "" @@ -55,11 +59,11 @@ msgid "" "custom repository entries. The configuration in the other files may be " "changed but is usually not preserved by sysupgrade." msgstr "" -"Nedenfor er en liste over de forskellige konfigurationsfiler, der anvendes " -"af opkg. Brugopkg.conftil globale indstillinger og " -"customfeeds.conf til brugerdefinerede poster i repositoriet. " -"Konfigurationen i de andre filer kan ændres, men den bevares normalt ikke af " -"sysupgrade." +"Herunder følger en oversigt over de forskellige konfigurationsfiler, som " +"opkg benytter. Brug opkg.conf til globale indstillinger og " +"customfeeds.conf til brugerdefinerede arkivindgange. Konfigurationen i " +"de øvrige filer kan ændres, men bevares normalt ikke ved en sysupgrade." #: applications/luci-app-package-manager/htdocs/luci-static/resources/view/package-manager.js:885 #: applications/luci-app-package-manager/htdocs/luci-static/resources/view/package-manager.js:932 @@ -75,11 +79,11 @@ msgstr "Ryd" #: applications/luci-app-package-manager/htdocs/luci-static/resources/view/package-manager.js:1277 msgid "Configure %s" -msgstr "" +msgstr "Konfigurer %s" #: applications/luci-app-package-manager/htdocs/luci-static/resources/view/package-manager.js:829 msgid "Dependencies" -msgstr "Dependencies" +msgstr "Afhængigheder" #: applications/luci-app-package-manager/htdocs/luci-static/resources/view/package-manager.js:835 #: applications/luci-app-package-manager/htdocs/luci-static/resources/view/package-manager.js:1042 @@ -93,7 +97,7 @@ msgstr "Detaljer for pakke %h" #: applications/luci-app-package-manager/htdocs/luci-static/resources/view/package-manager.js:1252 msgid "Disk space" -msgstr "" +msgstr "Diskplads" #: applications/luci-app-package-manager/htdocs/luci-static/resources/view/package-manager.js:1140 msgid "Dismiss" @@ -137,7 +141,7 @@ msgstr "Filter" #: applications/luci-app-package-manager/root/usr/share/rpcd/acl.d/luci-app-package-manager.json:3 msgid "Grant access to package management" -msgstr "" +msgstr "Giv adgang til pakkehåndtering" #: applications/luci-app-package-manager/htdocs/luci-static/resources/view/package-manager.js:1312 msgid "Hide all translation packages" @@ -151,7 +155,7 @@ msgstr "Installer" #: applications/luci-app-package-manager/htdocs/luci-static/resources/view/package-manager.js:1243 msgid "Install additional software and upgrade existing packages with %s." -msgstr "" +msgstr "Installer yderligere software, og opgrader eksisterende pakker med %s." #: applications/luci-app-package-manager/htdocs/luci-static/resources/view/package-manager.js:865 msgid "Install suggested translation packages as well" @@ -315,7 +319,7 @@ msgstr "Foreslåede oversættelser kræver ca. %1024mB ekstra plads." #: applications/luci-app-package-manager/htdocs/luci-static/resources/view/package-manager.js:1123 msgid "The %s %h command failed with code %d." -msgstr "" +msgstr "Kommandoen %s %h mislykkedes med koden %d." #: applications/luci-app-package-manager/htdocs/luci-static/resources/view/package-manager.js:554 msgid "" @@ -344,7 +348,7 @@ msgstr "Skriv for at filtrere…" #: applications/luci-app-package-manager/htdocs/luci-static/resources/view/package-manager.js:1142 msgid "Unable to execute %s %s command: %s" -msgstr "" +msgstr "Kunne ikke udføre kommandoen %s %s: %s" #: applications/luci-app-package-manager/htdocs/luci-static/resources/view/package-manager.js:973 msgid "Unable to read %s: %s" @@ -384,7 +388,7 @@ msgstr "Version inkompatibel" #: applications/luci-app-package-manager/htdocs/luci-static/resources/view/package-manager.js:1088 msgid "Waiting for the %s %h command to complete…" -msgstr "" +msgstr "Venter på, at kommandoen %s %h fuldføres…" #: applications/luci-app-package-manager/htdocs/luci-static/resources/view/package-manager.js:1308 msgctxt "Display translation packages" diff --git a/luci-app-package-manager/po/hu/package-manager.po b/luci-app-package-manager/po/hu/package-manager.po index 45aec587e..3345dc74e 100644 --- a/luci-app-package-manager/po/hu/package-manager.po +++ b/luci-app-package-manager/po/hu/package-manager.po @@ -1,8 +1,8 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" -"PO-Revision-Date: 2026-03-08 17:32+0000\n" -"Last-Translator: hmzs \n" +"PO-Revision-Date: 2026-10-13 21:56+0000\n" +"Last-Translator: Pavel Borecki \n" "Language-Team: Hungarian \n" "Language: hu\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 5.17-dev\n" +"X-Generator: Weblate 2026.11.dev0\n" #: applications/luci-app-package-manager/htdocs/luci-static/resources/view/package-manager.js:943 #: applications/luci-app-package-manager/htdocs/luci-static/resources/view/package-manager.js:1008 @@ -51,9 +51,9 @@ msgid "" "The configuration in the other files may be changed but is usually not " "preserved by sysupgrade." msgstr "" -"Alább található az apk által használt különféle beállítófájlok " +"Alább található az apk által használt különféle beállítófájlok " "listája. Az egyéb fájlokban lévő beállítások megváltoztathatók, de általában " -"nem lesznek megtartva rendszerfrissítéskor." +"nem lesznek megtartva rendszerfrissítéskor." #: applications/luci-app-package-manager/htdocs/luci-static/resources/view/package-manager.js:979 msgid "" @@ -63,10 +63,10 @@ msgid "" "changed but is usually not preserved by sysupgrade." msgstr "" "Alább található az opkg által használt különféle beállítófájlok " -"listája. Használja az opkg.conf fájlt a globális " -"beállításokhoz, és a customfeeds.conf fájlt az egyéni " -"tárolóbejegyzésekhez. Az egyéb fájlokban lévő beállítások megváltoztathatók, " -"de általában nem lesznek megtartva rendszerfrissítéskor." +"listája. Használja az opkg.conf fájlt a globális beállításokhoz, és " +"a customfeeds.conf fájlt az egyéni tárolóbejegyzésekhez. Az egyéb " +"fájlokban lévő beállítások megváltoztathatók, de általában nem lesznek " +"megtartva rendszerfrissítéskor." #: applications/luci-app-package-manager/htdocs/luci-static/resources/view/package-manager.js:885 #: applications/luci-app-package-manager/htdocs/luci-static/resources/view/package-manager.js:932 diff --git a/luci-app-package-manager/po/nl/package-manager.po b/luci-app-package-manager/po/nl/package-manager.po index 0784fca4b..4a97a8fdb 100644 --- a/luci-app-package-manager/po/nl/package-manager.po +++ b/luci-app-package-manager/po/nl/package-manager.po @@ -1,8 +1,8 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" -"PO-Revision-Date: 2026-01-10 04:39+0000\n" -"Last-Translator: Marco Otto \n" +"PO-Revision-Date: 2026-10-13 21:56+0000\n" +"Last-Translator: Pavel Borecki \n" "Language-Team: Dutch \n" "Language: nl\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 5.15.1\n" +"X-Generator: Weblate 2026.11.dev0\n" #: applications/luci-app-package-manager/htdocs/luci-static/resources/view/package-manager.js:943 #: applications/luci-app-package-manager/htdocs/luci-static/resources/view/package-manager.js:1008 @@ -43,7 +43,7 @@ msgstr "" #: applications/luci-app-package-manager/htdocs/luci-static/resources/view/package-manager.js:1328 msgid "Available" -msgstr "" +msgstr "Beschikbaar" #: applications/luci-app-package-manager/htdocs/luci-static/resources/view/package-manager.js:980 msgid "" @@ -274,7 +274,7 @@ msgstr "" #: applications/luci-app-package-manager/htdocs/luci-static/resources/view/package-manager.js:1157 msgid "SHA256" -msgstr "" +msgstr "SHA256" #: applications/luci-app-package-manager/htdocs/luci-static/resources/view/package-manager.js:1019 msgid "Save" diff --git a/luci-app-package-manager/po/ru/package-manager.po b/luci-app-package-manager/po/ru/package-manager.po index ee586042d..d9196e310 100644 --- a/luci-app-package-manager/po/ru/package-manager.po +++ b/luci-app-package-manager/po/ru/package-manager.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: LuCI: base\n" "POT-Creation-Date: 2010-05-09 01:01+0300\n" -"PO-Revision-Date: 2026-09-12 17:14+0000\n" +"PO-Revision-Date: 2026-10-12 11:12+0000\n" "Last-Translator: SnIPeRSnIPeR " "\n" "Language-Team: Russian =2 && " "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -"X-Generator: Weblate 2026.10.dev0\n" +"X-Generator: Weblate 2026.11.dev0\n" "Project-Info: Это технический перевод, не дословный. Главное-удобный русский " "интерфейс, все проверялось в графическом режиме, совместим с другими apps\n" @@ -197,7 +197,7 @@ msgstr "Загрузка данных конфигурации…" #: applications/luci-app-package-manager/htdocs/luci-static/resources/view/package-manager.js:1194 msgid "Loading package information…" -msgstr "Загрузка информации о пакете…" +msgstr "Загрузка информации…" #: applications/luci-app-package-manager/htdocs/luci-static/resources/view/package-manager.js:1156 msgid "MD5" diff --git a/luci-app-package-manager/po/ur/package-manager.po b/luci-app-package-manager/po/ur/package-manager.po index 64d9e8ce7..44d95aa7d 100644 --- a/luci-app-package-manager/po/ur/package-manager.po +++ b/luci-app-package-manager/po/ur/package-manager.po @@ -1,14 +1,14 @@ msgid "" msgstr "" -"PO-Revision-Date: 2024-10-24 13:06+0000\n" -"Last-Translator: Allan Nordhøy \n" +"PO-Revision-Date: 2026-10-13 15:11+0000\n" +"Last-Translator: Pavel Borecki \n" "Language-Team: Urdu \n" "Language: ur\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 5.8.2-dev\n" +"X-Generator: Weblate 2026.11.dev0\n" #: applications/luci-app-package-manager/htdocs/luci-static/resources/view/package-manager.js:943 #: applications/luci-app-package-manager/htdocs/luci-static/resources/view/package-manager.js:1008 @@ -316,6 +316,7 @@ msgid "The %s %h command failed with code %d." msgstr "" #: applications/luci-app-package-manager/htdocs/luci-static/resources/view/package-manager.js:554 +#, fuzzy msgid "" "The installed version of package %h is not compatible, require %s " "while %s is installed." diff --git a/luci-app-passwall/Makefile b/luci-app-passwall/Makefile index 16f42d775..ac0993c16 100644 --- a/luci-app-passwall/Makefile +++ b/luci-app-passwall/Makefile @@ -8,7 +8,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=luci-app-passwall PKG_VERSION:=26.10.16 -PKG_RELEASE:=340 +PKG_RELEASE:=341 PKG_PO_VERSION:=$(PKG_VERSION) PKG_CONFIG_DEPENDS:= \ diff --git a/luci-app-passwall/root/usr/share/passwall/app.sh b/luci-app-passwall/root/usr/share/passwall/app.sh index 8f646d0cf..f6f5c2152 100755 --- a/luci-app-passwall/root/usr/share/passwall/app.sh +++ b/luci-app-passwall/root/usr/share/passwall/app.sh @@ -1780,6 +1780,7 @@ start() { lua $APP_PATH/subscribe.lua start $cfgids cron > /dev/null 2>&1 & } } + return 0 } stop() { diff --git a/luci-app-passwall2/Makefile b/luci-app-passwall2/Makefile index 683326be4..46ec46277 100644 --- a/luci-app-passwall2/Makefile +++ b/luci-app-passwall2/Makefile @@ -6,8 +6,8 @@ include $(TOPDIR)/rules.mk PKG_NAME:=luci-app-passwall2 -PKG_VERSION:=26.10.1 -PKG_RELEASE:=146 +PKG_VERSION:=26.10.20 +PKG_RELEASE:=147 PKG_PO_VERSION:=$(PKG_VERSION) PKG_CONFIG_DEPENDS:= \ diff --git a/luci-app-passwall2/root/usr/share/passwall2/app.sh b/luci-app-passwall2/root/usr/share/passwall2/app.sh index 29956404f..c00e32b30 100755 --- a/luci-app-passwall2/root/usr/share/passwall2/app.sh +++ b/luci-app-passwall2/root/usr/share/passwall2/app.sh @@ -960,6 +960,7 @@ start() { lua $APP_PATH/subscribe.lua start $cfgids cron > /dev/null 2>&1 & } } + return 0 } stop() { diff --git a/luci-app-passwall2/root/usr/share/passwall2/nftables.sh b/luci-app-passwall2/root/usr/share/passwall2/nftables.sh index 1b2c295a4..94f8ee45b 100755 --- a/luci-app-passwall2/root/usr/share/passwall2/nftables.sh +++ b/luci-app-passwall2/root/usr/share/passwall2/nftables.sh @@ -147,45 +147,30 @@ gen_nft_tables() { fi } +# Avoid terminal stdin or open-ended pipes to prevent hanging. insert_nftset() { local nftset_name="${1}"; shift - local timeout_argument="${1:--1}"; shift - local default_timeout="365d" - local suffix="" + [ -n "$nftset_name" ] || return 0 - if [ -n "$nftset_name" ] && { [ $# -gt 0 ] || [ ! -t 0 ]; }; then - case "$timeout_argument" in - "-1") suffix="" ;; - "0") suffix=" timeout $default_timeout" ;; - *) suffix=" timeout $timeout_argument" ;; - esac - { - if [ $# -gt 0 ] && [ $# -le 1000 ]; then - printf "%s\n" "$@" - elif [ $# -gt 1000 ]; then - printf "%s\n" "$*" - else - cat - fi | awk -v s="$suffix" -v n="$nftset_name" -v t="$NFTABLE_NAME" ' - BEGIN { - RS = "[ \t\n\r]+" - ORS = "" - } - $0 != "" { - if (!first) { - printf "add element %s %s { \n", t, n - first = 1; - } else { - print ",\n" - } - print $0 s - } - END { - if (first) print "\n }\n" - } - ' - } | nft -f - - fi + awk -v n="$nftset_name" -v t="$NFTABLE_NAME" ' + BEGIN { + RS = "[ \t\n\r]+" + ORS = "" + } + $0 != "" { + if (!first) { + printf "add element %s %s { \n", t, n + first = 1 + } else { + print ",\n" + } + printf " %s", $0 + } + END { + if (first) { + print "\n }\n" + } + }' | nft -f - } gen_nftset() { @@ -205,9 +190,6 @@ gen_nftset() { nft "add set $NFTABLE_NAME $nftset_name { type $ip_type; flags interval, timeout; timeout $timeout_argument_set; gc-interval $gc_interval_time; auto-merge; }" fi fi - if [ $# -gt 0 ]; then - insert_nftset "$nftset_name" "$timeout_argument_element" "$@" - fi } gen_shunt_list() { @@ -245,13 +227,13 @@ gen_shunt_list() { [ "$shunt_node" = "_default" ] && outbound="${default_outbound}" _SHUNT_LIST4="${_SHUNT_LIST4} ${nftset_v4}:${outbound}" _SHUNT_LIST6="${_SHUNT_LIST6} ${nftset_v6}:${outbound}" - config_n_get $shunt_id ip_list | sed 's/#.*//' | grep -E "(\.((2(5[0-5]|[0-4][0-9]))|[0-1]?[0-9]{1,2})){3}" | insert_nftset $nftset_v4 "0" - config_n_get $shunt_id ip_list | sed 's/#.*//' | grep -E "([A-Fa-f0-9]{1,4}::?){1,7}[A-Fa-f0-9]{1,4}" | insert_nftset $nftset_v6 "0" + config_n_get $shunt_id ip_list | sed 's/#.*//' | grep -E "(\.((2(5[0-5]|[0-4][0-9]))|[0-1]?[0-9]{1,2})){3}" | insert_nftset $nftset_v4 + config_n_get $shunt_id ip_list | sed 's/#.*//' | grep -E "([A-Fa-f0-9]{1,4}::?){1,7}[A-Fa-f0-9]{1,4}" | insert_nftset $nftset_v6 [ "${enable_geoview_ip}" = "1" ] && { local _geoip_code=$(config_n_get $shunt_id ip_list | tr -s "\r\n" "\n" | sed -e "/^$/d" | grep -E "^geoip:" | grep -v "^geoip:private" | sed -E 's/^geoip:(.*)/\1/' | sed ':a;N;$!ba;s/\n/,/g') [ -n "$_geoip_code" ] && { - get_geoip $_geoip_code ipv4 | grep -E "(\.((2(5[0-5]|[0-4][0-9]))|[0-1]?[0-9]{1,2})){3}" | insert_nftset $nftset_v4 "0" - get_geoip $_geoip_code ipv6 | grep -E "([A-Fa-f0-9]{1,4}::?){1,7}[A-Fa-f0-9]{1,4}" | insert_nftset $nftset_v6 "0" + get_geoip $_geoip_code ipv4 | grep -E "(\.((2(5[0-5]|[0-4][0-9]))|[0-1]?[0-9]{1,2})){3}" | insert_nftset $nftset_v4 + get_geoip $_geoip_code ipv6 | grep -E "([A-Fa-f0-9]{1,4}::?){1,7}[A-Fa-f0-9]{1,4}" | insert_nftset $nftset_v6 #log 3 "$(i18n "parse the traffic splitting rules[%s]-[geoip:%s] add to %s to complete." "${shunt_id}" "${_geoip_code}" "NFTSET[${nftset_v4},${nftset_v6}]")" } } @@ -584,29 +566,29 @@ filter_haproxy() { [ "$(config_n_get @global_haproxy[0] balancing_enable 0)" != "1" ] && return for item in $(uci show $CONFIG | grep ".lbss=" | cut -d "'" -f 2); do get_host_ip ipv4 $(echo $item | awk -F ":" '{print $1}') 1 - done | insert_nftset $NFTSET_VPS "-1" + done | insert_nftset $NFTSET_VPS log_i18n 1 "Add node to the load balancer is directly connected to %s[%s]." "nftset" "${NFTSET_VPS}" } filter_vps_addr() { for server_host in "$@"; do get_host_ip "ipv4" ${server_host} - done | insert_nftset $NFTSET_VPS "-1" + done | insert_nftset $NFTSET_VPS for server_host in "$@"; do get_host_ip "ipv6" ${server_host} - done | insert_nftset $NFTSET_VPS6 "-1" + done | insert_nftset $NFTSET_VPS6 } filter_vpsip() { local ipv4_addrs=$(uci show $CONFIG | grep -E "(.address=|.download_address=)" | cut -d "'" -f 2 | grep -E "([0-9]{1,3}[\.]){3}[0-9]{1,3}" | grep -v "^127\.0\.0\.1$") [ -n "$ipv4_addrs" ] && { - echo "$ipv4_addrs" | insert_nftset $NFTSET_VPS "-1" + echo "$ipv4_addrs" | insert_nftset $NFTSET_VPS log_i18n 1 "Add all %s nodes to %s[%s] direct connection complete." "IPv4" "nftset" "${NFTSET_VPS}" } local ipv6_addrs=$(uci show $CONFIG | grep -E "(.address=|.download_address=)" | cut -d "'" -f 2 | grep -E "([A-Fa-f0-9]{1,4}::?){1,7}[A-Fa-f0-9]{1,4}") [ -n "$ipv6_addrs" ] && { - echo "$ipv6_addrs" | insert_nftset $NFTSET_VPS6 "-1" + echo "$ipv6_addrs" | insert_nftset $NFTSET_VPS6 log_i18n 1 "Add all %s nodes to %s[%s] direct connection complete." "IPv6" "nftset" "${NFTSET_VPS6}" } } @@ -692,13 +674,13 @@ update_wan_sets() { local WAN_IP=$(get_wan_ips ip4) [ -n "$WAN_IP" ] && { # nft flush set $NFTABLE_NAME $NFTSET_WAN - echo "$WAN_IP" | insert_nftset $NFTSET_WAN "-1" + echo "$WAN_IP" | insert_nftset $NFTSET_WAN } local WAN6_IP=$(get_wan_ips ip6) [ -n "${WAN6_IP}" ] && { # nft flush set $NFTABLE_NAME $NFTSET_WAN6 - echo "$WAN6_IP" | insert_nftset $NFTSET_WAN6 "-1" + echo "$WAN6_IP" | insert_nftset $NFTSET_WAN6 } ) 9>"${LOCK_PATH}/${CONFIG}_update_wan_sets.lock" } @@ -719,18 +701,18 @@ add_firewall_rule() { gen_nftset $NFTSET_VPS6 ipv6_addr 0 "-1" gen_nftset $NFTSET_WAN6 ipv6_addr 0 "-1" - get_local_ips ip4 | insert_nftset $NFTSET_LOCAL "-1" - get_local_ips ip6 | insert_nftset $NFTSET_LOCAL6 "-1" + get_local_ips ip4 | insert_nftset $NFTSET_LOCAL + get_local_ips ip6 | insert_nftset $NFTSET_LOCAL6 for ip in $(cat /usr/share/passwall2/direct_ip | tr -s "\r\n" "\n" | grep -v "^#" | sed -e "/^$/d"); do if [[ "$ip" == *::* ]]; then - echo "$ip" | insert_nftset $NFTSET_DIRECT6 "-1" + echo "$ip" | insert_nftset $NFTSET_DIRECT6 elif [[ "$ip" == "geoip:"* ]]; then local _geoip_code=$(echo $ip | awk -F ':' '{print $2}') - get_geoip $_geoip_code ipv4 | grep -E "(\.((2(5[0-5]|[0-4][0-9]))|[0-1]?[0-9]{1,2})){3}" | insert_nftset $NFTSET_DIRECT "-1" - get_geoip $_geoip_code ipv6 | grep -E "([A-Fa-f0-9]{1,4}::?){1,7}[A-Fa-f0-9]{1,4}" | insert_nftset $NFTSET_DIRECT6 "-1" + get_geoip $_geoip_code ipv4 | grep -E "(\.((2(5[0-5]|[0-4][0-9]))|[0-1]?[0-9]{1,2})){3}" | insert_nftset $NFTSET_DIRECT + get_geoip $_geoip_code ipv6 | grep -E "([A-Fa-f0-9]{1,4}::?){1,7}[A-Fa-f0-9]{1,4}" | insert_nftset $NFTSET_DIRECT6 else - echo "$ip" | insert_nftset $NFTSET_DIRECT "-1" + echo "$ip" | insert_nftset $NFTSET_DIRECT fi done @@ -743,21 +725,21 @@ add_firewall_rule() { #log_i18n 1 "local network segments (%s) direct connection: %s" "IPv4" "${lan_ip}" #log_i18n 1 "local network segments (%s) direct connection: %s" "IPv6" "${lan_ip6}" - [ -n "$lan_ip" ] && echo $lan_ip | insert_nftset $NFTSET_DIRECT "-1" - [ -n "$lan_ip6" ] && echo $lan_ip6 | insert_nftset $NFTSET_DIRECT6 "-1" + [ -n "$lan_ip" ] && echo $lan_ip | insert_nftset $NFTSET_DIRECT + [ -n "$lan_ip6" ] && echo $lan_ip6 | insert_nftset $NFTSET_DIRECT6 } update_wan_sets [ -n "$ISP_DNS" ] && { - echo "$ISP_DNS" | insert_nftset $NFTSET_DIRECT "-1" + echo "$ISP_DNS" | insert_nftset $NFTSET_DIRECT for ispip in $ISP_DNS; do log_i18n 1 "$(i18n "Add ISP %s DNS to the whitelist: %s" "IPv4" "${ispip}")" done } [ -n "$ISP_DNS6" ] && { - echo $ISP_DNS6 | insert_nftset $NFTSET_DIRECT6 "-1" + echo $ISP_DNS6 | insert_nftset $NFTSET_DIRECT6 for ispip6 in $ISP_DNS6; do log_i18n 1 "$(i18n "Add ISP %s DNS to the whitelist: %s" "IPv6" "${ispip6}")" done @@ -1005,9 +987,6 @@ stop() { arg1=$1 shift case $arg1 in -insert_nftset) - insert_nftset "$@" - ;; filter_direct_node_list) filter_direct_node_list ;; diff --git a/luci-app-qosify/po/es/qosify.po b/luci-app-qosify/po/es/qosify.po index a563d3548..6339b03b6 100644 --- a/luci-app-qosify/po/es/qosify.po +++ b/luci-app-qosify/po/es/qosify.po @@ -3,12 +3,12 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Language: es\n" "Content-Transfer-Encoding: 8bit\n" -"Last-Translator: Franco Castillo \n" +"Last-Translator: apemay \n" "Language-Team: Spanish \n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"PO-Revision-Date: 2026-09-29 12:10+0000\n" -"X-Generator: Weblate 2026.10.dev0\n" +"PO-Revision-Date: 2026-10-13 21:56+0000\n" +"X-Generator: Weblate 2026.11.dev0\n" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:882 msgid "%d interface" @@ -978,7 +978,6 @@ msgid "Reset to defaults, applied." msgstr "Restablecer a valores predeterminados, aplicado." #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:2095 -#, fuzzy msgid "Resetting" msgstr "Restableciendo" @@ -1205,7 +1204,7 @@ msgstr "" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1205 msgid "Upload" -msgstr "Carga" +msgstr "Cargar" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1210 msgid "Upload & Apply" diff --git a/luci-app-qosify/po/ga/qosify.po b/luci-app-qosify/po/ga/qosify.po index ea1bb21b4..db4942b1b 100644 --- a/luci-app-qosify/po/ga/qosify.po +++ b/luci-app-qosify/po/ga/qosify.po @@ -3,101 +3,118 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Language: ga\n" "Content-Transfer-Encoding: 8bit\n" -"Last-Translator: Aindriú Mac Giolla Eoin \n" +"Last-Translator: Aindriú Mac Giolla Eoin " +"\n" "Language-Team: Irish \n" "Plural-Forms: nplurals=5; plural=n==1 ? 0 : n==2 ? 1 : (n>2 && n<7) ? 2 :(n>" "6 && n<11) ? 3 : 4;\n" -"PO-Revision-Date: 2026-09-02 17:28+0000\n" -"X-Generator: Weblate 2026.9.dev0\n" +"PO-Revision-Date: 2026-10-15 11:02+0000\n" +"X-Generator: Weblate 2026.11.dev0\n" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:882 msgid "%d interface" msgid_plural "%d interfaces" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" -msgstr[4] "" +msgstr[0] "%d comhéadan" +msgstr[1] "%d chomhéadan" +msgstr[2] "%d chomhéadan" +msgstr[3] "%d chomhéadan" +msgstr[4] "%d chomhéadan" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:943 msgid "%d rule" msgid_plural "%d rules" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" -msgstr[4] "" +msgstr[0] "%d riail" +msgstr[1] "%d riail" +msgstr[2] "%d riail" +msgstr[3] "%d riail" +msgstr[4] "%d riail" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:942 msgid "%d section" msgid_plural "%d sections" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" -msgstr[4] "" +msgstr[0] "%d rannán" +msgstr[1] "%d rannán" +msgstr[2] "%d rannán" +msgstr[3] "%d rannán" +msgstr[4] "%d rannán" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:682 msgid "%s (current)" -msgstr "" +msgstr "%s (reatha)" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:700 msgid "%s (from bandwidth)" -msgstr "" +msgstr "%s (ón bandaleithead)" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:2085 msgid "" "%s and %s are replaced with the templates shipped by the qosify package, and " "shaping is left disabled." msgstr "" +"Cuirtear na teimpléid a sholáthraíonn an pacáiste qosify in áit %s agus %s, " +"agus fágtar an mhúnlú tráchta díchumasaithe." #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1809 msgid "" "%s came back empty although it is %d bytes on disk — refusing to overwrite it" msgstr "" +"Tháinig %s ar ais folamh cé go bhfuil sé %d beart ar an diosca — ag diúltú é " +"a fhorscríobh" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:2346 msgid "%s changed on disk — your unsaved edits are still in the editor." msgstr "" +"Athraíodh %s ar an diosca — tá do chuid athruithe nár sábháladh fós san " +"eagarthóir." #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:2249 msgid "" "%s could not be read — the editor is left empty and will not be saved over " "it." msgstr "" +"Níorbh fhéidir %s a léamh — fágadh an t-eagarthóir folamh agus ní shábhálfar " +"aon rud ina áit." #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1833 msgid "" "%s has changed since this editor was loaded. Saving now discards those " "changes." msgstr "" +"Tá athrú tagtha ar %s ó luchtú an eagarthóra seo. Má shábhálann tú anois, " +"caillfear na hathruithe sin." #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1864 msgid "" "%s is %d bytes on disk but was never loaded into the editor — refusing to " "truncate it. Reload the page first." msgstr "" +"Tá %s %d beart ar an diosca ach níor luchtáladh riamh é sa eagarthóir — á " +"dhiúltú é a ghiorrú. Athluchtaigh an leathanach ar dtús." #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:364 msgid "%s is a list in this section — edit %s directly" -msgstr "" +msgstr "Is liosta é %s sa rannán seo — cuir %s in eagar go díreach" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1656 msgid "" "%s is not in the defaults list — qosify does not load it, so the Rules tab " "has no effect" msgstr "" +"Níl %s ar an liosta réamhshocruithe — níl sé á luchtú ag qosify, mar sin níl " +"aon éifeacht ag an gcluaisín Rialacha" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:286 msgid "" "%s is set to \"%s\" — qosify converts it with atoi(), so anything but a non-" "zero number means off" msgstr "" +"Tá %s socraithe ar \"%s\" — déanann qosify é a thiontú le atoi(), mar sin " +"ciallaíonn aon rud seachas uimhir neamh-nialasach go bhfuil sé múchta" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:750 msgid "%s quick settings" -msgstr "" +msgstr "Socruithe tapa %s" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:2069 msgid "%s uploaded, qosify reloaded." @@ -105,11 +122,11 @@ msgstr "%s uaslódáilte, qosify athlódáilte." #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:2103 msgid "%s was not written: %s" -msgstr "" +msgstr "Níor scríobhadh %s: %s" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:2106 msgid "%s was reset but %s was not written: %s" -msgstr "" +msgstr "Athshocraíodh %s ach níor scríobhadh %s: %s" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1945 msgid "%s, applied (QoS disabled)." @@ -119,6 +136,8 @@ msgstr "%s, curtha i bhfeidhm (QoS díchumasaithe)." msgid "" "%s, applied — qosify did not answer on ubus, so shaping could not be checked." msgstr "" +"%s, curtha i bhfeidhm — níor thug qosify freagra ar ubus, mar sin níorbh " +"fhéidir an mhúnlú a sheiceáil." #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1947 msgid "%s, applied." @@ -128,30 +147,42 @@ msgstr "%s, curtha i bhfeidhm." #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:468 msgid "%s: %s \"%s\" is not a class, codepoint or 0-63 — qosify ignores it" msgstr "" +"%s: %s Ní aicme, pointe cóid ná luach idir 0 agus 63 é \"%s\" — déanann " +"qosify neamhaird de" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:456 msgid "" "%s: %s \"%s\" is not a class, codepoint or 0-63 — qosify rejects the whole " "config and interface changes are not applied" msgstr "" +"%s: %s Ní rang, pointe cóid ná luach idir 0 agus 63 é \"%s\" — diúltaíonn " +"qosify don chumraíocht ar fad agus ní chuirtear na hathruithe ar an " +"gcomhéadan i bhfeidhm" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:465 msgid "" "%s: %s \"%s\" is not a codepoint or 0-63 — qosify drops this class and the " "rules using it" msgstr "" +"%s: Ní pointe cóid ná luach idir 0 agus 63 é %s \"%s\" — déanann qosify an " +"aicme seo agus na rialacha a bhaineann léi a chaitheamh i leataobh" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:448 msgid "" "%s: %s cannot be checked — write it as one plain or fully quoted value, with " "no backslash" msgstr "" +"%s: Ní féidir %s a sheiceáil — scríobh é mar luach simplí amháin nó mar " +"luach atá faoi luíana iomlána, gan aon chúlslais" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:451 msgid "" "%s: %s contains shell metacharacters — qosify runs the tc command with sh -c " "as root, so they would break it or be executed" msgstr "" +"%s: Tá meitea-charachtair bhlaosc i %s — ritheann qosify an t-ordú tc le sh -" +"c mar fhréamh (root), mar sin chuirfeadh siad isteach ar a fheidhmiú nó " +"rithfí iad" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1109 msgid "(alias)" @@ -159,7 +190,7 @@ msgstr "(ainm cleite)" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:435 msgid "(this qosify build has no NQB)" -msgstr "" +msgstr "(níl NQB ag an leagan seo de qosify)" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:2185 msgid "A config defaults section already exists." @@ -168,6 +199,7 @@ msgstr "Tá rannóg réamhshocruithe cumraíochta ann cheana féin." #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:2183 msgid "A section name may only contain letters, digits and underscores." msgstr "" +"Ní fhéadfaidh ach litreacha, digití agus fostí a bheith i n-ainm rannáin." #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:856 msgid "Active" @@ -180,19 +212,21 @@ msgstr "Cuir leis" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:85 msgid "Adds atm, noatm or ptm when overhead_type is manual" -msgstr "" +msgstr "Cuireann sé atm, noatm nó ptm leis nuair is manual é overhead_type" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:87 msgid "Adds ether-vlan once per level (1 or 2)" -msgstr "" +msgstr "Cuireann ether-vlan leis uair amháin in aghaidh an leibhéil (1 nó 2)" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:86 msgid "Adds mpu " -msgstr "" +msgstr "Cuireann mpu leis" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:84 msgid "Adds overhead when overhead_type is manual" msgstr "" +"Cuireann sé forchostas leis nuair is 'manual' (láimhe) atá i gceist " +"le overhead_type" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:608 #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:737 @@ -202,10 +236,11 @@ msgstr "Ardleibhéil" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1870 msgid "An empty %s stops all shaping. Continue?" msgstr "" +"Cuireann %s folamh stop le gach múnlú. Ar mhaith leat leanúint ar aghaidh?" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:726 msgid "Automatic download rate" -msgstr "" +msgstr "Ráta íoslódála uathoibríoch" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:893 msgid "Autostart" @@ -213,7 +248,7 @@ msgstr "Uaththosú" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:924 msgid "Autostart state unknown — rpcd did not answer" -msgstr "" +msgstr "Stádas an uaththosaithe anaithnid — níor thug rpcd freagra" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:883 msgid "Available" @@ -221,17 +256,19 @@ msgstr "Ar fáil" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1196 msgid "Backup" -msgstr "" +msgstr "Cúltaca" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:76 msgid "" "Bandwidth for both directions, where bandwidth_up or bandwidth_down is not " "set" msgstr "" +"Bandleithead don dá threo, i gcás nach bhfuil bandwidth_up ná bandwidth_down " +"socraithe" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:716 msgid "Basic" -msgstr "" +msgstr "Bunúsach" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:224 #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:2029 @@ -240,57 +277,60 @@ msgstr "Ábhar dénártha diúltaithe" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:79 msgid "CAKE diffserv mode" -msgstr "" +msgstr "Mód diffserv CAKE" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:89 msgid "CAKE egress options" -msgstr "" +msgstr "Roghanna imeachta CAKE" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:739 msgid "CAKE egress options, space separated." -msgstr "" +msgstr "Roghanna imeachta CAKE, scartha le spásanna." #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:88 msgid "CAKE ingress options" -msgstr "" +msgstr "Roghanna iontrála CAKE" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:738 msgid "CAKE ingress options, space separated." -msgstr "" +msgstr "Roghanna iontrála CAKE, scartha le spásanna." #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:90 msgid "CAKE options for ingress + egress" -msgstr "" +msgstr "Roghanna CAKE le haghaidh iontrála agus imeachta" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:83 msgid "" "CAKE overhead keyword added to options; manual uses overhead and " "overhead_encap" msgstr "" +"Cuireadh eochairfhocal forchostais CAKE leis na roghanna; úsáideann an " +"lámhleabhar forchostais agus forchostais_encap" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:731 msgid "CAKE overhead keyword. Use none if unsure." msgstr "" +"Príomhfhocal forchostais CAKE. Ná húsáid aon cheann mura bhfuil tú cinnte." #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:564 msgid "Cancel" -msgstr "" +msgstr "Cealaigh" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1214 msgid "Check Devices" -msgstr "" +msgstr "Seiceáil na gléasanna" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1193 msgid "Choose file…" -msgstr "" +msgstr "Roghnaigh comhad…" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1114 msgid "Classes" -msgstr "" +msgstr "Ranganna" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1737 msgid "Cleanup exited with code %d" -msgstr "" +msgstr "Tháinig deireadh leis an nglanadh leis an gcód %d" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1146 #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1990 @@ -300,12 +340,12 @@ msgstr "Glan" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1869 msgid "Clear configuration" -msgstr "" +msgstr "Cumraíocht shoiléir" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1990 #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1996 msgid "Clear editor" -msgstr "" +msgstr "Glan an t-eagarthóir" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:929 msgid "Click to disable autostart" @@ -317,7 +357,7 @@ msgstr "Cliceáil chun uaththosú a chumasú" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:740 msgid "Common CAKE options" -msgstr "" +msgstr "Roghanna coitianta CAKE" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:604 msgid "Config" @@ -329,7 +369,7 @@ msgstr "Glanadh an chumraíocht, stopadh qosify." #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1894 msgid "Config cleared." -msgstr "" +msgstr "Cumraíocht glanta." #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1915 msgid "Config saved" @@ -342,28 +382,28 @@ msgstr "Cumraíocht: %s" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:566 msgid "Continue" -msgstr "" +msgstr "Lean ar aghaidh" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1245 msgid "Could not read %s: %s" -msgstr "" +msgstr "Níorbh fhéidir %s a léamh: %s" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:607 msgid "Counters" -msgstr "" +msgstr "Cuntair" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1404 #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1627 msgid "DNS Entries" -msgstr "" +msgstr "Iontrálacha DNS" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1364 msgid "DNS Entries (%d of %d)" -msgstr "" +msgstr "Iontrálacha DNS (%d as %d)" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1364 msgid "DNS Entries (%d)" -msgstr "" +msgstr "Iontrálacha DNS (%d)" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1021 msgid "" @@ -372,51 +412,60 @@ msgid "" "accepted too, and any dscp_* value may also name a class. Prefix with + to " "override only when the DSCP field is zero." msgstr "" +"Pointí cóid DSCP: CS0–CS7, AF11–AF43, EF, VA, NQB, LE, DF (teastaíonn " +"*qosify* le haghaidh NQB ón Meitheamh 2026; níl sé ar fáil i 24.10 ná i " +"25.12). Glactar le luach amh idir 0 agus 63 freisin, agus féadfaidh aon " +"luach *dscp_** rang a shainiú chomh maith. Cuir + roimhe chun an socrú a " +"shárú ach amháin nuair atá an réimse DSCP cothrom le nialas." #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:63 msgid "DSCP value for ICMP packets" -msgstr "" +msgstr "Luach DSCP do phacáistí ICMP" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:65 msgid "DSCP value for bulk-marked packets" -msgstr "" +msgstr "Luach DSCP do phaicéid atá marcáilte mar thrácht mórchóir" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:71 msgid "DSCP value for egress" -msgstr "" +msgstr "Luach DSCP don aschur" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:70 msgid "DSCP value for ingress" -msgstr "" +msgstr "Luach DSCP don ionchur" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:69 msgid "DSCP value for ingress and egress, where they are not set" msgstr "" +"Luach DSCP le haghaidh iontrála agus eis-shreafa, i gcás nach bhfuil siad " +"socraithe" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:64 msgid "DSCP value for priority-marked packets" -msgstr "" +msgstr "Luach DSCP do phaicéid atá marcáilte le tosaíocht" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1021 msgid "DSCP values" -msgstr "" +msgstr "Luachanna DSCP" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:61 msgid "Default DSCP value for TCP packets" -msgstr "" +msgstr "Luach réamhshocraithe DSCP do phacáistí TCP" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:62 msgid "Default DSCP value for UDP packets" -msgstr "" +msgstr "Luach réamhshocraithe DSCP do phacáistí UDP" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:60 msgid "Default timeout for dynamically added entries" msgstr "" +"Am scoir réamhshocraithe le haghaidh iontrálacha a chuirtear leis go " +"dinimiciúil" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1022 #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1217 msgid "Defaults" -msgstr "" +msgstr "Réamhshocruithe" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1022 msgid "" @@ -434,15 +483,15 @@ msgstr "" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:718 msgid "Device" -msgstr "" +msgstr "Gléas" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1711 msgid "Device check done." -msgstr "" +msgstr "Seiceáil an fheiste críochnaithe." #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1714 msgid "Device check failed: %s" -msgstr "" +msgstr "Theip ar sheiceáil an ghléis: %s" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:859 #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:881 @@ -452,11 +501,13 @@ msgstr "Míchumasaithe" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:75 msgid "Downlink bandwidth (same format as tc)" -msgstr "" +msgstr "Bandaleithead an nasc-íoslódála (an fhormáid chéanna le tc)" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:720 msgid "Downlink bandwidth, same format as tc. Set just below line speed." msgstr "" +"Bandaleithead an nasc-síos, sa bhformáid chéanna le tc. Socraigh é díreach " +"faoi bhun luas na líne." #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1198 #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1247 @@ -465,15 +516,15 @@ msgstr "Íoslódáil" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:720 msgid "Download bandwidth" -msgstr "" +msgstr "Bandaleithead íoslódála" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:724 msgid "Download shaping" -msgstr "" +msgstr "Íoslódáil múnlú" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1197 msgid "Download the current files from the router." -msgstr "" +msgstr "Íoslódáil na comhaid reatha ón ródaire." #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1166 msgid "" @@ -481,10 +532,14 @@ msgid "" "raw value, a codepoint like CS0, or a class name. DNS entries are compared " "in the order in which they are specified, using the first matching entry." msgstr "" +"Tá dhá réimse i ngach líne, scartha le spás bán: *match* agus *dscp*. Is " +"féidir le *dscp* a bheith ina luach amh, ina phointe cóid (amhail CS0), nó " +"ina ainm aicme. Déantar comparáid idir iontrálacha DNS san ord ina " +"sonraítear iad, agus úsáidtear an chéad iontráil a thagann leis an gcritéar." #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:739 msgid "Egress CAKE options" -msgstr "" +msgstr "Roghanna Egress CAKE" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:2020 msgid "Empty file" @@ -494,31 +549,35 @@ msgstr "Comhad folamh" msgid "" "Empty the config editor? Nothing is written until you click Save & Apply." msgstr "" +"An bhfuil an t-eagarthóir cumraíochta le folmhú? Ní scríobhtar aon rud go " +"dtí go gcliceálann tú ar Sábháil & Cuir i bhFeidhm." #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1996 msgid "" "Empty the rules editor? Nothing is written until you click Save & Apply." msgstr "" +"An bhfuil tú ag iarraidh an t-eagarthóir rialacha a fholmhú? Ní scríobhfar " +"aon rud go dtí go gcliceálann tú ar Sábháil & Cuir i bhFeidhm." #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:80 msgid "Enable CAKE NAT host detection via conntrack" -msgstr "" +msgstr "Cumasaigh braite óstach CAKE NAT trí conntrack" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:82 msgid "Enable CAKE automatic rate estimation for ingress" -msgstr "" +msgstr "Cumasaigh meastachán uathoibríoch ráta CAKE don trácht isteach" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:81 msgid "Enable CAKE host isolation" -msgstr "" +msgstr "Cumasaigh leithlisiú óstach CAKE" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:78 msgid "Enable egress shaping" -msgstr "" +msgstr "Cumasaigh múnlú tráchta amach" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:77 msgid "Enable ingress shaping" -msgstr "" +msgstr "Cumasaigh múnlú tráchta isteach" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:881 #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:930 @@ -535,11 +594,11 @@ msgstr "Cumasaithe — Gan Múnlú (seiceáil cumraíocht)" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:711 msgid "Encapsulation overhead" -msgstr "" +msgstr "Forchostas cuimsithe" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:2182 msgid "Enter a section name." -msgstr "" +msgstr "Cuir isteach ainm na ríne." #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:2156 msgid "Enter a single IPv4 address (qosify does not accept CIDR)." @@ -549,6 +608,8 @@ msgstr "Cuir isteach seoladh IPv4 amháin (ní ghlacann qosify le CIDR)." msgid "" "Enter a single IPv6 address (qosify does not accept CIDR or a %zone suffix)." msgstr "" +"Cuir isteach seoladh IPv6 amháin (ní ghlacann qosify le CIDR ná le hiarmhír " +"%zone)." #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:2141 msgid "Enter a value." @@ -556,7 +617,7 @@ msgstr "Cuir isteach luach." #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:941 msgid "Entries" -msgstr "" +msgstr "Iontrálacha" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1848 #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1961 @@ -572,6 +633,9 @@ msgid "" "Error: invalid characters in bandwidth or options fields. Use alphanumeric, " "spaces, hyphens, dots, colons only." msgstr "" +"Earráid: carachtair neamhbhailí sna réimsí bandaleithid nó roghanna. Ná " +"húsáid ach carachtair alfa-uimhriúla, spásanna, fleiscíní, poncanna agus " +"idirchóinní." #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1798 msgid "Error: name must be a device or interface name" @@ -583,7 +647,7 @@ msgstr "Earráid: ní mór don fhorchostais a bheith ina líon iomlán beart" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1768 msgid "Error: overhead_mpu must be a whole number of bytes" -msgstr "" +msgstr "Earráid: ní mór gur líon iomlán beart é overhead_mpu" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:2070 msgid "Errors:" @@ -593,11 +657,11 @@ msgstr "Earráidí:" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1198 #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1205 msgid "File" -msgstr "" +msgstr "Comhad" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1832 msgid "File changed on disk" -msgstr "" +msgstr "Athraíodh an comhad ar an diosca" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:2021 msgid "File too large (max 64KB)" @@ -605,7 +669,7 @@ msgstr "Comhad ró-mhór (uasmhéid 64KB)" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:667 msgid "Files" -msgstr "" +msgstr "Comhaid" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:938 msgid "Found (empty or invalid)" @@ -617,78 +681,82 @@ msgstr "Deonaigh rochtain ar aip LuCI qosify" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:728 msgid "Host isolation" -msgstr "" +msgstr "Leithlisiú óstach" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1156 #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1169 msgid "IPv4 address, e.g. 1.1.1.1" -msgstr "" +msgstr "Seoladh IPv4, m.sh. 1.1.1.1" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1156 #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1170 msgid "IPv6 address, e.g. ff01::1" -msgstr "" +msgstr "Seoladh IPv6, m.sh. ff01::1" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:738 msgid "Ingress CAKE options" -msgstr "" +msgstr "Roghanna Ingress CAKE" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:718 msgid "Interface" -msgstr "" +msgstr "Comhéadan" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:741 msgid "Invalid CAKE options can stop qosify starting." -msgstr "" +msgstr "D’fhéadfadh roghanna CAKE neamhbhailí cosc a chur ar qosify tosú." #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1173 msgid "Like dns:... but only matches cname entries" -msgstr "" +msgstr "Cosúil le dns:... ach ní mheaitseálann sé ach iontrálacha cname" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:228 msgid "" "Line %d is longer than 1023 characters — the rule loader reads fixed-size " "lines and would split it, comment included" msgstr "" +"Tá líne %d níos faide ná 1023 carachtar — léann an luchtaire rialacha línte " +"de mhéid seasta agus dhéanfadh sé í a scoilt, an nóta tráchta san áireamh" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:59 msgid "List of files with port/IP/host mappings" -msgstr "" +msgstr "Liosta comhad ina bhfuil mapálacha port/IP/óstach" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1402 #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1404 msgid "Loading..." -msgstr "" +msgstr "Ag luchtú..." #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1212 msgid "Maintenance" -msgstr "" +msgstr "Cothabháil" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:710 msgid "Manual overhead" -msgstr "" +msgstr "Costas riaracháin láimhe" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1166 msgid "Mapping file syntax" -msgstr "" +msgstr "Comhréir an chomhaid mapála" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1692 msgid "Mapping files reloaded." -msgstr "" +msgstr "Athlódáladh comhaid mhapála." #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:434 msgid "" "Match not loaded by qosify on line %s — ports 1-65534, one IPv4/IPv6 address " "(no CIDR or %%zone), or dns:, dns_c:" msgstr "" +"Níor luchtú qosify an cluiche ar an líne %s — poirt 1-65534, seoladh IPv4/" +"IPv6 amháin (gan CIDR ná %%zone), nó dns:, dns_c:" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:66 msgid "Maximum average packet length for marking a flow as priority" -msgstr "" +msgstr "Uasfhad meánach paicéid chun sruth a mharcáil mar shruth tosaíochta" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:734 msgid "Minimum packet unit (MPU)" -msgstr "" +msgstr "Íos-aonad paicéid (MPU)" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:883 #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:938 @@ -698,37 +766,41 @@ msgstr "Ar iarraidh" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:941 #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1198 msgid "Modified" -msgstr "" +msgstr "Athraithe" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:433 msgid "" "More than two fields on line %s — qosify reads the rest of the line as the " "DSCP value and skips it" msgstr "" +"Níos mó ná dhá réimse ar an líne %s — léann qosify an chuid eile den líne " +"mar luach DSCP agus déanann sé neamhaird air" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:727 msgid "NAT awareness" -msgstr "" +msgstr "Feasacht ar NAT" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:718 msgid "Netdev to enable QoS on. Required." -msgstr "" +msgstr "Netdev ar a gcuirfear QoS i ngníomh. Riachtanach." #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1585 msgid "No CAKE tin statistics." -msgstr "" +msgstr "Gan staitisticí maidir le múnlaí cácaí." #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1628 msgid "No DNS entries." -msgstr "" +msgstr "Gan aon iontráil DNS." #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:432 msgid "No DSCP target on line %s — qosify skips single-field lines" msgstr "" +"Gan sprioc DSCP ar an líne %s — déanann qosify neamhaird ar línte a bhfuil " +"réimse amháin iontu" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1107 msgid "No classes defined in %s" -msgstr "" +msgstr "Níl aon ranganna sainithe i %s" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:2142 msgid "No classes defined. Add classes in the Config tab first." @@ -739,7 +811,7 @@ msgstr "" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1191 #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1192 msgid "No file selected" -msgstr "" +msgstr "Níl aon chomhad roghnaithe" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:2006 msgid "No files selected." @@ -747,11 +819,11 @@ msgstr "Níl aon chomhaid roghnaithe." #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1585 msgid "No output." -msgstr "" +msgstr "Gan aon aschur." #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1568 msgid "No per-class counters." -msgstr "" +msgstr "Gan áiritheoirí in aghaidh an ranga." #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:2154 msgid "No spaces or # allowed in patterns or addresses." @@ -774,16 +846,20 @@ msgstr "" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:67 msgid "Number of packets per second to trigger bulk flow detection" msgstr "" +"Líon na bpaicéad in aghaidh an tsoicind chun braite sreafa mórchóir a " +"spreagadh" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1161 #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1174 msgid "Only override the DSCP value if it is zero" -msgstr "" +msgstr "Ná sáraigh an luach DSCP ach amháin má tá sé nialas" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:704 msgid "" "Only sent with host isolation on — add nat to common CAKE options to force it" msgstr "" +"Ní sheoltar é ach nuair atá leithlisiú óstach (host isolation) curtha ar " +"siúl — cuir 'nat' le gnáth-roghanna CAKE chun é a chur i bhfeidhm" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1017 msgid "Options" @@ -791,11 +867,11 @@ msgstr "Roghanna" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:730 msgid "Overhead" -msgstr "" +msgstr "Os cionn an chinn" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:731 msgid "Overhead preset" -msgstr "" +msgstr "Réamhshocrú os cionn an chinn" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:603 msgid "Overview" @@ -803,17 +879,20 @@ msgstr "Forbhreathnú" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1834 msgid "Overwrite" -msgstr "" +msgstr "Forscríobh" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:2007 msgid "Overwrite config files" -msgstr "" +msgstr "Sáraigh comhaid chumraíochta" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1172 msgid "" "POSIX.2 extended regular expression for matching hostnames. Only works if " "dns lookups are passed to qosify via the add_dns_host ubus call." msgstr "" +"Slonn rialta leathnaithe POSIX.2 chun ainmneacha óstach a mheaitseáil. Ní " +"oibríonn sé ach má chuirtear cuardaigh DNS ar aghaidh chuig qosify tríd an " +"nglao ubus `add_dns_host`." #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:2150 msgid "Port must be 1-65534 (qosify rejects 65535)." @@ -822,7 +901,7 @@ msgstr "Ní mór don phort a bheith 1-65534 (diúltaíonn qosify do 65535)." #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:2146 #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:2149 msgid "Port must be a number or a range (4500, 5060-5061)." -msgstr "" +msgstr "Caithfidh an port a bheith ina uimhir nó ina raon (4500, 5060-5061)." #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:717 msgid "QoS Enabled" @@ -830,15 +909,15 @@ msgstr "QoS Cumasaithe" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:721 msgid "Queueing mode" -msgstr "" +msgstr "Modh scuaineála" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1163 msgid "Quick Add" -msgstr "" +msgstr "Cuir leis go tapa" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1016 msgid "Quick Add: %s" -msgstr "" +msgstr "Cuir leis go tapa: %s" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:2153 msgid "Range start must not exceed end." @@ -846,19 +925,19 @@ msgstr "Ní mór tús an raoin a bheith níos faide ná deireadh an raoin." #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1213 msgid "Re-check devices" -msgstr "" +msgstr "Athsheiceáil na feistí" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1707 msgid "Re-checking devices..." -msgstr "" +msgstr "Ag athsheiceáil feistí..." #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:768 msgid "Re-read the mapping files only" -msgstr "" +msgstr "Athléigh na comhaid mhapála amháin" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1690 msgid "Re-reading the mapping files..." -msgstr "" +msgstr "Ag athléamh na gcomhad mapála..." #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1215 msgid "" @@ -867,6 +946,11 @@ msgid "" "is stopped. Nothing is reported back by the call — the result shows in the " "Service table on the Overview tab." msgstr "" +"Ritheann sé pas feiste an deamhain féin arís: déantar athscrúdú ar gach " +"rannán múnlaithe; cuirtear tús le rannán a bhfuil a fheiste ann anois, agus " +"stoptar rannán nach bhfuil a fheiste ann a thuilleadh. Ní thugann an glao " +"aon fhaisnéis ar ais — feictear an toradh sa tábla Seirbhísí ar an gcluaisín " +"Forléargais." #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:2024 msgid "Read error" @@ -878,11 +962,11 @@ msgstr "Ag léamh agus ag bailíochtú comhad..." #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1681 msgid "Reading tc output..." -msgstr "" +msgstr "Ag léamh aschur tc..." #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1019 msgid "Reference" -msgstr "" +msgstr "Tagairt" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:765 msgid "Reload" @@ -890,20 +974,20 @@ msgstr "Athlódáil" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:765 msgid "Reload Rules" -msgstr "" +msgstr "Athluchtaigh na Rialacha" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1695 msgid "Reload failed: %s" -msgstr "" +msgstr "Theip ar an athlódáil: %s" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1585 msgid "Requires write access." -msgstr "" +msgstr "Teastaíonn cead scríofa." #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1219 #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:2086 msgid "Reset" -msgstr "" +msgstr "Athshocraigh" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:2120 msgid "Reset failed: %s" @@ -911,7 +995,7 @@ msgstr "Theip ar an athshocrú: %s" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:2084 msgid "Reset to defaults" -msgstr "" +msgstr "Athshocraigh go dtí na réamhshocruithe" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:2116 msgid "Reset to defaults, applied." @@ -927,11 +1011,11 @@ msgstr "Atosaigh" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1203 msgid "Restore" -msgstr "" +msgstr "Athchóirigh" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1218 msgid "Restore qosify defaults" -msgstr "" +msgstr "Athchóirigh réamhshocruithe qosify" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:2095 msgid "Restoring defaults..." @@ -939,7 +1023,7 @@ msgstr "Ag athchóiriú réamhshocruithe..." #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:605 msgid "Rules" -msgstr "" +msgstr "Rialacha" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1976 msgid "Rules saved" @@ -960,12 +1044,12 @@ msgstr "Rith — Ní Múnlú" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:867 msgid "Running — Shaping Unknown" -msgstr "" +msgstr "Ag rith — Múnlú Anaithnid" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:753 #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1147 msgid "Save & Apply" -msgstr "Sábháil & Cuir i bhFeidhm" +msgstr "Sábháil agus Cuir i bhFeidhm" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1825 #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1897 @@ -993,6 +1077,9 @@ msgid "" "Section name is the class name that rules and dscp_* values refer to. " "qosify.init reads config alias the same way as config class." msgstr "" +"Is é ainm na rannóige ainm na haicme a dtagraíonn na rialacha agus na " +"luachanna dscp_* di. Léann qosify.init an ailias cumraíochta ar an gcaoi " +"chéanna leis an aicme chumraíochta." #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1724 msgid "Sending %s to qosify..." @@ -1000,23 +1087,23 @@ msgstr "Ag seoladh %s chuig qosify..." #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:711 msgid "Sent to CAKE as atm, noatm or ptm." -msgstr "" +msgstr "Seolta chuig CAKE mar atm, noatm ná ptm." #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:735 msgid "Sent to CAKE as ether-vlan, once per tag." -msgstr "" +msgstr "Seolta chuig CAKE mar ether-vlan, uair amháin in aghaidh an chlibe." #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:734 msgid "Sent to CAKE as mpu, in bytes." -msgstr "" +msgstr "Seolta chuigCAKE mar mpu, i mbearta." #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:710 msgid "Sent to CAKE as overhead, in bytes." -msgstr "" +msgstr "Seolta chuig CAKE mar mhaoirchostas, i mbearta." #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:663 msgid "Service" -msgstr "" +msgstr "Seirbhís" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1745 msgid "Service action failed: %s" @@ -1029,16 +1116,16 @@ msgstr "Socruithe sábháilte" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:723 #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:894 msgid "Shaping" -msgstr "" +msgstr "Múnlú" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:941 #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1198 msgid "Size" -msgstr "" +msgstr "Méid" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:73 msgid "Skip this section" -msgstr "" +msgstr "Scipeáil an rannán seo" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:764 msgid "Start" @@ -1052,7 +1139,7 @@ msgstr "Stádas" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:855 msgid "Status Unknown" -msgstr "" +msgstr "Stádas anaithnid" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:766 msgid "Stop" @@ -1060,40 +1147,51 @@ msgstr "Stop" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1167 msgid "TCP single port, or range from to " -msgstr "" +msgstr "Port aonair TCP, nó raon ó go " #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1680 msgid "The detailed tc output needs write access to this page." msgstr "" +"Teastaíonn cead scríofa don leathanach seo le haghaidh aschur mionchruinn an " +"tc." #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:590 msgid "" "The qosify UCI configuration could not be loaded — class and interface lists " "may be incomplete." msgstr "" +"Níorbh fhéidir cumraíocht UCI qosify a luchtú — d’fhéadfadh liostaí na " +"ranganna agus na gcomhéadan a bheith neamhiomlán." #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1204 msgid "" "The selected files replace the ones on the router and qosify is reloaded." msgstr "" +"Cuireann na comhaid roghnaithe in ionad na gcomhad atá ar an ródaire, agus " +"athlódáiltear qosify." #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:2008 msgid "" "The selected files replace the ones on the router and qosify is reloaded. " "Download a backup from this tab first if you need one." msgstr "" +"Cuireann na comhaid roghnaithe in ionad na gcomhad atá ar an ródaire, agus " +"déantar qosify a athlódáil. Íoslódáil cúltaca ón gcluaisín seo ar dtús más " +"gá duit ceann." #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:68 msgid "Time below bulk_trigger_pps threshold until a bulk flow mark is removed" msgstr "" +"An t-am faoi bhun na tairsí bulk_trigger_pps go dtí go mbaintear marc sreafa " +"mórchóir" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1402 msgid "Traffic by CAKE Tin" -msgstr "" +msgstr "Trácht le CAKE Tin" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1401 msgid "Traffic by Class" -msgstr "" +msgstr "Trácht de réir Aicme" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:596 msgid "Traffic shaping and DSCP classification via qosify" @@ -1101,13 +1199,13 @@ msgstr "Múnlú tráchta agus aicmiú DSCP trí qosify" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1168 msgid "UDP single port, or range from to " -msgstr "" +msgstr "Port aonair UDP, nó raon ó go " #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:864 #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:866 #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:925 msgid "Unknown" -msgstr "" +msgstr "Anaithnid" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:435 msgid "Unknown class/DSCP target: %s" @@ -1116,30 +1214,33 @@ msgstr "Sprioc ranga/DSCP anaithnid: %s" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:717 msgid "Unticked sets disabled 1 and qosify skips this section." msgstr "" +"Tacair neamhthiceáilte díchumasaithe 1 agus scipeálann qosify an chuid seo." #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:74 msgid "Uplink bandwidth (same format as tc)" -msgstr "" +msgstr "Bandaleithead uasnaisc (an fhormáid chéanna le tc)" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:719 msgid "Uplink bandwidth, same format as tc. Set just below line speed." msgstr "" +"Bandaleithead nasc suas, sa bhformáid chéanna le tc. Socraigh é díreach faoi " +"bhun luas na líne." #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1205 msgid "Upload" -msgstr "" +msgstr "Uaslódáil" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1210 msgid "Upload & Apply" -msgstr "" +msgstr "Uaslódáil agus Cuir i bhFeidhm" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:2009 msgid "Upload and apply" -msgstr "" +msgstr "Uaslódáil agus cuir i bhfeidhm" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:719 msgid "Upload bandwidth" -msgstr "" +msgstr "Bandaleithead uaslódála" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:2061 msgid "Upload error: %s" @@ -1151,7 +1252,7 @@ msgstr "Theip ar an uaslódáil: %s" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:725 msgid "Upload shaping" -msgstr "" +msgstr "Múnlú uaslódála" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:2035 msgid "Uploading" @@ -1159,11 +1260,11 @@ msgstr "Ag uaslódáil" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:892 msgid "Uptime" -msgstr "" +msgstr "Am oibríochta" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:735 msgid "VLAN tags" -msgstr "" +msgstr "Clibeanna VLAN" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:938 msgid "Valid" @@ -1182,7 +1283,7 @@ msgstr "Ag obair" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1870 msgid "Write empty file" -msgstr "" +msgstr "Scríobh comhad folamh" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1906 msgid "Writing config and reloading qosify..." @@ -1197,42 +1298,53 @@ msgid "" "You have read-only access to this page, so editing and service control are " "disabled." msgstr "" +"Tá rochtain léite amháin agat ar an leathanach seo, mar sin tá an t-" +"eagarthóireacht agus rialú na seirbhíse díchumasaithe." #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:901 msgid "active" -msgstr "" +msgstr "gníomhach" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1767 msgid "" "bandwidth_down does not look like a tc rate (100mbit, 12MBps, unlimited) — " "passing it through anyway" msgstr "" +"Ní cosúil gur ráta tc é bandwidth_down (100mbit, 12MBps, gan teorainn) — á " +"chur ar aghaidh mar sin féin" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1766 msgid "" "bandwidth_up does not look like a tc rate (100mbit, 12MBps, unlimited) — " "passing it through anyway" msgstr "" +"Ní cosúil gur ráta tc é bandwidth_up (100mbit, 12MBps, gan teorainn) — á " +"chur ar aghaidh mar sin féin" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1012 msgid "" "config device takes the same options, with name set to a netdev. nat " "defaults to 1 for interfaces and 0 for devices." msgstr "" +"Glacann config device leis na roghanna céanna, agus an t-ainm socraithe mar " +"netdev. Is é 1 an réamhshocrú do nat i gcás comhéadan, agus is é 0 é i gcás " +"feistí." #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:900 msgid "device %s" -msgstr "" +msgstr "gléas %s" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:902 msgid "device: %s, ingress: %s, egress: %s" -msgstr "" +msgstr "gléas: %s, ionchur: %s, aschur: %s" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:289 msgid "" "disabled is set to \"%s\" — config_get_bool does not recognise that, so the " "section stays enabled" msgstr "" +"Tá disabled socraithe ar \"%s\" — ní aithníonn config_get_bool é sin, mar " +"sin fanann an rannán cumasaithe" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:700 #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:718 @@ -1242,23 +1354,23 @@ msgstr "" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1160 #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:2129 msgid "e.g. %s" -msgstr "" +msgstr "m.sh. %s" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1171 msgid "fnmatch() pattern supporting * and ? as wildcard characters" -msgstr "" +msgstr "Patrún fnmatch() a thacaíonn le * agus ? mar charachtair fhiáine" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1613 msgid "get_stats did not answer." -msgstr "" +msgstr "Níor thug get_stats freagra." #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:901 msgid "inactive" -msgstr "" +msgstr "neamhghníomhach" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1109 msgid "ingress %s, egress %s" -msgstr "" +msgstr "iontráil %s, imeacht %s" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:282 msgid "ingress and egress are both 0 — nothing is shaped" @@ -1267,11 +1379,11 @@ msgstr "" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:900 msgid "interface %s" -msgstr "" +msgstr "comhéadan %s" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1155 msgid "match" -msgstr "" +msgstr "meaitseáil" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:274 msgid "" @@ -1303,14 +1415,16 @@ msgid "" "netifd interface (config interface) or netdev (config device) to enable QoS " "on" msgstr "" +"comhéadan netifd (comhéadan cumraíochta) nó netdev (gléas cumraíochta) chun " +"QoS a chumasú ar" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:718 msgid "netifd interface to enable QoS on. Required." -msgstr "" +msgstr "Comhéadan netifd ar a gcuirfear QoS i ngníomh. Riachtanach." #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:902 msgid "no" -msgstr "" +msgstr "níl" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:284 msgid "no bandwidth_down or bandwidth — ingress CAKE runs unlimited" @@ -1322,7 +1436,7 @@ msgstr "gan bandwidth_up ná bandwidth — ritheann CAKE amach gan teorainn" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:882 msgid "none" -msgstr "" +msgstr "aon cheann" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:281 msgid "overhead and overhead_encap are ignored unless overhead_type is manual" @@ -1339,11 +1453,13 @@ msgstr "qosify" msgid "" "qosify did not appear on ubus, so its config was not applied — press Reload" msgstr "" +"Níor tháinig qosify chun cinn ar ubus, mar sin níor cuireadh a chumraíocht i " +"bhfeidhm — brúigh Athlódáil" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:833 #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1729 msgid "qosify did not come up — check the system log" -msgstr "" +msgstr "Níor thosaigh qosify — seiceáil loga an chórais" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1610 #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1672 @@ -1353,7 +1469,7 @@ msgstr "Níl qosify ag rith. Tosaigh ón táb Forbhreathnú." #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1735 #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1887 msgid "qosify is still running — leaving the qdiscs alone" -msgstr "" +msgstr "Tá qosify fós ag rith — na qdiscs á bhfágáil mar atá" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1253 msgid "qosify-status" @@ -1368,6 +1484,8 @@ msgid "" "rpcd is not answering for qosify — check the ACL in /usr/share/rpcd/acl.d " "and restart rpcd" msgstr "" +"Níl rpcd ag freagairt do qosify — seiceáil an ACL i /usr/share/rpcd/acl.d " +"agus athtosaigh rpcd" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:832 #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1609 @@ -1377,31 +1495,33 @@ msgstr "" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1886 msgid "rpcd is not answering for qosify, so the service state is unknown." msgstr "" +"Níl rpcd ag freagairt do qosify, mar sin ní fios cén staid ina bhfuil an " +"tseirbhís." #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:955 msgid "section name" -msgstr "" +msgstr "ainm an rannán" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:953 msgid "section type" -msgstr "" +msgstr "cineál rannóige" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1529 #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1533 msgid "share" -msgstr "" +msgstr "roinn" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1541 msgid "total" -msgstr "" +msgstr "iomlán" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1160 msgid "value" -msgstr "" +msgstr "luach" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:902 msgid "yes" -msgstr "" +msgstr "tá" #~ msgid "%s contains a quote — qosify rejects the whole value" #~ msgstr "Tá luachan i %s — diúltaíonn qosify don luach iomlán" diff --git a/luci-app-qosify/po/ko/qosify.po b/luci-app-qosify/po/ko/qosify.po index bfc30e617..d6028194d 100644 --- a/luci-app-qosify/po/ko/qosify.po +++ b/luci-app-qosify/po/ko/qosify.po @@ -7,27 +7,27 @@ msgstr "" "Language-Team: Korean \n" "Plural-Forms: nplurals=1; plural=0;\n" -"PO-Revision-Date: 2026-09-29 17:59+0000\n" -"X-Generator: Weblate 2026.10.dev0\n" +"PO-Revision-Date: 2026-10-01 18:42+0000\n" +"X-Generator: Weblate 2026.10\n" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:882 msgid "%d interface" msgid_plural "%d interfaces" -msgstr[0] "" +msgstr[0] "인터페이스 %d개" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:943 msgid "%d rule" msgid_plural "%d rules" -msgstr[0] "" +msgstr[0] "규칙 %d개" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:942 msgid "%d section" msgid_plural "%d sections" -msgstr[0] "" +msgstr[0] "섹션 %d개" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:682 msgid "%s (current)" -msgstr "" +msgstr "%s (현재)" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:700 msgid "%s (from bandwidth)" @@ -84,7 +84,7 @@ msgstr "" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:750 msgid "%s quick settings" -msgstr "" +msgstr "%s 빠른 설정" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:2069 msgid "%s uploaded, qosify reloaded." @@ -192,7 +192,7 @@ msgstr "" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:726 msgid "Automatic download rate" -msgstr "" +msgstr "자동 다운로드 속도" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:893 msgid "Autostart" @@ -218,7 +218,7 @@ msgstr "" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:716 msgid "Basic" -msgstr "" +msgstr "기본" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:224 #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:2029 @@ -227,7 +227,7 @@ msgstr "" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:79 msgid "CAKE diffserv mode" -msgstr "" +msgstr "CAKE 차등 서비스(Diffserv) 모드" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:89 msgid "CAKE egress options" @@ -265,7 +265,7 @@ msgstr "취소" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1214 msgid "Check Devices" -msgstr "" +msgstr "장치 확인" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1193 msgid "Choose file…" @@ -273,7 +273,7 @@ msgstr "파일 선택…" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1114 msgid "Classes" -msgstr "" +msgstr "클래스" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1737 msgid "Cleanup exited with code %d" @@ -342,7 +342,7 @@ msgstr "" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1404 #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1627 msgid "DNS Entries" -msgstr "" +msgstr "DNS 항목" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1364 msgid "DNS Entries (%d of %d)" @@ -362,7 +362,7 @@ msgstr "" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:63 msgid "DSCP value for ICMP packets" -msgstr "" +msgstr "ICMP 패킷의 DSCP 값" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:65 msgid "DSCP value for bulk-marked packets" @@ -386,15 +386,15 @@ msgstr "" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1021 msgid "DSCP values" -msgstr "" +msgstr "DSCP 값" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:61 msgid "Default DSCP value for TCP packets" -msgstr "" +msgstr "TCP 패킷의 기본 DSCP 값" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:62 msgid "Default DSCP value for UDP packets" -msgstr "" +msgstr "UDP 패킷의 기본 DSCP 값" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:60 msgid "Default timeout for dynamically added entries" @@ -403,7 +403,7 @@ msgstr "" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1022 #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1217 msgid "Defaults" -msgstr "" +msgstr "기본값" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1022 msgid "" @@ -424,7 +424,7 @@ msgstr "" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1714 msgid "Device check failed: %s" -msgstr "" +msgstr "장치 확인 실패: %s" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:859 #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:881 @@ -451,7 +451,7 @@ msgstr "다운로드 대역폭" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:724 msgid "Download shaping" -msgstr "" +msgstr "다운로드 셰이핑" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1197 msgid "Download the current files from the router." @@ -496,11 +496,11 @@ msgstr "CAKE 호스트 격리 활성화" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:78 msgid "Enable egress shaping" -msgstr "" +msgstr "이그레스 셰이핑 활성화" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:77 msgid "Enable ingress shaping" -msgstr "" +msgstr "인그레스 셰이핑 활성화" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:881 #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:930 @@ -509,7 +509,7 @@ msgstr "활성화" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:858 msgid "Enabled — Not Running" -msgstr "" +msgstr "활성화 — 실행 중 아님" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:857 msgid "Enabled — Not Shaping (check config)" @@ -517,7 +517,7 @@ msgstr "" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:711 msgid "Encapsulation overhead" -msgstr "" +msgstr "캡슐화 오버헤드" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:2182 msgid "Enter a section name." @@ -538,7 +538,7 @@ msgstr "" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:941 msgid "Entries" -msgstr "" +msgstr "항목" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1848 #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1961 @@ -587,7 +587,7 @@ msgstr "" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:667 msgid "Files" -msgstr "" +msgstr "파일" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:938 msgid "Found (empty or invalid)" @@ -604,12 +604,12 @@ msgstr "호스트 격리" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1156 #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1169 msgid "IPv4 address, e.g. 1.1.1.1" -msgstr "" +msgstr "IPv4 주소 (예: 1.1.1.1)" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1156 #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1170 msgid "IPv6 address, e.g. ff01::1" -msgstr "" +msgstr "IPv6 주소 (예: ff01::1)" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:738 msgid "Ingress CAKE options" @@ -640,15 +640,15 @@ msgstr "" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1402 #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1404 msgid "Loading..." -msgstr "" +msgstr "불러오는 중..." #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1212 msgid "Maintenance" -msgstr "" +msgstr "유지 관리" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:710 msgid "Manual overhead" -msgstr "" +msgstr "수동 오버헤드" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1166 msgid "Mapping file syntax" @@ -670,7 +670,7 @@ msgstr "" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:734 msgid "Minimum packet unit (MPU)" -msgstr "" +msgstr "최소 패킷 단위 (MPU)" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:883 #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:938 @@ -690,7 +690,7 @@ msgstr "" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:727 msgid "NAT awareness" -msgstr "" +msgstr "NAT 인식" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:718 msgid "Netdev to enable QoS on. Required." @@ -769,7 +769,7 @@ msgstr "옵션" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:730 msgid "Overhead" -msgstr "" +msgstr "오버헤드" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:731 msgid "Overhead preset" @@ -804,7 +804,7 @@ msgstr "" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:717 msgid "QoS Enabled" -msgstr "" +msgstr "QoS 활성화" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:721 msgid "Queueing mode" @@ -812,11 +812,11 @@ msgstr "대기열 관리 모드" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1163 msgid "Quick Add" -msgstr "" +msgstr "빠른 추가" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1016 msgid "Quick Add: %s" -msgstr "" +msgstr "빠른 추가: %s" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:2153 msgid "Range start must not exceed end." @@ -824,11 +824,11 @@ msgstr "" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1213 msgid "Re-check devices" -msgstr "" +msgstr "장치 재확인" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1707 msgid "Re-checking devices..." -msgstr "" +msgstr "장치를 다시 확인 중..." #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:768 msgid "Re-read the mapping files only" @@ -856,11 +856,11 @@ msgstr "" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1681 msgid "Reading tc output..." -msgstr "" +msgstr "tc 출력을 읽는 중..." #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1019 msgid "Reference" -msgstr "" +msgstr "참조" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:765 msgid "Reload" @@ -868,7 +868,7 @@ msgstr "다시 불러오기" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:765 msgid "Reload Rules" -msgstr "" +msgstr "규칙 다시 불러오기" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1695 msgid "Reload failed: %s" @@ -881,7 +881,7 @@ msgstr "" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1219 #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:2086 msgid "Reset" -msgstr "" +msgstr "초기화" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:2120 msgid "Reset failed: %s" @@ -889,7 +889,7 @@ msgstr "초기화 실패: %s" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:2084 msgid "Reset to defaults" -msgstr "" +msgstr "기본값으로 초기화" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:2116 msgid "Reset to defaults, applied." @@ -905,7 +905,7 @@ msgstr "재시작" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1203 msgid "Restore" -msgstr "" +msgstr "복원" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1218 msgid "Restore qosify defaults" @@ -930,15 +930,15 @@ msgstr "규칙: %s" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:868 msgid "Running & Shaping" -msgstr "" +msgstr "실행 중 및 셰이핑 중" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:869 msgid "Running — Not Shaping" -msgstr "" +msgstr "실행 중 — 셰이핑 중 아님" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:867 msgid "Running — Shaping Unknown" -msgstr "" +msgstr "실행 중 — 셰이핑 상태 알 수 없음" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:753 #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1147 @@ -998,7 +998,7 @@ msgstr "서비스" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1745 msgid "Service action failed: %s" -msgstr "" +msgstr "서비스 작업 실패: %s" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1817 msgid "Settings saved" @@ -1007,7 +1007,7 @@ msgstr "" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:723 #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:894 msgid "Shaping" -msgstr "" +msgstr "셰이핑" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:941 #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1198 @@ -1030,7 +1030,7 @@ msgstr "상태" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:855 msgid "Status Unknown" -msgstr "" +msgstr "상태 알 수 없음" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:766 msgid "Stop" @@ -1075,7 +1075,7 @@ msgstr "" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:596 msgid "Traffic shaping and DSCP classification via qosify" -msgstr "" +msgstr "QoSify를 통한 트래픽 셰이핑 및 DSCP 분류" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1168 msgid "UDP single port, or range from to " @@ -1129,7 +1129,7 @@ msgstr "업로드 실패: %s" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:725 msgid "Upload shaping" -msgstr "" +msgstr "업로드 셰이핑" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:2035 msgid "Uploading" @@ -1141,7 +1141,7 @@ msgstr "" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:735 msgid "VLAN tags" -msgstr "" +msgstr "VLAN 태그" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:938 msgid "Valid" @@ -1155,7 +1155,7 @@ msgstr "" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1707 #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1724 msgid "Working" -msgstr "" +msgstr "작업 중" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1870 msgid "Write empty file" @@ -1219,7 +1219,7 @@ msgstr "" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1160 #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:2129 msgid "e.g. %s" -msgstr "" +msgstr "예: %s" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1171 msgid "fnmatch() pattern supporting * and ? as wildcard characters" @@ -1235,7 +1235,7 @@ msgstr "비활성" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1109 msgid "ingress %s, egress %s" -msgstr "" +msgstr "인그레스 %s, 이그레스 %s" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:282 msgid "ingress and egress are both 0 — nothing is shaped" @@ -1324,7 +1324,7 @@ msgstr "" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1253 msgid "qosify-status" -msgstr "" +msgstr "qosify-status" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1682 msgid "qosify-status returned no output." @@ -1364,7 +1364,7 @@ msgstr "" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1160 msgid "value" -msgstr "" +msgstr "값" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:902 msgid "yes" diff --git a/luci-app-qosify/po/pt_BR/qosify.po b/luci-app-qosify/po/pt_BR/qosify.po index 9d4cbc1ea..fcde41a52 100644 --- a/luci-app-qosify/po/pt_BR/qosify.po +++ b/luci-app-qosify/po/pt_BR/qosify.po @@ -3,12 +3,13 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Language: pt_BR\n" "Content-Transfer-Encoding: 8bit\n" -"Last-Translator: Pavel Borecki \n" +"Last-Translator: Janderson Vieira Santos " +"\n" "Language-Team: Portuguese (Brazil) \n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"PO-Revision-Date: 2026-09-29 17:59+0000\n" -"X-Generator: Weblate 2026.10.dev0\n" +"PO-Revision-Date: 2026-10-18 16:40+0000\n" +"X-Generator: Weblate 2026.11.dev0\n" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:882 msgid "%d interface" @@ -211,7 +212,7 @@ msgstr "Disponível" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1196 msgid "Backup" -msgstr "" +msgstr "Backup" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:76 msgid "" @@ -264,7 +265,7 @@ msgstr "" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:564 msgid "Cancel" -msgstr "" +msgstr "Cancelar" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1214 msgid "Check Devices" @@ -433,7 +434,7 @@ msgstr "" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:881 #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:930 msgid "Disabled" -msgstr "" +msgstr "Desativado" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:75 msgid "Downlink bandwidth (same format as tc)" @@ -446,7 +447,7 @@ msgstr "" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1198 #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1247 msgid "Download" -msgstr "" +msgstr "Baixar" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:720 msgid "Download bandwidth" @@ -746,7 +747,7 @@ msgstr "" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:870 msgid "Not Running" -msgstr "" +msgstr "Não está em execução" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1771 msgid "Note: bandwidth not set — CAKE will run unlimited on that direction." @@ -946,7 +947,7 @@ msgstr "" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:753 #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1147 msgid "Save & Apply" -msgstr "" +msgstr "Salvar & Aplicar" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1825 #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1897 @@ -997,7 +998,7 @@ msgstr "" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:663 msgid "Service" -msgstr "" +msgstr "Serviço" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1745 msgid "Service action failed: %s" diff --git a/luci-app-qosify/po/ru/qosify.po b/luci-app-qosify/po/ru/qosify.po index 5f0bb4a33..5e657fbee 100644 --- a/luci-app-qosify/po/ru/qosify.po +++ b/luci-app-qosify/po/ru/qosify.po @@ -3,14 +3,13 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Language: ru\n" "Content-Transfer-Encoding: 8bit\n" -"Last-Translator: SnIPeRSnIPeR " -"\n" +"Last-Translator: Hannu Nyman \n" "Language-Team: Russian \n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -"PO-Revision-Date: 2026-09-28 18:23+0000\n" -"X-Generator: Weblate 2026.10.dev0\n" +"PO-Revision-Date: 2026-10-18 16:40+0000\n" +"X-Generator: Weblate 2026.11.dev0\n" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:882 msgid "%d interface" @@ -29,70 +28,82 @@ msgstr[2] "%d правил" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:942 msgid "%d section" msgid_plural "%d sections" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" +msgstr[0] "секция" +msgstr[1] "секции" +msgstr[2] "секций" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:682 msgid "%s (current)" -msgstr "" +msgstr "%s (текущий)" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:700 msgid "%s (from bandwidth)" -msgstr "" +msgstr "%s (из полосы пропускания)" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:2085 msgid "" "%s and %s are replaced with the templates shipped by the qosify package, and " "shaping is left disabled." msgstr "" +"%s и %s заменяются шаблонами, поставляемыми пакетом qosify, а шейпинг " +"остаётся отключённым." #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1809 msgid "" "%s came back empty although it is %d bytes on disk — refusing to overwrite it" -msgstr "" +msgstr "%s вернулся пустым, хотя на диске %d байт — отказываюсь перезаписывать" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:2346 msgid "%s changed on disk — your unsaved edits are still in the editor." -msgstr "" +msgstr "%s изменён на диске — ваши несохранённые правки остаются в редакторе." #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:2249 msgid "" "%s could not be read — the editor is left empty and will not be saved over " "it." msgstr "" +"%s не удалось прочитать — редактор оставлен пустым, и сохранение поверх него " +"выполнено не будет." #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1833 msgid "" "%s has changed since this editor was loaded. Saving now discards those " "changes." msgstr "" +"%s изменён с момента загрузки этого редактора. Сохранение сейчас отбросит " +"эти изменения." #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1864 msgid "" "%s is %d bytes on disk but was never loaded into the editor — refusing to " "truncate it. Reload the page first." msgstr "" +"%s занимает %d байт на диске, но не был загружен в редактор — отказываюсь " +"его усекать. Сначала перезагрузите страницу." #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:364 msgid "%s is a list in this section — edit %s directly" -msgstr "" +msgstr "%s является списком в этой секции — редактируйте %s напрямую" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1656 msgid "" "%s is not in the defaults list — qosify does not load it, so the Rules tab " "has no effect" msgstr "" +"%s отсутствует в списке defaults — qosify его не загружает, поэтому вкладка «" +"Правила» не действует" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:286 msgid "" "%s is set to \"%s\" — qosify converts it with atoi(), so anything but a non-" "zero number means off" msgstr "" +"%s установлено в \\\"%s\\\" — qosify преобразует его через atoi(), поэтому " +"всё, кроме ненулевого числа, означает «выключено»" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:750 msgid "%s quick settings" -msgstr "" +msgstr "%s быстрые настройки" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:2069 msgid "%s uploaded, qosify reloaded." @@ -100,11 +111,11 @@ msgstr "%s загружен, qosify перезапущен." #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:2103 msgid "%s was not written: %s" -msgstr "" +msgstr "%s не был записан: %s" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:2106 msgid "%s was reset but %s was not written: %s" -msgstr "" +msgstr "%s был сброшен, но %s не был записан: %s" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1945 msgid "%s, applied (QoS disabled)." @@ -114,6 +125,8 @@ msgstr "%s применено (QoS отключён)." msgid "" "%s, applied — qosify did not answer on ubus, so shaping could not be checked." msgstr "" +"%s, применено — qosify не ответил через ubus, поэтому шейпинг не удалось " +"проверить." #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1947 msgid "%s, applied." @@ -123,30 +136,40 @@ msgstr "%s применено." #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:468 msgid "%s: %s \"%s\" is not a class, codepoint or 0-63 — qosify ignores it" msgstr "" +"%s: %s \"%s\" не является классом, кодовой точкой или значением 0–63 — " +"qosify игнорирует это" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:456 msgid "" "%s: %s \"%s\" is not a class, codepoint or 0-63 — qosify rejects the whole " "config and interface changes are not applied" msgstr "" +"%s: %s \"%s\" не является классом, кодовой точкой или значением 0–63 — " +"qosify отклоняет всю конфигурацию, изменения интерфейса не применяются" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:465 msgid "" "%s: %s \"%s\" is not a codepoint or 0-63 — qosify drops this class and the " "rules using it" msgstr "" +"%s: %s \"%s\" не является кодовой точкой или значением 0–63 — qosify " +"отбрасывает этот класс и правила, которые его используют" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:448 msgid "" "%s: %s cannot be checked — write it as one plain or fully quoted value, with " "no backslash" msgstr "" +"%s: %s невозможно проверить — запишите его как одно простое или полностью " +"заключённое в кавычки значение, без обратной косой черты" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:451 msgid "" "%s: %s contains shell metacharacters — qosify runs the tc command with sh -c " "as root, so they would break it or be executed" msgstr "" +"%s: %s содержит метасимволы оболочки — qosify запускает команду tc через sh -" +"c от имени root, поэтому они либо сломают её, либо будут выполнены" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1109 msgid "(alias)" @@ -154,7 +177,7 @@ msgstr "(псевдоним)" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:435 msgid "(this qosify build has no NQB)" -msgstr "" +msgstr "(в этой сборке qosify нет NQB)" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:2185 msgid "A config defaults section already exists." @@ -162,7 +185,7 @@ msgstr "Секция defaults конфигурации уже существуе #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:2183 msgid "A section name may only contain letters, digits and underscores." -msgstr "" +msgstr "Имя секции может содержать только буквы, цифры и знаки подчёркивания." #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:856 msgid "Active" @@ -175,19 +198,19 @@ msgstr "Добавить" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:85 msgid "Adds atm, noatm or ptm when overhead_type is manual" -msgstr "" +msgstr "Добавляет atm, noatm или ptm, когда overhead_type = manual" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:87 msgid "Adds ether-vlan once per level (1 or 2)" -msgstr "" +msgstr "Добавляет ether-vlan по одному разу на уровень (1 или 2)" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:86 msgid "Adds mpu " -msgstr "" +msgstr "Добавляет mpu " #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:84 msgid "Adds overhead when overhead_type is manual" -msgstr "" +msgstr "Добавляет overhead , когда overhead_type = manual" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:608 #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:737 @@ -196,11 +219,11 @@ msgstr "Дополнительно" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1870 msgid "An empty %s stops all shaping. Continue?" -msgstr "" +msgstr "Пустой %s останавливает весь шейпинг. Продолжить?" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:726 msgid "Automatic download rate" -msgstr "" +msgstr "Автоматическая скорость загрузки" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:893 msgid "Autostart" @@ -208,7 +231,7 @@ msgstr "Автозапуск" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:924 msgid "Autostart state unknown — rpcd did not answer" -msgstr "" +msgstr "Состояние автозапуска неизвестно — rpcd не ответил" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:883 msgid "Available" @@ -216,17 +239,19 @@ msgstr "Доступно" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1196 msgid "Backup" -msgstr "" +msgstr "Резервная копия" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:76 msgid "" "Bandwidth for both directions, where bandwidth_up or bandwidth_down is not " "set" msgstr "" +"Полоса пропускания для обоих направлений, если bandwidth_up или " +"bandwidth_down не заданы" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:716 msgid "Basic" -msgstr "" +msgstr "Основные" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:224 #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:2029 @@ -235,57 +260,59 @@ msgstr "Двоичное содержимое отклонено" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:79 msgid "CAKE diffserv mode" -msgstr "" +msgstr "Режим diffserv CAKE" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:89 msgid "CAKE egress options" -msgstr "" +msgstr "Параметры CAKE для исходящего трафика" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:739 msgid "CAKE egress options, space separated." -msgstr "" +msgstr "Параметры CAKE для исходящего трафика, разделённые пробелами." #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:88 msgid "CAKE ingress options" -msgstr "" +msgstr "Параметры CAKE для входящего трафика" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:738 msgid "CAKE ingress options, space separated." -msgstr "" +msgstr "Параметры CAKE для входящего трафика, разделённые пробелами." #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:90 msgid "CAKE options for ingress + egress" -msgstr "" +msgstr "Параметры CAKE для входящего + исходящего трафика" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:83 msgid "" "CAKE overhead keyword added to options; manual uses overhead and " "overhead_encap" msgstr "" +"Ключевое слово overhead CAKE, добавляемое к параметрам; manual использует " +"overhead и overhead_encap" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:731 msgid "CAKE overhead keyword. Use none if unsure." -msgstr "" +msgstr "Ключевое слово overhead CAKE. Если не уверены, используйте none." #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:564 msgid "Cancel" -msgstr "" +msgstr "Отмена" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1214 msgid "Check Devices" -msgstr "" +msgstr "Проверить устройства" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1193 msgid "Choose file…" -msgstr "" +msgstr "Выбрать файл…" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1114 msgid "Classes" -msgstr "" +msgstr "Классы" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1737 msgid "Cleanup exited with code %d" -msgstr "" +msgstr "Очистка завершилась с кодом %d" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1146 #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1990 @@ -295,12 +322,12 @@ msgstr "Очистить" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1869 msgid "Clear configuration" -msgstr "" +msgstr "Очистить конфигурацию" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1990 #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1996 msgid "Clear editor" -msgstr "" +msgstr "Очистить редактор" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:929 msgid "Click to disable autostart" @@ -312,7 +339,7 @@ msgstr "Нажмите, чтобы включить автозапуск" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:740 msgid "Common CAKE options" -msgstr "" +msgstr "Общие параметры CAKE" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:604 msgid "Config" @@ -324,7 +351,7 @@ msgstr "Конфигурация очищена, qosify остановлен." #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1894 msgid "Config cleared." -msgstr "" +msgstr "Конфигурация очищена." #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1915 msgid "Config saved" @@ -337,28 +364,28 @@ msgstr "Конфигурация: %s" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:566 msgid "Continue" -msgstr "" +msgstr "Продолжить" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1245 msgid "Could not read %s: %s" -msgstr "" +msgstr "Не удалось прочитать %s: %s" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:607 msgid "Counters" -msgstr "" +msgstr "Счётчики" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1404 #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1627 msgid "DNS Entries" -msgstr "" +msgstr "Записи DNS" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1364 msgid "DNS Entries (%d of %d)" -msgstr "" +msgstr "Записи DNS (%d из %d)" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1364 msgid "DNS Entries (%d)" -msgstr "" +msgstr "Записи DNS (%d)" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1021 msgid "" @@ -367,51 +394,55 @@ msgid "" "accepted too, and any dscp_* value may also name a class. Prefix with + to " "override only when the DSCP field is zero." msgstr "" +"Кодовые точки DSCP: CS0–CS7, AF11–AF43, EF, VA, NQB, LE, DF (NQB требует " +"qosify от июня 2026; в 24.10 и 25.12 его нет). Необработанное значение от 0 " +"до 63 тоже принимается, и любое значение dscp_* может также указывать имя " +"класса. Префикс + означает переопределять только когда поле DSCP равно нулю." #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:63 msgid "DSCP value for ICMP packets" -msgstr "" +msgstr "Значение DSCP для пакетов ICMP" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:65 msgid "DSCP value for bulk-marked packets" -msgstr "" +msgstr "Значение DSCP для пакетов, помеченных как bulk" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:71 msgid "DSCP value for egress" -msgstr "" +msgstr "Значение DSCP для исходящего трафика" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:70 msgid "DSCP value for ingress" -msgstr "" +msgstr "Значение DSCP для входящего трафика" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:69 msgid "DSCP value for ingress and egress, where they are not set" -msgstr "" +msgstr "Значение DSCP для входящего и исходящего трафика, если они не заданы" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:64 msgid "DSCP value for priority-marked packets" -msgstr "" +msgstr "Значение DSCP для пакетов, помеченных как приоритетные" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1021 msgid "DSCP values" -msgstr "" +msgstr "Значения DSCP" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:61 msgid "Default DSCP value for TCP packets" -msgstr "" +msgstr "Значение DSCP по умолчанию для пакетов TCP" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:62 msgid "Default DSCP value for UDP packets" -msgstr "" +msgstr "Значение DSCP по умолчанию для пакетов UDP" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:60 msgid "Default timeout for dynamically added entries" -msgstr "" +msgstr "Тайм-аут по умолчанию для динамически добавляемых записей" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1022 #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1217 msgid "Defaults" -msgstr "" +msgstr "Значения по умолчанию" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1022 msgid "" @@ -429,15 +460,15 @@ msgstr "" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:718 msgid "Device" -msgstr "" +msgstr "Устройство" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1711 msgid "Device check done." -msgstr "" +msgstr "Проверка устройств завершена." #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1714 msgid "Device check failed: %s" -msgstr "" +msgstr "Проверка устройств не удалась: %s" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:859 #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:881 @@ -447,11 +478,13 @@ msgstr "Отключено" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:75 msgid "Downlink bandwidth (same format as tc)" -msgstr "" +msgstr "Полоса пропускания нисходящего канала (тот же формат, что и в tc)" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:720 msgid "Downlink bandwidth, same format as tc. Set just below line speed." msgstr "" +"Полоса пропускания нисходящего канала, тот же формат, что и в tc. Установите " +"чуть ниже скорости линии." #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1198 #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1247 @@ -460,15 +493,15 @@ msgstr "Скачать" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:720 msgid "Download bandwidth" -msgstr "" +msgstr "Скорость загрузки" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:724 msgid "Download shaping" -msgstr "" +msgstr "Шейпинг загрузки" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1197 msgid "Download the current files from the router." -msgstr "" +msgstr "Скачать текущие файлы с маршрутизатора." #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1166 msgid "" @@ -476,10 +509,14 @@ msgid "" "raw value, a codepoint like CS0, or a class name. DNS entries are compared " "in the order in which they are specified, using the first matching entry." msgstr "" +"Каждая строка содержит два разделённых пробелами поля: match и dscp. dscp " +"может быть необработанным значением, кодовой точкой вроде CS0 или именем " +"класса. Записи DNS сравниваются в порядке указания, используется первая " +"подходящая запись." #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:739 msgid "Egress CAKE options" -msgstr "" +msgstr "Параметры CAKE для исходящего трафика" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:2020 msgid "Empty file" @@ -489,31 +526,35 @@ msgstr "Пустой файл" msgid "" "Empty the config editor? Nothing is written until you click Save & Apply." msgstr "" +"Очистить редактор конфигурации? Ничего не записывается, пока вы не нажмёте «" +"Сохранить и применить»." #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1996 msgid "" "Empty the rules editor? Nothing is written until you click Save & Apply." msgstr "" +"Очистить редактор правил? Ничего не записывается, пока вы не нажмёте «" +"Сохранить и применить»." #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:80 msgid "Enable CAKE NAT host detection via conntrack" -msgstr "" +msgstr "Включить определение хостов NAT в CAKE через conntrack" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:82 msgid "Enable CAKE automatic rate estimation for ingress" -msgstr "" +msgstr "Включить автоматическую оценку скорости CAKE для входящего трафика" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:81 msgid "Enable CAKE host isolation" -msgstr "" +msgstr "Включить изоляцию хостов CAKE" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:78 msgid "Enable egress shaping" -msgstr "" +msgstr "Включить шейпинг исходящего трафика" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:77 msgid "Enable ingress shaping" -msgstr "" +msgstr "Включить шейпинг входящего трафика" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:881 #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:930 @@ -530,11 +571,11 @@ msgstr "Включено — шейпинг не выполняется (про #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:711 msgid "Encapsulation overhead" -msgstr "" +msgstr "Накладные расходы инкапсуляции" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:2182 msgid "Enter a section name." -msgstr "" +msgstr "Введите имя секции." #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:2156 msgid "Enter a single IPv4 address (qosify does not accept CIDR)." @@ -543,7 +584,7 @@ msgstr "Введите один IPv4-адрес (qosify не принимает #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:2159 msgid "" "Enter a single IPv6 address (qosify does not accept CIDR or a %zone suffix)." -msgstr "" +msgstr "Введите один IPv6-адрес (qosify не принимает CIDR или суффикс %zone)." #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:2141 msgid "Enter a value." @@ -551,7 +592,7 @@ msgstr "Введите значение." #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:941 msgid "Entries" -msgstr "" +msgstr "Записи" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1848 #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1961 @@ -567,6 +608,8 @@ msgid "" "Error: invalid characters in bandwidth or options fields. Use alphanumeric, " "spaces, hyphens, dots, colons only." msgstr "" +"Ошибка: недопустимые символы в полях bandwidth или options. Используйте " +"только буквы, цифры, пробелы, дефисы, точки и двоеточия." #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1798 msgid "Error: name must be a device or interface name" @@ -578,7 +621,7 @@ msgstr "Ошибка: overhead должен быть целым числом б #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1768 msgid "Error: overhead_mpu must be a whole number of bytes" -msgstr "" +msgstr "Ошибка: overhead_mpu должно быть целым числом байтов" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:2070 msgid "Errors:" @@ -588,11 +631,11 @@ msgstr "Ошибки:" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1198 #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1205 msgid "File" -msgstr "" +msgstr "Файл" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1832 msgid "File changed on disk" -msgstr "" +msgstr "Файл изменён на диске" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:2021 msgid "File too large (max 64KB)" @@ -600,7 +643,7 @@ msgstr "Файл слишком большой (макс. 64 КБ)" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:667 msgid "Files" -msgstr "" +msgstr "Файлы" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:938 msgid "Found (empty or invalid)" @@ -612,78 +655,82 @@ msgstr "Предоставить доступ к LuCI-приложению Qosif #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:728 msgid "Host isolation" -msgstr "" +msgstr "Изоляция хостов" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1156 #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1169 msgid "IPv4 address, e.g. 1.1.1.1" -msgstr "" +msgstr "IPv4-адрес, например 1.1.1.1" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1156 #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1170 msgid "IPv6 address, e.g. ff01::1" -msgstr "" +msgstr "IPv6-адрес, например ff01::1" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:738 msgid "Ingress CAKE options" -msgstr "" +msgstr "Параметры CAKE для входящего трафика" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:718 msgid "Interface" -msgstr "" +msgstr "Интерфейс" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:741 msgid "Invalid CAKE options can stop qosify starting." -msgstr "" +msgstr "Некорректные параметры CAKE могут помешать запуску qosify." #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1173 msgid "Like dns:... but only matches cname entries" -msgstr "" +msgstr "Как dns:..., но совпадает только с записями cname" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:228 msgid "" "Line %d is longer than 1023 characters — the rule loader reads fixed-size " "lines and would split it, comment included" msgstr "" +"Строка %d длиннее 1023 символов — загрузчик правил читает строки " +"фиксированного размера и разделит её, включая комментарий" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:59 msgid "List of files with port/IP/host mappings" -msgstr "" +msgstr "Список файлов с сопоставлениями порт/IP/хост" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1402 #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1404 msgid "Loading..." -msgstr "" +msgstr "Загрузка..." #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1212 msgid "Maintenance" -msgstr "" +msgstr "Обслуживание" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:710 msgid "Manual overhead" -msgstr "" +msgstr "Overhead вручную" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1166 msgid "Mapping file syntax" -msgstr "" +msgstr "Синтаксис файла сопоставлений" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1692 msgid "Mapping files reloaded." -msgstr "" +msgstr "Файлы сопоставлений перезагружены." #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:434 msgid "" "Match not loaded by qosify on line %s — ports 1-65534, one IPv4/IPv6 address " "(no CIDR or %%zone), or dns:, dns_c:" msgstr "" +"Match не загружен qosify в строке %s — порты 1–65534, один IPv4/IPv6-адрес " +"(без CIDR или %%zone), либо dns:, dns_c:" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:66 msgid "Maximum average packet length for marking a flow as priority" -msgstr "" +msgstr "Максимальная средняя длина пакета для пометки потока как приоритетного" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:734 msgid "Minimum packet unit (MPU)" -msgstr "" +msgstr "Минимальная единица пакета (MPU)" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:883 #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:938 @@ -693,37 +740,39 @@ msgstr "Отсутствует" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:941 #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1198 msgid "Modified" -msgstr "" +msgstr "Изменён" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:433 msgid "" "More than two fields on line %s — qosify reads the rest of the line as the " "DSCP value and skips it" msgstr "" +"Больше двух полей в строке %s — qosify читает остаток строки как значение " +"DSCP и пропускает её" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:727 msgid "NAT awareness" -msgstr "" +msgstr "Учёт NAT" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:718 msgid "Netdev to enable QoS on. Required." -msgstr "" +msgstr "Netdev, на котором включить QoS. Обязательно." #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1585 msgid "No CAKE tin statistics." -msgstr "" +msgstr "Нет статистики tin CAKE." #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1628 msgid "No DNS entries." -msgstr "" +msgstr "Нет записей DNS." #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:432 msgid "No DSCP target on line %s — qosify skips single-field lines" -msgstr "" +msgstr "Нет цели DSCP в строке %s — qosify пропускает строки с одним полем" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1107 msgid "No classes defined in %s" -msgstr "" +msgstr "В %s не определены классы" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:2142 msgid "No classes defined. Add classes in the Config tab first." @@ -733,7 +782,7 @@ msgstr "" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1191 #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1192 msgid "No file selected" -msgstr "" +msgstr "Файл не выбран" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:2006 msgid "No files selected." @@ -741,11 +790,11 @@ msgstr "Файлы не выбраны." #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1585 msgid "No output." -msgstr "" +msgstr "Нет вывода." #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1568 msgid "No per-class counters." -msgstr "" +msgstr "Нет счётчиков по классам." #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:2154 msgid "No spaces or # allowed in patterns or addresses." @@ -767,17 +816,19 @@ msgstr "" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:67 msgid "Number of packets per second to trigger bulk flow detection" -msgstr "" +msgstr "Число пакетов в секунду для запуска обнаружения bulk-потока" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1161 #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1174 msgid "Only override the DSCP value if it is zero" -msgstr "" +msgstr "Переопределять значение DSCP только если оно равно нулю" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:704 msgid "" "Only sent with host isolation on — add nat to common CAKE options to force it" msgstr "" +"Отправляется только при включённой изоляции хостов — добавьте nat в общие " +"параметры CAKE, чтобы принудительно включить" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1017 msgid "Options" @@ -785,11 +836,11 @@ msgstr "Параметры" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:730 msgid "Overhead" -msgstr "" +msgstr "Overhead" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:731 msgid "Overhead preset" -msgstr "" +msgstr "Предустановка overhead" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:603 msgid "Overview" @@ -797,17 +848,20 @@ msgstr "Обзор" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1834 msgid "Overwrite" -msgstr "" +msgstr "Перезаписать" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:2007 msgid "Overwrite config files" -msgstr "" +msgstr "Перезаписать файлы конфигурации" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1172 msgid "" "POSIX.2 extended regular expression for matching hostnames. Only works if " "dns lookups are passed to qosify via the add_dns_host ubus call." msgstr "" +"Расширенное регулярное выражение POSIX.2 для сопоставления имён хостов. " +"Работает только если DNS-запросы передаются в qosify через ubus-вызов " +"add_dns_host." #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:2150 msgid "Port must be 1-65534 (qosify rejects 65535)." @@ -816,7 +870,7 @@ msgstr "Порт должен быть в диапазоне 1–65534 (qosify #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:2146 #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:2149 msgid "Port must be a number or a range (4500, 5060-5061)." -msgstr "" +msgstr "Порт должен быть числом или диапазоном (4500, 5060-5061)." #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:717 msgid "QoS Enabled" @@ -824,15 +878,15 @@ msgstr "QoS включён" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:721 msgid "Queueing mode" -msgstr "" +msgstr "Режим очередей" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1163 msgid "Quick Add" -msgstr "" +msgstr "Быстрое добавление" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1016 msgid "Quick Add: %s" -msgstr "" +msgstr "Быстрое добавление: %s" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:2153 msgid "Range start must not exceed end." @@ -840,19 +894,19 @@ msgstr "Начало диапазона не должно превышать к #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1213 msgid "Re-check devices" -msgstr "" +msgstr "Перепроверить устройства" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1707 msgid "Re-checking devices..." -msgstr "" +msgstr "Перепроверка устройств..." #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:768 msgid "Re-read the mapping files only" -msgstr "" +msgstr "Перечитать только файлы сопоставлений" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1690 msgid "Re-reading the mapping files..." -msgstr "" +msgstr "Перечитывание файлов сопоставлений..." #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1215 msgid "" @@ -872,11 +926,11 @@ msgstr "Чтение и проверка файлов..." #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1681 msgid "Reading tc output..." -msgstr "" +msgstr "Чтение вывода tc..." #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1019 msgid "Reference" -msgstr "" +msgstr "Справка" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:765 msgid "Reload" @@ -884,20 +938,20 @@ msgstr "Перезагрузить" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:765 msgid "Reload Rules" -msgstr "" +msgstr "Перезагрузить правила" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1695 msgid "Reload failed: %s" -msgstr "" +msgstr "Перезагрузка не удалась: %s" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1585 msgid "Requires write access." -msgstr "" +msgstr "Требуется доступ на запись." #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1219 #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:2086 msgid "Reset" -msgstr "" +msgstr "Сброс" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:2120 msgid "Reset failed: %s" @@ -905,7 +959,7 @@ msgstr "Ошибка сброса: %s" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:2084 msgid "Reset to defaults" -msgstr "" +msgstr "Сбросить к значениям по умолчанию" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:2116 msgid "Reset to defaults, applied." @@ -921,11 +975,11 @@ msgstr "Перезапустить" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1203 msgid "Restore" -msgstr "" +msgstr "Восстановить" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1218 msgid "Restore qosify defaults" -msgstr "" +msgstr "Восстановить настройки по умолчанию" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:2095 msgid "Restoring defaults..." @@ -933,7 +987,7 @@ msgstr "Восстановление значений по умолчанию... #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:605 msgid "Rules" -msgstr "" +msgstr "Правила" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1976 msgid "Rules saved" @@ -954,12 +1008,12 @@ msgstr "Работает — шейпинг не выполняется" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:867 msgid "Running — Shaping Unknown" -msgstr "" +msgstr "Работает — шейпинг неизвестен" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:753 #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1147 msgid "Save & Apply" -msgstr "Применить" +msgstr "Сохранить и применить" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1825 #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1897 @@ -987,6 +1041,8 @@ msgid "" "Section name is the class name that rules and dscp_* values refer to. " "qosify.init reads config alias the same way as config class." msgstr "" +"Имя секции — это имя класса, на которое ссылаются правила и значения dscp_*. " +"qosify.init читает config alias так же, как config class." #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1724 msgid "Sending %s to qosify..." @@ -994,23 +1050,23 @@ msgstr "Отправка %s в qosify..." #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:711 msgid "Sent to CAKE as atm, noatm or ptm." -msgstr "" +msgstr "Передаётся в CAKE как atm, noatm или ptm." #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:735 msgid "Sent to CAKE as ether-vlan, once per tag." -msgstr "" +msgstr "Передаётся в CAKE как ether-vlan, по одному разу на тег." #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:734 msgid "Sent to CAKE as mpu, in bytes." -msgstr "" +msgstr "Передаётся в CAKE как mpu, в байтах." #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:710 msgid "Sent to CAKE as overhead, in bytes." -msgstr "" +msgstr "Передаётся в CAKE как overhead, в байтах." #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:663 msgid "Service" -msgstr "" +msgstr "Служба" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1745 msgid "Service action failed: %s" @@ -1023,16 +1079,16 @@ msgstr "Настройки сохранены" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:723 #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:894 msgid "Shaping" -msgstr "" +msgstr "Шейпинг" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:941 #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1198 msgid "Size" -msgstr "" +msgstr "Размер" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:73 msgid "Skip this section" -msgstr "" +msgstr "Пропустить эту секцию" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:764 msgid "Start" @@ -1046,7 +1102,7 @@ msgstr "Статус" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:855 msgid "Status Unknown" -msgstr "" +msgstr "Состояние неизвестно" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:766 msgid "Stop" @@ -1054,40 +1110,45 @@ msgstr "Остановить" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1167 msgid "TCP single port, or range from to " -msgstr "" +msgstr "Один порт TCP или диапазон от до " #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1680 msgid "The detailed tc output needs write access to this page." -msgstr "" +msgstr "Подробный вывод tc требует доступа на запись к этой странице." #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:590 msgid "" "The qosify UCI configuration could not be loaded — class and interface lists " "may be incomplete." msgstr "" +"Не удалось загрузить конфигурацию UCI qosify — списки классов и интерфейсов " +"могут быть неполными." #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1204 msgid "" "The selected files replace the ones on the router and qosify is reloaded." msgstr "" +"Выбранные файлы заменяют файлы на маршрутизаторе, и qosify перезагружается." #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:2008 msgid "" "The selected files replace the ones on the router and qosify is reloaded. " "Download a backup from this tab first if you need one." msgstr "" +"Выбранные файлы заменяют файлы на маршрутизаторе, и qosify перезагружается. " +"Если нужна резервная копия, сначала скачайте её на этой вкладке." #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:68 msgid "Time below bulk_trigger_pps threshold until a bulk flow mark is removed" -msgstr "" +msgstr "Время ниже порога bulk_trigger_pps до снятия метки bulk-потока" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1402 msgid "Traffic by CAKE Tin" -msgstr "" +msgstr "Трафик по tin CAKE" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1401 msgid "Traffic by Class" -msgstr "" +msgstr "Трафик по классам" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:596 msgid "Traffic shaping and DSCP classification via qosify" @@ -1095,13 +1156,13 @@ msgstr "Шейпинг трафика и классификация DSCP с по #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1168 msgid "UDP single port, or range from to " -msgstr "" +msgstr "Один порт UDP или диапазон от до " #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:864 #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:866 #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:925 msgid "Unknown" -msgstr "" +msgstr "Неизвестно" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:435 msgid "Unknown class/DSCP target: %s" @@ -1109,31 +1170,33 @@ msgstr "Неизвестный класс/цель DSCP: %s" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:717 msgid "Unticked sets disabled 1 and qosify skips this section." -msgstr "" +msgstr "Снятый флажок устанавливает disabled 1, и qosify пропускает эту секцию." #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:74 msgid "Uplink bandwidth (same format as tc)" -msgstr "" +msgstr "Полоса пропускания восходящего канала (тот же формат, что и в tc)" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:719 msgid "Uplink bandwidth, same format as tc. Set just below line speed." msgstr "" +"Полоса пропускания восходящего канала, тот же формат, что и в tc. Установите " +"чуть ниже скорости линии." #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1205 msgid "Upload" -msgstr "" +msgstr "Загрузить" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1210 msgid "Upload & Apply" -msgstr "" +msgstr "Загрузить и применить" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:2009 msgid "Upload and apply" -msgstr "" +msgstr "Загрузить и применить" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:719 msgid "Upload bandwidth" -msgstr "" +msgstr "Скорость отдачи" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:2061 msgid "Upload error: %s" @@ -1145,7 +1208,7 @@ msgstr "Загрузка не удалась: %s" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:725 msgid "Upload shaping" -msgstr "" +msgstr "Шейпинг отдачи" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:2035 msgid "Uploading" @@ -1153,11 +1216,11 @@ msgstr "Загрузка" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:892 msgid "Uptime" -msgstr "" +msgstr "Время работы" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:735 msgid "VLAN tags" -msgstr "" +msgstr "Теги VLAN" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:938 msgid "Valid" @@ -1177,7 +1240,7 @@ msgstr "Работает" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1870 msgid "Write empty file" -msgstr "" +msgstr "Записать пустой файл" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1906 msgid "Writing config and reloading qosify..." @@ -1192,42 +1255,52 @@ msgid "" "You have read-only access to this page, so editing and service control are " "disabled." msgstr "" +"У вас доступ к этой странице только для чтения, поэтому редактирование и " +"управление службой отключены." #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:901 msgid "active" -msgstr "" +msgstr "активен" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1767 msgid "" "bandwidth_down does not look like a tc rate (100mbit, 12MBps, unlimited) — " "passing it through anyway" msgstr "" +"bandwidth_down не похоже на скорость tc (100mbit, 12MBps, unlimited) — всё " +"равно передаю как есть" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1766 msgid "" "bandwidth_up does not look like a tc rate (100mbit, 12MBps, unlimited) — " "passing it through anyway" msgstr "" +"bandwidth_up не похоже на скорость tc (100mbit, 12MBps, unlimited) — всё " +"равно передаю как есть" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1012 msgid "" "config device takes the same options, with name set to a netdev. nat " "defaults to 1 for interfaces and 0 for devices." msgstr "" +"config device принимает те же параметры, но name задаётся как netdev. nat по " +"умолчанию равен 1 для интерфейсов и 0 для устройств." #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:900 msgid "device %s" -msgstr "" +msgstr "устройство %s" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:902 msgid "device: %s, ingress: %s, egress: %s" -msgstr "" +msgstr "устройство: %s, входящий: %s, исходящий: %s" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:289 msgid "" "disabled is set to \"%s\" — config_get_bool does not recognise that, so the " "section stays enabled" msgstr "" +"disabled установлено в \"%s\" — config_get_bool не распознаёт это, поэтому " +"секция остаётся включённой" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:700 #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:718 @@ -1237,23 +1310,23 @@ msgstr "" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1160 #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:2129 msgid "e.g. %s" -msgstr "" +msgstr "например, %s" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1171 msgid "fnmatch() pattern supporting * and ? as wildcard characters" -msgstr "" +msgstr "Шаблон fnmatch() с поддержкой * и ? как подстановочных символов" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1613 msgid "get_stats did not answer." -msgstr "" +msgstr "get_stats не ответил." #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:901 msgid "inactive" -msgstr "" +msgstr "неактивен" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1109 msgid "ingress %s, egress %s" -msgstr "" +msgstr "входящий %s, исходящий %s" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:282 msgid "ingress and egress are both 0 — nothing is shaped" @@ -1261,11 +1334,11 @@ msgstr "ingress и egress равны 0 — шейпинг не выполняе #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:900 msgid "interface %s" -msgstr "" +msgstr "интерфейс %s" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1155 msgid "match" -msgstr "" +msgstr "match" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:274 msgid "" @@ -1297,14 +1370,16 @@ msgid "" "netifd interface (config interface) or netdev (config device) to enable QoS " "on" msgstr "" +"Интерфейс netifd (config interface) или netdev (config device), на котором " +"включить QoS" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:718 msgid "netifd interface to enable QoS on. Required." -msgstr "" +msgstr "Интерфейс netifd, на котором включить QoS. Обязательно." #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:902 msgid "no" -msgstr "" +msgstr "нет" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:284 msgid "no bandwidth_down or bandwidth — ingress CAKE runs unlimited" @@ -1319,7 +1394,7 @@ msgstr "" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:882 msgid "none" -msgstr "" +msgstr "нет" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:281 msgid "overhead and overhead_encap are ignored unless overhead_type is manual" @@ -1335,11 +1410,13 @@ msgstr "qosify" msgid "" "qosify did not appear on ubus, so its config was not applied — press Reload" msgstr "" +"qosify не появился в ubus, поэтому его конфигурация не была применена — " +"нажмите «Перезагрузить»" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:833 #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1729 msgid "qosify did not come up — check the system log" -msgstr "" +msgstr "qosify не запустился — проверьте системный журнал" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1610 #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1672 @@ -1349,7 +1426,7 @@ msgstr "Qosify не запущен. Запустите его на вкладк #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1735 #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1887 msgid "qosify is still running — leaving the qdiscs alone" -msgstr "" +msgstr "qosify всё ещё работает — не трогаю qdisc" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1253 msgid "qosify-status" @@ -1364,6 +1441,8 @@ msgid "" "rpcd is not answering for qosify — check the ACL in /usr/share/rpcd/acl.d " "and restart rpcd" msgstr "" +"rpcd не отвечает за qosify — проверьте ACL в /usr/share/rpcd/acl.d и " +"перезапустите rpcd" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:832 #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1609 @@ -1372,32 +1451,32 @@ msgstr "" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1734 #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1886 msgid "rpcd is not answering for qosify, so the service state is unknown." -msgstr "" +msgstr "rpcd не отвечает за qosify, поэтому состояние службы неизвестно." #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:955 msgid "section name" -msgstr "" +msgstr "имя секции" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:953 msgid "section type" -msgstr "" +msgstr "тип секции" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1529 #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1533 msgid "share" -msgstr "" +msgstr "доля" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1541 msgid "total" -msgstr "" +msgstr "всего" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1160 msgid "value" -msgstr "" +msgstr "значение" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:902 msgid "yes" -msgstr "" +msgstr "да" #~ msgid "%s contains a quote — qosify rejects the whole value" #~ msgstr "%s содержит кавычку — qosify отклоняет всё значение" diff --git a/luci-app-qosify/po/ta/qosify.po b/luci-app-qosify/po/ta/qosify.po index bf88489b4..194458096 100644 --- a/luci-app-qosify/po/ta/qosify.po +++ b/luci-app-qosify/po/ta/qosify.po @@ -3,12 +3,12 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Language: ta\n" "Content-Transfer-Encoding: 8bit\n" -"Last-Translator: Pavel Borecki \n" +"Last-Translator: Pavel Borecki \n" "Language-Team: Tamil \n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"PO-Revision-Date: 2026-08-23 19:31+0000\n" -"X-Generator: Weblate 2026.9.dev0\n" +"PO-Revision-Date: 2026-10-13 13:20+0000\n" +"X-Generator: Weblate 2026.11.dev0\n" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:882 msgid "%d interface" @@ -207,11 +207,11 @@ msgstr "" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:883 msgid "Available" -msgstr "" +msgstr "கிடைக்கிறது" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1196 msgid "Backup" -msgstr "" +msgstr "காப்புப்பிரதி" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:76 msgid "" @@ -419,7 +419,7 @@ msgstr "" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:718 msgid "Device" -msgstr "" +msgstr "சாதனம்" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1711 msgid "Device check done." @@ -508,7 +508,7 @@ msgstr "" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:881 #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:930 msgid "Enabled" -msgstr "" +msgstr "இயக்கப்பட்டது" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:858 msgid "Enabled — Not Running" diff --git a/luci-app-qosify/po/uk/qosify.po b/luci-app-qosify/po/uk/qosify.po index 469e23d60..dffadd21c 100644 --- a/luci-app-qosify/po/uk/qosify.po +++ b/luci-app-qosify/po/uk/qosify.po @@ -3,13 +3,13 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Language: uk\n" "Content-Transfer-Encoding: 8bit\n" -"Last-Translator: Martin Olmer \n" +"Last-Translator: Karakurt \n" "Language-Team: Ukrainian \n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -"PO-Revision-Date: 2026-08-31 06:59+0000\n" -"X-Generator: Weblate 2026.9.dev0\n" +"PO-Revision-Date: 2026-10-04 08:24+0000\n" +"X-Generator: Weblate 2026.10.1.dev0\n" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:882 msgid "%d interface" @@ -215,7 +215,7 @@ msgstr "Доступно" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1196 msgid "Backup" -msgstr "" +msgstr "Резервна копія" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:76 msgid "" diff --git a/luci-app-qosify/po/zh_Hant/qosify.po b/luci-app-qosify/po/zh_Hant/qosify.po index 3f0da3a5c..d6ecf8e63 100644 --- a/luci-app-qosify/po/zh_Hant/qosify.po +++ b/luci-app-qosify/po/zh_Hant/qosify.po @@ -3,22 +3,22 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Language: zh_Hant\n" "Content-Transfer-Encoding: 8bit\n" -"Last-Translator: 為什麼不加空格 \n" +"Last-Translator: TCP \n" "Language-Team: Chinese (Traditional Han script) \n" "Plural-Forms: nplurals=1; plural=0;\n" -"PO-Revision-Date: 2026-09-02 20:59+0000\n" -"X-Generator: Weblate 2026.9.dev0\n" +"PO-Revision-Date: 2026-10-18 16:40+0000\n" +"X-Generator: Weblate 2026.11.dev0\n" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:882 msgid "%d interface" msgid_plural "%d interfaces" -msgstr[0] "" +msgstr[0] "%d 個介面" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:943 msgid "%d rule" msgid_plural "%d rules" -msgstr[0] "" +msgstr[0] "%d 個規則" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:942 msgid "%d section" @@ -192,7 +192,7 @@ msgstr "" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:726 msgid "Automatic download rate" -msgstr "" +msgstr "自動下載速率" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:893 msgid "Autostart" @@ -208,7 +208,7 @@ msgstr "可用" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1196 msgid "Backup" -msgstr "" +msgstr "備份" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:76 msgid "" @@ -218,7 +218,7 @@ msgstr "" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:716 msgid "Basic" -msgstr "" +msgstr "基本" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:224 #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:2029 @@ -261,19 +261,19 @@ msgstr "" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:564 msgid "Cancel" -msgstr "" +msgstr "取消" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1214 msgid "Check Devices" -msgstr "" +msgstr "檢查裝置" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1193 msgid "Choose file…" -msgstr "" +msgstr "選擇檔案…" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1114 msgid "Classes" -msgstr "" +msgstr "類別" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1737 msgid "Cleanup exited with code %d" @@ -329,7 +329,7 @@ msgstr "配置: %s" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:566 msgid "Continue" -msgstr "" +msgstr "繼續" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1245 msgid "Could not read %s: %s" @@ -416,7 +416,7 @@ msgstr "" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:718 msgid "Device" -msgstr "" +msgstr "裝置" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1711 msgid "Device check done." @@ -447,7 +447,7 @@ msgstr "下載" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:720 msgid "Download bandwidth" -msgstr "" +msgstr "下載頻寬" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:724 msgid "Download shaping" @@ -517,7 +517,7 @@ msgstr "" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:711 msgid "Encapsulation overhead" -msgstr "" +msgstr "封裝開銷" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:2182 msgid "Enter a section name." @@ -575,7 +575,7 @@ msgstr "錯誤:" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1198 #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1205 msgid "File" -msgstr "" +msgstr "檔案" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1832 msgid "File changed on disk" @@ -587,7 +587,7 @@ msgstr "檔案過大 (最大 64KB)" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:667 msgid "Files" -msgstr "" +msgstr "檔案" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:938 msgid "Found (empty or invalid)" @@ -599,17 +599,17 @@ msgstr "" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:728 msgid "Host isolation" -msgstr "" +msgstr "主機隔離" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1156 #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1169 msgid "IPv4 address, e.g. 1.1.1.1" -msgstr "" +msgstr "IPv4 位址,例如 1.1.1.1" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1156 #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1170 msgid "IPv6 address, e.g. ff01::1" -msgstr "" +msgstr "IPv6 位址,例如 ff01::1" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:738 msgid "Ingress CAKE options" @@ -617,7 +617,7 @@ msgstr "" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:718 msgid "Interface" -msgstr "" +msgstr "介面" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:741 msgid "Invalid CAKE options can stop qosify starting." @@ -648,7 +648,7 @@ msgstr "" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:710 msgid "Manual overhead" -msgstr "" +msgstr "手動開銷" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1166 msgid "Mapping file syntax" @@ -690,7 +690,7 @@ msgstr "" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:727 msgid "NAT awareness" -msgstr "" +msgstr "NAT 意識" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:718 msgid "Netdev to enable QoS on. Required." @@ -769,7 +769,7 @@ msgstr "選項" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:730 msgid "Overhead" -msgstr "" +msgstr "開銷" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:731 msgid "Overhead preset" @@ -781,11 +781,11 @@ msgstr "概覽" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1834 msgid "Overwrite" -msgstr "" +msgstr "覆寫" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:2007 msgid "Overwrite config files" -msgstr "" +msgstr "覆寫配置檔案" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1172 msgid "" @@ -804,7 +804,7 @@ msgstr "" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:717 msgid "QoS Enabled" -msgstr "" +msgstr "QoS 已啟用" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:721 msgid "Queueing mode" @@ -812,11 +812,11 @@ msgstr "" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1163 msgid "Quick Add" -msgstr "" +msgstr "快速新增" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1016 msgid "Quick Add: %s" -msgstr "" +msgstr "快速新增: %s" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:2153 msgid "Range start must not exceed end." @@ -824,7 +824,7 @@ msgstr "" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1213 msgid "Re-check devices" -msgstr "" +msgstr "重新檢查裝置" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1707 msgid "Re-checking devices..." @@ -889,7 +889,7 @@ msgstr "" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:2084 msgid "Reset to defaults" -msgstr "" +msgstr "重設為預設值" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:2116 msgid "Reset to defaults, applied." @@ -917,7 +917,7 @@ msgstr "" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:605 msgid "Rules" -msgstr "" +msgstr "規則" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1976 msgid "Rules saved" @@ -994,7 +994,7 @@ msgstr "" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:663 msgid "Service" -msgstr "" +msgstr "服務" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1745 msgid "Service action failed: %s" @@ -1012,7 +1012,7 @@ msgstr "" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:941 #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1198 msgid "Size" -msgstr "" +msgstr "大小" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:73 msgid "Skip this section" @@ -1030,7 +1030,7 @@ msgstr "狀態" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:855 msgid "Status Unknown" -msgstr "" +msgstr "狀態未知" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:766 msgid "Stop" @@ -1085,7 +1085,7 @@ msgstr "" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:866 #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:925 msgid "Unknown" -msgstr "" +msgstr "未知" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:435 msgid "Unknown class/DSCP target: %s" @@ -1105,7 +1105,7 @@ msgstr "" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1205 msgid "Upload" -msgstr "" +msgstr "上傳" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1210 msgid "Upload & Apply" @@ -1137,7 +1137,7 @@ msgstr "上傳中" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:892 msgid "Uptime" -msgstr "" +msgstr "上線時間" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:735 msgid "VLAN tags" @@ -1199,7 +1199,7 @@ msgstr "" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:900 msgid "device %s" -msgstr "" +msgstr "裝置 %s" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:902 msgid "device: %s, ingress: %s, egress: %s" @@ -1219,7 +1219,7 @@ msgstr "" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1160 #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:2129 msgid "e.g. %s" -msgstr "" +msgstr "例如 %s" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1171 msgid "fnmatch() pattern supporting * and ? as wildcard characters" @@ -1243,7 +1243,7 @@ msgstr "" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:900 msgid "interface %s" -msgstr "" +msgstr "介面 %s" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:1155 msgid "match" @@ -1279,7 +1279,7 @@ msgstr "" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:902 msgid "no" -msgstr "" +msgstr "否" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:284 msgid "no bandwidth_down or bandwidth — ingress CAKE runs unlimited" @@ -1368,7 +1368,7 @@ msgstr "" #: applications/luci-app-qosify/htdocs/luci-static/resources/view/qosify/main.js:902 msgid "yes" -msgstr "" +msgstr "是" #~ msgid "Backup Current Files" #~ msgstr "備份當前檔案" diff --git a/luci-app-samba4/po/da/samba4.po b/luci-app-samba4/po/da/samba4.po index e7d87e16a..0d860867d 100644 --- a/luci-app-samba4/po/da/samba4.po +++ b/luci-app-samba4/po/da/samba4.po @@ -3,8 +3,8 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-03-22 15:23+0100\n" -"PO-Revision-Date: 2021-11-16 17:38+0000\n" -"Last-Translator: drax red \n" +"PO-Revision-Date: 2026-10-05 07:56+0000\n" +"Last-Translator: Hosted Weblate user 168028 \n" "Language-Team: Danish \n" "Language: da\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.9.1-dev\n" +"X-Generator: Weblate 2026.10.1.dev0\n" #: applications/luci-app-samba4/htdocs/luci-static/resources/view/samba4.js:120 msgid "Allow guests" diff --git a/luci-app-sfp-info/Makefile b/luci-app-sfp-info/Makefile index aebe0b40b..64f2b9b75 100644 --- a/luci-app-sfp-info/Makefile +++ b/luci-app-sfp-info/Makefile @@ -9,7 +9,7 @@ LUCI_PKGARCH:=all PKG_LICENSE:=Apache-2.0 PKG_VERSION:=1.0 -PKG_RELEASE:=4 +PKG_RELEASE:=5 PKG_MAINTAINER:=Meng Zhuo include $(TOPDIR)/feeds/luci/luci.mk diff --git a/luci-app-sfp-info/po/da/sfp-info.po b/luci-app-sfp-info/po/da/sfp-info.po new file mode 100644 index 000000000..7a2722bf9 --- /dev/null +++ b/luci-app-sfp-info/po/da/sfp-info.po @@ -0,0 +1,116 @@ +msgid "" +msgstr "" +"Content-Type: text/plain; charset=UTF-8\n" +"Language: da\n" +"Content-Transfer-Encoding: 8bit\n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" + +#: applications/luci-app-sfp-info/htdocs/luci-static/resources/view/sfp-info/main.js:68 +msgid "Bias Current" +msgstr "" + +#: applications/luci-app-sfp-info/htdocs/luci-static/resources/view/sfp-info/main.js:65 +msgid "Date Code" +msgstr "" + +#: applications/luci-app-sfp-info/root/usr/share/rpcd/acl.d/luci-app-sfp-info.json:3 +msgid "Grant ubus access to SFP Info" +msgstr "" + +#: applications/luci-app-sfp-info/htdocs/luci-static/resources/view/sfp-info/main.js:61 +msgid "Interface" +msgstr "" + +#: applications/luci-app-sfp-info/htdocs/luci-static/resources/view/sfp-info/main.js:106 +msgid "No SFP/QSFP modules detected." +msgstr "" + +#: applications/luci-app-sfp-info/htdocs/luci-static/resources/view/sfp-info/main.js:205 +msgid "Normal" +msgstr "" + +#: applications/luci-app-sfp-info/htdocs/luci-static/resources/view/sfp-info/main.js:64 +msgid "Part Number" +msgstr "" + +#: applications/luci-app-sfp-info/htdocs/luci-static/resources/view/sfp-info/main.js:70 +msgid "RX Power" +msgstr "" + +#: applications/luci-app-sfp-info/htdocs/luci-static/resources/view/sfp-info/main.js:182 +msgid "RX power high" +msgstr "" + +#: applications/luci-app-sfp-info/htdocs/luci-static/resources/view/sfp-info/main.js:183 +msgid "RX power low" +msgstr "" + +#: applications/luci-app-sfp-info/htdocs/luci-static/resources/view/sfp-info/main.js:46 +msgid "Range" +msgstr "" + +#: applications/luci-app-sfp-info/htdocs/luci-static/resources/view/sfp-info/main.js:78 +msgid "SFP / QSFP Transceiver Information" +msgstr "" + +#: applications/luci-app-sfp-info/root/usr/share/luci/menu.d/luci-app-sfp-info.json:3 +msgid "SFP Info" +msgstr "" + +#: applications/luci-app-sfp-info/htdocs/luci-static/resources/view/sfp-info/main.js:71 +msgid "Status" +msgstr "" + +#: applications/luci-app-sfp-info/htdocs/luci-static/resources/view/sfp-info/main.js:69 +msgid "TX Power" +msgstr "" + +#: applications/luci-app-sfp-info/htdocs/luci-static/resources/view/sfp-info/main.js:178 +msgid "TX bias high" +msgstr "" + +#: applications/luci-app-sfp-info/htdocs/luci-static/resources/view/sfp-info/main.js:179 +msgid "TX bias low" +msgstr "" + +#: applications/luci-app-sfp-info/htdocs/luci-static/resources/view/sfp-info/main.js:180 +msgid "TX power high" +msgstr "" + +#: applications/luci-app-sfp-info/htdocs/luci-static/resources/view/sfp-info/main.js:181 +msgid "TX power low" +msgstr "" + +#: applications/luci-app-sfp-info/htdocs/luci-static/resources/view/sfp-info/main.js:66 +msgid "Temperature" +msgstr "" + +#: applications/luci-app-sfp-info/htdocs/luci-static/resources/view/sfp-info/main.js:174 +msgid "Temperature high" +msgstr "" + +#: applications/luci-app-sfp-info/htdocs/luci-static/resources/view/sfp-info/main.js:175 +msgid "Temperature low" +msgstr "" + +#: applications/luci-app-sfp-info/htdocs/luci-static/resources/view/sfp-info/main.js:63 +msgid "Type" +msgstr "" + +#: applications/luci-app-sfp-info/htdocs/luci-static/resources/view/sfp-info/main.js:62 +msgid "Vendor" +msgstr "" + +#: applications/luci-app-sfp-info/htdocs/luci-static/resources/view/sfp-info/main.js:67 +msgid "Voltage" +msgstr "" + +#: applications/luci-app-sfp-info/htdocs/luci-static/resources/view/sfp-info/main.js:176 +msgid "Voltage high" +msgstr "" + +#: applications/luci-app-sfp-info/htdocs/luci-static/resources/view/sfp-info/main.js:177 +msgid "Voltage low" +msgstr "" diff --git a/luci-app-shunt/Makefile b/luci-app-shunt/Makefile index fd5d18339..5759e1683 100644 --- a/luci-app-shunt/Makefile +++ b/luci-app-shunt/Makefile @@ -6,8 +6,8 @@ include $(TOPDIR)/rules.mk LUCI_TITLE:=LuCI support for shunt LUCI_DEPENDS:=+luci-base +shunt -PKG_VERSION:=0.1.10 -PKG_RELEASE:=5 +PKG_VERSION:=0.2.0 +PKG_RELEASE:=6 PKG_LICENSE:=Apache-2.0 PKG_MAINTAINER:=Dirk Brenken diff --git a/luci-app-shunt/htdocs/luci-static/resources/view/shunt/overview.js b/luci-app-shunt/htdocs/luci-static/resources/view/shunt/overview.js index 61270ebee..cbdaf337d 100644 --- a/luci-app-shunt/htdocs/luci-static/resources/view/shunt/overview.js +++ b/luci-app-shunt/htdocs/luci-static/resources/view/shunt/overview.js @@ -226,7 +226,8 @@ function renderPolicies(st) { rows.push(E('tr', { 'class': 'tr' }, [ E('td', { 'class': 'td' }, [p.name]), E('td', { 'class': 'td' }, [p.action || 'route']), - E('td', { 'class': 'td' }, [p.interface || '-']), + E('td', { 'class': 'td' }, [p.interface || + (p.tproxy_port ? ':%d'.format(p.tproxy_port) : '-')]), E('td', { 'class': 'td' }, [fmtMark(p.mark)]), E('td', { 'class': 'td' }, [bypass ? '-' : fmtCount(p.rt_table)]), E('td', { 'class': 'td' }, [bypass ? '-' : fmtCount(p.rules)]), diff --git a/luci-app-shunt/htdocs/luci-static/resources/view/shunt/policies.js b/luci-app-shunt/htdocs/luci-static/resources/view/shunt/policies.js index 0953a07c0..09a9880a3 100644 --- a/luci-app-shunt/htdocs/luci-static/resources/view/shunt/policies.js +++ b/luci-app-shunt/htdocs/luci-static/resources/view/shunt/policies.js @@ -5,6 +5,7 @@ 'require ui'; 'require uci'; 'require form'; +'require tools.widgets as widgets'; function handleAction(ev) { if (ev === 'restart') { @@ -44,8 +45,16 @@ function handleAction(ev) { return fs.exec_direct('/etc/init.d/shunt', [ev]); } -// `shunt refresh` re-reads the domain files in the running daemon; its -// output is the count and the issues, worth showing as is. +// `shunt refresh` re-reads the domain and address files in the running +// daemon; its output is the count and the issues, worth showing as is. +// A list file is a bare name under /tmp/shunt or an absolute path. +function validateFile(section_id, value) { + if (value && (/\s/.test(value) || (value.charAt(0) !== '/' && value.indexOf('/') !== -1))) { + return _('Expecting a bare file name or an absolute path, without whitespace'); + } + return true; +} + function handleRefresh() { return fs.exec('/usr/sbin/shunt', ['refresh']) .then(function (res) { @@ -105,10 +114,11 @@ return view.extend({ o.editable = true; o = s.option(form.ListValue, 'action', _('Action'), - _('Route the selected traffic into the interface below, or \ - bypass it - a bypass policy marks nothing and exempts the traffic from every policy after it.')); + _('Route the selected traffic into the interface below, \ + bypass it - a bypass policy marks nothing and exempts the traffic from every policy after it - or hand it to a transparent proxy on the router.')); o.value('route', _('Route into a policy interface')); o.value('bypass', _('Bypass - leave the traffic alone')); + o.value('tproxy', _('Transparent proxy on the router')); o.default = 'route'; o.editable = true; @@ -124,11 +134,21 @@ return view.extend({ } }); - o = s.option(form.ListValue, 'fallback', _('Fallback Behavior')); + o = s.option(form.Value, 'tproxy_port', _('Proxy Port'), + _('The port the transparent proxy listens on, for tcp and udp. \ + It must listen on loopback or on the wildcard address. Needs kmod-nft-tproxy.')); + o.datatype = 'port'; + o.rmempty = false; + o.depends('action', 'tproxy'); + + o = s.option(form.ListValue, 'fallback', _('Fallback Behavior'), + _('What new traffic does when the interface is down or, for a \ + transparent proxy, when nothing listens on its port.')); o.value('main', _('Fall through to the normal uplink')); o.value('block', _('Block the traffic (killswitch)')); o.default = 'main'; o.depends('action', 'route'); + o.depends('action', 'tproxy'); o = s.option(form.Flag, 'keep_local', _('Keep Local Traffic'), _('Traffic to networks the routing table already has a route for \ @@ -148,6 +168,13 @@ return view.extend({ o.datatype = 'macaddr'; o.modalonly = true; + o = s.option(widgets.DeviceSelect, 'src_dev', _('Source Devices'), + _('Everything arriving on these devices, ORed with the client selectors \ + above - a whole guest network or VLAN, in IPv4 and IPv6 alike, whatever prefix it gets. Not the router\'s own traffic. For domains, add the device to the observed devices as well.')); + o.multiple = true; + o.noaliases = true; + o.modalonly = true; + o = s.option(form.MultiValue, 'proto', _('Protocols'), _('Restrict to tcp, udp or both. A port without a protocol covers both.')); o.value('tcp', 'tcp'); @@ -155,7 +182,7 @@ return view.extend({ o.modalonly = true; o = s.option(form.DynamicList, 'dport', _('Destination Ports'), - _('Single ports or ranges like 8000-8080, ANDed with the addresses below.')); + _('Single ports or ranges like 8000-8080, ANDed with the addresses below. Ports alone select that traffic from every client.')); o.datatype = 'or(port, portrange)'; o.modalonly = true; @@ -164,6 +191,13 @@ return view.extend({ o.datatype = 'ipaddr'; o.modalonly = true; + o = s.option(form.DynamicList, 'dst_file', _('Destination Address Files'), + _('Files with one address or prefix per line, IPv4 and IPv6 mixed, \ + for large published ranges. A bare name lives under /tmp/shunt, an absolute path is used as given. After the file changed, refresh below.')); + o.placeholder = 'ranges.txt'; + o.modalonly = true; + o.validate = validateFile; + o = s.option(form.DynamicList, 'domain', _('Domains'), _('example.com matches that name only, *.example.com matches its \ subdomains but not the apex - list both to cover both.')); @@ -174,12 +208,7 @@ return view.extend({ community-maintained lists. A bare name lives under /tmp/shunt, an absolute path is used as given. Entries from a file are learned by the DNS observer only, never polled; after the file changed, refresh below.')); o.placeholder = 'community.txt'; o.modalonly = true; - o.validate = function (section_id, value) { - if (value && (/\s/.test(value) || (value.charAt(0) !== '/' && value.indexOf('/') !== -1))) { - return _('Expecting a bare file name or an absolute path, without whitespace'); - } - return true; - }; + o.validate = validateFile; o = s.option(form.Value, 'gw4', _('IPv4 Gateway Override'), _('Only needed when the gateway discovered from netifd is wrong. \ @@ -210,7 +239,7 @@ return view.extend({ 'click': ui.createHandlerFn(this, function () { return handleRefresh(); }) - }, [_('Refresh Domain Files')]) + }, [_('Refresh List Files')]) ]); }); diff --git a/luci-app-shunt/htdocs/luci-static/resources/view/shunt/setreport.js b/luci-app-shunt/htdocs/luci-static/resources/view/shunt/setreport.js index f4422361e..4819c3d92 100644 --- a/luci-app-shunt/htdocs/luci-static/resources/view/shunt/setreport.js +++ b/luci-app-shunt/htdocs/luci-static/resources/view/shunt/setreport.js @@ -15,8 +15,9 @@ function setKind(name) { return name.substring(0, 1); } +// m_ and i_ carry no family digit, every other kind does. function setPolicy(name) { - return name.substring(name.substring(0, 1) === 'm' ? 2 : 3); + return name.substring('mi'.indexOf(name.substring(0, 1)) >= 0 ? 2 : 3); } function fmtExpiry(sec) { @@ -175,7 +176,7 @@ return view.extend({ } dom.content(target, [ - renderCards(sets, ['c', 'm'], _('Client Selectors'), + renderCards(sets, ['c', 'm', 'i'], _('Client Selectors'), _('No client is selected, so every client is covered.')), renderCards(sets, ['s'], _('Static Destinations'), null), renderLearned(sets) diff --git a/luci-app-shunt/po/templates/shunt.pot b/luci-app-shunt/po/templates/shunt.pot index dc6ceb086..a96254f8d 100644 --- a/luci-app-shunt/po/templates/shunt.pot +++ b/luci-app-shunt/po/templates/shunt.pot @@ -1,7 +1,7 @@ msgid "" msgstr "Content-Type: text/plain; charset=UTF-8" -#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/overview.js:358 +#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/overview.js:359 msgid "%d name(s) every %ds" msgstr "" @@ -54,7 +54,7 @@ msgstr "" msgid "Apply failed: %s" msgstr "" -#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/policies.js:129 +#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/policies.js:139 msgid "Block the traffic (killswitch)" msgstr "" @@ -66,7 +66,7 @@ msgstr "" msgid "Bytes routed" msgstr "" -#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/overview.js:427 +#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/overview.js:428 msgid "" "Ceiling in seconds for a learned address in its Set. An address learned from " "a DNS answer expires with the TTL of that answer, clamped to the range 60 to " @@ -74,7 +74,7 @@ msgid "" "interval." msgstr "" -#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/policies.js:147 +#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/policies.js:158 msgid "Client MACs this policy applies to, ORed with the addresses above." msgstr "" @@ -82,7 +82,7 @@ msgstr "" msgid "Client Selectors" msgstr "" -#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/policies.js:142 +#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/policies.js:153 msgid "" "Client addresses or prefixes this policy applies to. Leave empty to apply to " "every client." @@ -92,7 +92,7 @@ msgstr "" msgid "Compression pointer in the question" msgstr "" -#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/overview.js:407 +#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/overview.js:408 msgid "DNS Observer Settings" msgstr "" @@ -100,23 +100,23 @@ msgstr "" msgid "DNS responses observed on %s since the service started" msgstr "" -#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/overview.js:413 +#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/overview.js:414 msgid "Debug Logging" msgstr "" -#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/policies.js:162 +#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/policies.js:173 msgid "Destination Addresses" msgstr "" -#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/policies.js:157 +#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/policies.js:168 msgid "Destination Ports" msgstr "" -#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/policies.js:163 +#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/policies.js:174 msgid "Destination addresses or prefixes to route into this policy." msgstr "" -#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/policies.js:172 +#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/policies.js:183 msgid "Domain Files" msgstr "" @@ -124,15 +124,15 @@ msgstr "" msgid "Domain is in no policy" msgstr "" -#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/policies.js:167 +#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/policies.js:178 msgid "Domains" msgstr "" -#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/overview.js:410 +#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/overview.js:411 msgid "Enable the shunt service." msgstr "" -#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/overview.js:409 +#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/overview.js:410 #: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/policies.js:102 msgid "Enabled" msgstr "" @@ -148,7 +148,7 @@ msgid "" "and only to those domains." msgstr "" -#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/policies.js:179 +#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/policies.js:190 msgid "Expecting a bare file name or an absolute path, without whitespace" msgstr "" @@ -160,7 +160,7 @@ msgstr "" msgid "Extension header chain too long" msgstr "" -#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/policies.js:128 +#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/policies.js:138 msgid "Fall through to the normal uplink" msgstr "" @@ -168,11 +168,11 @@ msgstr "" msgid "Fallback" msgstr "" -#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/policies.js:127 +#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/policies.js:135 msgid "Fallback Behavior" msgstr "" -#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/policies.js:173 +#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/policies.js:184 msgid "" "Files with one domain pattern per line, for large or community-maintained " "lists. A bare name lives under /tmp/shunt, an absolute path is used as " @@ -184,7 +184,7 @@ msgstr "" msgid "Frame ends mid-structure" msgstr "" -#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/overview.js:406 +#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/overview.js:407 msgid "General Settings" msgstr "" @@ -196,11 +196,11 @@ msgstr "" msgid "IP fragment" msgstr "" -#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/policies.js:184 +#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/policies.js:195 msgid "IPv4 Gateway Override" msgstr "" -#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/policies.js:190 +#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/policies.js:201 msgid "IPv6 Gateway Override" msgstr "" @@ -213,15 +213,15 @@ msgid "Inconsistent UDP length" msgstr "" #: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/overview.js:212 -#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/policies.js:115 +#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/policies.js:116 msgid "Interface" msgstr "" -#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/policies.js:133 +#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/policies.js:144 msgid "Keep Local Traffic" msgstr "" -#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/overview.js:380 +#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/overview.js:381 #: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/setreport.js:126 msgid "Learned addresses" msgstr "" @@ -230,14 +230,14 @@ msgstr "" msgid "Learned addresses (%d)" msgstr "" -#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/overview.js:414 +#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/overview.js:415 msgid "" "Log every observed DNS answer and every set write. Useful for a bug report, " "noisy in normal operation - on a router running adblock roughly half of all " "answers are error replies, and each one gets a line." msgstr "" -#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/overview.js:417 +#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/overview.js:418 msgid "Manage rp_filter" msgstr "" @@ -245,7 +245,7 @@ msgstr "" msgid "Mark" msgstr "" -#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/overview.js:426 +#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/overview.js:427 msgid "Maximum Entry Lifetime" msgstr "" @@ -285,7 +285,7 @@ msgstr "" msgid "No policy is active." msgstr "" -#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/overview.js:271 +#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/overview.js:272 #: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/policies.js:73 msgid "No shunt config found!" msgstr "" @@ -312,11 +312,11 @@ msgid "" "observed DNS answers." msgstr "" -#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/overview.js:446 +#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/overview.js:447 msgid "Observed Devices" msgstr "" -#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/policies.js:185 +#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/policies.js:196 msgid "" "Only needed when the gateway discovered from netifd is wrong. Point to point " "interfaces need no gateway at all." @@ -330,7 +330,7 @@ msgstr "" msgid "Packets routed" msgstr "" -#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/overview.js:441 +#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/overview.js:442 msgid "Passive DNS Observer" msgstr "" @@ -344,17 +344,17 @@ msgstr "" msgid "Policy" msgstr "" -#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/overview.js:278 +#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/overview.js:279 msgid "" "Policy based routing by mac, source, destination and domain. For further " "information please check the %s." msgstr "" -#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/overview.js:383 +#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/overview.js:384 msgid "Poll" msgstr "" -#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/overview.js:421 +#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/overview.js:422 msgid "Poll Interval" msgstr "" @@ -362,11 +362,15 @@ msgstr "" msgid "Processing Log" msgstr "" -#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/policies.js:151 +#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/policies.js:162 msgid "Protocols" msgstr "" -#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/overview.js:442 +#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/policies.js:128 +msgid "Proxy Port" +msgstr "" + +#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/overview.js:443 msgid "" "Read DNS answers as they pass the LAN device, whichever resolver produced " "them. Required for wildcard domains, which cannot be resolved ahead of time." @@ -380,7 +384,7 @@ msgstr "" msgid "Refresh" msgstr "" -#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/policies.js:213 +#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/policies.js:224 msgid "Refresh Domain Files" msgstr "" @@ -388,7 +392,7 @@ msgstr "" msgid "Refresh failed: %s" msgstr "" -#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/overview.js:252 +#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/overview.js:253 msgid "Rejected settings" msgstr "" @@ -396,11 +400,11 @@ msgstr "" msgid "Reserved label type" msgstr "" -#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/policies.js:152 +#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/policies.js:163 msgid "Restrict to tcp, udp or both. A port without a protocol covers both." msgstr "" -#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/overview.js:343 +#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/overview.js:344 msgid "Reverse path filtering is strict" msgstr "" @@ -410,8 +414,9 @@ msgstr "" #: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/policies.js:108 msgid "" -"Route the selected traffic into the interface below, or bypass it - a bypass " -"policy marks nothing and exempts the traffic from every policy after it." +"Route the selected traffic into the interface below, bypass it - a bypass " +"policy marks nothing and exempts the traffic from every policy after it - or " +"hand it to a transparent proxy on the router." msgstr "" #: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/overview.js:216 @@ -422,16 +427,16 @@ msgstr "" msgid "Rules" msgstr "" -#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/overview.js:470 -#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/policies.js:205 +#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/overview.js:471 +#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/policies.js:216 msgid "Save & Restart" msgstr "" -#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/overview.js:422 +#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/overview.js:423 msgid "Seconds between poll cycles." msgstr "" -#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/overview.js:375 +#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/overview.js:376 msgid "Service" msgstr "" @@ -440,31 +445,31 @@ msgstr "" msgid "Set Reporting" msgstr "" -#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/overview.js:418 +#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/overview.js:419 msgid "" "Set rp_filter to 2 on shunt's own policy interfaces, at start and when one " "comes up." msgstr "" -#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/overview.js:403 +#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/overview.js:404 msgid "Settings" msgstr "" -#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/overview.js:435 +#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/overview.js:436 msgid "" "Should be at least twice the poll interval (%d), otherwise entries expire " "between cycles." msgstr "" -#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/policies.js:158 +#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/policies.js:169 msgid "Single ports or ranges like 8000-8080, ANDed with the addresses below." msgstr "" -#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/policies.js:141 +#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/policies.js:152 msgid "Source Addresses" msgstr "" -#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/policies.js:146 +#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/policies.js:157 msgid "Source MAC Addresses" msgstr "" @@ -472,11 +477,11 @@ msgstr "" msgid "Static Destinations" msgstr "" -#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/overview.js:463 +#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/overview.js:464 msgid "Stop" msgstr "" -#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/overview.js:345 +#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/overview.js:346 msgid "" "Strict rp_filter will drop shunt's marked traffic on %s. Set rp_filter to 2 " "on the policy interface, enable rp_filter_manage to have shunt do it, or " @@ -487,23 +492,29 @@ msgstr "" msgid "Table" msgstr "" -#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/overview.js:447 +#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/overview.js:448 msgid "" "The LAN device the DNS answers cross on their way to the clients, normally " "br-lan. One entry per network segment, see the README." msgstr "" -#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/policies.js:116 +#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/policies.js:117 msgid "" "The device or logical interface this policy routes into. A netifd name is " "resolved to its device; any other device name is used as entered." msgstr "" +#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/policies.js:129 +msgid "" +"The port the transparent proxy listens on, for tcp and udp. It must listen " +"on loopback or on the wildcard address. Needs kmod-nft-tproxy." +msgstr "" + #: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/logtemplate.js:44 msgid "The syslog output, pre-filtered for messages related to: %s" msgstr "" -#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/overview.js:254 +#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/overview.js:255 msgid "" "These entries were skipped. Everything else was applied - a rejected entry " "never takes the service down." @@ -517,28 +528,38 @@ msgstr "" msgid "Too many stacked VLAN tags" msgstr "" -#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/policies.js:134 +#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/policies.js:145 msgid "" "Traffic to networks the routing table already has a route for - your other " "subnets, your static routes - stays on the normal path instead of entering " "the policy interface. Turn this off only for a hermetic killswitch." msgstr "" +#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/policies.js:112 +msgid "Transparent proxy on the router" +msgstr "" + #: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/overview.js:134 msgid "Truncated response" msgstr "" -#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/overview.js:377 +#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/overview.js:378 msgid "Version" msgstr "" +#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/policies.js:136 +msgid "" +"What new traffic does when the interface is down or, for a transparent " +"proxy, when nothing listens on its port." +msgstr "" + #: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/setreport.js:235 msgid "" "What the nftables Sets currently hold. Counters are reset whenever an entry " "is refreshed, so they show recent activity, not a lifetime total." msgstr "" -#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/overview.js:382 +#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/overview.js:383 msgid "across all policies" msgstr "" @@ -546,17 +567,17 @@ msgstr "" msgid "all policies" msgstr "" -#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/policies.js:168 +#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/policies.js:179 msgid "" "example.com matches that name only, *.example.com matches its subdomains but " "not the apex - list both to cover both." msgstr "" -#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/policies.js:123 +#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/policies.js:124 msgid "interface" msgstr "" -#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/overview.js:353 +#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/overview.js:354 msgid "n/a" msgstr "" @@ -564,7 +585,7 @@ msgstr "" msgid "no answer from the backend" msgstr "" -#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/overview.js:279 +#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/overview.js:280 msgid "online documentation" msgstr "" @@ -592,10 +613,10 @@ msgstr "" msgid "stopped" msgstr "" -#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/overview.js:359 +#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/overview.js:360 msgid "unavailable - ucode-mod-resolv missing" msgstr "" -#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/overview.js:384 +#: applications/luci-app-shunt/htdocs/luci-static/resources/view/shunt/overview.js:385 msgid "wildcards are covered by the observer only" msgstr "" diff --git a/luci-app-smartdns/Makefile b/luci-app-smartdns/Makefile index 06de6782e..43649ec73 100644 --- a/luci-app-smartdns/Makefile +++ b/luci-app-smartdns/Makefile @@ -7,7 +7,7 @@ include $(TOPDIR)/rules.mk PKG_LICENSE:=GPL-3.0-or-later PKG_MAINTAINER:=Nick Peng PKG_VERSION:=1.2025.47.2 -PKG_RELEASE:=14 +PKG_RELEASE:=15 LUCI_TITLE:=LuCI for smartdns LUCI_DESCRIPTION:=Provides Luci for smartdns diff --git a/luci-app-smartdns/po/cs/smartdns.po b/luci-app-smartdns/po/cs/smartdns.po index 9187dfe3d..e23fee866 100644 --- a/luci-app-smartdns/po/cs/smartdns.po +++ b/luci-app-smartdns/po/cs/smartdns.po @@ -1,8 +1,8 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" -"PO-Revision-Date: 2026-08-27 18:20+0000\n" -"Last-Translator: Martin Olmer \n" +"PO-Revision-Date: 2026-10-04 08:24+0000\n" +"Last-Translator: Pavel Borecki \n" "Language-Team: Czech \n" "Language: cs\n" @@ -10,7 +10,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=((n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2);\n" -"X-Generator: Weblate 2026.9.dev0\n" +"X-Generator: Weblate 2026.10.1.dev0\n" #: applications/luci-app-smartdns/htdocs/luci-static/resources/view/smartdns/smartdns.js:791 msgid "Additional Args for upstream dns servers" @@ -238,7 +238,7 @@ msgstr "Stáhnout soubory" #: applications/luci-app-smartdns/htdocs/luci-static/resources/view/smartdns/smartdns.js:134 msgid "Download Files Setting" -msgstr "Stáhnout nastavení souborů" +msgstr "Nastavení stahování souborů" #: applications/luci-app-smartdns/htdocs/luci-static/resources/view/smartdns/smartdns.js:134 msgid "" diff --git a/luci-app-smartdns/po/da/smartdns.po b/luci-app-smartdns/po/da/smartdns.po index 5632a8061..428a0c59b 100644 --- a/luci-app-smartdns/po/da/smartdns.po +++ b/luci-app-smartdns/po/da/smartdns.po @@ -1,8 +1,8 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" -"PO-Revision-Date: 2024-01-25 02:53+0000\n" -"Last-Translator: drax red \n" +"PO-Revision-Date: 2026-10-05 13:33+0000\n" +"Last-Translator: Hosted Weblate user 168028 \n" "Language-Team: Danish \n" "Language: da\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 5.4-dev\n" +"X-Generator: Weblate 2026.10.1.dev0\n" #: applications/luci-app-smartdns/htdocs/luci-static/resources/view/smartdns/smartdns.js:791 msgid "Additional Args for upstream dns servers" @@ -42,7 +42,7 @@ msgstr "" #: applications/luci-app-smartdns/htdocs/luci-static/resources/view/smartdns/smartdns.js:131 #: applications/luci-app-smartdns/htdocs/luci-static/resources/view/smartdns/smartdns.js:638 msgid "Advanced Settings" -msgstr "" +msgstr "Avancerede indstillinger" #: applications/luci-app-smartdns/htdocs/luci-static/resources/view/smartdns/smartdns.js:252 msgid "" @@ -482,7 +482,7 @@ msgstr "" #: applications/luci-app-smartdns/htdocs/luci-static/resources/view/smartdns/smartdns.js:1013 msgid "No" -msgstr "" +msgstr "Nej" #: applications/luci-app-smartdns/htdocs/luci-static/resources/view/smartdns/smartdns.js:281 msgid "No Speed IPset Name" @@ -500,7 +500,7 @@ msgstr "" #: applications/luci-app-smartdns/htdocs/luci-static/resources/view/smartdns/smartdns.js:999 #: applications/luci-app-smartdns/htdocs/luci-static/resources/view/smartdns/smartdns.js:1024 msgid "None" -msgstr "" +msgstr "Ingen" #: applications/luci-app-smartdns/htdocs/luci-static/resources/view/smartdns/smartdns.js:783 msgid "Only socks5 proxy support udp server." @@ -533,7 +533,7 @@ msgstr "" #: applications/luci-app-smartdns/htdocs/luci-static/resources/view/smartdns/smartdns.js:63 msgid "RUNNING" -msgstr "KØRE" +msgstr "RUNNING" #: applications/luci-app-smartdns/htdocs/luci-static/resources/view/smartdns/smartdns.js:340 msgid "Reply Domain TTL Max" @@ -843,7 +843,7 @@ msgstr "" #: applications/luci-app-smartdns/htdocs/luci-static/resources/view/smartdns/smartdns.js:1012 msgid "Yes" -msgstr "" +msgstr "Ja" #: applications/luci-app-smartdns/htdocs/luci-static/resources/view/smartdns/smartdns.js:171 #: applications/luci-app-smartdns/htdocs/luci-static/resources/view/smartdns/smartdns.js:212 @@ -851,7 +851,7 @@ msgstr "" #: applications/luci-app-smartdns/htdocs/luci-static/resources/view/smartdns/smartdns.js:1011 #: applications/luci-app-smartdns/htdocs/luci-static/resources/view/smartdns/smartdns.js:1019 msgid "default" -msgstr "" +msgstr "Standard" #: applications/luci-app-smartdns/htdocs/luci-static/resources/view/smartdns/smartdns.js:554 msgid "domain list (/etc/smartdns/domain-set)" diff --git a/luci-app-smartdns/po/de/smartdns.po b/luci-app-smartdns/po/de/smartdns.po index ed703313a..f558e93ab 100644 --- a/luci-app-smartdns/po/de/smartdns.po +++ b/luci-app-smartdns/po/de/smartdns.po @@ -1,14 +1,15 @@ msgid "" msgstr "" -"PO-Revision-Date: 2026-04-21 11:00+0000\n" -"Last-Translator: Werner Schleifer \n" +"PO-Revision-Date: 2026-10-12 11:12+0000\n" +"Last-Translator: Werner Schleifer " +"\n" "Language-Team: German \n" "Language: de\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 5.17.1-dev\n" +"X-Generator: Weblate 2026.11.dev0\n" #: applications/luci-app-smartdns/htdocs/luci-static/resources/view/smartdns/smartdns.js:791 msgid "Additional Args for upstream dns servers" @@ -899,7 +900,7 @@ msgstr "Ja" #: applications/luci-app-smartdns/htdocs/luci-static/resources/view/smartdns/smartdns.js:1011 #: applications/luci-app-smartdns/htdocs/luci-static/resources/view/smartdns/smartdns.js:1019 msgid "default" -msgstr "Standard" +msgstr "Vorgabe" #: applications/luci-app-smartdns/htdocs/luci-static/resources/view/smartdns/smartdns.js:554 msgid "domain list (/etc/smartdns/domain-set)" diff --git a/luci-app-smartdns/po/ga/smartdns.po b/luci-app-smartdns/po/ga/smartdns.po index 262559cfe..b894722ac 100644 --- a/luci-app-smartdns/po/ga/smartdns.po +++ b/luci-app-smartdns/po/ga/smartdns.po @@ -1,6 +1,6 @@ msgid "" msgstr "" -"PO-Revision-Date: 2026-09-02 17:27+0000\n" +"PO-Revision-Date: 2026-10-09 14:25+0000\n" "Last-Translator: Aindriú Mac Giolla Eoin \n" "Language-Team: Irish \n" @@ -9,7 +9,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=5; plural=n==1 ? 0 : n==2 ? 1 : (n>2 && n<7) ? 2 :(n>" "6 && n<11) ? 3 : 4;\n" -"X-Generator: Weblate 2026.9.dev0\n" +"X-Generator: Weblate 2026.10.1.dev0\n" #: applications/luci-app-smartdns/htdocs/luci-static/resources/view/smartdns/smartdns.js:791 msgid "Additional Args for upstream dns servers" @@ -901,7 +901,7 @@ msgstr "Tá" #: applications/luci-app-smartdns/htdocs/luci-static/resources/view/smartdns/smartdns.js:1011 #: applications/luci-app-smartdns/htdocs/luci-static/resources/view/smartdns/smartdns.js:1019 msgid "default" -msgstr "réamhshocraithe" +msgstr "réamhshocrú" #: applications/luci-app-smartdns/htdocs/luci-static/resources/view/smartdns/smartdns.js:554 msgid "domain list (/etc/smartdns/domain-set)" diff --git a/luci-app-smartdns/po/ja/smartdns.po b/luci-app-smartdns/po/ja/smartdns.po index 9aba629ff..8162856e5 100644 --- a/luci-app-smartdns/po/ja/smartdns.po +++ b/luci-app-smartdns/po/ja/smartdns.po @@ -1,7 +1,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" -"PO-Revision-Date: 2025-12-07 21:54+0000\n" +"PO-Revision-Date: 2026-10-18 16:40+0000\n" "Last-Translator: Monarch " "\n" "Language-Team: Japanese \n" +"PO-Revision-Date: 2026-10-13 21:56+0000\n" +"Last-Translator: Pavel Borecki \n" "Language-Team: Vietnamese \n" "Language: vi\n" @@ -10,7 +10,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 2026.6\n" +"X-Generator: Weblate 2026.11.dev0\n" #: applications/luci-app-smartdns/htdocs/luci-static/resources/view/smartdns/smartdns.js:791 msgid "Additional Args for upstream dns servers" @@ -253,7 +253,7 @@ msgstr "" #: applications/luci-app-smartdns/htdocs/luci-static/resources/view/smartdns/smartdns.js:641 #: applications/luci-app-smartdns/htdocs/luci-static/resources/view/smartdns/smartdns.js:958 msgid "Enable" -msgstr "" +msgstr "Bật lên" #: applications/luci-app-smartdns/htdocs/luci-static/resources/view/smartdns/smartdns.js:494 msgid "Enable Auto Update" diff --git a/luci-app-transmission/po/da/transmission.po b/luci-app-transmission/po/da/transmission.po index e78c22bdf..467e8d4c7 100644 --- a/luci-app-transmission/po/da/transmission.po +++ b/luci-app-transmission/po/da/transmission.po @@ -3,8 +3,8 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-05-31 03:41+0200\n" -"PO-Revision-Date: 2024-01-25 02:53+0000\n" -"Last-Translator: drax red \n" +"PO-Revision-Date: 2026-10-05 07:31+0000\n" +"Last-Translator: Hosted Weblate user 168028 \n" "Language-Team: Danish \n" "Language: da\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 5.4-dev\n" +"X-Generator: Weblate 2026.10.1.dev0\n" #: applications/luci-app-transmission/htdocs/luci-static/resources/view/transmission.js:65 msgid "Alternative download speed" @@ -198,7 +198,7 @@ msgstr "Off" #: applications/luci-app-transmission/htdocs/luci-static/resources/view/transmission.js:38 msgid "Open Web Interface" -msgstr "Åbn webinterface" +msgstr "Open Web Interface" #: applications/luci-app-transmission/htdocs/luci-static/resources/view/transmission.js:153 msgid "PEX enabled" @@ -390,7 +390,7 @@ msgstr "Hastighedsgrænse op aktiveret" #: applications/luci-app-transmission/htdocs/luci-static/resources/view/transmission.js:179 msgid "This is documented on %s." -msgstr "" +msgstr "Dette er dokumenteret på %s." #: applications/luci-app-transmission/root/usr/share/luci/menu.d/luci-app-transmission.json:3 msgid "Transmission" diff --git a/luci-app-transmission/po/fi/transmission.po b/luci-app-transmission/po/fi/transmission.po index cadd4a639..38d73f77b 100644 --- a/luci-app-transmission/po/fi/transmission.po +++ b/luci-app-transmission/po/fi/transmission.po @@ -3,8 +3,8 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-05-11 07:11+0200\n" -"PO-Revision-Date: 2025-05-04 15:03+0000\n" -"Last-Translator: Ricky Tigg \n" +"PO-Revision-Date: 2026-10-13 21:56+0000\n" +"Last-Translator: Pavel Borecki \n" "Language-Team: Finnish \n" "Language: fi\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 5.12-dev\n" +"X-Generator: Weblate 2026.11.dev0\n" #: applications/luci-app-transmission/htdocs/luci-static/resources/view/transmission.js:65 msgid "Alternative download speed" @@ -391,7 +391,7 @@ msgstr "" #: applications/luci-app-transmission/root/usr/share/luci/menu.d/luci-app-transmission.json:3 msgid "Transmission" -msgstr "" +msgstr "Transmission" #: applications/luci-app-transmission/htdocs/luci-static/resources/view/transmission.js:42 msgid "" diff --git a/luci-app-transmission/po/pt_BR/transmission.po b/luci-app-transmission/po/pt_BR/transmission.po index 7f13c4226..a4d429fce 100644 --- a/luci-app-transmission/po/pt_BR/transmission.po +++ b/luci-app-transmission/po/pt_BR/transmission.po @@ -3,8 +3,9 @@ msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2012-07-06 16:27+0200\n" -"PO-Revision-Date: 2026-05-16 22:08+0000\n" -"Last-Translator: Volenski \n" +"PO-Revision-Date: 2026-10-12 11:12+0000\n" +"Last-Translator: Janderson Vieira Santos " +"\n" "Language-Team: Portuguese (Brazil) \n" "Language: pt_BR\n" @@ -12,7 +13,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 2026.6.dev0\n" +"X-Generator: Weblate 2026.11.dev0\n" #: applications/luci-app-transmission/htdocs/luci-static/resources/view/transmission.js:65 msgid "Alternative download speed" @@ -391,7 +392,7 @@ msgstr "Limite superior de velocidade habilitado" #: applications/luci-app-transmission/htdocs/luci-static/resources/view/transmission.js:179 msgid "This is documented on %s." -msgstr "" +msgstr "Isto está documentado em %s." #: applications/luci-app-transmission/root/usr/share/luci/menu.d/luci-app-transmission.json:3 msgid "Transmission" diff --git a/luci-app-transmission/po/ta/transmission.po b/luci-app-transmission/po/ta/transmission.po index 485652b1e..41ffca3b4 100644 --- a/luci-app-transmission/po/ta/transmission.po +++ b/luci-app-transmission/po/ta/transmission.po @@ -1,14 +1,14 @@ msgid "" msgstr "" -"PO-Revision-Date: 2025-06-15 17:45+0000\n" -"Last-Translator: தமிழ்நேரம் \n" +"PO-Revision-Date: 2026-10-13 13:20+0000\n" +"Last-Translator: Pavel Borecki \n" "Language-Team: Tamil \n" "Language: ta\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 5.12-dev\n" +"X-Generator: Weblate 2026.11.dev0\n" #: applications/luci-app-transmission/htdocs/luci-static/resources/view/transmission.js:65 msgid "Alternative download speed" @@ -84,7 +84,7 @@ msgstr "DHT இயக்கப்பட்டது" #: applications/luci-app-transmission/htdocs/luci-static/resources/view/transmission.js:151 msgid "Debug" -msgstr "பிழைத்திருத்தம்" +msgstr "பிழை நீக்கு" #: applications/luci-app-transmission/htdocs/luci-static/resources/view/transmission.js:97 msgid "Download directory" diff --git a/luci-app-unblockneteasemusic/Makefile b/luci-app-unblockneteasemusic/Makefile index 83bd2faf6..4487cdb86 100644 --- a/luci-app-unblockneteasemusic/Makefile +++ b/luci-app-unblockneteasemusic/Makefile @@ -5,13 +5,12 @@ include $(TOPDIR)/rules.mk LUCI_TITLE:=LuCI support for UnblockNeteaseMusic (JavaScript) -LUCI_DEPENDS:=+dnsmasq-full +firewall4 +node \ - @(PACKAGE_libustream-mbedtls||PACKAGE_libustream-openssl||PACKAGE_libustream-wolfssl) +LUCI_DEPENDS:=+dnsmasq-full +firewall4 +node LUCI_PKGARCH:=all PKG_NAME:=luci-app-unblockneteasemusic PKG_VERSION:=3.4 -PKG_RELEASE:=3 +PKG_RELEASE:=4 PKG_MAINTAINER:=Tianling Shen diff --git a/luci-app-watchcat/po/da/watchcat.po b/luci-app-watchcat/po/da/watchcat.po index e26cd9c7b..a588b03a4 100644 --- a/luci-app-watchcat/po/da/watchcat.po +++ b/luci-app-watchcat/po/da/watchcat.po @@ -1,8 +1,8 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" -"PO-Revision-Date: 2022-09-10 07:18+0000\n" -"Last-Translator: drax red \n" +"PO-Revision-Date: 2026-10-05 07:56+0000\n" +"Last-Translator: Hosted Weblate user 168028 \n" "Language-Team: Danish \n" "Language: da\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.14.1-dev\n" +"X-Generator: Weblate 2026.10.1.dev0\n" #: applications/luci-app-watchcat/htdocs/luci-static/resources/view/watchcat.js:94 msgid "" @@ -20,12 +20,12 @@ msgid "" "to fail. Enter the number of seconds to wait for the soft reboot to fail or " "use 0 to disable the forced reboot delay." msgstr "" -"Gælder for Ping-genstart og periodisk genstart
Ved genstart af " -"routeren vil tjenesten udløse en blød genstart. Indtastning af en værdi, der " -"ikke er nul her, vil udløse en forsinket hård genstart, hvis den bløde " -"genstart mislykkes. Indtast det antal sekunder, der skal vente på, at den " -"bløde genstart mislykkes, eller brug 0 for at deaktivere den tvungne " -"genstartsforsinkelse." +"Gælder for tilstandene Ping-genstart og Periodisk genstart
Når " +"routeren genstartes, udfører tjenesten en blød genstart. Hvis du angiver en " +"værdi, der ikke er nul, udløses en forsinket hård genstart, såfremt den " +"bløde genstart mislykkes. Angiv antallet af sekunder, der skal ventes, før " +"den bløde genstart anses for at være mislykket, eller brug 0 for at " +"deaktivere forsinkelsen af den tvungne genstart." #: applications/luci-app-watchcat/htdocs/luci-static/resources/view/watchcat.js:111 msgid "" @@ -52,7 +52,7 @@ msgstr "Adressefamilie til pinging af værten" #: applications/luci-app-watchcat/htdocs/luci-static/resources/view/watchcat.js:65 msgid "Any" -msgstr "" +msgstr "Enhver" #: applications/luci-app-watchcat/htdocs/luci-static/resources/view/watchcat.js:84 msgid "Big: 248 bytes" @@ -86,7 +86,7 @@ msgstr "" #: applications/luci-app-watchcat/htdocs/luci-static/resources/view/watchcat.js:52 msgid "Hosts To Check" -msgstr "" +msgstr "Hosts, der skal tjekkes" #: applications/luci-app-watchcat/htdocs/luci-static/resources/view/watchcat.js:71 msgid "" @@ -110,7 +110,7 @@ msgstr "Kæmpe: 1492 bytes" #: applications/luci-app-watchcat/htdocs/luci-static/resources/view/watchcat.js:52 msgid "IP addresses or hostnames to ping." -msgstr "" +msgstr "IP-adresser eller hostnavne, der skal pinges." #: applications/luci-app-watchcat/htdocs/luci-static/resources/view/watchcat.js:118 msgid "" diff --git a/luci-app-watchcat/po/fr/watchcat.po b/luci-app-watchcat/po/fr/watchcat.po index 22aaac146..5aaf6ca7e 100644 --- a/luci-app-watchcat/po/fr/watchcat.po +++ b/luci-app-watchcat/po/fr/watchcat.po @@ -1,8 +1,8 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" -"PO-Revision-Date: 2024-02-01 22:49+0000\n" -"Last-Translator: ButterflyOfFire \n" +"PO-Revision-Date: 2026-10-13 21:56+0000\n" +"Last-Translator: Pavel Borecki \n" "Language-Team: French \n" "Language: fr\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 5.4-dev\n" +"X-Generator: Weblate 2026.11.dev0\n" #: applications/luci-app-watchcat/htdocs/luci-static/resources/view/watchcat.js:94 msgid "" @@ -21,7 +21,7 @@ msgid "" "use 0 to disable the forced reboot delay." msgstr "" "S'applique aux modes de redémarrage par ping et de redémarrage " -"périodique
Lorsque le service redémarre le routeur, il déclenche " +"périodique
Lorsque le service redémarre le routeur, il déclenche " "un redémarrage en douceur. La saisie d'une valeur non nulle ici déclenchera " "un redémarrage dur différé si le redémarrage progressif devait échouer. " "Entrez le nombre de secondes à attendre pour que le redémarrage progressif " @@ -33,9 +33,9 @@ msgid "" "ModemManager, you can have Watchcat restart your ModemManager interface by " "specifying its name." msgstr "" -"S'applique aux modes d'interface Ping Reboot et Restart
Si vous " -"utilisez ModemManager, vous pouvez demander à Watchcat de redémarrer votre " -"interface ModemManager en spécifiant son nom." +"S'applique aux modes d'interface Ping Reboot et Restart
Si " +"vous utilisez ModemManager, vous pouvez demander à Watchcat de redémarrer " +"votre interface ModemManager en spécifiant son nom." #: applications/luci-app-watchcat/htdocs/luci-static/resources/view/watchcat.js:104 msgid "" @@ -43,7 +43,7 @@ msgid "" "> Specify the interface to monitor and react if a ping over it fails." msgstr "" "S'applique aux modes de redémarrage par ping et de redémarrage " -"périodique
Indiquer l'interface à monitorer et corriger en cas " +"périodique
Indiquer l'interface à monitorer et corriger en cas " "d'échec de ping." #: applications/luci-app-watchcat/htdocs/luci-static/resources/view/watchcat.js:60 diff --git a/luci-app-watchcat/po/ko/watchcat.po b/luci-app-watchcat/po/ko/watchcat.po index f7ffdeb0a..da0ed65bf 100644 --- a/luci-app-watchcat/po/ko/watchcat.po +++ b/luci-app-watchcat/po/ko/watchcat.po @@ -1,8 +1,8 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" -"PO-Revision-Date: 2026-08-26 18:51+0000\n" -"Last-Translator: Hyeonjeong Lee \n" +"PO-Revision-Date: 2026-10-17 20:51+0000\n" +"Last-Translator: raepo7214 \n" "Language-Team: Korean \n" "Language: ko\n" @@ -10,7 +10,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 2026.9.dev0\n" +"X-Generator: Weblate 2026.11.dev0\n" #: applications/luci-app-watchcat/htdocs/luci-static/resources/view/watchcat.js:94 msgid "" @@ -71,7 +71,7 @@ msgstr "" #: applications/luci-app-watchcat/htdocs/luci-static/resources/view/watchcat.js:52 msgid "Hosts To Check" -msgstr "" +msgstr "확인할 호스트" #: applications/luci-app-watchcat/htdocs/luci-static/resources/view/watchcat.js:71 msgid "" diff --git a/luci-app-watchcat/po/nb_NO/watchcat.po b/luci-app-watchcat/po/nb_NO/watchcat.po index 3efd68900..08f41fa0b 100644 --- a/luci-app-watchcat/po/nb_NO/watchcat.po +++ b/luci-app-watchcat/po/nb_NO/watchcat.po @@ -1,16 +1,16 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" -"PO-Revision-Date: 2024-01-26 16:51+0000\n" -"Last-Translator: Allan Nordhøy \n" +"PO-Revision-Date: 2026-10-13 15:11+0000\n" +"Last-Translator: Pavel Borecki \n" "Language-Team: Norwegian Bokmål \n" +"luciapplicationswatchcat/nb/>\n" "Language: nb_NO\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 5.4-dev\n" +"X-Generator: Weblate 2026.11.dev0\n" #: applications/luci-app-watchcat/htdocs/luci-static/resources/view/watchcat.js:94 msgid "" @@ -203,6 +203,7 @@ msgid "Watchcat" msgstr "" #: applications/luci-app-watchcat/htdocs/luci-static/resources/view/watchcat.js:82 +#, fuzzy msgid "Windows: 32 bytes" msgstr "" "Ved omstart av systemet vil watchcat utløse en myk omstart. Å skrive inn et " diff --git a/luci-app-watchcat/po/tr/watchcat.po b/luci-app-watchcat/po/tr/watchcat.po index 3e517b8d3..c447492e7 100644 --- a/luci-app-watchcat/po/tr/watchcat.po +++ b/luci-app-watchcat/po/tr/watchcat.po @@ -1,8 +1,8 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" -"PO-Revision-Date: 2026-08-06 20:04+0000\n" -"Last-Translator: egemen \n" +"PO-Revision-Date: 2026-10-13 13:19+0000\n" +"Last-Translator: Pavel Borecki \n" "Language-Team: Turkish \n" "Language: tr\n" @@ -10,7 +10,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 2026.8.1.dev0\n" +"X-Generator: Weblate 2026.11.dev0\n" #: applications/luci-app-watchcat/htdocs/luci-static/resources/view/watchcat.js:94 msgid "" @@ -21,11 +21,11 @@ msgid "" "use 0 to disable the forced reboot delay." msgstr "" "Ping Yeniden Başlatma ve Periyodik Yeniden Başlatma modları için " -"geçerlidir
Yönlendiriciyi yeniden başlatırken, hizmet yumuşak " -"bir yeniden başlatmayı tetikleyecektir. Buraya sıfır olmayan bir değer " -"girmek, yumuşak yeniden başlatma başarısız olursa, gecikmeli bir donanım " -"yeniden başlatmayı tetikleyecektir. Yumuşak yeniden başlatmanın başarısız " -"olması için beklenecek saniye sayısını girin veya zorunlu yeniden başlatma " +"geçerlidir
Yönlendiriciyi yeniden başlatırken, hizmet yumuşak bir " +"yeniden başlatmayı tetikleyecektir. Buraya sıfır olmayan bir değer girmek, " +"yumuşak yeniden başlatma başarısız olursa, gecikmeli bir donanım yeniden " +"başlatmayı tetikleyecektir. Yumuşak yeniden başlatmanın başarısız olması " +"için beklenecek saniye sayısını girin veya zorunlu yeniden başlatma " "gecikmesini devre dışı bırakmak için 0'ı kullanın." #: applications/luci-app-watchcat/htdocs/luci-static/resources/view/watchcat.js:111 @@ -34,9 +34,9 @@ msgid "" "ModemManager, you can have Watchcat restart your ModemManager interface by " "specifying its name." msgstr "" -"Ping Yeniden Başlatma ve Yeniden Başlatma Arayüzü modları için geçerlidir " -"
ModemManager kullanıyorsanız, Watchcat'in adını belirterek " -"ModemManager arayüzünüzü yeniden başlatmasını sağlayabilirsiniz." +"Ping Yeniden Başlatma ve Yeniden Başlatma Arayüzü modları için " +"geçerlidir
ModemManager kullanıyorsanız, Watchcat'in adını " +"belirterek ModemManager arayüzünüzü yeniden başlatmasını sağlayabilirsiniz." #: applications/luci-app-watchcat/htdocs/luci-static/resources/view/watchcat.js:104 msgid "" diff --git a/luci-app-watchcat/po/vi/watchcat.po b/luci-app-watchcat/po/vi/watchcat.po index caa0e25ba..2a08b9645 100644 --- a/luci-app-watchcat/po/vi/watchcat.po +++ b/luci-app-watchcat/po/vi/watchcat.po @@ -1,8 +1,8 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" -"PO-Revision-Date: 2025-05-12 17:04+0000\n" -"Last-Translator: Lộc SuperVipPro \n" +"PO-Revision-Date: 2026-10-13 21:56+0000\n" +"Last-Translator: Pavel Borecki \n" "Language-Team: Vietnamese \n" "Language: vi\n" @@ -10,7 +10,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 5.12-dev\n" +"X-Generator: Weblate 2026.11.dev0\n" #: applications/luci-app-watchcat/htdocs/luci-static/resources/view/watchcat.js:94 msgid "" @@ -20,8 +20,8 @@ msgid "" "to fail. Enter the number of seconds to wait for the soft reboot to fail or " "use 0 to disable the forced reboot delay." msgstr "" -"Áp dụng cho chế độ Khởi động lại Ping và Khởi động lại định kỳ
Khi khởi động lại bộ định tuyến, dịch vụ sẽ kích hoạt khởi động lại mềm. " +"Áp dụng cho chế độ Khởi động lại Ping và Khởi động lại định kỳ
" +"Khi khởi động lại bộ định tuyến, dịch vụ sẽ kích hoạt khởi động lại mềm. " "Nhập một giá trị khác không ở đây sẽ kích hoạt khởi động lại cứng bị trì " "hoãn nếu khởi động lại mềm không thành công. Nhập số giây để chờ khởi động " "lại mềm không thành công hoặc sử dụng 0 để vô hiệu hóa độ trễ khởi động lại " @@ -33,9 +33,9 @@ msgid "" "ModemManager, you can have Watchcat restart your ModemManager interface by " "specifying its name." msgstr "" -"Áp dụng cho chế độ Khởi động lại Ping và Khởi động lại giao diện
Nếu sử dụng ModemManager, bạn có thể yêu cầu Watchcat khởi động lại giao " -"diện ModemManager của mình bằng cách chỉ định tên của nó." +"Áp dụng cho chế độ Khởi động lại Ping và Khởi động lại giao diện " +"
Nếu sử dụng ModemManager, bạn có thể yêu cầu Watchcat khởi động lại " +"giao diện ModemManager của mình bằng cách chỉ định tên của nó." #: applications/luci-app-watchcat/htdocs/luci-static/resources/view/watchcat.js:104 msgid "" @@ -191,11 +191,11 @@ msgid "" "for a specified duration of time.
" msgstr "" "Khởi động lại Ping: Khởi động lại thiết bị này nếu ping đến một máy chủ được " -"chỉ định không thành công trong một khoảng thời gian nhất định.
Khởi " +"chỉ định không thành công trong một khoảng thời gian nhất định.
Khởi " "động lại định kỳ: Khởi động lại thiết bị này sau một khoảng thời gian nhất " -"định.
Khởi động lại giao diện: Khởi động lại giao diện mạng nếu ping " +"định.
Khởi động lại giao diện: Khởi động lại giao diện mạng nếu ping " "đến một máy chủ cụ thể không thành công trong một khoảng thời gian cụ thể. " -"
Chạy tập lệnh: Chạy tập lệnh nếu lệnh ping đến một máy chủ cụ thể " +"
Chạy tập lệnh: Chạy tập lệnh nếu lệnh ping đến một máy chủ cụ thể " "không thành công trong một khoảng thời gian cụ thể.
" #: applications/luci-app-watchcat/htdocs/luci-static/resources/view/watchcat.js:29 diff --git a/luci-app-weechat/Makefile b/luci-app-weechat/Makefile new file mode 100644 index 000000000..d1d010d49 --- /dev/null +++ b/luci-app-weechat/Makefile @@ -0,0 +1,13 @@ +# This is free software, licensed under the Apache License, Version 2.0 . + +include $(TOPDIR)/rules.mk + +LUCI_TITLE:=LuCI support for WeeChat IRC client +LUCI_DEPENDS:=+luci-base +weechat +rpcd-mod-ucode + +PKG_LICENSE:=Apache-2.0 +PKG_MAINTAINER:=Josef Schlehofer + +include $(TOPDIR)/feeds/luci/luci.mk + +# call BuildPackage - OpenWrt buildroot signature diff --git a/luci-app-weechat/htdocs/luci-static/resources/tools/weechat.js b/luci-app-weechat/htdocs/luci-static/resources/tools/weechat.js new file mode 100644 index 000000000..7a3a218f1 --- /dev/null +++ b/luci-app-weechat/htdocs/luci-static/resources/tools/weechat.js @@ -0,0 +1,27 @@ +'use strict'; +'require baseclass'; + +return baseclass.extend({ + parseAutoJoin: function(val) { + if (!val || !val.trim()) + return { channels: [], keys: [] }; + + var trimmed = val.trim(); + var spaceIdx = trimmed.search(/\s/); + if (spaceIdx === -1) { + return { + channels: trimmed.split(',').map(function(c) { return c.trim(); }).filter(Boolean), + keys: [] + }; + } + + var firstPart = trimmed.substring(0, spaceIdx).trim(); + var rest = trimmed.substring(spaceIdx + 1).trim(); + + /* Keys are positional, so keep empty ones to stay aligned with channels */ + return { + channels: firstPart.split(',').map(function(c) { return c.trim(); }).filter(Boolean), + keys: rest.length ? rest.split(',').map(function(k) { return k.trim(); }) : [] + }; + } +}); diff --git a/luci-app-weechat/htdocs/luci-static/resources/view/weechat/relay.js b/luci-app-weechat/htdocs/luci-static/resources/view/weechat/relay.js new file mode 100644 index 000000000..c4ab27415 --- /dev/null +++ b/luci-app-weechat/htdocs/luci-static/resources/view/weechat/relay.js @@ -0,0 +1,412 @@ +'use strict'; +'require view'; +'require form'; +'require rpc'; +'require uci'; +'require ui'; + +var callGetCertStatus = rpc.declare({ + object: 'weechat', + method: 'get_certificate_status', + params: [ 'path' ], + expect: { '': {} } +}); + +var callGenerateCert = rpc.declare({ + object: 'weechat', + method: 'generate_certificate', + params: [ 'cn', 'san', 'path' ], + expect: { '': {} } +}); + +var callServiceList = rpc.declare({ + object: 'service', + method: 'list', + params: [ 'name' ], + expect: { '': {} } +}); + +var callRcInit = rpc.declare({ + object: 'rc', + method: 'init', + params: [ 'name', 'action' ] +}); + +/* Mirrors check_path() in the init script, which refuses to start otherwise */ +function validatePath(value, allowPercent) { + if (!value) + return true; + if (value.charAt(0) !== '/' || /[\r\n]/.test(value) || /(^|\/)\.\.?(\/|$)/.test(value)) + return _('Must be an absolute path without . or .. components'); + if (value !== value.trim()) + return _('Must not start or end with a space'); + if (value.indexOf('${') !== -1) + return _('Must not contain "${"'); + if (!allowPercent && value.indexOf('%') !== -1) + return _('Must not contain "%"'); + return true; +} + +/* WeeChat only reads the certificate when it starts, so restart a running relay */ +function restartIfRunning() { + return callServiceList('weechat').then(function(res) { + var instances = (res && res.weechat && res.weechat.instances) || {}; + var running = Object.keys(instances).some(function(k) { return instances[k].running; }); + + if (!running) + return false; + + return callRcInit('weechat', 'restart').then(function(ret) { + if (ret) + throw new Error(_('Command failed with return code %d').format(ret)); + return true; + }); + }); +} + +return view.extend({ + load: function() { + return uci.load('weechat'); + }, + + render: function() { + var m, s, o; + var defaultPath = '/etc/weechat/tls/relay.pem'; + var refreshCertStatus = null; + + /* Only certificates in this directory are checked and generated here */ + function isManagedPath(path) { + return /^\/etc\/weechat\/tls\/[A-Za-z0-9._-]+\.pem$/.test(path) && path.indexOf('..') === -1; + } + + /* IPv6 literals come with brackets, which are not valid in a SAN */ + var hostname = (window.location.hostname || 'OpenWrt').replace(/^\[(.*)\]$/, '$1'); + var defaultSan = hostname; + + m = new form.Map('weechat', _('WeeChat - Relay'), + _('Configure the WeeChat relay and chat logging.')); + + /* Relay */ + s = m.section(form.NamedSection, 'weechat', 'weechat', _('Relay')); + + var optRelayEnabled = s.option(form.Flag, 'relay_enabled', _('Enable Relay Server')); + optRelayEnabled.default = optRelayEnabled.disabled; + optRelayEnabled.rmempty = false; + + o = s.option(form.Value, 'relay_address', _('Listen Address'), + _('IP address to bind (leave empty for all interfaces). The address must exist when WeeChat starts.')); + o.datatype = 'ipaddr("nomask")'; + o.placeholder = _('All interfaces'); + /* WeeChat cannot bind to it and the init script refuses it */ + o.validate = function(section_id, value) { + var m = (value || '').match(/(?:^|:)(\d+\.\d+\.\d+\.\d+)$/); + if (m && m[1].split('.').some(function(p) { return p.length > 1 && p.charAt(0) === '0'; })) + return _('Leading zeros are not allowed in an IPv4 address'); + return true; + }; + o.rmempty = true; + o.depends('relay_enabled', '1'); + + o = s.option(form.Value, 'relay_port', _('Port'), + _('Port for relay connections (WebSocket).')); + o.datatype = 'and(port,min(1))'; + o.default = '9000'; + o.placeholder = '9000'; + o.depends('relay_enabled', '1'); + + /* Security */ + s = m.section(form.NamedSection, 'weechat', 'weechat', _('Security')); + + o = s.option(form.Flag, 'relay_tls', _('Enable TLS'), + _('Encrypt relay connections with TLS.')); + o.default = o.disabled; + + var optCertKey = s.option(form.Value, 'relay_cert_key', _('Certificate'), + _('PEM file containing the certificate and private key. It must be readable by the weechat user.')); + optCertKey.placeholder = defaultPath; + optCertKey.rmempty = true; + optCertKey.depends('relay_tls', '1'); + optCertKey.validate = function(section_id, value) { + return validatePath(value, true); + }; + optCertKey.onchange = function() { + if (refreshCertStatus) + refreshCertStatus(); + }; + + /* An empty field means the default path, as in the init script */ + function getActiveCertPath() { + var val = optCertKey.formvalue('weechat'); + if (val == null) + val = uci.get('weechat', 'weechat', 'relay_cert_key'); + return (val || '').trim() || defaultPath; + } + + /* Certificate status widget */ + var optCertStatus = s.option(form.DummyValue, '_cert_status', _('Certificate status')); + optCertStatus.depends('relay_tls', '1'); + + optCertStatus.renderWidget = function(section_id, option_index, cfgvalue) { + var container = E('div', { 'class': 'cbi-value-field' }); + var isReadonly = (this.readonly != null) ? this.readonly : this.map.readonly; + + function updateWidget(path) { + while (container.firstChild) + container.removeChild(container.firstChild); + + if (!isManagedPath(path)) { + container.appendChild(E('div', { 'class': 'alert-message notice' }, + _('This certificate is managed outside of LuCI, so it is not checked here. The service refuses to start if the file does not exist.'))); + return; + } + + container.appendChild(E('em', {}, _('Checking certificate status…'))); + + callGetCertStatus(path || defaultPath).then(function(res) { + while (container.firstChild) + container.removeChild(container.firstChild); + + var elements = []; + + if (res && res.exists && res.has_cert && res.has_key) { + elements.push(E('div', {}, [ + E('span', { 'class': 'label success' }, [ '● ', _('Certificate and key present') ]) + ])); + + elements.push(E('p', { 'class': 'cbi-value-description' }, [ + E('strong', {}, _('File: ')), + E('code', {}, res.path) + ])); + + elements.push(E('button', { + 'class': 'btn cbi-button cbi-button-action', + 'type': 'button', + 'disabled': isReadonly || null, + 'click': function(ev) { + ev.preventDefault(); + showGenerateDialog(getActiveCertPath(), res.generator_available); + } + }, _('Generate new certificate'))); + } else if (res && res.exists && (!res.has_cert || !res.has_key)) { + elements.push(E('div', { 'class': 'alert-message warning' }, + _('Certificate file exists but is incomplete (must contain both certificate and private key).'))); + + elements.push(E('button', { + 'class': 'btn cbi-button cbi-button-action', + 'type': 'button', + 'disabled': isReadonly || null, + 'click': function(ev) { + ev.preventDefault(); + showGenerateDialog(getActiveCertPath(), res.generator_available); + } + }, _('Generate self-signed certificate'))); + } else { + elements.push(E('div', { 'class': 'alert-message warning' }, + _('TLS is enabled but no certificate file was found.'))); + + elements.push(E('button', { + 'class': 'btn cbi-button cbi-button-action', + 'type': 'button', + 'disabled': isReadonly || null, + 'click': function(ev) { + ev.preventDefault(); + showGenerateDialog(getActiveCertPath(), res && res.generator_available); + } + }, _('Generate self-signed certificate'))); + } + + if (res && res.generator_available === false) { + elements.push(E('div', { 'class': 'alert-message warning' }, + _('Certificate generation requires the %s or %s utility.').format('px5g', 'openssl'))); + } + + for (var i = 0; i < elements.length; i++) + container.appendChild(elements[i]); + }).catch(function(err) { + while (container.firstChild) + container.removeChild(container.firstChild); + container.appendChild(E('div', { 'class': 'alert-message error' }, + _('Unable to verify certificate status: %s').format(err.message || err))); + }); + } + + function showGenerateDialog(targetPath, generatorAvailable) { + var inputCn, inputSan, btnGenerate, btnCancel, msgBox; + + var modalContent = [ + E('div', { 'class': 'alert-message notice' }, [ + E('p', {}, + _('A self-signed certificate will be generated for WeeChat Relay at %s.').format(targetPath)), + E('p', {}, + E('strong', {}, _('Self-signed certificates provide encryption but are not trusted automatically by browsers.'))), + E('p', {}, + _('For Internet-facing deployments, use a certificate issued by a trusted CA.')) + ]), + + E('h5', {}, _('Certificate identity')), + + E('div', { 'class': 'cbi-value' }, [ + E('label', { 'class': 'cbi-value-title' }, _('Common name')), + E('div', { 'class': 'cbi-value-field' }, [ + inputCn = E('input', { + 'type': 'text', + 'class': 'cbi-input-text', + 'value': hostname, + 'placeholder': 'router.local' + }), + E('div', { 'class': 'cbi-value-description' }, + _('Host name identifying this router.')) + ]) + ]), + + E('div', { 'class': 'cbi-value' }, [ + E('label', { 'class': 'cbi-value-title' }, _('Subject alternative names')), + E('div', { 'class': 'cbi-value-field' }, [ + inputSan = E('input', { + 'type': 'text', + 'class': 'cbi-input-text', + 'value': defaultSan, + 'placeholder': 'router.local, 192.168.1.1' + }), + E('div', { 'class': 'cbi-value-description' }, + _('Comma-separated list of host names and IP addresses used to reach the relay.')) + ]) + ]), + + msgBox = E('div', {}), + + E('div', { 'class': 'right' }, [ + btnCancel = E('button', { + 'class': 'btn cbi-button cbi-button-neutral', + 'click': ui.hideModal + }, _('Cancel')), + ' ', + btnGenerate = E('button', { + 'class': 'btn cbi-button cbi-button-action', + 'click': function(ev) { + ev.preventDefault(); + var cnVal = inputCn.value.trim(); + var sanVal = inputSan.value.trim(); + + if (!cnVal) { + ui.addNotification(null, E('p', _('Please enter a valid Common Name.')), 'warning'); + return; + } + + btnGenerate.disabled = true; + btnCancel.disabled = true; + btnGenerate.textContent = _('Generating…'); + + while (msgBox.firstChild) + msgBox.removeChild(msgBox.firstChild); + msgBox.appendChild(E('p', { 'class': 'spinning' }, _('Generating self-signed certificate…'))); + + callGenerateCert(cnVal, sanVal, targetPath).then(function(res) { + if (res && res.success) { + ui.hideModal(); + updateWidget(getActiveCertPath()); + /* Only the saved relay settings decide which certificate WeeChat loads */ + (res.in_use ? restartIfRunning() : Promise.resolve(null)).then(function(restarted) { + var msg; + if (restarted === true) + msg = _('Self-signed certificate generated for %s. WeeChat was restarted to use it.'); + else if (restarted === false) + msg = _('Self-signed certificate generated for %s. WeeChat uses it from its next start.'); + else + msg = _('Self-signed certificate generated for %s. Save and apply TLS with this certificate to use it.'); + ui.addNotification(null, E('p', msg.format(cnVal)), 'info'); + }).catch(function(err) { + ui.addNotification(null, E('p', + _('Self-signed certificate generated for %s, but WeeChat could not be restarted: %s').format(cnVal, err.message || err)), + 'warning'); + }); + } else { + btnGenerate.disabled = false; + btnCancel.disabled = false; + btnGenerate.textContent = _('Generate'); + while (msgBox.firstChild) + msgBox.removeChild(msgBox.firstChild); + msgBox.appendChild(E('div', { 'class': 'alert-message error' }, + res && res.error ? res.error : _('Certificate generation failed.'))); + } + }).catch(function(err) { + btnGenerate.disabled = false; + btnCancel.disabled = false; + btnGenerate.textContent = _('Generate'); + while (msgBox.firstChild) + msgBox.removeChild(msgBox.firstChild); + msgBox.appendChild(E('div', { 'class': 'alert-message error' }, + err.message || err)); + }); + } + }, _('Generate')) + ]) + ]; + + if (generatorAvailable === false) { + btnGenerate.disabled = true; + msgBox.appendChild(E('div', { 'class': 'alert-message error' }, + _('Cannot generate certificate: neither %s nor %s is installed on this router.').format('px5g', 'openssl'))); + } + + ui.showModal(_('Generate certificate?'), modalContent); + } + + refreshCertStatus = function() { + updateWidget(getActiveCertPath()); + }; + + /* The field is not in the page yet while rendering, start from its stored value */ + updateWidget(String(optCertKey.cfgvalue(section_id) || '').trim() || defaultPath); + + return container; + }; + + o = s.option(form.Value, 'relay_password', _('Relay Password'), + _('Password required by clients to connect.')); + o.password = true; + o.validate = function(section_id, value) { + var formVal = optRelayEnabled ? optRelayEnabled.formvalue(section_id) : null; + var isEnabled = (formVal !== null) ? (formVal === '1') : (uci.get('weechat', section_id, 'relay_enabled') === '1'); + if (isEnabled && (!value || !value.trim())) { + return _('Relay password is required when relay server is enabled.'); + } + return true; + }; + + /* Logging */ + s = m.section(form.NamedSection, 'weechat', 'weechat', _('Logging')); + + o = s.option(form.Flag, 'log_enabled', _('Enable Logging'), + _('Record chat logs to disk. Disabled by default to protect flash memory.')); + o.default = o.disabled; + + o = s.option(form.Value, 'log_dir', _('Log Directory'), + _('Directory where WeeChat stores chat logs. The default /var/log/weechat is created automatically, any other directory must exist and be writable by the weechat user.')); + o.placeholder = '/var/log/weechat'; + o.depends('log_enabled', '1'); + o.validate = function(section_id, value) { + return validatePath(value, false); + }; + + /* Web Client */ + s = m.section(form.NamedSection, 'weechat', 'weechat', _('Web Client')); + + o = s.option(form.DummyValue, '_gb_info'); + o.cfgvalue = function() { + return E('div', {}, [ + E('p', { 'style': 'margin-bottom: 12px; line-height: 1.5;' }, + _('Glowing Bear is a web client that connects to WeeChat using the relay configured above.')), + E('a', { + 'class': 'btn cbi-button cbi-button-action', + 'href': 'https://www.glowing-bear.org/', + 'target': '_blank', + 'rel': 'noreferrer noopener', + 'style': 'margin-bottom: 6px; display: inline-block;' + }, [ _('Open Glowing Bear (Hosted)'), ' ↗' ]) + ]); + }; + + return m.render(); + } +}); diff --git a/luci-app-weechat/htdocs/luci-static/resources/view/weechat/servers.js b/luci-app-weechat/htdocs/luci-static/resources/view/weechat/servers.js new file mode 100644 index 000000000..6d6482b58 --- /dev/null +++ b/luci-app-weechat/htdocs/luci-static/resources/view/weechat/servers.js @@ -0,0 +1,376 @@ +'use strict'; +'require view'; +'require form'; +'require uci'; +'require ui'; +'require tools.weechat as weechatTools'; + +/* WeeChat evaluates these options, the init script refuses "${" in them */ +function validateNoExpr(section_id, value) { + if (value && value.indexOf('${') !== -1) + return _('Must not contain "${"'); + return true; +} + +function checkAutoJoinRows(rows) { + for (var i = 0; i < rows.length; i++) { + var chanInput = rows[i].querySelector('.chan-input'); + var keyInput = rows[i].querySelector('.key-input'); + var chan = (chanInput ? chanInput.value : '').trim(); + var key = (keyInput ? keyInput.value : '').trim(); + + if (!chan && key) + return _('Channel key cannot be specified without a channel name'); + if (chan && (chan.indexOf(',') !== -1 || /\s/.test(chan))) + return _('Channel name "%s" cannot contain commas or spaces').format(chan); + if (key && (key.indexOf(',') !== -1 || /\s/.test(key))) + return _('Channel key cannot contain commas or spaces'); + if (validateNoExpr(null, chan) !== true || validateNoExpr(null, key) !== true) + return _('Channels and keys must not contain "${"'); + } + return true; +} + +var CBIAutoJoin = form.Value.extend({ + validate: function(section_id, value) { + var el = document.getElementById(this.cbid(section_id)); + if (!el || !el.parentNode) + return true; + + var res = checkAutoJoinRows(el.parentNode.querySelectorAll('tr[data-channel-row]')); + + /* The modal shows no message for this widget, so show it here */ + var box = el.parentNode.querySelector('.autojoin-error'); + if (box) { + box.textContent = (res === true) ? '' : res; + box.style.display = (res === true) ? 'none' : ''; + } + + return res; + }, + + /* + * The value lives in a hidden field, which never runs validation on its + * own, so let parse() see the result of validate() through these. + */ + isValid: function(section_id) { + return this.validate(section_id, this.formvalue(section_id)) === true; + }, + + getValidationError: function(section_id) { + var res = this.validate(section_id, this.formvalue(section_id)); + return (res === true) ? '' : res; + }, + + textvalue: function(section_id) { + var val = this.cfgvalue(section_id); + var parsed = weechatTools.parseAutoJoin(val); + if (parsed.channels.length === 0) + return null; + + var nodes = []; + parsed.channels.forEach(function(chan, idx) { + if (idx > 0) + nodes.push(', '); + nodes.push(E('code', {}, chan)); + }); + return E('span', {}, nodes); + }, + + renderWidget: function(section_id, option_index, cfgvalue) { + var isReadonly = (this.readonly != null) ? this.readonly : this.map.readonly; + var hidden = new ui.Hiddenfield((cfgvalue != null) ? cfgvalue : '', { + id: this.cbid(section_id) + }); + + var table = E('table', { 'class': 'table cbi-section-table' }, [ + E('tr', { 'class': 'tr cbi-section-table-titles' }, [ + E('th', { 'class': 'th cbi-section-table-cell' }, _('Channel')), + E('th', { 'class': 'th cbi-section-table-cell' }, _('Key')), + E('th', { 'class': 'th cbi-section-table-cell cbi-section-actions' }, '') + ]) + ]); + + function updateValue() { + var rows = table.querySelectorAll('tr[data-channel-row]'); + var chansWithKeys = []; + var chansWithoutKeys = []; + + rows.forEach(function(row) { + var chanInput = row.querySelector('.chan-input'); + var keyInput = row.querySelector('.key-input'); + var chan = (chanInput ? chanInput.value : '').trim(); + var key = (keyInput ? keyInput.value : '').trim(); + + if (!chan) + return; + + if (key) + chansWithKeys.push({ chan: chan, key: key }); + else + chansWithoutKeys.push(chan); + }); + + var allChans = chansWithKeys.map(function(item) { return item.chan; }).concat(chansWithoutKeys); + var allKeys = chansWithKeys.map(function(item) { return item.key; }); + var result = allChans.join(','); + if (allKeys.length > 0) + result += ' ' + allKeys.join(','); + + hidden.setValue(result); + } + + function createRow(channel, key) { + var chanInput = E('input', { + 'type': 'text', + 'class': 'cbi-input-text chan-input', + 'placeholder': '#openwrt', + 'value': channel || '', + 'disabled': isReadonly || null + }); + + chanInput.addEventListener('input', function() { + if (chanInput.value.indexOf(',') !== -1 || /\s/.test(chanInput.value)) { + chanInput.classList.add('cbi-input-invalid'); + chanInput.title = _('Enter a single channel per row without commas or spaces'); + } else { + chanInput.classList.remove('cbi-input-invalid'); + chanInput.removeAttribute('title'); + } + updateValue(); + }); + + var keyInput = E('input', { + 'type': 'password', + 'class': 'cbi-input-text key-input', + 'placeholder': _('Optional key'), + 'value': key || '', + 'disabled': isReadonly || null + }); + + keyInput.addEventListener('input', function() { + if (keyInput.value.indexOf(',') !== -1 || /\s/.test(keyInput.value)) { + keyInput.classList.add('cbi-input-invalid'); + keyInput.title = _('Channel key cannot contain commas or spaces'); + } else { + keyInput.classList.remove('cbi-input-invalid'); + keyInput.removeAttribute('title'); + } + updateValue(); + }); + + var btnRemove = E('button', { + 'type': 'button', + 'class': 'btn cbi-button cbi-button-remove', + 'title': _('Remove'), + 'disabled': isReadonly || null + }, '✕'); + + var row = E('tr', { + 'class': 'tr cbi-section-table-row', + 'data-channel-row': '' + }, [ + E('td', { 'class': 'td cbi-section-table-cell' }, chanInput), + E('td', { 'class': 'td cbi-section-table-cell' }, keyInput), + E('td', { 'class': 'td cbi-section-table-cell cbi-section-actions' }, btnRemove) + ]); + + btnRemove.addEventListener('click', function() { + row.remove(); + updateValue(); + }); + + return row; + } + + var parsed = weechatTools.parseAutoJoin(cfgvalue != null ? cfgvalue : ''); + if (parsed.channels.length > 0) { + parsed.channels.forEach(function(chan, idx) { + table.appendChild(createRow(chan, parsed.keys[idx] || '')); + }); + } + else { + table.appendChild(createRow('', '')); + } + + var btnAdd = E('button', { + 'type': 'button', + 'class': 'btn cbi-button cbi-button-add', + 'disabled': isReadonly || null + }, _('Add channel')); + + btnAdd.addEventListener('click', function() { + var newRow = createRow('', ''); + table.appendChild(newRow); + var input = newRow.querySelector('.chan-input'); + if (input) + input.focus(); + }); + + return E('div', { 'class': 'cbi-value-field' }, [ + table, + btnAdd, + E('div', { 'class': 'alert-message error autojoin-error', 'style': 'display: none' }), + hidden.render() + ]); + } +}); + +return view.extend({ + render: function() { + var m, s, o; + + m = new form.Map('weechat', _('WeeChat - IRC Servers'), + _('Configure IRC server connections, authentication, and auto-join channels.')); + + s = m.section(form.GridSection, 'server', _('IRC Servers')); + s.addremove = true; + s.anonymous = false; + s.addbtntitle = _('Add Server'); + s.nodescriptions = true; + + s.sectiontitle = function(section_id) { + return section_id; + }; + + /* Define Tabs */ + s.tab('connection', _('Connection')); + s.tab('identity', _('Identity')); + s.tab('auth', _('Authentication')); + s.tab('channels', _('Channels')); + + /* Connection settings (table columns + modal Connection tab) */ + o = s.taboption('connection', form.Value, 'address', _('Server Hostname'), + _('Hostname or IP address of the IRC server.')); + o.placeholder = 'irc.oftc.net'; + o.datatype = 'host'; + o.rmempty = false; + + o = s.taboption('connection', form.Value, 'port', _('Port')); + o.datatype = 'and(port,min(1))'; + o.default = '6697'; + o.placeholder = '6697'; + + o = s.taboption('connection', form.Flag, 'ssl', _('Use TLS')); + o.default = o.enabled; + o.rmempty = false; + + o = s.taboption('connection', form.ListValue, 'ipv6', _('IPv6 Support'), + _('IPv6 connection mode for this IRC server.')); + o.value('auto', _('Auto')); + o.value('force', _('Force IPv6')); + o.value('disable', _('Disable IPv6')); + o.default = 'auto'; + o.textvalue = function(section_id) { + var val = this.cfgvalue(section_id) || this.default; + switch (val) { + case 'force': return _('Force IPv6'); + case 'disable': return _('Disabled'); + case 'auto': + default: + return _('Auto'); + } + }; + + /* Channels (table column + modal Channels tab) */ + o = s.taboption('channels', CBIAutoJoin, 'autojoin', _('Auto-join Channels'), + _('Channels to join automatically after connecting to this server.')); + o.rmempty = true; + + /* Auto-connect & Enabled flags (table columns + modal Connection tab) */ + o = s.taboption('connection', form.Flag, 'autoconnect', _('Auto-connect'), + _('Connect automatically when WeeChat starts.')); + o.default = o.enabled; + o.rmempty = false; + o.editable = true; + + o = s.taboption('connection', form.Flag, 'enabled', _('Enabled')); + o.default = o.enabled; + o.rmempty = false; + o.editable = true; + + /* Tab 2: Identity */ + o = s.taboption('identity', form.Value, 'nicks', _('Nicknames'), + _('Comma-separated list of nicknames to try.')); + o.placeholder = 'weechat,weechat_'; + o.modalonly = true; + o.validate = validateNoExpr; + + o = s.taboption('identity', form.Value, 'username', _('Username')); + o.placeholder = 'weechat'; + o.modalonly = true; + o.validate = validateNoExpr; + + o = s.taboption('identity', form.Value, 'realname', _('Real Name')); + o.placeholder = 'WeeChat User'; + o.modalonly = true; + o.validate = validateNoExpr; + + /* Tab 3: Authentication */ + o = s.taboption('auth', form.ListValue, 'auth_method', _('Authentication Method'), + _('Select the authentication method required by the IRC network.')); + o.value('none', _('None')); + o.value('nickserv', _('NickServ (/msg nickserv identify)')); + o.value('sasl_plain', _('SASL PLAIN')); + o.value('sasl_scram_sha_256', _('SASL SCRAM-SHA-256')); + o.value('sasl_scram_sha_512', _('SASL SCRAM-SHA-512')); + o.default = 'none'; + o.modalonly = true; + + o = s.taboption('auth', form.Value, 'sasl_username', _('SASL Username'), + _('Account username if different from nickname.')); + o.depends('auth_method', 'sasl_plain'); + o.depends('auth_method', 'sasl_scram_sha_256'); + o.depends('auth_method', 'sasl_scram_sha_512'); + o.modalonly = true; + /* Same default as the init script: the first nickname, then the username */ + o.validate = function(section_id, value) { + var nick = (this.section.formvalue(section_id, 'nicks') || '').split(',')[0]; + var account = value || nick || this.section.formvalue(section_id, 'username') || ''; + if (!account.trim()) + return _('Enter a SASL username or a nickname'); + return validateNoExpr(section_id, value); + }; + + o = s.taboption('auth', form.Value, 'password', _('Password')); + o.password = true; + o.depends('auth_method', 'nickserv'); + o.depends('auth_method', 'sasl_plain'); + o.depends('auth_method', 'sasl_scram_sha_256'); + o.depends('auth_method', 'sasl_scram_sha_512'); + o.modalonly = true; + o.validate = function(section_id, value) { + var method = this.section.formvalue(section_id, 'auth_method'); + + if (!method || method === 'none') + return true; + if (!value || !value.trim()) + return _('A password is required for this authentication method'); + /* WeeChat replaces these in the NickServ command after decoding the password */ + if (method === 'nickserv' && /\$(nick|channel|server)/.test(value)) + return _('A NickServ password cannot contain $nick, $channel or $server'); + return true; + }; + + return m.render().then(L.bind(function(nodes) { + var target = null; + var hashMatch = (window.location.hash || '').match(/#(?:edit|server)=([^&]+)/); + if (hashMatch) { + target = decodeURIComponent(hashMatch[1]); + } else { + var params = new URLSearchParams(window.location.search); + target = params.get('server') || params.get('edit'); + } + + if (target && (m.data.get('weechat', target) || uci.get('weechat', target))) { + if (window.history && window.history.replaceState) { + var cleanSearch = window.location.search ? window.location.search.replace(/[?&](?:server|edit)=[^&]*/g, '').replace(/^&/, '?') : ''; + window.history.replaceState(null, '', window.location.pathname + cleanSearch); + } + s.renderMoreOptionsModal(target); + } + + return nodes; + }, this)); + } +}); diff --git a/luci-app-weechat/htdocs/luci-static/resources/view/weechat/status.js b/luci-app-weechat/htdocs/luci-static/resources/view/weechat/status.js new file mode 100644 index 000000000..65f18a742 --- /dev/null +++ b/luci-app-weechat/htdocs/luci-static/resources/view/weechat/status.js @@ -0,0 +1,394 @@ +'use strict'; +'require view'; +'require rpc'; +'require uci'; +'require ui'; +'require poll'; +'require tools.weechat as weechatTools'; + +function renderEnabledState(isEnabled) { + return [ + isEnabled + ? E('span', { 'class': 'label success', 'style': 'margin-right: 8px;' }, _('Enabled')) + : E('span', { 'class': 'label danger', 'style': 'margin-right: 8px;' }, _('Disabled')), + E('span', { 'class': 'cbi-value-description' }, + isEnabled ? _('Service is allowed to start.') : _('Service is disabled in configuration.')) + ]; +} + +function getServiceStatus(serviceData) { + var isRunning = false, + pid = null; + + if (serviceData && serviceData.weechat && serviceData.weechat.instances) { + var instances = serviceData.weechat.instances; + for (var inst in instances) { + if (instances[inst].running) { + isRunning = true; + pid = instances[inst].pid; + break; + } + } + } + + return { running: isRunning, pid: pid }; +} + +return view.extend({ + callServiceList: rpc.declare({ + object: 'service', + method: 'list', + params: ['name'], + expect: { '': {} } + }), + + callRcList: rpc.declare({ + object: 'rc', + method: 'list', + expect: { '': {} } + }), + + callRcInit: rpc.declare({ + object: 'rc', + method: 'init', + params: ['name', 'action'] + }), + + callDaemonInfo: rpc.declare({ + object: 'weechat', + method: 'get_daemon_info', + expect: { '': {} } + }), + + callEnableService: rpc.declare({ + object: 'weechat', + method: 'enable_service', + expect: { success: false } + }), + + /* + * The init script only starts WeeChat with option enabled '1'. Let the + * backend commit just that option, uci.apply() would apply every change + * staged in this session, for any config. + */ + ensureEnabled: function() { + if (uci.get('weechat', 'weechat', 'enabled') === '1') + return Promise.resolve(); + + return this.callEnableService().then(function(success) { + if (!success) + throw new Error(_('Could not enable the service in /etc/config/weechat')); + + var cell = document.getElementById('weechat-service-enabled'); + if (cell) { + while (cell.firstChild) + cell.removeChild(cell.firstChild); + renderEnabledState(true).forEach(function(node) { cell.appendChild(node); }); + } + + uci.unload('weechat'); + return uci.load('weechat'); + }); + }, + + load: function() { + return Promise.all([ + uci.load('weechat'), + this.callServiceList('weechat'), + this.callRcList(), + L.resolveDefault(this.callDaemonInfo(), {}) + ]); + }, + + handleServiceAction: function(statusBadge, pidLabel, btnStart, btnRestart, btnStop, isReadonly, action) { + btnStart.disabled = true; + btnRestart.disabled = true; + btnStop.disabled = true; + + var ensureEnabled = (action === 'start') ? this.ensureEnabled() : Promise.resolve(); + + return ensureEnabled.then(L.bind(function() { + return this.callRcInit('weechat', action); + }, this)).then(L.bind(function(ret) { + if (ret) + throw new Error(_('Command failed with return code %d').format(ret)); + + return new Promise(function(resolve) { + window.setTimeout(resolve, 1000); + }); + }, this)).then(L.bind(function() { + return this.updateServiceStatus(statusBadge, pidLabel, btnStart, btnRestart, btnStop, isReadonly); + }, this)).catch(function(e) { + ui.addNotification(null, E('p', _('Failed to execute "/etc/init.d/weechat %s": %s').format(action, e.message || e))); + }); + }, + + handleToggleAutostart: function(enable, autostartBadge, autostartBtn, isReadonly, ev) { + var action = enable ? 'enable' : 'disable'; + autostartBtn.disabled = true; + + var prepare = enable ? this.ensureEnabled() : Promise.resolve(); + + return prepare.then(L.bind(function() { + return this.callRcInit('weechat', action); + }, this)).then(L.bind(function(ret) { + if (ret) + throw new Error(_('Command failed with return code %d').format(ret)); + + autostartBadge.className = 'label ' + (enable ? 'success' : ''); + autostartBadge.textContent = enable ? _('Enabled') : _('Disabled'); + autostartBtn.textContent = enable ? _('Disable Autostart') : _('Enable Autostart'); + autostartBtn.disabled = isReadonly ? true : false; + autostartBtn.onclick = isReadonly ? null : ui.createHandlerFn(this, 'handleToggleAutostart', !enable, autostartBadge, autostartBtn, isReadonly); + }, this)).catch(function(e) { + autostartBtn.disabled = false; + ui.addNotification(null, E('p', _('Failed to execute "/etc/init.d/weechat %s": %s').format(action, e.message || e))); + }); + }, + + updateServiceStatus: function(statusBadge, pidLabel, btnStart, btnRestart, btnStop, isReadonly) { + return this.callServiceList('weechat').then(function(res) { + var st = getServiceStatus(res); + var isRunning = st.running; + var pid = st.pid; + + statusBadge.className = 'label ' + (isRunning ? 'success' : 'danger'); + statusBadge.textContent = isRunning ? _('Running') : _('Stopped'); + pidLabel.textContent = (isRunning && pid) ? ('PID: ' + pid) : ''; + + btnStart.disabled = (isRunning || isReadonly); + btnRestart.disabled = (!isRunning || isReadonly); + btnStop.disabled = (!isRunning || isReadonly); + }); + }, + + render: function(data) { + var serviceData = data[1] || {}, + rcData = data[2] || {}, + daemonInfo = data[3] || {}, + isReadonly = !L.hasViewPermission(), + st = getServiceStatus(serviceData), + isRunning = st.running, + pid = st.pid, + isAutostart = !!(rcData && rcData.weechat && rcData.weechat.enabled), + isEnabled = (uci.get('weechat', 'weechat', 'enabled') === '1'), + version = (daemonInfo && daemonInfo.version) ? daemonInfo.version : '-'; + + var statusBadge = E('span', { + 'class': 'label ' + (isRunning ? 'success' : 'danger'), + 'style': 'padding: 4px 10px; font-size: 90%; font-weight: bold; border-radius: 4px;' + }, isRunning ? _('Running') : _('Stopped')); + + var pidLabel = E('span', { + 'class': 'cbi-value-description', + 'style': 'margin-left: 8px; font-weight: normal;' + }, (isRunning && pid) ? ('PID: ' + pid) : ''); + + var autostartBadge = E('span', { + 'class': 'label ' + (isAutostart ? 'success' : ''), + 'style': 'margin-right: 12px;' + }, isAutostart ? _('Enabled') : _('Disabled')); + + var autostartBtn = E('button', { + 'class': 'btn cbi-button cbi-button-action', + 'disabled': isReadonly ? 'disabled' : null + }, isAutostart ? _('Disable Autostart') : _('Enable Autostart')); + + if (!isReadonly) { + autostartBtn.onclick = ui.createHandlerFn(this, 'handleToggleAutostart', !isAutostart, autostartBadge, autostartBtn, isReadonly); + } + + var btnStart = E('button', { + 'class': 'btn cbi-button cbi-button-action weechat-btn-control', + 'disabled': (isRunning || isReadonly) ? 'disabled' : null + }, _('Start')); + + var btnRestart = E('button', { + 'class': 'btn cbi-button cbi-button-reload weechat-btn-control', + 'disabled': (!isRunning || isReadonly) ? 'disabled' : null + }, _('Restart')); + + var btnStop = E('button', { + 'class': 'btn cbi-button cbi-button-negative weechat-btn-control', + 'disabled': (!isRunning || isReadonly) ? 'disabled' : null + }, _('Stop')); + + if (!isReadonly) { + btnStart.addEventListener('click', + ui.createHandlerFn(this, 'handleServiceAction', + statusBadge, pidLabel, btnStart, btnRestart, btnStop, isReadonly, 'start')); + btnRestart.addEventListener('click', + ui.createHandlerFn(this, 'handleServiceAction', + statusBadge, pidLabel, btnStart, btnRestart, btnStop, isReadonly, 'restart')); + btnStop.addEventListener('click', + ui.createHandlerFn(this, 'handleServiceAction', + statusBadge, pidLabel, btnStart, btnRestart, btnStop, isReadonly, 'stop')); + } + + var relayEnabled = (uci.get('weechat', 'weechat', 'relay_enabled') === '1'), + relayPort = uci.get('weechat', 'weechat', 'relay_port') || '9000', + relayTls = (uci.get('weechat', 'weechat', 'relay_tls') === '1'); + + var servers = uci.sections('weechat', 'server'), + enabledCount = 0; + + servers.forEach(function(srv) { + if (srv.enabled !== '0' && srv.enabled !== false && srv.enabled !== 'off') + enabledCount++; + }); + + var relayStatusNode; + if (relayEnabled) { + var clientBtn = E('a', { + 'class': 'btn cbi-button cbi-button-neutral', + 'href': 'https://www.glowing-bear.org/', + 'target': '_blank', + 'rel': 'noreferrer noopener', + 'style': 'display: inline-block; margin-top: 6px;' + }, [ _('Open Web Client (Hosted)'), ' ↗' ]); + + relayStatusNode = E('div', {}, [ + E('div', {}, [ + E('span', { 'class': 'label success' }, _('Enabled')) + ]), + E('div', { 'class': 'cbi-value-description', 'style': 'margin-top: 4px;' }, + _('Port %s · TLS %s').format(relayPort, relayTls ? _('enabled') : _('disabled'))), + E('div', { 'style': 'margin-top: 6px;' }, clientBtn) + ]); + } else { + relayStatusNode = E('div', {}, [ + E('span', { 'class': 'label' }, _('Disabled')) + ]); + } + + var ircStatusNode = E('div', {}, [ + E('span', {}, + _('%d configured · %d enabled').format(servers.length, enabledCount)) + ]); + + var serverRows = []; + if (servers.length === 0) { + serverRows.push(E('tr', { 'class': 'tr cbi-section-table-row' }, [ + E('td', { 'colspan': 8, 'class': 'td cbi-section-table-cell center' }, + _('No IRC servers configured. Go to Servers tab to add one.')) + ])); + } else { + servers.forEach(function(s) { + var isSrvEnabled = (s.enabled !== '0' && s.enabled !== false && s.enabled !== 'off'); + var isSrvSsl = (s.ssl !== '0' && s.ssl !== false && s.ssl !== 'off'); + var parsed = weechatTools.parseAutoJoin(s.autojoin); + var chans = parsed.channels; + + var chanNodes = []; + if (chans.length > 0) { + chans.forEach(function(chan) { + chanNodes.push(E('code', { + 'style': 'margin: 2px 4px 2px 0; display: inline-block; padding: 2px 6px; border-radius: 3px;' + }, chan)); + }); + } else { + chanNodes.push(E('em', { 'class': 'cbi-value-description' }, _('no channels'))); + } + + serverRows.push(E('tr', { 'class': 'tr cbi-section-table-row' }, [ + E('td', { 'class': 'td cbi-section-table-cell' }, + isSrvEnabled + ? E('span', { 'class': 'label success' }, _('Enabled')) + : E('span', { 'class': 'label' }, _('Disabled'))), + E('td', { 'class': 'td cbi-section-table-cell' }, E('strong', {}, s['.name'])), + E('td', { 'class': 'td cbi-section-table-cell' }, s.address || '-'), + E('td', { 'class': 'td cbi-section-table-cell' }, s.port || '6697'), + E('td', { 'class': 'td cbi-section-table-cell' }, isSrvSsl ? _('Yes') : _('No')), + E('td', { 'class': 'td cbi-section-table-cell' }, s.nicks || s.username || '-'), + E('td', { 'class': 'td cbi-section-table-cell' }, chanNodes), + E('td', { 'class': 'td cbi-section-table-cell cbi-section-actions', 'style': 'text-align: right; white-space: nowrap;' }, [ + E('a', { + 'class': 'btn cbi-button cbi-button-edit', + 'href': L.url('admin/services/weechat/servers') + '?server=' + encodeURIComponent(s['.name']) + '#edit=' + encodeURIComponent(s['.name']), + 'title': _('Edit server'), + 'aria-label': _('Edit server') + }, '✎') + ]) + ])); + }); + } + + poll.add(L.bind(function() { + return this.updateServiceStatus(statusBadge, pidLabel, btnStart, btnRestart, btnStop, isReadonly); + }, this), 5); + + return E('div', { 'class': 'cbi-map' }, [ + E('link', { 'rel': 'stylesheet', 'href': L.resource('view/weechat/weechat.css') }), + + E('h2', {}, _('WeeChat - Status')), + E('div', { 'class': 'cbi-map-descr' }, + _('WeeChat runs as a headless daemon on your router. It keeps you connected to IRC networks and exposes a secure Relay API for web or mobile clients.')), + + /* Two cards grid */ + E('div', { 'class': 'weechat-status-grid' }, [ + /* Card 1: Service Status */ + E('div', { 'class': 'weechat-panel' }, [ + E('h3', {}, _('Service Status')), + E('table', {}, [ + E('tr', { 'class': 'tr' }, [ + E('td', { 'class': 'td left', 'style': 'width: 35%;' }, _('WeeChat Daemon')), + E('td', { 'class': 'td left' }, [ statusBadge, pidLabel ]) + ]), + E('tr', { 'class': 'tr' }, [ + E('td', { 'class': 'td left' }, _('Version')), + E('td', { 'class': 'td left' }, E('span', {}, version)) + ]), + E('tr', { 'class': 'tr' }, [ + E('td', { 'class': 'td left' }, _('Service enabled')), + E('td', { 'class': 'td left', 'id': 'weechat-service-enabled' }, renderEnabledState(isEnabled)) + ]), + E('tr', { 'class': 'tr' }, [ + E('td', { 'class': 'td left' }, _('Autostart at boot')), + E('td', { 'class': 'td left' }, [ autostartBadge, autostartBtn ]) + ]), + E('tr', { 'class': 'tr' }, [ + E('td', { 'class': 'td left' }, _('Service control')), + E('td', { 'class': 'td left' }, [ btnStart, btnRestart, btnStop ]) + ]) + ]) + ]), + + /* Card 2: Overview */ + E('div', { 'class': 'weechat-panel' }, [ + E('h3', {}, _('Overview')), + E('table', {}, [ + E('tr', { 'class': 'tr' }, [ + E('td', { 'class': 'td left', 'style': 'width: 30%;' }, _('Relay server')), + E('td', { 'class': 'td left' }, relayStatusNode) + ]), + E('tr', { 'class': 'tr' }, [ + E('td', { 'class': 'td left' }, _('IRC servers')), + E('td', { 'class': 'td left' }, ircStatusNode) + ]) + ]) + ]) + ]), + + /* Configured IRC Servers Table */ + E('div', { 'class': 'weechat-servers-panel' }, [ + E('h3', {}, _('Configured IRC Servers')), + E('table', { 'class': 'table cbi-section-table' }, [ + E('tr', { 'class': 'tr cbi-section-table-titles' }, [ + E('th', { 'class': 'th cbi-section-table-cell', 'style': 'width: 10%; white-space: nowrap;' }, _('Status')), + E('th', { 'class': 'th cbi-section-table-cell', 'style': 'width: 12%; white-space: nowrap;' }, _('Server')), + E('th', { 'class': 'th cbi-section-table-cell', 'style': 'width: 20%; white-space: nowrap;' }, _('Hostname')), + E('th', { 'class': 'th cbi-section-table-cell', 'style': 'width: 7%; white-space: nowrap;' }, _('Port')), + E('th', { 'class': 'th cbi-section-table-cell', 'style': 'width: 7%; white-space: nowrap;' }, _('TLS')), + E('th', { 'class': 'th cbi-section-table-cell', 'style': 'width: 13%; white-space: nowrap;' }, _('Nicknames')), + E('th', { 'class': 'th cbi-section-table-cell', 'style': 'width: 26%;' }, _('Channels')), + E('th', { 'class': 'th cbi-section-table-cell cbi-section-actions', 'style': 'width: 5%; text-align: right;' }, '') + ]) + ].concat(serverRows)) + ]) + ]); + }, + + handleSaveApply: null, + handleSave: null, + handleReset: null +}); diff --git a/luci-app-weechat/htdocs/luci-static/resources/view/weechat/weechat.css b/luci-app-weechat/htdocs/luci-static/resources/view/weechat/weechat.css new file mode 100644 index 000000000..81363b545 --- /dev/null +++ b/luci-app-weechat/htdocs/luci-static/resources/view/weechat/weechat.css @@ -0,0 +1,65 @@ +.weechat-status-grid { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 1.25rem; + margin-bottom: 1.25rem; +} + +@media (max-width: 840px) { + .weechat-status-grid { + grid-template-columns: 1fr; + } +} + +.weechat-panel { + border: 1px solid rgba(128, 128, 128, 0.22); + border-radius: 6px; + padding: 16px 20px; + background: rgba(128, 128, 128, 0.02); + display: flex; + flex-direction: column; +} + +.weechat-panel h3 { + margin-top: 0; + margin-bottom: 14px; + padding-bottom: 10px; + border-bottom: 1px solid rgba(128, 128, 128, 0.15); + font-size: 1.15rem; + font-weight: 600; +} + +.weechat-panel table { + width: 100%; + margin-bottom: 0; + border-collapse: collapse; + flex: 1; +} + +.weechat-panel td { + padding: 10px 4px; + vertical-align: middle; + border: none; +} + +.weechat-servers-panel { + border: 1px solid rgba(128, 128, 128, 0.22); + border-radius: 6px; + padding: 16px 20px; + background: rgba(128, 128, 128, 0.02); + margin-top: 0.5rem; +} + +.weechat-servers-panel h3 { + margin-top: 0; + margin-bottom: 14px; + padding-bottom: 10px; + border-bottom: 1px solid rgba(128, 128, 128, 0.15); + font-size: 1.15rem; + font-weight: 600; +} + +.weechat-btn-control { + min-width: 72px; + margin-right: 6px; +} diff --git a/luci-app-weechat/po/templates/weechat.pot b/luci-app-weechat/po/templates/weechat.pot new file mode 100644 index 000000000..dfd0f7d0c --- /dev/null +++ b/luci-app-weechat/po/templates/weechat.pot @@ -0,0 +1,665 @@ +msgid "" +msgstr "Content-Type: text/plain; charset=UTF-8" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/status.js:266 +msgid "%d configured · %d enabled" +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/servers.js:351 +msgid "A NickServ password cannot contain $nick, $channel or $server" +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/servers.js:348 +msgid "A password is required for this authentication method" +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/relay.js:239 +msgid "A self-signed certificate will be generated for WeeChat Relay at %s." +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/servers.js:321 +msgid "Account username if different from nickname." +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/servers.js:229 +msgid "Add Server" +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/servers.js:200 +msgid "Add channel" +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/relay.js:99 +msgid "All interfaces" +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/servers.js:239 +msgid "Authentication" +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/servers.js:310 +msgid "Authentication Method" +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/servers.js:260 +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/servers.js:271 +msgid "Auto" +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/servers.js:281 +msgid "Auto-connect" +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/servers.js:276 +msgid "Auto-join Channels" +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/status.js:346 +msgid "Autostart at boot" +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/relay.js:282 +msgid "Cancel" +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/relay.js:349 +msgid "" +"Cannot generate certificate: neither %s nor %s is installed on this router." +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/relay.js:124 +msgid "Certificate" +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/relay.js:173 +msgid "Certificate and key present" +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/relay.js:192 +msgid "" +"Certificate file exists but is incomplete (must contain both certificate and " +"private key)." +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/relay.js:330 +msgid "Certificate generation failed." +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/relay.js:220 +msgid "Certificate generation requires the %s or %s utility." +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/relay.js:246 +msgid "Certificate identity" +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/relay.js:146 +msgid "Certificate status" +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/servers.js:88 +msgid "Channel" +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/servers.js:23 +msgid "Channel key cannot be specified without a channel name" +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/servers.js:27 +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/servers.js:154 +msgid "Channel key cannot contain commas or spaces" +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/servers.js:25 +msgid "Channel name \"%s\" cannot contain commas or spaces" +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/servers.js:240 +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/status.js:383 +msgid "Channels" +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/servers.js:29 +msgid "Channels and keys must not contain \"${\"" +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/servers.js:277 +msgid "Channels to join automatically after connecting to this server." +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/relay.js:163 +msgid "Checking certificate status…" +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/relay.js:272 +msgid "" +"Comma-separated list of host names and IP addresses used to reach the relay." +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/servers.js:294 +msgid "Comma-separated list of nicknames to try." +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/relay.js:61 +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/status.js:114 +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/status.js:136 +msgid "Command failed with return code %d" +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/relay.js:249 +msgid "Common name" +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/servers.js:224 +msgid "" +"Configure IRC server connections, authentication, and auto-join channels." +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/relay.js:87 +msgid "Configure the WeeChat relay and chat logging." +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/status.js:374 +msgid "Configured IRC Servers" +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/servers.js:282 +msgid "Connect automatically when WeeChat starts." +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/servers.js:237 +msgid "Connection" +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/status.js:80 +msgid "Could not enable the service in /etc/config/weechat" +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/relay.js:385 +msgid "" +"Directory where WeeChat stores chat logs. The default /var/log/weechat is " +"created automatically, any other directory must exist and be writable by the " +"weechat user." +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/status.js:140 +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/status.js:195 +msgid "Disable Autostart" +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/servers.js:262 +msgid "Disable IPv6" +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/servers.js:268 +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/status.js:13 +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/status.js:139 +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/status.js:190 +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/status.js:260 +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/status.js:297 +msgid "Disabled" +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/status.js:308 +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/status.js:309 +msgid "Edit server" +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/status.js:140 +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/status.js:195 +msgid "Enable Autostart" +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/relay.js:380 +msgid "Enable Logging" +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/relay.js:92 +msgid "Enable Relay Server" +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/relay.js:120 +msgid "Enable TLS" +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/servers.js:287 +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/status.js:12 +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/status.js:139 +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/status.js:190 +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/status.js:252 +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/status.js:296 +msgid "Enabled" +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/relay.js:121 +msgid "Encrypt relay connections with TLS." +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/servers.js:331 +msgid "Enter a SASL username or a nickname" +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/servers.js:135 +msgid "Enter a single channel per row without commas or spaces" +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/status.js:122 +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/status.js:145 +msgid "Failed to execute \"/etc/init.d/weechat %s\": %s" +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/relay.js:177 +msgid "File:" +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/relay.js:243 +msgid "" +"For Internet-facing deployments, use a certificate issued by a trusted CA." +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/servers.js:261 +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/servers.js:267 +msgid "Force IPv6" +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/relay.js:326 +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/relay.js:335 +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/relay.js:342 +msgid "Generate" +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/relay.js:352 +msgid "Generate certificate?" +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/relay.js:189 +msgid "Generate new certificate" +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/relay.js:202 +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/relay.js:215 +msgid "Generate self-signed certificate" +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/relay.js:302 +msgid "Generating self-signed certificate…" +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/relay.js:298 +msgid "Generating…" +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/relay.js:399 +msgid "" +"Glowing Bear is a web client that connects to WeeChat using the relay " +"configured above." +msgstr "" + +#: applications/luci-app-weechat/root/usr/share/rpcd/acl.d/luci-app-weechat.json:3 +msgid "Grant access for luci-app-weechat" +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/relay.js:258 +msgid "Host name identifying this router." +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/status.js:379 +msgid "Hostname" +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/servers.js:244 +msgid "Hostname or IP address of the IRC server." +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/relay.js:97 +msgid "" +"IP address to bind (leave empty for all interfaces). The address must exist " +"when WeeChat starts." +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/servers.js:258 +msgid "IPv6 Support" +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/servers.js:259 +msgid "IPv6 connection mode for this IRC server." +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/servers.js:226 +msgid "IRC Servers" +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/status.js:365 +msgid "IRC servers" +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/servers.js:238 +msgid "Identity" +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/servers.js:89 +msgid "Key" +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/relay.js:104 +msgid "Leading zeros are not allowed in an IPv4 address" +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/relay.js:96 +msgid "Listen Address" +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/relay.js:384 +msgid "Log Directory" +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/relay.js:378 +msgid "Logging" +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/relay.js:40 +msgid "Must be an absolute path without . or .. components" +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/relay.js:44 +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/servers.js:11 +msgid "Must not contain \"${\"" +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/relay.js:46 +msgid "Must not contain \"%\"" +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/relay.js:42 +msgid "Must not start or end with a space" +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/servers.js:313 +msgid "NickServ (/msg nickserv identify)" +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/servers.js:293 +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/status.js:382 +msgid "Nicknames" +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/status.js:301 +msgid "No" +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/status.js:273 +msgid "No IRC servers configured. Go to Servers tab to add one." +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/servers.js:312 +msgid "None" +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/relay.js:406 +msgid "Open Glowing Bear (Hosted)" +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/status.js:248 +msgid "Open Web Client (Hosted)" +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/servers.js:146 +msgid "Optional key" +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/status.js:358 +msgid "Overview" +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/relay.js:125 +msgid "" +"PEM file containing the certificate and private key. It must be readable by " +"the weechat user." +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/servers.js:335 +msgid "Password" +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/relay.js:366 +msgid "Password required by clients to connect." +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/relay.js:292 +msgid "Please enter a valid Common Name." +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/relay.js:110 +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/servers.js:249 +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/status.js:380 +msgid "Port" +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/status.js:255 +msgid "Port %s · TLS %s" +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/relay.js:111 +msgid "Port for relay connections (WebSocket)." +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/servers.js:304 +msgid "Real Name" +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/relay.js:381 +msgid "Record chat logs to disk. Disabled by default to protect flash memory." +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/relay.js:90 +#: applications/luci-app-weechat/root/usr/share/luci/menu.d/luci-app-weechat.json:30 +msgid "Relay" +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/relay.js:365 +msgid "Relay Password" +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/relay.js:372 +msgid "Relay password is required when relay server is enabled." +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/status.js:361 +msgid "Relay server" +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/servers.js:165 +msgid "Remove" +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/status.js:209 +msgid "Restart" +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/status.js:156 +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/status.js:180 +msgid "Running" +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/servers.js:314 +msgid "SASL PLAIN" +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/servers.js:315 +msgid "SASL SCRAM-SHA-256" +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/servers.js:316 +msgid "SASL SCRAM-SHA-512" +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/servers.js:320 +msgid "SASL Username" +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/relay.js:118 +msgid "Security" +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/servers.js:311 +msgid "Select the authentication method required by the IRC network." +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/relay.js:320 +msgid "" +"Self-signed certificate generated for %s, but WeeChat could not be " +"restarted: %s" +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/relay.js:316 +msgid "" +"Self-signed certificate generated for %s. Save and apply TLS with this " +"certificate to use it." +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/relay.js:314 +msgid "" +"Self-signed certificate generated for %s. WeeChat uses it from its next " +"start." +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/relay.js:312 +msgid "" +"Self-signed certificate generated for %s. WeeChat was restarted to use it." +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/relay.js:241 +msgid "" +"Self-signed certificates provide encryption but are not trusted " +"automatically by browsers." +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/status.js:378 +msgid "Server" +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/servers.js:243 +msgid "Server Hostname" +msgstr "" + +#: applications/luci-app-weechat/root/usr/share/luci/menu.d/luci-app-weechat.json:22 +msgid "Servers" +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/status.js:331 +msgid "Service Status" +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/status.js:350 +msgid "Service control" +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/status.js:342 +msgid "Service enabled" +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/status.js:15 +msgid "Service is allowed to start." +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/status.js:15 +msgid "Service is disabled in configuration." +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/status.js:204 +msgid "Start" +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/status.js:377 +#: applications/luci-app-weechat/root/usr/share/luci/menu.d/luci-app-weechat.json:14 +msgid "Status" +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/status.js:214 +msgid "Stop" +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/status.js:156 +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/status.js:180 +msgid "Stopped" +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/relay.js:263 +msgid "Subject alternative names" +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/status.js:381 +msgid "TLS" +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/relay.js:205 +msgid "TLS is enabled but no certificate file was found." +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/relay.js:159 +msgid "" +"This certificate is managed outside of LuCI, so it is not checked here. The " +"service refuses to start if the file does not exist." +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/relay.js:229 +msgid "Unable to verify certificate status: %s" +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/servers.js:254 +msgid "Use TLS" +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/servers.js:299 +msgid "Username" +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/status.js:338 +msgid "Version" +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/relay.js:393 +msgid "Web Client" +msgstr "" + +#: applications/luci-app-weechat/root/usr/share/luci/menu.d/luci-app-weechat.json:3 +msgid "WeeChat" +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/servers.js:223 +msgid "WeeChat - IRC Servers" +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/relay.js:86 +msgid "WeeChat - Relay" +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/status.js:323 +msgid "WeeChat - Status" +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/status.js:334 +msgid "WeeChat Daemon" +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/status.js:325 +msgid "" +"WeeChat runs as a headless daemon on your router. It keeps you connected to " +"IRC networks and exposes a secure Relay API for web or mobile clients." +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/status.js:301 +msgid "Yes" +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/status.js:255 +msgid "disabled" +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/status.js:255 +msgid "enabled" +msgstr "" + +#: applications/luci-app-weechat/htdocs/luci-static/resources/view/weechat/status.js:290 +msgid "no channels" +msgstr "" diff --git a/luci-app-weechat/root/usr/share/luci/menu.d/luci-app-weechat.json b/luci-app-weechat/root/usr/share/luci/menu.d/luci-app-weechat.json new file mode 100644 index 000000000..fb887e6e0 --- /dev/null +++ b/luci-app-weechat/root/usr/share/luci/menu.d/luci-app-weechat.json @@ -0,0 +1,37 @@ +{ + "admin/services/weechat": { + "title": "WeeChat", + "order": 60, + "action": { + "type": "firstchild" + }, + "depends": { + "acl": [ "luci-app-weechat" ], + "uci": { "weechat": true } + } + }, + "admin/services/weechat/status": { + "title": "Status", + "order": 10, + "action": { + "type": "view", + "path": "weechat/status" + } + }, + "admin/services/weechat/servers": { + "title": "Servers", + "order": 20, + "action": { + "type": "view", + "path": "weechat/servers" + } + }, + "admin/services/weechat/relay": { + "title": "Relay", + "order": 30, + "action": { + "type": "view", + "path": "weechat/relay" + } + } +} diff --git a/luci-app-weechat/root/usr/share/rpcd/acl.d/luci-app-weechat.json b/luci-app-weechat/root/usr/share/rpcd/acl.d/luci-app-weechat.json new file mode 100644 index 000000000..1df8c0385 --- /dev/null +++ b/luci-app-weechat/root/usr/share/rpcd/acl.d/luci-app-weechat.json @@ -0,0 +1,36 @@ +{ + "luci-app-weechat": { + "description": "Grant access for luci-app-weechat", + "read": { + "uci": [ + "weechat" + ], + "ubus": { + "service": [ + "list" + ], + "rc": [ + "list" + ], + "weechat": [ + "get_certificate_status", + "get_daemon_info" + ] + } + }, + "write": { + "uci": [ + "weechat" + ], + "ubus": { + "rc": [ + "init" + ], + "weechat": [ + "enable_service", + "generate_certificate" + ] + } + } + } +} diff --git a/luci-app-weechat/root/usr/share/rpcd/ucode/weechat.uc b/luci-app-weechat/root/usr/share/rpcd/ucode/weechat.uc new file mode 100755 index 000000000..9f17ae371 --- /dev/null +++ b/luci-app-weechat/root/usr/share/rpcd/ucode/weechat.uc @@ -0,0 +1,389 @@ +#!/usr/bin/env ucode +'use strict'; + +import { access, lstat, readfile, unlink, rename, chmod, chown, mkdir, mkdtemp, open, popen } from 'fs'; +import { cursor } from 'uci'; + +/* + * The weechat init script keeps /etc/weechat and /etc/weechat/tls owned by + * root and not writable by the daemon. Certificates are only written there, + * so the daemon cannot redirect any of the paths used below. + */ +const BASE_DIR = '/etc/weechat'; +const TLS_DIR = BASE_DIR + '/tls'; +const DEFAULT_CERT = TLS_DIR + '/relay.pem'; + +function find_px5g() { + if (access('/usr/sbin/px5g', 'x')) { + return '/usr/sbin/px5g'; + } + if (access('/usr/bin/px5g', 'x')) { + return '/usr/bin/px5g'; + } + return null; +} + +function find_openssl() { + if (access('/usr/bin/openssl', 'x')) { + return '/usr/bin/openssl'; + } + return null; +} + +function px5g_supports_addext(px5g_bin) { + if (!px5g_bin) + return false; + let p = popen(px5g_bin + ' 2>&1', 'r'); + let out = p ? p.read('all') : ''; + if (p) + p.close(); + // px5g-wolfssl outputs: "PX5G X.509 Certificate Generator Utilit using WolfSSL" + // and does not support -addext + if (index(out, 'WolfSSL') >= 0) + return false; + return true; +} + +/* Without the s flag, ^ and $ also match at line breaks, so reject them first */ +function single_line(val) { + return type(val) == 'string' && index(val, '\n') < 0 && index(val, '\r') < 0; +} + +function valid_cert_path(path) { + return single_line(path) && + match(path, /^\/etc\/weechat\/tls\/[a-zA-Z0-9._-]+\.pem$/) && + index(path, '..') < 0; +} + +function root_owned_dir(path) { + let st = lstat(path); + return !!(st && st.type == 'directory' && st.uid == 0 && !(st.mode & 0022)); +} + +function normalize_san(entry) { + if (!single_line(entry)) + return null; + + let item = trim(entry); + if (!length(item)) + return null; + + let kind = null; + if (match(item, /^IP:/i)) { + kind = 'IP'; + item = trim(substr(item, 3)); + } else if (match(item, /^DNS:/i)) { + kind = 'DNS'; + item = trim(substr(item, 4)); + } + + let ip = (kind != 'DNS') ? iptoarr(item) : null; + if (ip) + return { type: 'IP', value: arrtoip(ip), bytes: ip }; + if (kind == 'IP') + return null; + + if (match(item, /^[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(\.[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/)) + return { type: 'DNS', value: item }; + + return null; +} + +/* DER encoding of a SAN entry, GeneralName [7] for IP and [2] for DNS */ +function san_der(san) { + let bytes = (san.type == 'IP') ? san.bytes : map(split(san.value, ''), (c) => ord(c)); + let tag = (san.type == 'IP') ? 0x87 : 0x82; + let hdr = (length(bytes) < 128) ? [ tag, length(bytes) ] : [ tag, 0x81, length(bytes) ]; + return chr(...hdr, ...bytes); +} + +/* + * px5g-mbedtls up to PKG_RELEASE 11 writes every IP entry with a length of + * 16 bytes, so an IPv4 entry turns into a wrong IPv6 address, and other px5g + * builds might ignore -addext. Look for each SAN entry in the certificate. + */ +function cert_has_sans(cert_pem, sans) { + let der = b64dec(replace(cert_pem, /-----[A-Z ]+-----|[ \t\r\n]/g, '')); + if (der == null) + return false; + + for (let san in sans) + if (index(der, san_der(san)) < 0) + return false; + return true; +} + +function cleanup_temp_dir(tmp_dir) { + if (tmp_dir && match(tmp_dir, /^\/tmp\/weechat-cert\.[A-Za-z0-9]+$/)) { + system(['rm', '-rf', tmp_dir]); + } +} + +function failure(msg) { + return { success: false, error: msg }; +} + +/* Whether the saved config makes the relay use this certificate */ +function cert_in_use(path) { + let ctx = cursor(); + return ctx.get('weechat', 'weechat', 'relay_enabled') == '1' && + ctx.get('weechat', 'weechat', 'relay_tls') == '1' && + (ctx.get('weechat', 'weechat', 'relay_cert_key') || DEFAULT_CERT) == path; +} + +const methods = { + /* + * The init script only starts WeeChat with option enabled '1'. Commit + * just that option, LuCI itself can only apply all staged changes. + */ + enable_service: { + call: function(req) { + let ctx = cursor(); + if (!ctx.get('weechat', 'weechat')) + ctx.set('weechat', 'weechat', 'weechat'); + ctx.set('weechat', 'weechat', 'enabled', '1'); + return { success: !!ctx.commit('weechat') }; + } + }, + get_daemon_info: { + call: function(req) { + let version = null; + let p = popen('/usr/bin/weechat-headless -v 2>/dev/null', 'r'); + if (p) { + version = trim(p.read('all')); + p.close(); + } + if (!length(version)) { + p = popen('/usr/bin/weechat -v 2>/dev/null', 'r'); + if (p) { + version = trim(p.read('all')); + p.close(); + } + } + return { + version: length(version) ? version : null + }; + } + }, + get_certificate_status: { + args: { path: 'path' }, + call: function(req) { + let path = req?.args?.path || DEFAULT_CERT; + if (!valid_cert_path(path)) { + return { + exists: false, + error: 'Invalid path. Must be located under /etc/weechat/tls/.' + }; + } + + let tool_available = !!(find_px5g() || find_openssl()); + + let st = lstat(path); + if (!st || st.type != 'file' || st.size == 0) { + return { + exists: false, + path: path, + generator_available: tool_available + }; + } + + let content = readfile(path); + if (!content) { + return { + exists: true, + path: path, + readable: false, + generator_available: tool_available + }; + } + + return { + exists: true, + path: path, + readable: true, + has_key: !!match(content, /-----BEGIN ([A-Z0-9]+ )?PRIVATE KEY-----/), + has_cert: !!match(content, /-----BEGIN CERTIFICATE-----/), + generator_available: tool_available + }; + } + }, + + generate_certificate: { + args: { cn: 'cn', san: 'san', path: 'path' }, + call: function(req) { + let args = req?.args || {}; + let path = args.path || DEFAULT_CERT; + + if (!valid_cert_path(path)) + return failure('Invalid target path. Must be located under /etc/weechat/tls/.'); + + let cn = (type(args.cn) == 'string') ? trim(args.cn) : ''; + if (!length(cn)) { + cn = 'OpenWrt'; + } + /* ':' allows an IPv6 address, which the dialog pre-fills over IPv6 */ + if (!single_line(cn) || !match(cn, /^[a-zA-Z0-9.:_-]+$/)) + return failure('Invalid Common Name format.'); + + let san_raw = args.san; + let san_list = []; + if (type(san_raw) == 'array') { + san_list = san_raw; + } else if (type(san_raw) == 'string') { + san_list = split(san_raw, ','); + } + + let sans = []; + for (let entry in san_list) { + if (type(entry) != 'string' || !length(trim(entry))) + continue; + let san = normalize_san(entry); + if (!san) + return failure('Invalid Subject Alternative Name (SAN): ' + trim(entry)); + push(sans, san); + } + + let px5g_bin = find_px5g(); + let openssl_bin = find_openssl(); + + if (!px5g_bin && !openssl_bin) + return failure('Neither px5g nor openssl certificate generator is installed.'); + + /* + * A certificate needs at least one SAN, default to the CN. px5g-wolfssl + * cannot add any, it puts the CN in as a DNS name itself. + */ + let with_san = !!(openssl_bin || px5g_supports_addext(px5g_bin)); + if (!length(sans) && with_san) { + let san = normalize_san(cn); + if (!san) + return failure('Please enter a Subject Alternative Name.'); + push(sans, san); + } + + if (!root_owned_dir(BASE_DIR)) + return failure(BASE_DIR + ' must be a directory owned by root. Restart the WeeChat service to fix its permissions.'); + + if (!lstat(TLS_DIR)) { + if (!mkdir(TLS_DIR, 0755) || !chown(TLS_DIR, 0, 0) || !chmod(TLS_DIR, 0755)) + return failure('Failed to create directory: ' + TLS_DIR); + } + if (!root_owned_dir(TLS_DIR)) + return failure(TLS_DIR + ' must be a directory owned by root.'); + + let st_path = lstat(path); + if (st_path && st_path.type != 'file') + return failure('Target exists and is not a regular file: ' + path); + + let tmp_dir = mkdtemp('/tmp/weechat-cert.XXXXXX'); + if (!tmp_dir) + return failure('Failed to create secure temporary directory.'); + + let key_file = tmp_dir + '/key.pem'; + let cert_file = tmp_dir + '/cert.pem'; + let subj = sprintf('/C=ZZ/ST=Somewhere/L=Unknown/O=OpenWrt/CN=%s', cn); + /* + * rpcd waits for this call, so use an EC key: generating an RSA + * key can block it for a long time on slow routers. + */ + let key_opts = [ '-newkey', 'ec', '-pkeyopt', 'ec_paramgen_curve:P-256' ]; + let used_px5g = false; + let cmd; + + if (openssl_bin) { + let san_str = join(',', map(sans, (san) => san.type + ':' + san.value)); + + cmd = [ + openssl_bin, 'req', '-x509', '-nodes', + '-days', '397', + ...key_opts, + '-keyout', key_file, + '-out', cert_file, + '-subj', subj, + '-addext', 'extendedKeyUsage=serverAuth', + '-addext', 'subjectAltName=' + san_str + ]; + } else if (px5g_supports_addext(px5g_bin)) { + cmd = [ + px5g_bin, 'selfsigned', + '-days', '397', + ...key_opts, + '-keyout', key_file, + '-out', cert_file, + '-subj', subj, + '-addext', 'extendedKeyUsage=serverAuth' + ]; + // Keep the subjectAltName options last, older px5g-mbedtls + // hangs when any other option follows one of them. + for (let san in sans) + push(cmd, '-addext', 'subjectAltName=' + san.type + ':' + san.value); + used_px5g = true; + } else { + if (length(sans) > 0) { + cleanup_temp_dir(tmp_dir); + return failure('The installed px5g (WolfSSL) does not support Subject Alternative Names (-addext). Please install openssl-util or px5g-mbedtls.'); + } + /* It would put the address in as a DNS name, which no client accepts */ + if (iptoarr(cn)) { + cleanup_temp_dir(tmp_dir); + return failure('The installed px5g (WolfSSL) cannot put an IP address into a certificate. Please install openssl-util or px5g-mbedtls, or use a host name as Common Name.'); + } + cmd = [ + px5g_bin, 'selfsigned', + '-days', '397', + ...key_opts, + '-keyout', key_file, + '-out', cert_file, + '-subj', subj + ]; + } + + let ret = system(cmd); + let key_content = (ret == 0) ? readfile(key_file) : null; + let cert_content = (ret == 0) ? readfile(cert_file) : null; + cleanup_temp_dir(tmp_dir); + + if (!key_content || !cert_content) + return failure('Certificate generation failed.'); + + if (used_px5g && !cert_has_sans(cert_content, sans)) { + if (length(filter(sans, (san) => san.type == 'IP'))) + return failure('The installed px5g writes invalid IP addresses into certificates. Please install openssl-util, update px5g-mbedtls or use host names only.'); + return failure('The installed px5g did not write the Subject Alternative Names. Please install openssl-util or px5g-mbedtls.'); + } + + let combined = key_content; + if (substr(combined, -1) != '\n') { + combined += '\n'; + } + combined += cert_content; + + // Readable by the daemon, but only root can replace it + let tmp_file = path + '.tmp'; + unlink(tmp_file); + + let f = open(tmp_file, 'wx', 0640); + if (!f) + return failure('Failed to write certificate bundle.'); + let written = f.write(combined); + f.close(); + + if (written != length(combined) || + !chown(tmp_file, 'root', 'weechat') || + !chmod(tmp_file, 0640) || + !rename(tmp_file, path)) { + unlink(tmp_file); + return failure('Failed to install certificate to: ' + path); + } + + return { + success: true, + path: path, + in_use: cert_in_use(path), + message: 'Certificate generated successfully.' + }; + } + } +}; + +return { 'weechat': methods }; diff --git a/luci-mod-dashboard/po/bg/dashboard.po b/luci-mod-dashboard/po/bg/dashboard.po index d430933dd..f9415d2c4 100644 --- a/luci-mod-dashboard/po/bg/dashboard.po +++ b/luci-mod-dashboard/po/bg/dashboard.po @@ -1,8 +1,8 @@ msgid "" msgstr "" "Project-Id-Version: \n" -"PO-Revision-Date: 2026-03-15 08:27+0000\n" -"Last-Translator: Daniel Konstantinov \n" +"PO-Revision-Date: 2026-10-13 15:11+0000\n" +"Last-Translator: Pavel Borecki \n" "Language-Team: Bulgarian \n" "Language: bg\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 5.17-dev\n" +"X-Generator: Weblate 2026.11.dev0\n" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:97 msgid "%d clients" @@ -62,7 +62,7 @@ msgstr "BSSID" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:218 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:372 msgid "Band" -msgstr "" +msgstr "Честота" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:334 msgid "Bitrate" diff --git a/luci-mod-dashboard/po/ca/dashboard.po b/luci-mod-dashboard/po/ca/dashboard.po index f61ddf200..ac1452d25 100644 --- a/luci-mod-dashboard/po/ca/dashboard.po +++ b/luci-mod-dashboard/po/ca/dashboard.po @@ -1,9 +1,8 @@ msgid "" msgstr "" "Project-Id-Version: \n" -"PO-Revision-Date: 2026-03-08 17:33+0000\n" -"Last-Translator: Christopher Picón " -"\n" +"PO-Revision-Date: 2026-10-13 15:11+0000\n" +"Last-Translator: Pavel Borecki \n" "Language-Team: Catalan \n" "Language: ca\n" @@ -11,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 5.17-dev\n" +"X-Generator: Weblate 2026.11.dev0\n" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:97 msgid "%d clients" @@ -63,7 +62,7 @@ msgstr "BSSID" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:218 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:372 msgid "Band" -msgstr "" +msgstr "Banda" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:334 msgid "Bitrate" diff --git a/luci-mod-dashboard/po/da/dashboard.po b/luci-mod-dashboard/po/da/dashboard.po index 725efac26..281e58781 100644 --- a/luci-mod-dashboard/po/da/dashboard.po +++ b/luci-mod-dashboard/po/da/dashboard.po @@ -1,14 +1,14 @@ msgid "" msgstr "" -"PO-Revision-Date: 2023-07-17 15:06+0000\n" -"Last-Translator: drax red \n" +"PO-Revision-Date: 2026-10-05 13:33+0000\n" +"Last-Translator: Hosted Weblate user 168028 \n" "Language-Team: Danish \n" "Language: da\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 5.0-dev\n" +"X-Generator: Weblate 2026.10.1.dev0\n" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:97 msgid "%d clients" @@ -60,7 +60,7 @@ msgstr "BSSID" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:218 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:372 msgid "Band" -msgstr "" +msgstr "Bånd" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:334 msgid "Bitrate" @@ -101,7 +101,7 @@ msgstr "" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:221 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:418 msgid "Connected" -msgstr "Tilsluttet" +msgstr "Forbundet" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:14 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:19 @@ -338,7 +338,7 @@ msgstr "" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:219 msgid "Signal" -msgstr "" +msgstr "Signal" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:35 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:96 @@ -374,7 +374,7 @@ msgstr "" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:54 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:245 msgid "Total" -msgstr "" +msgstr "Total" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:160 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:407 @@ -447,7 +447,7 @@ msgstr "" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:231 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:234 msgid "dBm" -msgstr "" +msgstr "dBm" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/12_resources.js:89 msgid "load %.2f" diff --git a/luci-mod-dashboard/po/de/dashboard.po b/luci-mod-dashboard/po/de/dashboard.po index 57d6e4cf2..667df4929 100644 --- a/luci-mod-dashboard/po/de/dashboard.po +++ b/luci-mod-dashboard/po/de/dashboard.po @@ -1,8 +1,8 @@ msgid "" msgstr "" "Project-Id-Version: \n" -"PO-Revision-Date: 2026-09-07 17:15+0000\n" -"Last-Translator: HerbJul <19JulianHerbst95@web.de>\n" +"PO-Revision-Date: 2026-10-13 13:19+0000\n" +"Last-Translator: Pavel Borecki \n" "Language-Team: German \n" "Language: de\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 2026.9.1.dev0\n" +"X-Generator: Weblate 2026.11.dev0\n" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:97 msgid "%d clients" @@ -62,7 +62,7 @@ msgstr "BSSID" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:218 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:372 msgid "Band" -msgstr "" +msgstr "Frequenztyp" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:334 msgid "Bitrate" diff --git a/luci-mod-dashboard/po/el/dashboard.po b/luci-mod-dashboard/po/el/dashboard.po index 66b9ba724..1644c0aec 100644 --- a/luci-mod-dashboard/po/el/dashboard.po +++ b/luci-mod-dashboard/po/el/dashboard.po @@ -1,8 +1,8 @@ msgid "" msgstr "" "Project-Id-Version: \n" -"PO-Revision-Date: 2025-05-03 17:07+0000\n" -"Last-Translator: george kitsoukakis \n" +"PO-Revision-Date: 2026-10-13 15:11+0000\n" +"Last-Translator: Pavel Borecki \n" "Language-Team: Greek \n" "Language: el\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 5.12-dev\n" +"X-Generator: Weblate 2026.11.dev0\n" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:97 msgid "%d clients" @@ -62,7 +62,7 @@ msgstr "BSSID" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:218 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:372 msgid "Band" -msgstr "" +msgstr "Μπάντα" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:334 msgid "Bitrate" diff --git a/luci-mod-dashboard/po/es/dashboard.po b/luci-mod-dashboard/po/es/dashboard.po index 30cd1cdb5..b6ca0f957 100644 --- a/luci-mod-dashboard/po/es/dashboard.po +++ b/luci-mod-dashboard/po/es/dashboard.po @@ -1,7 +1,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" -"PO-Revision-Date: 2026-09-27 20:14+0000\n" +"PO-Revision-Date: 2026-10-01 12:16+0000\n" "Last-Translator: Franco Castillo \n" "Language-Team: Spanish \n" @@ -113,7 +113,7 @@ msgstr "Dispositivos DHCP" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:194 msgid "DNSv4" -msgstr "DNSv4" +msgstr "DNS" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:240 msgid "DNSv6" @@ -154,7 +154,7 @@ msgstr "GHz" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:188 msgid "GatewayV4" -msgstr "GatewayV4" +msgstr "Puerta de enlace" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:234 msgid "GatewayV6" @@ -182,7 +182,7 @@ msgstr "Conceder acceso al estado de la ruta del sistema" #: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:40 msgid "Grant access to wireless status display" -msgstr "Conceder acceso a la pantalla de estado del Wi-Fi" +msgstr "Conceder acceso a la pantalla de estado de Wi-Fi" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:47 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:215 @@ -300,7 +300,7 @@ msgstr "No se recibieron datos" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:180 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:244 msgid "No wireless clients connected" -msgstr "No hay clientes inalámbricos conectados" +msgstr "No hay clientes Wi-Fi conectados" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:219 msgid "Noise floor" @@ -418,19 +418,19 @@ msgstr "Wi-Fi" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:36 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:159 msgid "Wireless client data usage" -msgstr "Uso de datos del cliente inalámbrico" +msgstr "Uso de datos del cliente Wi-Fi" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:34 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:84 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:87 msgid "Wireless client distribution" -msgstr "Distribución de clientes inalámbricos" +msgstr "Distribución de clientes Wi-Fi" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:33 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:70 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:288 msgid "Wireless clients" -msgstr "Clientes inalámbricos" +msgstr "Clientes Wi-Fi" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/lib/charts.js:25 msgid "bit/s" diff --git a/luci-mod-dashboard/po/fi/dashboard.po b/luci-mod-dashboard/po/fi/dashboard.po index 133ae4b27..4bdce45fc 100644 --- a/luci-mod-dashboard/po/fi/dashboard.po +++ b/luci-mod-dashboard/po/fi/dashboard.po @@ -1,8 +1,8 @@ msgid "" msgstr "" "Project-Id-Version: \n" -"PO-Revision-Date: 2025-07-24 15:20+0000\n" -"Last-Translator: Ricky Tigg \n" +"PO-Revision-Date: 2026-10-13 21:56+0000\n" +"Last-Translator: Pavel Borecki \n" "Language-Team: Finnish \n" "Language: fi\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 5.13-dev\n" +"X-Generator: Weblate 2026.11.dev0\n" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:97 msgid "%d clients" @@ -62,7 +62,7 @@ msgstr "BSSID" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:218 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:372 msgid "Band" -msgstr "" +msgstr "Taajuusalue" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:334 msgid "Bitrate" diff --git a/luci-mod-dashboard/po/fr/dashboard.po b/luci-mod-dashboard/po/fr/dashboard.po index 53011f471..90d9b383b 100644 --- a/luci-mod-dashboard/po/fr/dashboard.po +++ b/luci-mod-dashboard/po/fr/dashboard.po @@ -1,8 +1,8 @@ msgid "" msgstr "" "Project-Id-Version: \n" -"PO-Revision-Date: 2025-12-12 15:40+0000\n" -"Last-Translator: liolio6 \n" +"PO-Revision-Date: 2026-10-13 21:56+0000\n" +"Last-Translator: Pavel Borecki \n" "Language-Team: French \n" "Language: fr\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 5.15-dev\n" +"X-Generator: Weblate 2026.11.dev0\n" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:97 msgid "%d clients" @@ -62,7 +62,7 @@ msgstr "BSSID" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:218 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:372 msgid "Band" -msgstr "" +msgstr "Bande" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:334 msgid "Bitrate" diff --git a/luci-mod-dashboard/po/ga/dashboard.po b/luci-mod-dashboard/po/ga/dashboard.po index 115a1f284..cceade0fc 100644 --- a/luci-mod-dashboard/po/ga/dashboard.po +++ b/luci-mod-dashboard/po/ga/dashboard.po @@ -1,7 +1,8 @@ msgid "" msgstr "" -"PO-Revision-Date: 2026-04-23 10:15+0000\n" -"Last-Translator: Aindriú Mac Giolla Eoin \n" +"PO-Revision-Date: 2026-10-12 11:12+0000\n" +"Last-Translator: Aindriú Mac Giolla Eoin " +"\n" "Language-Team: Irish \n" "Language: ga\n" @@ -9,41 +10,41 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=5; plural=n==1 ? 0 : n==2 ? 1 : (n>2 && n<7) ? 2 :(n>" "6 && n<11) ? 3 : 4;\n" -"X-Generator: Weblate 5.17.1-dev\n" +"X-Generator: Weblate 2026.11.dev0\n" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:97 msgid "%d clients" -msgstr "" +msgstr "%d cliant" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/12_resources.js:89 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/12_resources.js:124 msgid "%d core" msgid_plural "%d cores" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" -msgstr[4] "" +msgstr[0] "%d croí" +msgstr[1] "%d chroí" +msgstr[2] "%d chroí" +msgstr[3] "%d chroí" +msgstr[4] "%d chroí" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/lib/charts.js:277 msgid "%d min ago" -msgstr "" +msgstr "%d nóiméad ó shin" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:72 msgid "%d of %d SSIDs active" -msgstr "" +msgstr "%d as %d SSID gníomhach" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/lib/charts.js:277 msgid "%d s ago" -msgstr "" +msgstr "%d soic ó shin" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/12_resources.js:108 msgid "15 min: %.2f" -msgstr "" +msgstr "15 nóim: %.2f" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/12_resources.js:108 msgid "5 min: %.2f" -msgstr "" +msgstr "5 nóim: %.2f" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:322 msgid "Active" @@ -51,7 +52,7 @@ msgstr "Gníomhach" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:40 msgid "Active leases" -msgstr "" +msgstr "Léasanna gníomhacha" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:295 msgid "Architecture" @@ -64,7 +65,7 @@ msgstr "BSSID" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:218 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:372 msgid "Band" -msgstr "" +msgstr "Banna" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:334 msgid "Bitrate" @@ -72,22 +73,22 @@ msgstr "Ráta Giotáin" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/12_resources.js:173 msgid "Buffered" -msgstr "" +msgstr "Maolaithe" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/12_resources.js:141 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/12_resources.js:166 msgid "CPU" -msgstr "" +msgstr "LAP" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/12_resources.js:43 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/12_resources.js:87 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/12_resources.js:162 msgid "CPU usage" -msgstr "" +msgstr "Úsáid an LAP" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/12_resources.js:176 msgid "Cached" -msgstr "" +msgstr "Taiscthe" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:328 msgid "Channel" @@ -95,7 +96,7 @@ msgstr "Cainéal" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/lib/history.js:52 msgid "Collecting data..." -msgstr "" +msgstr "Ag bailiú sonraí..." #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:72 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:104 @@ -127,7 +128,7 @@ msgstr "Deais" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/lib/layout.js:13 msgid "Detail tabs" -msgstr "" +msgstr "Cluaisíní sonraí" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:352 msgid "Devices Connected" @@ -164,11 +165,11 @@ msgstr "GeataV6" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/lib/charts.js:25 msgid "Gbit/s" -msgstr "" +msgstr "Gbit/s" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:111 msgid "Good" -msgstr "" +msgstr "Maith" #: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:31 msgid "Grant access to DHCP status display" @@ -220,7 +221,7 @@ msgstr "réimír IPv6" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:206 msgid "Interface is disabled" -msgstr "" +msgstr "Tá an comhéadan díchumasaithe" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:21 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:23 @@ -231,7 +232,7 @@ msgstr "Idirlíon" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/lib/charts.js:25 msgid "Kbit/s" -msgstr "" +msgstr "kbit/s" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:285 msgid "Kernel Version" @@ -240,21 +241,21 @@ msgstr "Leagan na hEithne" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/index.js:251 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/index.js:298 msgid "Layout" -msgstr "" +msgstr "Leagan amach" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/lib/layout.js:12 msgid "Live charts" -msgstr "" +msgstr "Cairteacha beo" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/12_resources.js:45 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/12_resources.js:106 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/12_resources.js:154 msgid "Load average" -msgstr "" +msgstr "Meánualach" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/index.js:298 msgid "Loading view…" -msgstr "" +msgstr "Ag luchtú an amhairc…" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:280 msgid "Local Time" @@ -273,11 +274,11 @@ msgstr "Mbit/s" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/12_resources.js:97 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/12_resources.js:142 msgid "Memory" -msgstr "" +msgstr "Cuimhne" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/12_resources.js:170 msgid "Memory used" -msgstr "" +msgstr "Cuimhne in úsáid" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:290 msgid "Model" @@ -286,31 +287,31 @@ msgstr "Múnla" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:119 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:231 msgid "No RX signal" -msgstr "" +msgstr "Gan comhartha glactha" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:40 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:53 msgid "No active leases" -msgstr "" +msgstr "Gan léasanna gníomhacha" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/lib/history.js:52 msgid "No data received" -msgstr "" +msgstr "Ní bhfuarthas aon sonraí" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:88 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:113 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:180 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:244 msgid "No wireless clients connected" -msgstr "" +msgstr "Níl aon chliant gan sreang ceangailte" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:219 msgid "Noise floor" -msgstr "" +msgstr "Bunleibhéal torainn" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:74 msgid "Not configured or no address acquired" -msgstr "" +msgstr "Gan cumrú nó gan seoladh faighte" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:72 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:104 @@ -328,7 +329,7 @@ msgstr "Prótacal" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/12_resources.js:47 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/12_resources.js:202 msgid "Resources" -msgstr "" +msgstr "Acmhainní" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:217 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:316 @@ -338,11 +339,11 @@ msgstr "SSID" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/lib/layout.js:61 msgid "Save & Apply" -msgstr "" +msgstr "Sábháil agus Cuir i bhFeidhm" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:219 msgid "Signal" -msgstr "" +msgstr "Comhartha" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:35 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:96 @@ -352,11 +353,11 @@ msgstr "Neart Comhartha" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/lib/layout.js:11 msgid "Status cards" -msgstr "" +msgstr "Cártaí stádais" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/12_resources.js:180 msgid "Swap used" -msgstr "" +msgstr "Malartú déanta" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:24 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:317 @@ -367,13 +368,16 @@ msgstr "Córas" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/12_resources.js:130 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/12_resources.js:137 msgid "System load" -msgstr "" +msgstr "Ualach an chórais" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/lib/layout.js:18 msgid "" "The lists follow the page from top to bottom. What is in a list is shown, in " "that order: drag an entry to move it. An empty list shows the defaults." msgstr "" +"Leanann na liostaí an leathanach ó bharr go bun. Taispeántar ábhar an liosta " +"san ord sin: tarraing iontráil chun í a bhogadh. Taispeánann liosta folamh " +"na socruithe réamhshocraithe." #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:54 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:245 @@ -398,16 +402,16 @@ msgstr "Suas." #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:210 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:275 msgid "Uptime" -msgstr "Am ar Fáil" +msgstr "Am oibríochta" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/15_traffic.js:10 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/15_traffic.js:13 msgid "WAN traffic" -msgstr "" +msgstr "Trácht WAN" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:112 msgid "Weak" -msgstr "" +msgstr "Lag" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:28 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:37 @@ -417,31 +421,31 @@ msgstr "Gan sreang" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:36 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:159 msgid "Wireless client data usage" -msgstr "" +msgstr "Úsáid sonraí ag cliant gan sreang" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:34 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:84 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:87 msgid "Wireless client distribution" -msgstr "" +msgstr "Dáileadh cliant gan sreang" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:33 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:70 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:288 msgid "Wireless clients" -msgstr "" +msgstr "Cliaint gan sreang" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/lib/charts.js:25 msgid "bit/s" -msgstr "" +msgstr "bit/s" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:85 msgid "by SSID" -msgstr "" +msgstr "de réir SSID" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:87 msgid "clients" -msgstr "" +msgstr "cliaint" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:97 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:111 @@ -451,15 +455,15 @@ msgstr "" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:231 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:234 msgid "dBm" -msgstr "" +msgstr "dBm" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/12_resources.js:89 msgid "load %.2f" -msgstr "" +msgstr "luchtaigh %.2f" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/lib/charts.js:278 msgid "now" -msgstr "" +msgstr "anois" #~ msgid "Strength" #~ msgstr "Neart" diff --git a/luci-mod-dashboard/po/hu/dashboard.po b/luci-mod-dashboard/po/hu/dashboard.po index 15335f7b7..4e38ebe26 100644 --- a/luci-mod-dashboard/po/hu/dashboard.po +++ b/luci-mod-dashboard/po/hu/dashboard.po @@ -1,8 +1,8 @@ msgid "" msgstr "" "Project-Id-Version: \n" -"PO-Revision-Date: 2026-01-15 16:49+0000\n" -"Last-Translator: hmzs \n" +"PO-Revision-Date: 2026-10-13 21:56+0000\n" +"Last-Translator: Pavel Borecki \n" "Language-Team: Hungarian \n" "Language: hu\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 5.15.2\n" +"X-Generator: Weblate 2026.11.dev0\n" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:97 msgid "%d clients" @@ -62,7 +62,7 @@ msgstr "BSSID" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:218 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:372 msgid "Band" -msgstr "" +msgstr "Sáv" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:334 msgid "Bitrate" diff --git a/luci-mod-dashboard/po/it/dashboard.po b/luci-mod-dashboard/po/it/dashboard.po index 03447037a..dfcd4b5bb 100644 --- a/luci-mod-dashboard/po/it/dashboard.po +++ b/luci-mod-dashboard/po/it/dashboard.po @@ -1,8 +1,8 @@ msgid "" msgstr "" "Project-Id-Version: \n" -"PO-Revision-Date: 2026-01-07 14:02+0000\n" -"Last-Translator: Random \n" +"PO-Revision-Date: 2026-10-13 21:56+0000\n" +"Last-Translator: Pavel Borecki \n" "Language-Team: Italian \n" "Language: it\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 5.15.1\n" +"X-Generator: Weblate 2026.11.dev0\n" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:97 msgid "%d clients" @@ -62,7 +62,7 @@ msgstr "BSSID" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:218 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:372 msgid "Band" -msgstr "" +msgstr "Banda" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:334 msgid "Bitrate" diff --git a/luci-mod-dashboard/po/ja/dashboard.po b/luci-mod-dashboard/po/ja/dashboard.po index 1339876b7..1efeb907c 100644 --- a/luci-mod-dashboard/po/ja/dashboard.po +++ b/luci-mod-dashboard/po/ja/dashboard.po @@ -1,7 +1,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" -"PO-Revision-Date: 2025-12-07 21:54+0000\n" +"PO-Revision-Date: 2026-10-18 16:40+0000\n" "Last-Translator: Monarch " "\n" "Language-Team: Japanese \n" +"PO-Revision-Date: 2026-10-18 16:40+0000\n" +"Last-Translator: Hyeonjeong Lee \n" "Language-Team: Korean \n" "Language: ko\n" @@ -10,37 +10,37 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 5.16-dev\n" +"X-Generator: Weblate 2026.11.dev0\n" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:97 msgid "%d clients" -msgstr "" +msgstr "클라이언트 %d개" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/12_resources.js:89 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/12_resources.js:124 msgid "%d core" msgid_plural "%d cores" -msgstr[0] "" +msgstr[0] "%d 코어" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/lib/charts.js:277 msgid "%d min ago" -msgstr "" +msgstr "%d분 전" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:72 msgid "%d of %d SSIDs active" -msgstr "" +msgstr "활성 SSID %d개 (전체 %d개)" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/lib/charts.js:277 msgid "%d s ago" -msgstr "" +msgstr "%d초 전" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/12_resources.js:108 msgid "15 min: %.2f" -msgstr "" +msgstr "15분: %.2f" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/12_resources.js:108 msgid "5 min: %.2f" -msgstr "" +msgstr "5분: %.2f" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:322 msgid "Active" @@ -48,7 +48,7 @@ msgstr "활성" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:40 msgid "Active leases" -msgstr "" +msgstr "활성 임대" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:295 msgid "Architecture" @@ -61,7 +61,7 @@ msgstr "BSSID" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:218 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:372 msgid "Band" -msgstr "" +msgstr "대역" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:334 msgid "Bitrate" @@ -69,22 +69,22 @@ msgstr "비트레이트" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/12_resources.js:173 msgid "Buffered" -msgstr "" +msgstr "버퍼" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/12_resources.js:141 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/12_resources.js:166 msgid "CPU" -msgstr "" +msgstr "CPU" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/12_resources.js:43 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/12_resources.js:87 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/12_resources.js:162 msgid "CPU usage" -msgstr "" +msgstr "CPU 사용량" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/12_resources.js:176 msgid "Cached" -msgstr "" +msgstr "캐시" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:328 msgid "Channel" @@ -92,7 +92,7 @@ msgstr "채널" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/lib/history.js:52 msgid "Collecting data..." -msgstr "" +msgstr "데이터 수집 중..." #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:72 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:104 @@ -124,7 +124,7 @@ msgstr "대시보드" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/lib/layout.js:13 msgid "Detail tabs" -msgstr "" +msgstr "상세 탭" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:352 msgid "Devices Connected" @@ -161,11 +161,11 @@ msgstr "게이트웨이 IPv6" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/lib/charts.js:25 msgid "Gbit/s" -msgstr "" +msgstr "Gbit/s" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:111 msgid "Good" -msgstr "" +msgstr "좋음" #: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:31 msgid "Grant access to DHCP status display" @@ -177,7 +177,7 @@ msgstr "메인 상태 표시에 접근 권한 부여" #: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:3 msgid "Grant access to the system route status" -msgstr "시스템 라우트 상태 접근을 허가합니다" +msgstr "시스템 라우팅 상태에 접근 권한 부여" #: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:40 msgid "Grant access to wireless status display" @@ -217,7 +217,7 @@ msgstr "IPv6 접두사" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:206 msgid "Interface is disabled" -msgstr "" +msgstr "인터페이스가 비활성화됨" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:21 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:23 @@ -228,7 +228,7 @@ msgstr "인터넷" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/lib/charts.js:25 msgid "Kbit/s" -msgstr "" +msgstr "Kbit/s" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:285 msgid "Kernel Version" @@ -237,21 +237,21 @@ msgstr "커널 버전" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/index.js:251 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/index.js:298 msgid "Layout" -msgstr "" +msgstr "레이아웃" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/lib/layout.js:12 msgid "Live charts" -msgstr "" +msgstr "실시간 차트" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/12_resources.js:45 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/12_resources.js:106 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/12_resources.js:154 msgid "Load average" -msgstr "" +msgstr "부하 평균" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/index.js:298 msgid "Loading view…" -msgstr "" +msgstr "화면 불러오는 중…" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:280 msgid "Local Time" @@ -270,11 +270,11 @@ msgstr "Mbit/s" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/12_resources.js:97 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/12_resources.js:142 msgid "Memory" -msgstr "" +msgstr "메모리" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/12_resources.js:170 msgid "Memory used" -msgstr "" +msgstr "메모리 사용량" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:290 msgid "Model" @@ -283,31 +283,31 @@ msgstr "모델" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:119 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:231 msgid "No RX signal" -msgstr "" +msgstr "RX 신호 없음" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:40 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:53 msgid "No active leases" -msgstr "" +msgstr "활성 임대 없음" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/lib/history.js:52 msgid "No data received" -msgstr "" +msgstr "수신 데이터 없음" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:88 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:113 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:180 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:244 msgid "No wireless clients connected" -msgstr "" +msgstr "연결된 무선 클라이언트 없음" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:219 msgid "Noise floor" -msgstr "" +msgstr "기저 잡음" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:74 msgid "Not configured or no address acquired" -msgstr "" +msgstr "설정되지 않음 또는 할당된 주소 없음" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:72 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:104 @@ -325,7 +325,7 @@ msgstr "프로토콜" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/12_resources.js:47 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/12_resources.js:202 msgid "Resources" -msgstr "" +msgstr "자원" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:217 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:316 @@ -335,11 +335,11 @@ msgstr "SSID" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/lib/layout.js:61 msgid "Save & Apply" -msgstr "" +msgstr "저장 및 적용" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:219 msgid "Signal" -msgstr "" +msgstr "신호" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:35 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:96 @@ -349,11 +349,11 @@ msgstr "신호 강도" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/lib/layout.js:11 msgid "Status cards" -msgstr "" +msgstr "상태 카드" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/12_resources.js:180 msgid "Swap used" -msgstr "" +msgstr "스왑 사용량" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:24 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:317 @@ -364,13 +364,16 @@ msgstr "시스템" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/12_resources.js:130 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/12_resources.js:137 msgid "System load" -msgstr "" +msgstr "시스템 부하" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/lib/layout.js:18 msgid "" "The lists follow the page from top to bottom. What is in a list is shown, in " "that order: drag an entry to move it. An empty list shows the defaults." msgstr "" +"목록은 페이지 위에서 아래로 순서대로 배치됩니다. 각 목록에 포함된 항목은 " +"표시된 순서 그대로 출력되며, 항목을 드래그하여 순서를 변경할 수 있습니다. " +"목록이 비어 있으면 기본값이 표시됩니다." #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:54 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:245 @@ -400,11 +403,11 @@ msgstr "가동 시간" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/15_traffic.js:10 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/15_traffic.js:13 msgid "WAN traffic" -msgstr "" +msgstr "WAN 트래픽" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:112 msgid "Weak" -msgstr "" +msgstr "약함" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:28 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:37 @@ -414,31 +417,31 @@ msgstr "무선" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:36 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:159 msgid "Wireless client data usage" -msgstr "" +msgstr "무선 클라이언트 데이터 사용량" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:34 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:84 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:87 msgid "Wireless client distribution" -msgstr "" +msgstr "무선 클라이언트 분포" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:33 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:70 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:288 msgid "Wireless clients" -msgstr "" +msgstr "무선 클라이언트" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/lib/charts.js:25 msgid "bit/s" -msgstr "" +msgstr "bit/s" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:85 msgid "by SSID" -msgstr "" +msgstr "SSID별" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:87 msgid "clients" -msgstr "" +msgstr "클라이언트" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:97 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:111 @@ -448,15 +451,15 @@ msgstr "" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:231 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:234 msgid "dBm" -msgstr "" +msgstr "dBm" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/12_resources.js:89 msgid "load %.2f" -msgstr "" +msgstr "부하 %.2f" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/lib/charts.js:278 msgid "now" -msgstr "" +msgstr "지금" #~ msgid "Strength" #~ msgstr "강도" diff --git a/luci-mod-dashboard/po/lo/dashboard.po b/luci-mod-dashboard/po/lo/dashboard.po index b2c53b561..9f688fd40 100644 --- a/luci-mod-dashboard/po/lo/dashboard.po +++ b/luci-mod-dashboard/po/lo/dashboard.po @@ -1,14 +1,14 @@ msgid "" msgstr "" -"PO-Revision-Date: 2026-08-15 13:06+0000\n" -"Last-Translator: Bone NI \n" +"PO-Revision-Date: 2026-10-13 13:20+0000\n" +"Last-Translator: Pavel Borecki \n" "Language-Team: Lao \n" "Language: lo\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 2026.9.dev0\n" +"X-Generator: Weblate 2026.11.dev0\n" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:97 msgid "%d clients" @@ -59,7 +59,7 @@ msgstr "BSSID" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:218 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:372 msgid "Band" -msgstr "" +msgstr "ແຖບສັນຍານ" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:334 msgid "Bitrate" diff --git a/luci-mod-dashboard/po/lt/dashboard.po b/luci-mod-dashboard/po/lt/dashboard.po index 1caebc279..098031560 100644 --- a/luci-mod-dashboard/po/lt/dashboard.po +++ b/luci-mod-dashboard/po/lt/dashboard.po @@ -1,8 +1,8 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" -"PO-Revision-Date: 2026-04-20 17:56+0000\n" -"Last-Translator: Džiugas Januševičius \n" +"PO-Revision-Date: 2026-10-13 13:19+0000\n" +"Last-Translator: Pavel Borecki \n" "Language-Team: Lithuanian \n" "Language: lt\n" @@ -11,7 +11,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "(n%100<10 || n%100>=20) ? 1 : 2);\n" -"X-Generator: Weblate 5.17.1-dev\n" +"X-Generator: Weblate 2026.11.dev0\n" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:97 msgid "%d clients" @@ -64,7 +64,7 @@ msgstr "„BSSID“" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:218 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:372 msgid "Band" -msgstr "" +msgstr "Diapazonas" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:334 msgid "Bitrate" diff --git a/luci-mod-dashboard/po/nl/dashboard.po b/luci-mod-dashboard/po/nl/dashboard.po index 4568d6701..2aede7dba 100644 --- a/luci-mod-dashboard/po/nl/dashboard.po +++ b/luci-mod-dashboard/po/nl/dashboard.po @@ -1,8 +1,8 @@ msgid "" msgstr "" "Project-Id-Version: \n" -"PO-Revision-Date: 2025-12-28 09:02+0000\n" -"Last-Translator: Mijzelf \n" +"PO-Revision-Date: 2026-10-13 21:56+0000\n" +"Last-Translator: Pavel Borecki \n" "Language-Team: Dutch \n" "Language: nl\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 5.15.1\n" +"X-Generator: Weblate 2026.11.dev0\n" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:97 msgid "%d clients" @@ -62,7 +62,7 @@ msgstr "BSSID" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:218 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:372 msgid "Band" -msgstr "" +msgstr "Band" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:334 msgid "Bitrate" diff --git a/luci-mod-dashboard/po/pt_BR/dashboard.po b/luci-mod-dashboard/po/pt_BR/dashboard.po index a8c262db6..727fa2d7d 100644 --- a/luci-mod-dashboard/po/pt_BR/dashboard.po +++ b/luci-mod-dashboard/po/pt_BR/dashboard.po @@ -1,8 +1,9 @@ msgid "" msgstr "" "Project-Id-Version: \n" -"PO-Revision-Date: 2026-09-29 12:45+0000\n" -"Last-Translator: Pavel Borecki \n" +"PO-Revision-Date: 2026-10-13 13:19+0000\n" +"Last-Translator: Janderson Vieira Santos " +"\n" "Language-Team: Portuguese (Brazil) \n" "Language: pt_BR\n" @@ -10,38 +11,38 @@ 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 2026.10.dev0\n" +"X-Generator: Weblate 2026.11.dev0\n" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:97 msgid "%d clients" -msgstr "" +msgstr "%d clientes" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/12_resources.js:89 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/12_resources.js:124 msgid "%d core" msgid_plural "%d cores" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "%d núcleo" +msgstr[1] "%d núcleos" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/lib/charts.js:277 msgid "%d min ago" -msgstr "" +msgstr "%d min atrás" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:72 msgid "%d of %d SSIDs active" -msgstr "" +msgstr "%d de %d SSIDs ativos" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/lib/charts.js:277 msgid "%d s ago" -msgstr "" +msgstr "%d s atrás" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/12_resources.js:108 msgid "15 min: %.2f" -msgstr "" +msgstr "15 min: %.2f" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/12_resources.js:108 msgid "5 min: %.2f" -msgstr "" +msgstr "5 min: %.2f" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:322 msgid "Active" @@ -49,7 +50,7 @@ msgstr "Ativo" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:40 msgid "Active leases" -msgstr "" +msgstr "Concessões ativas" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:295 msgid "Architecture" @@ -70,22 +71,22 @@ msgstr "Taxa de bits" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/12_resources.js:173 msgid "Buffered" -msgstr "" +msgstr "Em buffer" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/12_resources.js:141 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/12_resources.js:166 msgid "CPU" -msgstr "" +msgstr "CPU" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/12_resources.js:43 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/12_resources.js:87 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/12_resources.js:162 msgid "CPU usage" -msgstr "" +msgstr "Uso da CPU" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/12_resources.js:176 msgid "Cached" -msgstr "" +msgstr "Em cache" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:328 msgid "Channel" @@ -93,7 +94,7 @@ msgstr "Canal" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/lib/history.js:52 msgid "Collecting data..." -msgstr "" +msgstr "Coletando dados..." #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:72 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:104 @@ -125,7 +126,7 @@ msgstr "Painel de Controle" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/lib/layout.js:13 msgid "Detail tabs" -msgstr "" +msgstr "Abas de detalhes" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:352 msgid "Devices Connected" @@ -166,7 +167,7 @@ msgstr "Gbit/s" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:111 msgid "Good" -msgstr "" +msgstr "Bom" #: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:31 msgid "Grant access to DHCP status display" @@ -218,7 +219,7 @@ msgstr "Prefixo IPv6" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:206 msgid "Interface is disabled" -msgstr "" +msgstr "A interface está desativada" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:21 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:23 @@ -238,21 +239,21 @@ msgstr "Versão do kernel" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/index.js:251 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/index.js:298 msgid "Layout" -msgstr "" +msgstr "Layout" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/lib/layout.js:12 msgid "Live charts" -msgstr "" +msgstr "Gráficos em tempo real" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/12_resources.js:45 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/12_resources.js:106 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/12_resources.js:154 msgid "Load average" -msgstr "" +msgstr "Média de carga" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/index.js:298 msgid "Loading view…" -msgstr "" +msgstr "Carregando visualização…" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:280 msgid "Local Time" @@ -271,11 +272,11 @@ msgstr "Mbit/s" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/12_resources.js:97 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/12_resources.js:142 msgid "Memory" -msgstr "" +msgstr "Memória" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/12_resources.js:170 msgid "Memory used" -msgstr "" +msgstr "Memória usada" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:290 msgid "Model" @@ -284,31 +285,31 @@ msgstr "Modelo" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:119 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:231 msgid "No RX signal" -msgstr "" +msgstr "Sem sinal RX" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:40 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:53 msgid "No active leases" -msgstr "" +msgstr "Nenhuma concessão ativa" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/lib/history.js:52 msgid "No data received" -msgstr "" +msgstr "Nenhum dado recebido" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:88 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:113 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:180 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:244 msgid "No wireless clients connected" -msgstr "" +msgstr "Nenhum cliente sem fio conectado" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:219 msgid "Noise floor" -msgstr "" +msgstr "Ruído de fundo" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:74 msgid "Not configured or no address acquired" -msgstr "" +msgstr "Não configurado ou nenhum endereço obtido" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:72 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:104 @@ -326,7 +327,7 @@ msgstr "Protocolo" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/12_resources.js:47 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/12_resources.js:202 msgid "Resources" -msgstr "" +msgstr "Recursos" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:217 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:316 @@ -336,11 +337,11 @@ msgstr "SSID" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/lib/layout.js:61 msgid "Save & Apply" -msgstr "" +msgstr "Salvar & Aplicar" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:219 msgid "Signal" -msgstr "" +msgstr "Sinal" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:35 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:96 @@ -350,11 +351,11 @@ msgstr "Força do sinal" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/lib/layout.js:11 msgid "Status cards" -msgstr "" +msgstr "Cartões de status" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/12_resources.js:180 msgid "Swap used" -msgstr "" +msgstr "Swap usado" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:24 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:317 @@ -365,13 +366,16 @@ msgstr "Sistema" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/12_resources.js:130 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/12_resources.js:137 msgid "System load" -msgstr "" +msgstr "Carga do sistema" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/lib/layout.js:18 msgid "" "The lists follow the page from top to bottom. What is in a list is shown, in " "that order: drag an entry to move it. An empty list shows the defaults." msgstr "" +"As listas seguem a página de cima para baixo. O que estiver em uma lista é " +"exibido nessa ordem: arraste uma entrada para movê-la. Uma lista vazia exibe " +"os padrões." #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:54 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:245 @@ -401,11 +405,11 @@ msgstr "Tempo de atividade" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/15_traffic.js:10 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/15_traffic.js:13 msgid "WAN traffic" -msgstr "" +msgstr "Tráfego da WAN" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:112 msgid "Weak" -msgstr "" +msgstr "Fraco" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:28 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:37 @@ -415,19 +419,19 @@ msgstr "Wi-Fi" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:36 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:159 msgid "Wireless client data usage" -msgstr "" +msgstr "Uso de dados dos clientes sem fio" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:34 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:84 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:87 msgid "Wireless client distribution" -msgstr "" +msgstr "Distribuição de clientes sem fio" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:33 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:70 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:288 msgid "Wireless clients" -msgstr "" +msgstr "Clientes sem fio" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/lib/charts.js:25 msgid "bit/s" @@ -435,11 +439,11 @@ msgstr "bit/s" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:85 msgid "by SSID" -msgstr "" +msgstr "por SSID" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:87 msgid "clients" -msgstr "" +msgstr "clientes" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:97 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:111 @@ -453,11 +457,11 @@ msgstr "dBm" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/12_resources.js:89 msgid "load %.2f" -msgstr "" +msgstr "carga %.2f" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/lib/charts.js:278 msgid "now" -msgstr "" +msgstr "agora" #~ msgid "Strength" #~ msgstr "Força" diff --git a/luci-mod-dashboard/po/ro/dashboard.po b/luci-mod-dashboard/po/ro/dashboard.po index 6b1ba3890..611f3d068 100644 --- a/luci-mod-dashboard/po/ro/dashboard.po +++ b/luci-mod-dashboard/po/ro/dashboard.po @@ -1,17 +1,17 @@ msgid "" msgstr "" "Project-Id-Version: \n" -"PO-Revision-Date: 2025-10-10 05:14+0000\n" -"Last-Translator: CRISTIAN ANDREI \n" +"PO-Revision-Date: 2026-10-13 21:56+0000\n" +"Last-Translator: Pavel Borecki \n" "Language-Team: Romanian \n" "Language: ro\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=n==1 ? 0 : " -"(n==0 || (n%100 > 0 && n%100 < 20)) ? 1 : 2;\n" -"X-Generator: Weblate 5.14-dev\n" +"Plural-Forms: nplurals=3; plural=n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < " +"20)) ? 1 : 2;\n" +"X-Generator: Weblate 2026.11.dev0\n" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:97 msgid "%d clients" @@ -64,7 +64,7 @@ msgstr "BSSID" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:218 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:372 msgid "Band" -msgstr "" +msgstr "Bandă" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:334 msgid "Bitrate" diff --git a/luci-mod-dashboard/po/ru/dashboard.po b/luci-mod-dashboard/po/ru/dashboard.po index 2b02966fe..b5d9c3b92 100644 --- a/luci-mod-dashboard/po/ru/dashboard.po +++ b/luci-mod-dashboard/po/ru/dashboard.po @@ -1,7 +1,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" -"PO-Revision-Date: 2026-08-14 12:12+0000\n" +"PO-Revision-Date: 2026-10-16 06:44+0000\n" "Last-Translator: SnIPeRSnIPeR " "\n" "Language-Team: Russian =2 && " "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -"X-Generator: Weblate 2026.9.dev0\n" +"X-Generator: Weblate 2026.11.dev0\n" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:97 msgid "%d clients" -msgstr "" +msgstr "Клиентов: %d" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/12_resources.js:89 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/12_resources.js:124 msgid "%d core" msgid_plural "%d cores" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" +msgstr[0] "%d ядро" +msgstr[1] "%d ядра" +msgstr[2] "%d ядер" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/lib/charts.js:277 msgid "%d min ago" -msgstr "" +msgstr "%d мин назад" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:72 msgid "%d of %d SSIDs active" -msgstr "" +msgstr "Активных SSID: %d из %d" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/lib/charts.js:277 msgid "%d s ago" -msgstr "" +msgstr "%d сек назад" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/12_resources.js:108 msgid "15 min: %.2f" -msgstr "" +msgstr "15 мин: %.2f" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/12_resources.js:108 msgid "5 min: %.2f" -msgstr "" +msgstr "5 мин: %.2f" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:322 msgid "Active" @@ -52,7 +52,7 @@ msgstr "Активно" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:40 msgid "Active leases" -msgstr "" +msgstr "Активные DHCP-аренды" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:295 msgid "Architecture" @@ -65,7 +65,7 @@ msgstr "BSSID" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:218 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:372 msgid "Band" -msgstr "" +msgstr "Диапазон" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:334 msgid "Bitrate" @@ -73,22 +73,22 @@ msgstr "Битрейт" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/12_resources.js:173 msgid "Buffered" -msgstr "" +msgstr "Буферизовано" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/12_resources.js:141 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/12_resources.js:166 msgid "CPU" -msgstr "" +msgstr "ЦП" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/12_resources.js:43 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/12_resources.js:87 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/12_resources.js:162 msgid "CPU usage" -msgstr "" +msgstr "Загрузка ЦП" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/12_resources.js:176 msgid "Cached" -msgstr "" +msgstr "Кэшировано" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:328 msgid "Channel" @@ -96,7 +96,7 @@ msgstr "Канал" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/lib/history.js:52 msgid "Collecting data..." -msgstr "" +msgstr "Сбор данных..." #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:72 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:104 @@ -128,7 +128,7 @@ msgstr "Информационная панель" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/lib/layout.js:13 msgid "Detail tabs" -msgstr "" +msgstr "Вкладки подробностей" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:352 msgid "Devices Connected" @@ -165,11 +165,11 @@ msgstr "GatewayV6" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/lib/charts.js:25 msgid "Gbit/s" -msgstr "" +msgstr "Гбит/с" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:111 msgid "Good" -msgstr "" +msgstr "Хороший" #: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:31 msgid "Grant access to DHCP status display" @@ -221,7 +221,7 @@ msgstr "Префикс IPv6" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:206 msgid "Interface is disabled" -msgstr "" +msgstr "Интерфейс отключён" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:21 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:23 @@ -232,7 +232,7 @@ msgstr "Интернет" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/lib/charts.js:25 msgid "Kbit/s" -msgstr "" +msgstr "Кбит/с" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:285 msgid "Kernel Version" @@ -241,21 +241,21 @@ msgstr "Версия ядра" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/index.js:251 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/index.js:298 msgid "Layout" -msgstr "" +msgstr "Макет" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/lib/layout.js:12 msgid "Live charts" -msgstr "" +msgstr "Графики в реальном времени" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/12_resources.js:45 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/12_resources.js:106 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/12_resources.js:154 msgid "Load average" -msgstr "" +msgstr "Средняя нагрузка" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/index.js:298 msgid "Loading view…" -msgstr "" +msgstr "Загрузка страницы…" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:280 msgid "Local Time" @@ -274,11 +274,11 @@ msgstr "Мбит/с" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/12_resources.js:97 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/12_resources.js:142 msgid "Memory" -msgstr "" +msgstr "Память" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/12_resources.js:170 msgid "Memory used" -msgstr "" +msgstr "Использовано памяти" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:290 msgid "Model" @@ -287,31 +287,31 @@ msgstr "Модель" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:119 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:231 msgid "No RX signal" -msgstr "" +msgstr "Нет сигнала RX" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:40 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:53 msgid "No active leases" -msgstr "" +msgstr "Нет активных DHCP-аренд" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/lib/history.js:52 msgid "No data received" -msgstr "" +msgstr "Данные не получены" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:88 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:113 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:180 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:244 msgid "No wireless clients connected" -msgstr "" +msgstr "Нет подключённых беспроводных клиентов" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:219 msgid "Noise floor" -msgstr "" +msgstr "Уровень шума" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:74 msgid "Not configured or no address acquired" -msgstr "" +msgstr "Не настроено или адрес не получен" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:72 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:104 @@ -329,7 +329,7 @@ msgstr "Протокол" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/12_resources.js:47 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/12_resources.js:202 msgid "Resources" -msgstr "" +msgstr "Ресурсы" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:217 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:316 @@ -339,11 +339,11 @@ msgstr "SSID" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/lib/layout.js:61 msgid "Save & Apply" -msgstr "" +msgstr "Сохранить и применить" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:219 msgid "Signal" -msgstr "" +msgstr "Сигнал" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:35 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:96 @@ -353,11 +353,11 @@ msgstr "Уровень сигнала" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/lib/layout.js:11 msgid "Status cards" -msgstr "" +msgstr "Карточки состояния" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/12_resources.js:180 msgid "Swap used" -msgstr "" +msgstr "Использовано подкачки" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:24 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:317 @@ -368,13 +368,16 @@ msgstr "Система" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/12_resources.js:130 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/12_resources.js:137 msgid "System load" -msgstr "" +msgstr "Системная нагрузка" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/lib/layout.js:18 msgid "" "The lists follow the page from top to bottom. What is in a list is shown, in " "that order: drag an entry to move it. An empty list shows the defaults." msgstr "" +"Списки идут сверху вниз по странице. Содержимое списка отображается в этом " +"порядке: перетащите элемент, чтобы изменить его положение. Пустой список " +"означает использование значений по умолчанию." #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:54 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:245 @@ -404,11 +407,11 @@ msgstr "Время работы" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/15_traffic.js:10 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/15_traffic.js:13 msgid "WAN traffic" -msgstr "" +msgstr "Трафик WAN" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:112 msgid "Weak" -msgstr "" +msgstr "Слабый" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:28 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:37 @@ -418,31 +421,31 @@ msgstr "Беспроводная сеть" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:36 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:159 msgid "Wireless client data usage" -msgstr "" +msgstr "Использование данных беспроводными клиентами" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:34 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:84 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:87 msgid "Wireless client distribution" -msgstr "" +msgstr "Распределение беспроводных клиентов" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:33 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:70 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:288 msgid "Wireless clients" -msgstr "" +msgstr "Беспроводные клиенты" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/lib/charts.js:25 msgid "bit/s" -msgstr "" +msgstr "бит/с" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:85 msgid "by SSID" -msgstr "" +msgstr "по SSID" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:87 msgid "clients" -msgstr "" +msgstr "клиенты" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:97 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:111 @@ -452,15 +455,15 @@ msgstr "" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:231 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:234 msgid "dBm" -msgstr "" +msgstr "дБм" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/12_resources.js:89 msgid "load %.2f" -msgstr "" +msgstr "нагрузка %.2f" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/lib/charts.js:278 msgid "now" -msgstr "" +msgstr "сейчас" #~ msgid "Strength" #~ msgstr "Уровень" diff --git a/luci-mod-dashboard/po/sk/dashboard.po b/luci-mod-dashboard/po/sk/dashboard.po index 874fa1748..9353e5152 100644 --- a/luci-mod-dashboard/po/sk/dashboard.po +++ b/luci-mod-dashboard/po/sk/dashboard.po @@ -1,16 +1,16 @@ msgid "" msgstr "" "Project-Id-Version: \n" -"PO-Revision-Date: 2023-09-02 23:33+0000\n" -"Last-Translator: MaycoH \n" +"PO-Revision-Date: 2026-10-13 15:11+0000\n" +"Last-Translator: Pavel Borecki \n" "Language-Team: Slovak \n" "Language: sk\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" -"X-Generator: Weblate 5.0.1-dev\n" +"Plural-Forms: nplurals=3; plural=((n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2);\n" +"X-Generator: Weblate 2026.11.dev0\n" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:97 msgid "%d clients" @@ -63,7 +63,7 @@ msgstr "BSSID" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:218 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:372 msgid "Band" -msgstr "" +msgstr "Pásmo" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:334 msgid "Bitrate" diff --git a/luci-mod-dashboard/po/sv/dashboard.po b/luci-mod-dashboard/po/sv/dashboard.po index 8a4d75ba6..dfb6b80e9 100644 --- a/luci-mod-dashboard/po/sv/dashboard.po +++ b/luci-mod-dashboard/po/sv/dashboard.po @@ -1,8 +1,8 @@ msgid "" msgstr "" "Project-Id-Version: \n" -"PO-Revision-Date: 2026-08-13 09:16+0000\n" -"Last-Translator: Jonatan Nyberg \n" +"PO-Revision-Date: 2026-10-13 13:19+0000\n" +"Last-Translator: Pavel Borecki \n" "Language-Team: Swedish \n" "Language: sv\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 2026.9.dev0\n" +"X-Generator: Weblate 2026.11.dev0\n" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:97 msgid "%d clients" @@ -62,7 +62,7 @@ msgstr "BSSID" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:218 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:372 msgid "Band" -msgstr "" +msgstr "Band" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:334 msgid "Bitrate" diff --git a/luci-mod-dashboard/po/ta/dashboard.po b/luci-mod-dashboard/po/ta/dashboard.po index 2ba2566f4..050f17c1a 100644 --- a/luci-mod-dashboard/po/ta/dashboard.po +++ b/luci-mod-dashboard/po/ta/dashboard.po @@ -1,14 +1,14 @@ msgid "" msgstr "" -"PO-Revision-Date: 2025-06-15 15:48+0000\n" -"Last-Translator: தமிழ்நேரம் \n" +"PO-Revision-Date: 2026-10-13 13:20+0000\n" +"Last-Translator: Pavel Borecki \n" "Language-Team: Tamil \n" "Language: ta\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 5.12-dev\n" +"X-Generator: Weblate 2026.11.dev0\n" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:97 msgid "%d clients" @@ -60,7 +60,7 @@ msgstr "பி.எச்.ஐ.டி" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:218 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:372 msgid "Band" -msgstr "" +msgstr "பட்டை" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:334 msgid "Bitrate" diff --git a/luci-mod-dashboard/po/uk/dashboard.po b/luci-mod-dashboard/po/uk/dashboard.po index 8fec78353..d3a7e52d6 100644 --- a/luci-mod-dashboard/po/uk/dashboard.po +++ b/luci-mod-dashboard/po/uk/dashboard.po @@ -1,8 +1,8 @@ msgid "" msgstr "" "Project-Id-Version: \n" -"PO-Revision-Date: 2026-05-15 10:43+0000\n" -"Last-Translator: Dan \n" +"PO-Revision-Date: 2026-10-13 13:19+0000\n" +"Last-Translator: Pavel Borecki \n" "Language-Team: Ukrainian \n" "Language: uk\n" @@ -11,7 +11,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -"X-Generator: Weblate 2026.5.dev0\n" +"X-Generator: Weblate 2026.11.dev0\n" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:97 msgid "%d clients" @@ -64,7 +64,7 @@ msgstr "BSSID" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:218 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:372 msgid "Band" -msgstr "" +msgstr "Діапазон" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:334 msgid "Bitrate" @@ -378,7 +378,7 @@ msgstr "" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:54 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:245 msgid "Total" -msgstr "Усього" +msgstr "Загалом" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:160 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:407 diff --git a/luci-mod-dashboard/po/vi/dashboard.po b/luci-mod-dashboard/po/vi/dashboard.po index 089033cd4..536118ada 100644 --- a/luci-mod-dashboard/po/vi/dashboard.po +++ b/luci-mod-dashboard/po/vi/dashboard.po @@ -1,8 +1,8 @@ msgid "" msgstr "" "Project-Id-Version: \n" -"PO-Revision-Date: 2026-04-20 17:56+0000\n" -"Last-Translator: Mytai20100 \n" +"PO-Revision-Date: 2026-10-13 21:56+0000\n" +"Last-Translator: Pavel Borecki \n" "Language-Team: Vietnamese \n" "Language: vi\n" @@ -10,7 +10,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 5.17.1-dev\n" +"X-Generator: Weblate 2026.11.dev0\n" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:97 msgid "%d clients" @@ -61,7 +61,7 @@ msgstr "BSSID" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:218 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:372 msgid "Band" -msgstr "" +msgstr "Cấm" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:334 msgid "Bitrate" diff --git a/luci-mod-dashboard/po/zh_Hant/dashboard.po b/luci-mod-dashboard/po/zh_Hant/dashboard.po index d09d2ee86..47d5f60f7 100644 --- a/luci-mod-dashboard/po/zh_Hant/dashboard.po +++ b/luci-mod-dashboard/po/zh_Hant/dashboard.po @@ -1,14 +1,15 @@ msgid "" msgstr "" -"PO-Revision-Date: 2026-04-14 04:12+0000\n" -"Last-Translator: ZW \n" +"PO-Revision-Date: 2026-09-30 11:47+0000\n" +"Last-Translator: 加尼瑪空格把變數都破壞了! " +"\n" "Language-Team: Chinese (Traditional Han script) \n" "Language: zh_Hant\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 5.17-dev\n" +"X-Generator: Weblate 2026.10.dev0\n" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:97 msgid "%d clients" @@ -59,7 +60,7 @@ msgstr "BSSID" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:218 #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:372 msgid "Band" -msgstr "" +msgstr "頻段" #: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:334 msgid "Bitrate" diff --git a/luci-theme-argon/Makefile b/luci-theme-argon/Makefile index d9adf4c7b..2757187c6 100644 --- a/luci-theme-argon/Makefile +++ b/luci-theme-argon/Makefile @@ -7,11 +7,11 @@ include $(TOPDIR)/rules.mk LUCI_TITLE:=Argon Theme -LUCI_DEPENDS:=+luci-base +USE_APK:wget-any +!USE_APK:wget +jsonfilter +ucode-mod-math +LUCI_DEPENDS:=+luci-base +USE_APK:wget-any +!USE_APK:wget +jsonfilter +ucode-mod-math +flock +coreutils-timeout # Keep existing translation package names and the argon-config message domain. LUCI_BASENAME:=argon-config PKG_VERSION:=3.0.0 -PKG_RELEASE:=30 +PKG_RELEASE:=31 PKG_LICENSE:=Apache-2.0 MIT # LuCI derives translations independently of the theme version. Keep release diff --git a/luci-theme-argon/README.md b/luci-theme-argon/README.md index 83174c156..08940d5bc 100644 --- a/luci-theme-argon/README.md +++ b/luci-theme-argon/README.md @@ -89,6 +89,10 @@ Open **System → Argon Config** for login layouts, colors, glass effects, wallp Local image and video backgrounds are supported, along with Bing, Unsplash and Wallhaven wallpapers. Unsplash requires an API access key. Browser icons and login logos accept PNG files, 16–1024 pixels per side, up to 1 MiB; browser icons must be square. +Under **Theme updates**, check the latest stable release, read its release notes and download the package matching your firmware's package manager. Checks use the router's connection to GitHub and cache successful results for five minutes. + +When a newer version is available, choose **Update now** and confirm to install the theme using the firmware’s native APK or OPKG package manager, preserving your Argon configuration. The page shows download, verification and installation status plus installation logs, and resumes monitoring after a page refresh. Reload the page after installation. Automatic installation requires a matching release package and SHA256 digest and does not perform downgrades. It updates the main theme package; separate translation packages remain managed by the system package manager. + ## Screenshots Light and dark views of the overview and both login layouts, on desktop and mobile. diff --git a/luci-theme-argon/README_ZH.md b/luci-theme-argon/README_ZH.md index fa418e99e..991dbf545 100644 --- a/luci-theme-argon/README_ZH.md +++ b/luci-theme-argon/README_ZH.md @@ -89,6 +89,10 @@ apk add --allow-untrusted ./luci-theme-argon-*.apk 背景支持本地图片、视频,以及 Bing、Unsplash、Wallhaven 在线壁纸;Unsplash 需填写 API Access Key。网站图标和登录 Logo 支持 PNG,每边 16–1024 像素、最大 1 MiB,网站图标需为正方形。 +在**主题更新**中手动检查最新稳定版、查看更新日志,并下载与固件包管理器匹配的安装包。检查通过路由器连接 GitHub,成功结果缓存五分钟。 + +检测到更高版本后,可点击**立即更新**并确认,通过固件自带的 APK 或 OPKG 安装主题,保留当前 Argon 配置。页面显示下载、校验、安装状态及安装日志,刷新页面后可继续查看进度;安装完成后重新加载页面。自动安装要求正式发布提供对应安装包及 SHA256 校验值,不执行降级。此功能更新主题主包,独立语言包仍由系统包管理器管理。 + ## 效果展示 亮暗两色,展示桌面与手机端的首页和两套登录界面。 diff --git a/luci-theme-argon/htdocs/luci-static/argon/css/cascade.css b/luci-theme-argon/htdocs/luci-static/argon/css/cascade.css index f16524c62..7809efc11 100644 --- a/luci-theme-argon/htdocs/luci-static/argon/css/cascade.css +++ b/luci-theme-argon/htdocs/luci-static/argon/css/cascade.css @@ -1210,9 +1210,9 @@ select[multiple] { .login-page .login-form .form-login .errorbox { padding: 0.75rem 1rem; overflow-wrap: anywhere; - border-inline-start: 3px solid var(--warning); + border: 1px solid var(--border-color); border-radius: var(--radius-control); - background: var(--surface-color); + background: color-mix(in srgb, var(--warning) 6%, var(--surface-color)); color: var(--text-strong); line-height: 1.5; text-align: start; @@ -1927,10 +1927,9 @@ span.spinning { margin: clamp(1rem, 4vh, 2rem) auto; padding: var(--field-gap) var(--section-inset); gap: var(--field-gap); - border: 1px solid transparent; - border-inline-start: 3px solid var(--status-accent); + border: 1px solid var(--border-color); border-radius: var(--radius-dialog) !important; - background-color: var(--surface-raised) !important; + background-color: color-mix(in srgb, var(--status-accent) 4%, var(--surface-raised)) !important; color: var(--text-strong); box-shadow: var(--section-shadow); font-size: 0.875rem; @@ -3241,6 +3240,29 @@ header .header-actions { .cbi-input-file { appearance: auto !important; } +.cbi-input-file[type="file"] { + padding: 0; + padding-inline-end: 0.75rem; + line-height: calc(2.5rem - 2px); + overflow: hidden; + cursor: pointer; +} +.cbi-input-file[type="file"]::file-selector-button { + box-sizing: border-box; + height: 100%; + margin: 0; + margin-inline-end: var(--action-gap); + padding: 0 0.75rem; + border: 0; + border-inline-end: 1px solid var(--control-border); + border-radius: 0; + font: inherit; + color: var(--control-text); + background-color: var(--surface-active); + vertical-align: top; + cursor: inherit; + appearance: none; +} .cbi-input-file::-webkit-file-upload-button { display: inline-block !important; } @@ -4002,8 +4024,7 @@ body:not(.Interfaces) .cbi-rowstyle-2:first-child { width: auto; margin: 0; padding: 0.75rem 1rem; - border: 1px solid transparent; - border-inline-start: 3px solid var(--dialog-feedback-accent); + border: 1px solid var(--border-color); border-radius: var(--radius-panel) !important; background-color: color-mix(in srgb, var(--dialog-feedback-accent) 10%, var(--surface-color)) !important; color: var(--text-strong); @@ -4979,6 +5000,105 @@ pre.command-output { max-width: 100%; } } +[data-page="admin-system-argon-config"] #argon-update [hidden] { + display: none !important; +} +[data-page="admin-system-argon-config"] .argon-update-content { + display: flex; + flex-direction: column; + gap: var(--field-gap); + padding: var(--field-gap) var(--section-inset); +} +[data-page="admin-system-argon-config"] .argon-update-content > p { + margin: 0; + padding: 0; + line-height: 1.5; +} +[data-page="admin-system-argon-config"] .argon-update-versions { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(min(100%, 16rem), 1fr)); + gap: var(--field-gap); + margin: 0; +} +[data-page="admin-system-argon-config"] .argon-update-versions dt { + margin-bottom: var(--control-gap); + color: var(--muted-text); + font-size: 0.8125rem; +} +[data-page="admin-system-argon-config"] .argon-update-versions dd { + margin: 0; + color: var(--text-strong); + line-height: 1.5; + overflow-wrap: anywhere; +} +[data-page="admin-system-argon-config"] .argon-update-status { + display: flex; + align-items: center; + gap: var(--control-gap); + color: var(--text-strong); +} +[data-page="admin-system-argon-config"] .argon-update-status[data-state="current"], +[data-page="admin-system-argon-config"] .argon-update-status[data-state="complete"] { + font-weight: 600; +} +[data-page="admin-system-argon-config"] .argon-update-status-icon { + display: inline-flex; + flex: 0 0 1.25rem; + align-items: center; + justify-content: center; + width: 1.25rem; + height: 1.25rem; + border: 1px solid var(--success); + border-radius: 50%; + color: var(--success); + font-size: 0.8125rem; + line-height: 1; +} +[data-page="admin-system-argon-config"] .argon-update-actions { + display: flex; + flex-wrap: wrap; + align-items: center; + gap: var(--control-gap); +} +[data-page="admin-system-argon-config"] .argon-update-actions > .cbi-button { + min-height: 2.5rem; + max-width: 100%; + height: auto; + white-space: normal; + overflow-wrap: anywhere; +} +[data-page="admin-system-argon-config"] #argon-update .argon-update-actions > .cbi-button-neutral { + color: var(--text-strong); + border: 1px solid var(--border-color); + background-color: var(--surface-muted); +} +[data-page="admin-system-argon-config"] .argon-update-checked { + color: var(--muted-text); + font-size: 0.8125rem; +} +[data-page="admin-system-argon-config"] .argon-update-details { + min-width: 0; +} +[data-page="admin-system-argon-config"] .argon-update-details > summary { + cursor: pointer; + color: var(--text-strong); + line-height: 1.5; +} +[data-page="admin-system-argon-config"] .argon-update-notes { + max-height: 22rem; + margin: var(--control-gap) 0 0; + padding: var(--field-gap); + overflow: auto; + overscroll-behavior: contain; + border: 1px solid var(--border-color); + border-radius: var(--radius-panel); + background-color: var(--surface-muted); + color: var(--text-strong); + font: inherit; + line-height: 1.6; + white-space: pre-wrap; + overflow-wrap: anywhere; +} [data-page="admin-system-argon-config"] .argon-color-picker { display: flex; align-items: center; @@ -5572,6 +5692,115 @@ pre.command-output { background: var(--input-bg); color: var(--text-color); } +#maincontent > .alert-message.notice:has(a[href$="/admin/system/attendedsysupgrade"]) { + display: grid !important; + grid-template-columns: minmax(0, 1fr) auto; + align-items: start; + gap: var(--action-gap) var(--field-gap); + padding: var(--field-gap) var(--section-inset); + border: 1px solid var(--border-color); + border-radius: var(--radius-card) !important; + background-color: var(--surface-raised) !important; + color: var(--text-color); + box-shadow: var(--section-shadow); + font-size: 0.875rem; + font-weight: 400; + line-height: 1.6; +} +#maincontent > .alert-message.notice:has(a[href$="/admin/system/attendedsysupgrade"]) > div:first-child { + display: contents; +} +#maincontent > .alert-message.notice:has(a[href$="/admin/system/attendedsysupgrade"]) > div:first-child > * { + grid-column: 1 / -1; + min-width: 0; + margin: 0; +} +#maincontent > .alert-message.notice:has(a[href$="/admin/system/attendedsysupgrade"]) > div:first-child > * + * { + margin-top: 0; +} +#maincontent > .alert-message.notice:has(a[href$="/admin/system/attendedsysupgrade"]) > div:first-child > h4 { + grid-column: 1; + align-self: center; + padding: 0; + background: none; + color: var(--text-strong); + font-size: 1rem; + font-weight: 600; + line-height: 1.5; + overflow-wrap: anywhere; +} +#maincontent > .alert-message.notice:has(a[href$="/admin/system/attendedsysupgrade"]) > div:first-child > .btn { + justify-self: start; +} +#maincontent > .alert-message.notice:has(a[href$="/admin/system/attendedsysupgrade"]) > div:last-child { + grid-column: 2; + grid-row: 1; + align-self: center; +} +#maincontent > .alert-message.notice:has(a[href$="/admin/system/attendedsysupgrade"]) > div:last-child > .btn { + margin: 0 !important; +} +#maincontent > .alert-message.notice:has(a[href$="/admin/system/attendedsysupgrade"]) .btn { + min-height: 2.25rem; + padding: 0.375rem 0.75rem; + border: 1px solid var(--border-color); + background-color: var(--surface-muted); + color: var(--text-strong); + font-size: 0.8125rem; + font-weight: 500; + line-height: 1.5; + overflow-wrap: anywhere; +} +#maincontent > .alert-message.notice:has(a[href$="/admin/system/attendedsysupgrade"]) a { + color: color-mix(in srgb, var(--link-color) 75%, var(--text-strong)); + text-decoration: underline; + text-underline-offset: 0.2em; + overflow-wrap: anywhere; +} +#maincontent > .alert-message.notice:has(a[href$="/admin/system/attendedsysupgrade"]) .table { + display: table; + width: 100%; + table-layout: fixed; + border-collapse: separate; + border-spacing: 0; + border: 1px solid var(--border-color); + border-radius: var(--radius-panel); + background-color: var(--surface-color); + overflow: hidden; + font-size: 0.8125rem; + font-variant-numeric: tabular-nums; +} +#maincontent > .alert-message.notice:has(a[href$="/admin/system/attendedsysupgrade"]) .table > :is(thead, tbody, tfoot) { + display: table-row-group; +} +#maincontent > .alert-message.notice:has(a[href$="/admin/system/attendedsysupgrade"]) .table .tr { + display: table-row; + background: none; +} +#maincontent > .alert-message.notice:has(a[href$="/admin/system/attendedsysupgrade"]) .table .th, +#maincontent > .alert-message.notice:has(a[href$="/admin/system/attendedsysupgrade"]) .table .td { + display: table-cell; + width: 33.333%; + padding: 0.625rem 0.75rem; + border-top: 1px solid var(--border-color); + color: var(--text-strong); + font-weight: 500; + line-height: 1.5; + text-align: start; + white-space: normal; + overflow-wrap: anywhere; +} +#maincontent > .alert-message.notice:has(a[href$="/admin/system/attendedsysupgrade"]) .table .th { + border-top: 0; + background-color: var(--surface-muted); +} +#maincontent > .alert-message.notice:has(a[href$="/admin/system/attendedsysupgrade"]) .table .td:first-child { + color: var(--muted-text); + font-weight: 400; +} +#maincontent > .alert-message.notice:has(a[href$="/admin/system/attendedsysupgrade"]) .table .td:last-child { + font-weight: 600; +} [data-page="admin-system-attendedsysupgrade"] #view > p, [data-page="admin-system-attendedsysupgrade-overview"] #view > p { display: flex; @@ -5665,12 +5894,74 @@ pre.command-output { vertical-align: text-top; top: auto; } -[data-page="admin-system-filetransfer"] #cbi-upload { +[data-page="admin-system-filetransfer"] .cbi-section > .cbi-section-node:not(.cbi-section-node-tabbed):where(:has(> .cbi-value, > [id] > .cbi-value)), +[data-page="admin-system-fileassistant"] .cbi-section > .cbi-section-node:not(.cbi-section-node-tabbed):where(:has(> .cbi-value, > [id] > .cbi-value)) { + padding-block: var(--field-gap); +} +[data-page="admin-system-filetransfer"] .cbi-section > .cbi-section-descr:not(:empty) ~ .cbi-section-node:not(.cbi-section-node-tabbed), +[data-page="admin-system-fileassistant"] .cbi-section > .cbi-section-descr:not(:empty) ~ .cbi-section-node:not(.cbi-section-node-tabbed) { + padding-block-start: 0; +} +[data-page="admin-system-filetransfer"] .cbi-section > .cbi-value, +[data-page="admin-system-fileassistant"] .cbi-section > .cbi-value { + padding-block: var(--field-gap); +} +[data-page="admin-system-filetransfer"] .cbi-section > .cbi-value ~ .cbi-value, +[data-page="admin-system-fileassistant"] .cbi-section > .cbi-value ~ .cbi-value, +[data-page="admin-system-filetransfer"] .cbi-section > .cbi-section-descr:not(:empty) ~ .cbi-value, +[data-page="admin-system-fileassistant"] .cbi-section > .cbi-section-descr:not(:empty) ~ .cbi-value { + padding-block-start: 0; +} +[data-page="admin-system-filetransfer"] .cbi-section > .cbi-section-create, +[data-page="admin-system-fileassistant"] .cbi-section > .cbi-section-create { + padding: var(--field-gap) var(--section-inset); +} +[data-page="admin-system-filetransfer"] #cbi-upload, +[data-page="admin-system-fileassistant"] #cbi-upload { margin-top: 0; } -[data-page="admin-system-filetransfer"] .cbi-section-table { +[data-page="admin-system-filetransfer"] .cbi-section-table, +[data-page="admin-system-fileassistant"] .cbi-section-table { box-shadow: 0 4px 8px rgba(0, 0, 0, 0.03); } +[data-page="admin-system-filetransfer"] .cbi-value:has( > :is(#ulfile, #dlfile)), +[data-page="admin-system-fileassistant"] .cbi-value:has( > :is(#ulfile, #dlfile)) { + display: grid; + grid-template-columns: fit-content(var(--form-label-width)) minmax(0, 25rem) auto; + align-items: center; + justify-content: start; + gap: var(--control-gap) var(--action-gap); +} +[data-page="admin-system-filetransfer"] .cbi-value:has( > :is(#ulfile, #dlfile)) > label.cbi-value, +[data-page="admin-system-fileassistant"] .cbi-value:has( > :is(#ulfile, #dlfile)) > label.cbi-value { + display: block !important; + width: auto !important; + min-width: 0; + padding: 0; + line-height: 1.5; + overflow-wrap: anywhere; +} +[data-page="admin-system-filetransfer"] .cbi-value:has( > :is(#ulfile, #dlfile)) > .cbi-input-file, +[data-page="admin-system-fileassistant"] .cbi-value:has( > :is(#ulfile, #dlfile)) > .cbi-input-file { + width: 100% !important; + min-width: 0; + max-width: 100%; +} +[data-page="admin-system-filetransfer"] .cbi-value:has( > :is(#ulfile, #dlfile)) > .cbi-button, +[data-page="admin-system-fileassistant"] .cbi-value:has( > :is(#ulfile, #dlfile)) > .cbi-button { + justify-self: start; + max-width: 100%; +} +@container (max-width: 40rem) { + [data-page="admin-system-filetransfer"] .cbi-value:has( > :is(#ulfile, #dlfile)), + [data-page="admin-system-fileassistant"] .cbi-value:has( > :is(#ulfile, #dlfile)) { + grid-template-columns: minmax(0, 1fr) auto; + } + [data-page="admin-system-filetransfer"] .cbi-value:has( > :is(#ulfile, #dlfile)) > label.cbi-value, + [data-page="admin-system-fileassistant"] .cbi-value:has( > :is(#ulfile, #dlfile)) > label.cbi-value { + grid-column: 1 / -1; + } +} [data-page="admin-system-fileassistant"] .fb-container td[class$="-icon"]::before { filter: var(--file-icon-filter); } @@ -6192,36 +6483,47 @@ pre.command-output { [data-page="admin-status-overview"] #view > div:first-child { gap: 0 !important; } -[data-page="admin-status"] div[style*="display:grid;grid-template-columns:repeat"], -[data-page="admin-status-overview"] div[style*="display:grid;grid-template-columns:repeat"] { - display: flex !important; - justify-content: space-evenly !important; - flex-wrap: wrap; +[data-page="admin-status"] #view div:has(> .ifacebox > .ifacebox-body > img[src*="/icons/port_"]), +[data-page="admin-status-overview"] #view div:has(> .ifacebox > .ifacebox-body > img[src*="/icons/port_"]) { + display: grid !important; + grid-template-columns: repeat(auto-fit, minmax(min(100%, 8.5rem), 1fr)) !important; + gap: var(--field-gap); + margin: 0 !important; + padding: var(--field-gap) var(--section-inset); } -[data-page="admin-status"] div[style*="display:grid;grid-template-columns:repeat"] .ifacebox, -[data-page="admin-status-overview"] div[style*="display:grid;grid-template-columns:repeat"] .ifacebox { - flex: 0 1 8.5rem; - min-width: 8rem !important; +[data-page="admin-status"] #view div:has(> .ifacebox > .ifacebox-body > img[src*="/icons/port_"]) > .ifacebox, +[data-page="admin-status-overview"] #view div:has(> .ifacebox > .ifacebox-body > img[src*="/icons/port_"]) > .ifacebox { + min-width: 0 !important; max-width: 100% !important; + margin: 0 !important; text-align: center; } -[data-page="admin-status"] div[style*="display:grid;grid-template-columns:repeat"] .ifacebox .ifacebox-body, -[data-page="admin-status-overview"] div[style*="display:grid;grid-template-columns:repeat"] .ifacebox .ifacebox-body { +[data-page="admin-status"] #view div:has(> .ifacebox > .ifacebox-body > img[src*="/icons/port_"]) > .ifacebox > .ifacebox-head:first-child, +[data-page="admin-status-overview"] #view div:has(> .ifacebox > .ifacebox-body > img[src*="/icons/port_"]) > .ifacebox > .ifacebox-head:first-child { + overflow-wrap: anywhere; +} +[data-page="admin-status"] #view div:has(> .ifacebox > .ifacebox-body > img[src*="/icons/port_"]) > .ifacebox .ifacebox-body, +[data-page="admin-status-overview"] #view div:has(> .ifacebox > .ifacebox-body > img[src*="/icons/port_"]) > .ifacebox .ifacebox-body { font-size: 0.75rem; padding: 0.75rem 0.5rem; } -[data-page="admin-status"] div[style*="display:grid;grid-template-columns:repeat"] .ifacebox .ifacebox-body .cbi-tooltip-container, -[data-page="admin-status-overview"] div[style*="display:grid;grid-template-columns:repeat"] .ifacebox .ifacebox-body .cbi-tooltip-container { +[data-page="admin-status"] #view div:has(> .ifacebox > .ifacebox-body > img[src*="/icons/port_"]) > .ifacebox .ifacebox-body .cbi-tooltip-container, +[data-page="admin-status-overview"] #view div:has(> .ifacebox > .ifacebox-body > img[src*="/icons/port_"]) > .ifacebox .ifacebox-body .cbi-tooltip-container { font-size: inherit !important; direction: ltr; unicode-bidi: isolate; } -[dir="rtl"] [data-page="admin-status"] div[style*="display:grid;grid-template-columns:repeat"] .ifacebox .ifacebox-body .cbi-tooltip-container .cbi-tooltip, -[dir="rtl"] [data-page="admin-status-overview"] div[style*="display:grid;grid-template-columns:repeat"] .ifacebox .ifacebox-body .cbi-tooltip-container .cbi-tooltip { +[dir="rtl"] [data-page="admin-status"] #view div:has(> .ifacebox > .ifacebox-body > img[src*="/icons/port_"]) > .ifacebox .ifacebox-body .cbi-tooltip-container .cbi-tooltip, +[dir="rtl"] [data-page="admin-status-overview"] #view div:has(> .ifacebox > .ifacebox-body > img[src*="/icons/port_"]) > .ifacebox .ifacebox-body .cbi-tooltip-container .cbi-tooltip { direction: rtl; } -[data-page="admin-status"] div[style*="display:grid;grid-template-columns:repeat"] .ifacebox > .ifacebox-body:last-child, -[data-page="admin-status-overview"] div[style*="display:grid;grid-template-columns:repeat"] .ifacebox > .ifacebox-body:last-child { +[data-page="admin-status"] #view div:has(> .ifacebox > .ifacebox-body > img[src*="/icons/port_"]) > .ifacebox > .ifacebox-body:nth-child(2), +[data-page="admin-status-overview"] #view div:has(> .ifacebox > .ifacebox-body > img[src*="/icons/port_"]) > .ifacebox > .ifacebox-body:nth-child(2) { + flex-grow: 1; + overflow-wrap: anywhere; +} +[data-page="admin-status"] #view div:has(> .ifacebox > .ifacebox-body > img[src*="/icons/port_"]) > .ifacebox > .ifacebox-body:last-child, +[data-page="admin-status-overview"] #view div:has(> .ifacebox > .ifacebox-body > img[src*="/icons/port_"]) > .ifacebox > .ifacebox-body:last-child { padding: 0.5rem 0.625rem; } [data-page="admin-status"] .argon-port-traffic, @@ -7292,6 +7594,333 @@ pre.command-output { [data-page="admin-vpn-passwall"] h4 { background: transparent; } +[data-page="admin-vpn-passwall"] .cbi-section > .cbi-section-node:not(.cbi-section-node-tabbed):where(:has(> .cbi-value, > [id] > .cbi-value)), +[data-page^="admin-vpn-passwall-"] .cbi-section > .cbi-section-node:not(.cbi-section-node-tabbed):where(:has(> .cbi-value, > [id] > .cbi-value)), +[data-page="admin-services-passwall"] .cbi-section > .cbi-section-node:not(.cbi-section-node-tabbed):where(:has(> .cbi-value, > [id] > .cbi-value)), +[data-page^="admin-services-passwall-"] .cbi-section > .cbi-section-node:not(.cbi-section-node-tabbed):where(:has(> .cbi-value, > [id] > .cbi-value)) { + padding-block: var(--field-gap); +} +[data-page="admin-vpn-passwall"] .cbi-section > .cbi-section-descr:not(:empty) ~ .cbi-section-node:not(.cbi-section-node-tabbed), +[data-page^="admin-vpn-passwall-"] .cbi-section > .cbi-section-descr:not(:empty) ~ .cbi-section-node:not(.cbi-section-node-tabbed), +[data-page="admin-services-passwall"] .cbi-section > .cbi-section-descr:not(:empty) ~ .cbi-section-node:not(.cbi-section-node-tabbed), +[data-page^="admin-services-passwall-"] .cbi-section > .cbi-section-descr:not(:empty) ~ .cbi-section-node:not(.cbi-section-node-tabbed) { + padding-block-start: 0; +} +[data-page="admin-vpn-passwall"] .cbi-section > .cbi-value, +[data-page^="admin-vpn-passwall-"] .cbi-section > .cbi-value, +[data-page="admin-services-passwall"] .cbi-section > .cbi-value, +[data-page^="admin-services-passwall-"] .cbi-section > .cbi-value { + padding-block: var(--field-gap); +} +[data-page="admin-vpn-passwall"] .cbi-section > .cbi-value ~ .cbi-value, +[data-page^="admin-vpn-passwall-"] .cbi-section > .cbi-value ~ .cbi-value, +[data-page="admin-services-passwall"] .cbi-section > .cbi-value ~ .cbi-value, +[data-page^="admin-services-passwall-"] .cbi-section > .cbi-value ~ .cbi-value, +[data-page="admin-vpn-passwall"] .cbi-section > .cbi-section-descr:not(:empty) ~ .cbi-value, +[data-page^="admin-vpn-passwall-"] .cbi-section > .cbi-section-descr:not(:empty) ~ .cbi-value, +[data-page="admin-services-passwall"] .cbi-section > .cbi-section-descr:not(:empty) ~ .cbi-value, +[data-page^="admin-services-passwall-"] .cbi-section > .cbi-section-descr:not(:empty) ~ .cbi-value { + padding-block-start: 0; +} +[data-page="admin-vpn-passwall"] .cbi-section > .cbi-section-create, +[data-page^="admin-vpn-passwall-"] .cbi-section > .cbi-section-create, +[data-page="admin-services-passwall"] .cbi-section > .cbi-section-create, +[data-page^="admin-services-passwall-"] .cbi-section > .cbi-section-create { + padding: var(--field-gap) var(--section-inset); +} +[data-page="admin-vpn-passwall"] .lv-dropdown-container, +[data-page^="admin-vpn-passwall-"] .lv-dropdown-container, +[data-page="admin-services-passwall"] .lv-dropdown-container, +[data-page^="admin-services-passwall-"] .lv-dropdown-container { + display: inline-flex; + flex-wrap: wrap; + align-items: center; + gap: var(--control-gap); + min-width: 0; + max-width: 100%; + vertical-align: middle; + white-space: normal; +} +[data-page="admin-vpn-passwall"] .lv-dropdown-container > .node-actions, +[data-page^="admin-vpn-passwall-"] .lv-dropdown-container > .node-actions, +[data-page="admin-services-passwall"] .lv-dropdown-container > .node-actions, +[data-page^="admin-services-passwall-"] .lv-dropdown-container > .node-actions { + margin: 0 !important; +} +[data-page="admin-vpn-passwall"] .lv-dropdown-display, +[data-page^="admin-vpn-passwall-"] .lv-dropdown-display, +[data-page="admin-services-passwall"] .lv-dropdown-display, +[data-page^="admin-services-passwall-"] .lv-dropdown-display { + display: inline-flex; + flex: 0 1 var(--form-control-min-width); + align-items: center; + gap: var(--control-gap); + width: var(--form-control-min-width) !important; + min-width: 0 !important; + max-width: 100%; + height: 2.5rem !important; + min-height: 2.5rem !important; + margin: 0 !important; + padding: 0.5rem 0.75rem !important; + line-height: 1.5rem !important; + border: 1px solid var(--control-border) !important; + border-radius: var(--radius-control) !important; + background-color: var(--select-bg) !important; + color: var(--control-text) !important; +} +[data-page="admin-vpn-passwall"] .lv-dropdown-display:focus, +[data-page^="admin-vpn-passwall-"] .lv-dropdown-display:focus, +[data-page="admin-services-passwall"] .lv-dropdown-display:focus, +[data-page^="admin-services-passwall-"] .lv-dropdown-display:focus { + --control-border: var(--control-focus); + outline: 0; + box-shadow: var(--control-focus-shadow); +} +[data-page="admin-vpn-passwall"] .lv-dropdown-label, +[data-page^="admin-vpn-passwall-"] .lv-dropdown-label, +[data-page="admin-services-passwall"] .lv-dropdown-label, +[data-page^="admin-services-passwall-"] .lv-dropdown-label { + flex: 1 1 auto; + width: auto; + min-width: 0; + text-align: start; + text-overflow: ellipsis; +} +[data-page="admin-vpn-passwall"] .lv-arrow-down, +[data-page^="admin-vpn-passwall-"] .lv-arrow-down, +[data-page="admin-services-passwall"] .lv-arrow-down, +[data-page^="admin-services-passwall-"] .lv-arrow-down, +[data-page="admin-vpn-passwall"] .lv-arrow-down-small, +[data-page^="admin-vpn-passwall-"] .lv-arrow-down-small, +[data-page="admin-services-passwall"] .lv-arrow-down-small, +[data-page^="admin-services-passwall-"] .lv-arrow-down-small, +[data-page="admin-vpn-passwall"] .lv-arrow-right, +[data-page^="admin-vpn-passwall-"] .lv-arrow-right, +[data-page="admin-services-passwall"] .lv-arrow-right, +[data-page^="admin-services-passwall-"] .lv-arrow-right { + flex: 0 0 1rem; + width: 1rem; + height: 1rem; + margin: 0; + border: 0; + background-color: currentColor; + -webkit-mask: var(--dropdown-arrow-icon) center / contain no-repeat; + mask: var(--dropdown-arrow-icon) center / contain no-repeat; +} +[data-page="admin-vpn-passwall"] .lv-arrow-right, +[data-page^="admin-vpn-passwall-"] .lv-arrow-right, +[data-page="admin-services-passwall"] .lv-arrow-right, +[data-page^="admin-services-passwall-"] .lv-arrow-right { + rotate: -90deg; +} +[data-page="admin-vpn-passwall"] .lv-dropdown-panel, +[data-page^="admin-vpn-passwall-"] .lv-dropdown-panel, +[data-page="admin-services-passwall"] .lv-dropdown-panel, +[data-page^="admin-services-passwall-"] .lv-dropdown-panel { + max-height: min(50vh, 18rem) !important; + line-height: 1.5 !important; + border: 1px solid var(--border-color) !important; + border-radius: var(--radius-panel) !important; + background-color: var(--surface-panel) !important; + color: var(--dropdown-text) !important; + box-shadow: var(--dropdown-shadow); +} +[data-page="admin-vpn-passwall"] .lv-dropdown-panel > div:first-child, +[data-page^="admin-vpn-passwall-"] .lv-dropdown-panel > div:first-child, +[data-page="admin-services-passwall"] .lv-dropdown-panel > div:first-child, +[data-page^="admin-services-passwall-"] .lv-dropdown-panel > div:first-child { + border-color: var(--border-color) !important; +} +[data-page="admin-vpn-passwall"] .lv-dropdown-panel .lv-dropdown-search, +[data-page^="admin-vpn-passwall-"] .lv-dropdown-panel .lv-dropdown-search, +[data-page="admin-services-passwall"] .lv-dropdown-panel .lv-dropdown-search, +[data-page^="admin-services-passwall-"] .lv-dropdown-panel .lv-dropdown-search { + padding: 0.5rem 0.75rem; + border: 1px solid var(--control-border); + border-radius: var(--radius-control); +} +[data-page="admin-vpn-passwall"] .lv-dropdown-panel.cbi-listvalue-panel li[data-key], +[data-page^="admin-vpn-passwall-"] .lv-dropdown-panel.cbi-listvalue-panel li[data-key], +[data-page="admin-services-passwall"] .lv-dropdown-panel.cbi-listvalue-panel li[data-key], +[data-page^="admin-services-passwall-"] .lv-dropdown-panel.cbi-listvalue-panel li[data-key] { + min-height: 2.5rem; + padding: 0.5rem 0.75rem; + border-radius: var(--radius-small); + background-color: transparent; + color: inherit; + text-align: start !important; + white-space: normal; + overflow-wrap: anywhere; + transition: none; +} +[data-page="admin-vpn-passwall"] .lv-dropdown-panel.cbi-listvalue-panel li[data-key].is-selected, +[data-page^="admin-vpn-passwall-"] .lv-dropdown-panel.cbi-listvalue-panel li[data-key].is-selected, +[data-page="admin-services-passwall"] .lv-dropdown-panel.cbi-listvalue-panel li[data-key].is-selected, +[data-page^="admin-services-passwall-"] .lv-dropdown-panel.cbi-listvalue-panel li[data-key].is-selected, +[data-page="admin-vpn-passwall"] .lv-dropdown-panel.cbi-listvalue-panel li[data-key].is-selected:hover, +[data-page^="admin-vpn-passwall-"] .lv-dropdown-panel.cbi-listvalue-panel li[data-key].is-selected:hover, +[data-page="admin-services-passwall"] .lv-dropdown-panel.cbi-listvalue-panel li[data-key].is-selected:hover, +[data-page^="admin-services-passwall-"] .lv-dropdown-panel.cbi-listvalue-panel li[data-key].is-selected:hover { + background-color: var(--dropdown-selected-bg) !important; + color: var(--dropdown-selected-text) !important; + font-weight: 500 !important; +} +@media (hover: hover) { + [data-page="admin-vpn-passwall"] .lv-dropdown-panel.cbi-listvalue-panel li[data-key]:not(.is-selected):hover, + [data-page^="admin-vpn-passwall-"] .lv-dropdown-panel.cbi-listvalue-panel li[data-key]:not(.is-selected):hover, + [data-page="admin-services-passwall"] .lv-dropdown-panel.cbi-listvalue-panel li[data-key]:not(.is-selected):hover, + [data-page^="admin-services-passwall-"] .lv-dropdown-panel.cbi-listvalue-panel li[data-key]:not(.is-selected):hover { + background-color: var(--dropdown-hover-bg); + } +} +[data-page="admin-vpn-passwall"] .lv-dropdown-panel .lv-item-label, +[data-page^="admin-vpn-passwall-"] .lv-dropdown-panel .lv-item-label, +[data-page="admin-services-passwall"] .lv-dropdown-panel .lv-item-label, +[data-page^="admin-services-passwall-"] .lv-dropdown-panel .lv-item-label { + margin: 0 !important; +} +[data-page="admin-vpn-passwall"] .lv-dropdown-panel .lv-group-title, +[data-page^="admin-vpn-passwall-"] .lv-dropdown-panel .lv-group-title, +[data-page="admin-services-passwall"] .lv-dropdown-panel .lv-group-title, +[data-page^="admin-services-passwall-"] .lv-dropdown-panel .lv-group-title { + gap: var(--control-gap); + padding: 0.5rem 0.75rem; + border-radius: var(--radius-small); + line-height: 1.5; + white-space: normal; + overflow-wrap: anywhere; +} +[data-page="admin-vpn-passwall"] .lv-dropdown-panel .lv-group-title > b, +[data-page^="admin-vpn-passwall-"] .lv-dropdown-panel .lv-group-title > b, +[data-page="admin-services-passwall"] .lv-dropdown-panel .lv-group-title > b, +[data-page^="admin-services-passwall-"] .lv-dropdown-panel .lv-group-title > b, +[data-page="admin-vpn-passwall"] .lv-dropdown-panel .lv-group-title > span, +[data-page^="admin-vpn-passwall-"] .lv-dropdown-panel .lv-group-title > span, +[data-page="admin-services-passwall"] .lv-dropdown-panel .lv-group-title > span, +[data-page^="admin-services-passwall-"] .lv-dropdown-panel .lv-group-title > span { + margin: 0 !important; +} +[data-page="admin-vpn-passwall"] .lv-dropdown-panel .lv-group-title > span[id^="group-count-"], +[data-page^="admin-vpn-passwall-"] .lv-dropdown-panel .lv-group-title > span[id^="group-count-"], +[data-page="admin-services-passwall"] .lv-dropdown-panel .lv-group-title > span[id^="group-count-"], +[data-page^="admin-services-passwall-"] .lv-dropdown-panel .lv-group-title > span[id^="group-count-"] { + margin-inline-start: auto !important; + color: var(--muted-text) !important; +} +[data-page="admin-vpn-passwall"] .lv-dropdown-panel .lv-group-list, +[data-page^="admin-vpn-passwall-"] .lv-dropdown-panel .lv-group-list, +[data-page="admin-services-passwall"] .lv-dropdown-panel .lv-group-list, +[data-page^="admin-services-passwall-"] .lv-dropdown-panel .lv-group-list { + margin: var(--control-gap) 0 0; + padding-inline-start: var(--control-gap); +} +[data-page="admin-vpn-passwall"]:has(#maincontent) .lv-dropdown-panel .lv-group-title, +[data-page^="admin-vpn-passwall-"]:has(#maincontent) .lv-dropdown-panel .lv-group-title, +[data-page="admin-services-passwall"]:has(#maincontent) .lv-dropdown-panel .lv-group-title, +[data-page^="admin-services-passwall-"]:has(#maincontent) .lv-dropdown-panel .lv-group-title { + background-color: var(--surface-active) !important; +} +[data-page="admin-vpn-passwall"] .cbi-value-field > .share-toolbar, +[data-page^="admin-vpn-passwall-"] .cbi-value-field > .share-toolbar, +[data-page="admin-services-passwall"] .cbi-value-field > .share-toolbar, +[data-page^="admin-services-passwall-"] .cbi-value-field > .share-toolbar { + padding-block: 0; +} +[data-page="admin-vpn-passwall"] #_passwall_status_fieldset, +[data-page^="admin-vpn-passwall-"] #_passwall_status_fieldset, +[data-page="admin-services-passwall"] #_passwall_status_fieldset, +[data-page^="admin-services-passwall-"] #_passwall_status_fieldset { + padding-block: var(--control-gap); +} +[data-page="admin-vpn-passwall"] #_passwall_status_fieldset .status .block, +[data-page^="admin-vpn-passwall-"] #_passwall_status_fieldset .status .block, +[data-page="admin-services-passwall"] #_passwall_status_fieldset .status .block, +[data-page^="admin-services-passwall-"] #_passwall_status_fieldset .status .block { + margin-block: var(--control-gap); +} +[data-page="admin-vpn-passwall"] #_log_fieldset, +[data-page^="admin-vpn-passwall-"] #_log_fieldset, +[data-page="admin-services-passwall"] #_log_fieldset, +[data-page^="admin-services-passwall-"] #_log_fieldset { + display: flex; + flex-direction: column; + gap: var(--field-gap); + padding: var(--field-gap) var(--section-inset); +} +[data-page="admin-vpn-passwall"] #_log_fieldset > .cbi-button, +[data-page^="admin-vpn-passwall-"] #_log_fieldset > .cbi-button, +[data-page="admin-services-passwall"] #_log_fieldset > .cbi-button, +[data-page^="admin-services-passwall-"] #_log_fieldset > .cbi-button { + align-self: flex-start; +} +[data-page="admin-vpn-passwall"] #_log_fieldset > textarea, +[data-page^="admin-vpn-passwall-"] #_log_fieldset > textarea, +[data-page="admin-services-passwall"] #_log_fieldset > textarea, +[data-page^="admin-services-passwall-"] #_log_fieldset > textarea { + display: block; + max-width: 100%; + margin: 0 !important; +} +[data-page="admin-vpn-passwall"] #app_version, +[data-page^="admin-vpn-passwall-"] #app_version, +[data-page="admin-services-passwall"] #app_version, +[data-page^="admin-services-passwall-"] #app_version { + display: flex; + flex-direction: column; + gap: var(--field-gap); +} +[data-page="admin-vpn-passwall"] #app_version > .cbi-value > .cbi-value-field, +[data-page^="admin-vpn-passwall-"] #app_version > .cbi-value > .cbi-value-field, +[data-page="admin-services-passwall"] #app_version > .cbi-value > .cbi-value-field, +[data-page^="admin-services-passwall-"] #app_version > .cbi-value > .cbi-value-field { + display: grid; + grid-template-columns: minmax(0, 10rem) auto; + align-items: center; + justify-content: start; + gap: var(--control-gap) var(--action-gap); +} +[data-page="admin-vpn-passwall"] #app_version > .cbi-value > .cbi-value-field > span:first-child, +[data-page^="admin-vpn-passwall-"] #app_version > .cbi-value > .cbi-value-field > span:first-child, +[data-page="admin-services-passwall"] #app_version > .cbi-value > .cbi-value-field > span:first-child, +[data-page^="admin-services-passwall-"] #app_version > .cbi-value > .cbi-value-field > span:first-child { + grid-column: 1; + grid-row: 1; + min-width: 0; + line-height: 1.5; + overflow-wrap: anywhere; + unicode-bidi: plaintext; +} +[data-page="admin-vpn-passwall"] #app_version > .cbi-value > .cbi-value-field > input[data-update-app], +[data-page^="admin-vpn-passwall-"] #app_version > .cbi-value > .cbi-value-field > input[data-update-app], +[data-page="admin-services-passwall"] #app_version > .cbi-value > .cbi-value-field > input[data-update-app], +[data-page^="admin-services-passwall-"] #app_version > .cbi-value > .cbi-value-field > input[data-update-app] { + grid-column: 2; + justify-self: start; + max-width: 100%; +} +[data-page="admin-vpn-passwall"] #app_version > .cbi-value > .cbi-value-field > span[id$="-detail"], +[data-page^="admin-vpn-passwall-"] #app_version > .cbi-value > .cbi-value-field > span[id$="-detail"], +[data-page="admin-services-passwall"] #app_version > .cbi-value > .cbi-value-field > span[id$="-detail"], +[data-page^="admin-services-passwall-"] #app_version > .cbi-value > .cbi-value-field > span[id$="-detail"] { + grid-column: 1 / -1; + min-width: 0; + line-height: 1.5; + overflow-wrap: anywhere; +} +[data-page="admin-vpn-passwall"] #app_version > .cbi-value > .cbi-value-field > span[id$="-detail"]:empty, +[data-page^="admin-vpn-passwall-"] #app_version > .cbi-value > .cbi-value-field > span[id$="-detail"]:empty, +[data-page="admin-services-passwall"] #app_version > .cbi-value > .cbi-value-field > span[id$="-detail"]:empty, +[data-page^="admin-services-passwall-"] #app_version > .cbi-value > .cbi-value-field > span[id$="-detail"]:empty { + display: none; +} +@container (max-width: 40rem) { + [data-page="admin-vpn-passwall"] .cbi-value:has(> .cbi-value-field > .share-toolbar) > .cbi-value-title, + [data-page^="admin-vpn-passwall-"] .cbi-value:has(> .cbi-value-field > .share-toolbar) > .cbi-value-title, + [data-page="admin-services-passwall"] .cbi-value:has(> .cbi-value-field > .share-toolbar) > .cbi-value-title, + [data-page^="admin-services-passwall-"] .cbi-value:has(> .cbi-value-field > .share-toolbar) > .cbi-value-title { + display: none; + } +} [data-page^="admin-vpn-passwall2"] .tr, [data-page^="admin-services-passwall2"] .tr, [data-page^="admin-vpn-passwall2"] .td, diff --git a/luci-theme-argon/htdocs/luci-static/resources/argon-overview.js b/luci-theme-argon/htdocs/luci-static/resources/argon-overview.js index 8f7f85a00..ce385309f 100644 --- a/luci-theme-argon/htdocs/luci-static/resources/argon-overview.js +++ b/luci-theme-argon/htdocs/luci-static/resources/argon-overview.js @@ -11,7 +11,7 @@ return baseclass.extend({ var frame = null; var update = function() { frame = null; - view.querySelectorAll('.ifacebox[style*="min-width:70px"] > .ifacebox-body:last-child > .cbi-tooltip-container').forEach(function(container) { + view.querySelectorAll('.ifacebox:has(> .ifacebox-body > img[src*="/icons/port_"]) > .ifacebox-body:last-child > .cbi-tooltip-container').forEach(function(container) { if (container.querySelector('.argon-port-traffic')) return; diff --git a/luci-theme-argon/htdocs/luci-static/resources/argon/updates.js b/luci-theme-argon/htdocs/luci-static/resources/argon/updates.js new file mode 100644 index 000000000..12f5b8aaa --- /dev/null +++ b/luci-theme-argon/htdocs/luci-static/resources/argon/updates.js @@ -0,0 +1,321 @@ +'use strict'; +'require baseclass'; +'require rpc'; +'require ui'; +'require poll'; + +var callGet = rpc.declare({ object: 'luci.argon_update', method: 'get', expect: { '': {} }, raise: true }); +var callCheck = rpc.declare({ object: 'luci.argon_update', method: 'check', expect: { '': {} }, raise: true }); +var callStatus = rpc.declare({ object: 'luci.argon_update', method: 'status', expect: { '': {} }, raise: true }); +var callStart = rpc.declare({ object: 'luci.argon_update', method: 'start', params: ['tag', 'package'], expect: { '': {} }, raise: true }); +var releases = 'https://github.com/jerrykuku/luci-theme-argon/releases'; + +function version(value) { + if (typeof value !== 'string' || value.length > 80) + return null; + var m = value.match(/^v?([0-9]+(?:\.[0-9]+){1,3})(?:(?:~|_)(alpha|beta|rc)([0-9]+)|-(alpha|beta|rc)\.([0-9]+))?(?:-r?([0-9]+))?$/); + if (!m) + return null; + var parts = m[1].split('.').map(Number); + while (parts.length < 4) + parts.push(0); + parts.push(m[2] || m[4] ? { alpha: 0, beta: 1, rc: 2 }[m[2] || m[4]] : 3); + parts.push(Number(m[3] || m[5] || 0), Number(m[6] || 1)); + return parts.every(function(n) { return Number.isSafeInteger(n); }) ? parts : null; +} + +function compare(a, b) { + for (var i = 0; i < a.length; i++) { + if (a[i] !== b[i]) + return a[i] < b[i] ? -1 : 1; + } + return 0; +} + +function release(state) { + if (!state || typeof state.tag !== 'string' || !/^v?[0-9]+(?:\.[0-9]+){1,3}$/.test(state.tag)) + return null; + var manager = state.package_manager; + var file = state[manager === 'opkg' ? 'ipk' : 'apk']; + var match = typeof file === 'string' && (manager === 'opkg' ? + file.match(/^luci-theme-argon_([0-9][0-9.~a-z-]*)_all\.ipk$/) : manager === 'apk' ? + file.match(/^luci-theme-argon-([0-9][0-9._a-z-]*)\.apk$/) : null); + var parsed = match && version(match[1]); + var tag = version(state.tag); + if (!parsed || !tag || parsed[4] !== 3 || parsed.slice(0, 4).join('.') !== tag.slice(0, 4).join('.')) + match = null; + return { tag: state.tag, file: match ? file : null, version: match ? match[1] : state.tag, + parsed: match ? parsed : null }; +} + +return baseclass.extend({ + load: function() { + return callGet().catch(function() { return null; }); + }, + + render: function(state, map) { + var loadedVersion = state && state.current_version; + var observedInstallation = !!(state && state.upgrade && state.upgrade.active); + var lastPhase = state && state.upgrade && state.upgrade.phase; + var busy = false; + var monitoring = false; + var confirming = false; + var starting = false; + var attached = false; + var current = E('dd'); + var latest = E('dd'); + var statusIcon = E('span', { 'class': 'argon-update-status-icon', 'aria-hidden': 'true', 'hidden': true }, '✓'); + var statusText = E('span'); + var status = E('p', { 'class': 'argon-update-status', 'role': 'status', 'aria-live': 'polite', 'aria-atomic': 'true' }, [statusIcon, statusText]); + var checked = E('p', { 'class': 'argon-update-checked' }); + var notes = E('pre', { 'class': 'argon-update-notes' }); + var details = E('details', { 'class': 'argon-update-details', 'hidden': true }, [ + E('summary', {}, _('Release notes')), notes + ]); + var releaseLink = E('a', { 'class': 'cbi-button cbi-button-neutral', 'href': releases + '/latest', 'target': '_blank', 'rel': 'noopener noreferrer' }, _('View release')); + var downloadLink = E('a', { 'class': 'cbi-button cbi-button-neutral', 'hidden': true, 'target': '_blank', 'rel': 'noopener noreferrer' }, _('Download package')); + var button = E('button', { 'type': 'button', 'class': 'cbi-button cbi-button-action', 'click': check }, _('Check for updates')); + var installButton = E('button', { 'type': 'button', 'class': 'cbi-button cbi-button-action', 'hidden': true, 'click': confirmInstall }, _('Update now')); + var reloadButton = E('button', { 'type': 'button', 'class': 'cbi-button cbi-button-neutral', 'hidden': true, + 'click': function() { window.location.reload(); } }, _('Reload page')); + var installHint = E('p', { 'class': 'argon-update-checked', 'hidden': true }, + _('Automatic installation is unavailable. Download the package to update manually.')); + var installLog = E('pre', { 'class': 'argon-update-notes' }); + var logDetails = E('details', { 'class': 'argon-update-details', 'hidden': true }, [ + E('summary', {}, _('Installation log')), installLog + ]); + var content = E('div', { 'class': 'argon-update-content' }, [ + status, + E('dl', { 'class': 'argon-update-versions' }, [ + E('div', {}, [E('dt', {}, _('Current version')), current]), + E('div', {}, [E('dt', {}, _('Latest stable version')), latest]) + ]), + E('div', { 'class': 'argon-update-actions' }, [button, installButton, reloadButton, releaseLink, downloadLink]), + installHint, checked, logDetails, details + ]); + + function needsReload() { + return !!(state && state.upgrade && state.upgrade.phase === 'complete' && + (observedInstallation || loadedVersion && state.current_version !== loadedVersion)); + } + + function showStatus(message, kind) { + statusText.textContent = message; + status.setAttribute('data-state', kind || 'idle'); + statusIcon.hidden = kind !== 'current' && kind !== 'complete'; + } + + function mayInstall() { + var remote = release(state); + var local = version(state && state.current_version); + return !!(remote && remote.file && remote.parsed && local && compare(local, remote.parsed) < 0 && + state.can_upgrade && map && !map.readonly && !needsReload()); + } + + function refresh() { + var remote = release(state); + var local = version(state && state.current_version); + var job = state && state.upgrade || {}; + if (job.active) + observedInstallation = true; + var active = !!job.active || monitoring; + var order = remote && remote.parsed && local ? compare(local, remote.parsed) : null; + var available = order !== null && order < 0; + var reloadNeeded = needsReload(); + if (job.phase === 'complete' && lastPhase !== 'complete') { + details.open = false; + logDetails.open = false; + } + lastPhase = job.phase; + current.textContent = state && state.current_version || _('Unknown version'); + latest.textContent = remote ? remote.version : _('Not checked yet.'); + button.disabled = busy || active || confirming; + button.className = 'cbi-button ' + (remote ? 'cbi-button-neutral' : 'cbi-button-action'); + installButton.hidden = !mayInstall(); + installButton.disabled = busy || active || confirming; + installHint.hidden = !(available && !state.can_upgrade && map && !map.readonly && !active && !reloadNeeded); + reloadButton.hidden = !reloadNeeded || active; + button.textContent = busy ? _('Checking for updates...') : _('Check for updates'); + content.setAttribute('aria-busy', String(busy)); + releaseLink.href = remote ? releases + '/tag/' + encodeURIComponent(remote.tag) : releases + '/latest'; + downloadLink.hidden = !(remote && remote.file) || active || reloadNeeded || order !== null && order >= 0; + if (!downloadLink.hidden) + downloadLink.href = releases + '/download/' + encodeURIComponent(remote.tag) + '/' + encodeURIComponent(remote.file); + checked.hidden = !(remote && Number.isSafeInteger(state.checked_at) && state.checked_at > 0); + if (!checked.hidden) + checked.textContent = _('Last checked: %s').format(new Date(state.checked_at * 1000).toLocaleString()); + details.hidden = !remote; + notes.textContent = remote && typeof state.notes === 'string' && state.notes.trim() ? + state.notes.slice(0, 32768) + (state.notes.length > 32768 ? '\n…' : '') : _('No release notes were published.'); + logDetails.hidden = typeof job.log !== 'string' || !job.log.trim(); + installLog.textContent = typeof job.log === 'string' ? job.log.slice(-8192) : ''; + if (active || job.phase === 'failed' || reloadNeeded) + showStatus(jobMessage(job), active ? 'working' : reloadNeeded ? 'complete' : 'error'); + else if (busy) + showStatus(_('Checking for updates...'), 'working'); + else if (!state || state.result !== 0) + showStatus(_('Unable to check for updates. Check the router\'s connection to GitHub and try again.'), 'error'); + else if (!remote) + showStatus(_('Not checked yet.')); + else if (!local || !remote.parsed) + showStatus(_('Unable to compare this version. View the release for details.')); + else + showStatus(order < 0 ? _('Update available.') : order === 0 ? + _('Your theme is up to date.') : _('The installed version is newer than the latest stable release.'), + order === 0 ? 'current' : available ? 'available' : 'idle'); + } + + function jobMessage(job) { + var phases = { + starting: _('Preparing the update...'), + downloading: _('Downloading the update...'), + verifying: _('Verifying the package...'), + installing: _('Installing the update. Please wait...'), + complete: _('Update installed. Reload the page to use the new version.') + }; + var errors = { + network: _('Download failed. Check the router\'s connection to GitHub and try again.'), + checksum: _('Package verification failed. Check for updates and try again.'), + space: _('Not enough free space to install the update.'), + version: _('The installed version has changed. Check for updates again.'), + metadata: _('Release information has changed or expired. Check for updates again.'), + interrupted: _('The update was interrupted. Check the installed version before trying again.'), + install: _('Installation failed. See the installation log for details.') + }; + return job.phase === 'failed' ? errors[job.error] || errors.install : + phases[job.phase] || _('Preparing the update...'); + } + + function stopMonitoring() { + monitoring = false; + poll.remove(watch); + } + + function watch() { + if (!content.isConnected) { + if (attached) + stopMonitoring(); + return Promise.resolve(); + } + attached = true; + return callStatus().then(function(result) { + if (result.result !== 0 || !result.upgrade) + throw new Error('status unavailable'); + state = Object.assign({}, state, { current_version: result.current_version, upgrade: result.upgrade }); + if (result.upgrade.active) { + refresh(); + return; + } + if (starting) + return; + stopMonitoring(); + return callGet().then(function(result) { + if (result.result === 0) + state = result; + }).catch(function() {}).then(function() { + if (state.upgrade && state.upgrade.active) + monitor(); + refresh(); + }); + }).catch(function() { + showStatus(_('Unable to read update progress. Reconnecting...'), 'error'); + }); + } + + function monitor() { + if (!monitoring) { + monitoring = true; + poll.add(watch, 2); + } + } + + function install() { + var remote = release(state); + if (busy || monitoring || !mayInstall()) + return Promise.resolve(); + starting = true; + monitor(); + refresh(); + return callStart(remote.tag, remote.file).then(function(result) { + starting = false; + if (result.result !== 0) { + stopMonitoring(); + refresh(); + showStatus(result.result === 3 ? _('Release information has changed or expired. Check for updates again.') : + result.result === 5 ? _('The installed version has changed. Check for updates again.') : + _('Unable to start the update. Check for updates and try again.'), 'error'); + if (result.result === 3 || result.result === 5) { + state.can_upgrade = false; + installButton.hidden = true; + } + if (result.result === 4) { + monitor(); + return watch(); + } + return; + } + state.upgrade = result.upgrade; + monitor(); + refresh(); + }).catch(function() { + starting = false; + // A lost reply does not mean the worker failed to start. Poll before + // allowing another installation request. + showStatus(_('Unable to read update progress. Reconnecting...'), 'error'); + }); + } + + function confirmInstall() { + var remote = release(state); + if (busy || monitoring || confirming || !mayInstall()) + return; + confirming = true; + refresh(); + ui.showModal(_('Update Argon to %s?').format(remote.version), [ + E('p', {}, _('The theme will be updated using the system package manager. Your Argon settings will be preserved.')), + E('div', { 'class': 'right' }, [ + E('button', { 'type': 'button', 'class': 'btn', 'click': function() { + confirming = false; + ui.hideModal(); + refresh(); + } }, _('Cancel')), + ' ', + E('button', { 'type': 'button', 'class': 'cbi-button cbi-button-action', 'click': function() { + confirming = false; + ui.hideModal(); + return install(); + } }, _('Update now')) + ]) + ]); + } + + function check() { + if (busy || monitoring || confirming) + return Promise.resolve(); + busy = true; + refresh(); + return callCheck().then(function(result) { + if (result.result !== 0 || !release(result)) + throw new Error('update check failed'); + state = result; + busy = false; + refresh(); + var remote = release(state); + var local = version(state.current_version); + details.open = !!(remote && remote.parsed && local && compare(local, remote.parsed) < 0 && !needsReload()); + if (state.upgrade && state.upgrade.active) + monitor(); + }).catch(function() { + busy = false; + refresh(); + showStatus(_('Unable to check for updates. Check the router\'s connection to GitHub and try again.'), 'error'); + }); + } + if (state && state.upgrade && state.upgrade.active) + monitor(); + refresh(); + return E('div', { 'class': 'cbi-section', 'id': 'argon-update' }, [ + E('h3', {}, _('Theme updates')), content + ]); + } +}); diff --git a/luci-theme-argon/htdocs/luci-static/resources/view/argon-config.js b/luci-theme-argon/htdocs/luci-static/resources/view/argon-config.js index a4ae5a6eb..2e9f1b9b1 100644 --- a/luci-theme-argon/htdocs/luci-static/resources/view/argon-config.js +++ b/luci-theme-argon/htdocs/luci-static/resources/view/argon-config.js @@ -1,6 +1,7 @@ 'use strict'; 'require form'; 'require argon.branding as branding'; +'require argon.updates as updates'; 'require fs'; 'require rpc'; 'require uci'; @@ -103,7 +104,8 @@ return view.extend({ ui.addNotification(null, E('p', _('Failed to list background files: %s.').format(e.message))); return []; }), - branding.load() + branding.load(), + updates.load() ]); }, @@ -113,6 +115,9 @@ return view.extend({ m = new form.Map('argon', _('Argon theme configuration'), _('Here you can set the blur and transparency of the login page of argon theme, and manage the background pictures and videos. Chrome is recommended.')); + s = m.section(form.TypedSection); + s.render = function() { return updates.render(data[4], this.map); }; + s = m.section(form.TypedSection, 'global', _('Theme configuration')); s.addremove = false; s.anonymous = true; diff --git a/luci-theme-argon/less/components/feedback.less b/luci-theme-argon/less/components/feedback.less index 1d8b2683c..d89d89f76 100644 --- a/luci-theme-argon/less/components/feedback.less +++ b/luci-theme-argon/less/components/feedback.less @@ -75,10 +75,9 @@ margin: clamp(1rem, 4vh, 2rem) auto; padding: var(--field-gap) var(--section-inset); gap: var(--field-gap); - border: 1px solid transparent; - border-inline-start: 3px solid var(--status-accent); + border: 1px solid var(--border-color); border-radius: var(--radius-dialog) !important; - background-color: var(--surface-raised) !important; + background-color: color-mix(in srgb, var(--status-accent) 4%, var(--surface-raised)) !important; color: var(--text-strong); box-shadow: var(--section-shadow); font-size: .875rem; diff --git a/luci-theme-argon/less/components/forms.less b/luci-theme-argon/less/components/forms.less index 7006eb67a..2730533b1 100644 --- a/luci-theme-argon/less/components/forms.less +++ b/luci-theme-argon/less/components/forms.less @@ -245,6 +245,33 @@ .cbi-input-file { appearance: auto !important; + // File pickers include their own button. A text field's vertical padding + // leaves too little space for that button and clips its lower edge. + &[type="file"] { + padding: 0; + padding-inline-end: .75rem; + line-height: calc(2.5rem - 2px); + overflow: hidden; + cursor: pointer; + + &::file-selector-button { + box-sizing: border-box; + height: 100%; + margin: 0; + margin-inline-end: var(--action-gap); + padding: 0 .75rem; + border: 0; + border-inline-end: 1px solid var(--control-border); + border-radius: 0; + font: inherit; + color: var(--control-text); + background-color: var(--surface-active); + vertical-align: top; + cursor: inherit; + appearance: none; + } + } + &::-webkit-file-upload-button { display: inline-block !important; } diff --git a/luci-theme-argon/less/components/overlays.less b/luci-theme-argon/less/components/overlays.less index d4ab17cd2..74c63c4b7 100644 --- a/luci-theme-argon/less/components/overlays.less +++ b/luci-theme-argon/less/components/overlays.less @@ -234,8 +234,7 @@ width: auto; margin: 0; padding: .75rem 1rem; - border: 1px solid transparent; - border-inline-start: 3px solid var(--dialog-feedback-accent); + border: 1px solid var(--border-color); border-radius: var(--radius-panel) !important; background-color: color-mix(in srgb, var(--dialog-feedback-accent) 10%, var(--surface-color)) !important; color: var(--text-strong); diff --git a/luci-theme-argon/less/components/sections.less b/luci-theme-argon/less/components/sections.less index 7fb3ae2d8..89c77ded3 100644 --- a/luci-theme-argon/less/components/sections.less +++ b/luci-theme-argon/less/components/sections.less @@ -68,6 +68,35 @@ display: none !important; } +// Older Lua CBI forms omit the body inset supplied by modern tab containers. +// Page adapters opt in so headings, descriptions and fields share one rhythm. +.legacy-cbi-section-spacing() { + .cbi-section { + > .cbi-section-node:not(.cbi-section-node-tabbed):where(:has(> .cbi-value, > [id] > .cbi-value)) { + padding-block: var(--field-gap); + } + + // Descriptions already inset the body, but a painted heading is a separate + // surface: its bottom padding cannot supply space below that surface. + > .cbi-section-descr:not(:empty) ~ .cbi-section-node:not(.cbi-section-node-tabbed) { + padding-block-start: 0; + } + + > .cbi-value { + padding-block: var(--field-gap); + } + + > .cbi-value ~ .cbi-value, + > .cbi-section-descr:not(:empty) ~ .cbi-value { + padding-block-start: 0; + } + + > .cbi-section-create { + padding: var(--field-gap) var(--section-inset); + } + } +} + .cbi-map-descr+fieldset { margin-top: 0; } diff --git a/luci-theme-argon/less/pages/argon-config.less b/luci-theme-argon/less/pages/argon-config.less index 54ffd8b18..0abfdf52c 100644 --- a/luci-theme-argon/less/pages/argon-config.less +++ b/luci-theme-argon/less/pages/argon-config.less @@ -1,6 +1,121 @@ // out: false [data-page="admin-system-argon-config"] { + #argon-update [hidden] { + display: none !important; + } + + .argon-update-content { + display: flex; + flex-direction: column; + gap: var(--field-gap); + padding: var(--field-gap) var(--section-inset); + + > p { + margin: 0; + padding: 0; + line-height: 1.5; + } + } + + .argon-update-versions { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(~"min(100%, 16rem)", 1fr)); + gap: var(--field-gap); + margin: 0; + + dt { + margin-bottom: var(--control-gap); + color: var(--muted-text); + font-size: .8125rem; + } + + dd { + margin: 0; + color: var(--text-strong); + line-height: 1.5; + overflow-wrap: anywhere; + } + } + + .argon-update-status { + display: flex; + align-items: center; + gap: var(--control-gap); + color: var(--text-strong); + + &[data-state="current"], + &[data-state="complete"] { + font-weight: 600; + } + } + + .argon-update-status-icon { + display: inline-flex; + flex: 0 0 1.25rem; + align-items: center; + justify-content: center; + width: 1.25rem; + height: 1.25rem; + border: 1px solid var(--success); + border-radius: 50%; + color: var(--success); + font-size: .8125rem; + line-height: 1; + } + + .argon-update-actions { + display: flex; + flex-wrap: wrap; + align-items: center; + gap: var(--control-gap); + + > .cbi-button { + min-height: 2.5rem; + max-width: 100%; + height: auto; + white-space: normal; + overflow-wrap: anywhere; + } + } + + #argon-update .argon-update-actions > .cbi-button-neutral { + color: var(--text-strong); + border: 1px solid var(--border-color); + background-color: var(--surface-muted); + } + + .argon-update-checked { + color: var(--muted-text); + font-size: .8125rem; + } + + .argon-update-details { + min-width: 0; + + > summary { + cursor: pointer; + color: var(--text-strong); + line-height: 1.5; + } + } + + .argon-update-notes { + max-height: 22rem; + margin: var(--control-gap) 0 0; + padding: var(--field-gap); + overflow: auto; + overscroll-behavior: contain; + border: 1px solid var(--border-color); + border-radius: var(--radius-panel); + background-color: var(--surface-muted); + color: var(--text-strong); + font: inherit; + line-height: 1.6; + white-space: pre-wrap; + overflow-wrap: anywhere; + } + .argon-color-picker { display: flex; align-items: center; diff --git a/luci-theme-argon/less/pages/attendedsysupgrade.less b/luci-theme-argon/less/pages/attendedsysupgrade.less index 107c28281..5654b15cc 100644 --- a/luci-theme-argon/less/pages/attendedsysupgrade.less +++ b/luci-theme-argon/less/pages/attendedsysupgrade.less @@ -1,5 +1,134 @@ // out: false +// The overview's native firmware reminder is inserted outside #view. +// Match its upgrade link so the styling also applies through the homepage route. +#maincontent > .alert-message.notice:has(a[href$="/admin/system/attendedsysupgrade"]) { + display: grid !important; + grid-template-columns: minmax(0, 1fr) auto; + align-items: start; + gap: var(--action-gap) var(--field-gap); + padding: var(--field-gap) var(--section-inset); + border: 1px solid var(--border-color); + border-radius: var(--radius-card) !important; + background-color: var(--surface-raised) !important; + color: var(--text-color); + box-shadow: var(--section-shadow); + font-size: .875rem; + font-weight: 400; + line-height: 1.6; + + // Keep LuCI's nodes and handlers; share the heading row with Dismiss. + > div:first-child { + display: contents; + + > * { + grid-column: 1 / -1; + min-width: 0; + margin: 0; + + + * { + margin-top: 0; + } + } + + > h4 { + grid-column: 1; + align-self: center; + padding: 0; + background: none; + color: var(--text-strong); + font-size: 1rem; + font-weight: 600; + line-height: 1.5; + overflow-wrap: anywhere; + } + + > .btn { + justify-self: start; + } + } + + > div:last-child { + grid-column: 2; + grid-row: 1; + align-self: center; + + > .btn { + margin: 0 !important; + } + } + + .btn { + min-height: 2.25rem; + padding: .375rem .75rem; + border: 1px solid var(--border-color); + background-color: var(--surface-muted); + color: var(--text-strong); + font-size: .8125rem; + font-weight: 500; + line-height: 1.5; + overflow-wrap: anywhere; + } + + a { + color: color-mix(in srgb, var(--link-color) 75%, var(--text-strong)); + text-decoration: underline; + text-underline-offset: .2em; + overflow-wrap: anywhere; + } + + .table { + display: table; + width: 100%; + table-layout: fixed; + border-collapse: separate; + border-spacing: 0; + border: 1px solid var(--border-color); + border-radius: var(--radius-panel); + background-color: var(--surface-color); + overflow: hidden; + font-size: .8125rem; + font-variant-numeric: tabular-nums; + + > :is(thead, tbody, tfoot) { + display: table-row-group; + } + + .tr { + display: table-row; + background: none; + } + + .th, + .td { + display: table-cell; + width: 33.333%; + padding: .625rem .75rem; + border-top: 1px solid var(--border-color); + color: var(--text-strong); + font-weight: 500; + line-height: 1.5; + text-align: start; + white-space: normal; + overflow-wrap: anywhere; + } + + .th { + border-top: 0; + background-color: var(--surface-muted); + } + + .td:first-child { + color: var(--muted-text); + font-weight: 400; + } + + .td:last-child { + font-weight: 600; + } + } +} + // System - Attended Sysupgrade [data-page="admin-system-attendedsysupgrade"], [data-page="admin-system-attendedsysupgrade-overview"] { diff --git a/luci-theme-argon/less/pages/filetransfer.less b/luci-theme-argon/less/pages/filetransfer.less index e9c5bef07..13999a898 100644 --- a/luci-theme-argon/less/pages/filetransfer.less +++ b/luci-theme-argon/less/pages/filetransfer.less @@ -1,7 +1,10 @@ // out: false // System - File Transfer -[data-page="admin-system-filetransfer"] { +[data-page="admin-system-filetransfer"], +[data-page="admin-system-fileassistant"] { + .legacy-cbi-section-spacing(); + #cbi-upload { margin-top: 0; } @@ -9,4 +12,49 @@ .cbi-section-table { box-shadow: 0 4px 8px rgba(0, 0, 0, 0.03); } + + // Legacy upload/download templates use a row class on their labels and + // fixed inline widths. Keep each label, field and action in one form row. + .cbi-value:has(> :is(#ulfile, #dlfile)) { + display: grid; + grid-template-columns: fit-content(var(--form-label-width)) minmax(0, 25rem) auto; + align-items: center; + justify-content: start; + gap: var(--control-gap) var(--action-gap); + + > label.cbi-value { + display: block !important; + width: auto !important; + min-width: 0; + padding: 0; + line-height: 1.5; + overflow-wrap: anywhere; + } + + > .cbi-input-file { + width: 100% !important; + min-width: 0; + max-width: 100%; + } + + > .cbi-button { + justify-self: start; + max-width: 100%; + } + } +} + +// Keep the page selectors explicit inside container queries: Less 4 does not +// retain an enclosing selector when bubbling a nested @container rule. +@container (max-width: 40rem) { + [data-page="admin-system-filetransfer"], + [data-page="admin-system-fileassistant"] { + .cbi-value:has(> :is(#ulfile, #dlfile)) { + grid-template-columns: minmax(0, 1fr) auto; + + > label.cbi-value { + grid-column: 1 / -1; + } + } + } } diff --git a/luci-theme-argon/less/pages/overview.less b/luci-theme-argon/less/pages/overview.less index 68df86263..d73ba6e25 100644 --- a/luci-theme-argon/less/pages/overview.less +++ b/luci-theme-argon/less/pages/overview.less @@ -75,19 +75,24 @@ gap: 0 !important; } - // Native port status uses a 70px grid. Keep the counters readable and wrap - // whole cards when multiple physical ports are present. - div[style*="display:grid;grid-template-columns:repeat"] { - display: flex !important; - justify-content: space-evenly !important; - flex-wrap: wrap; + // Match native port cards by their icons, independently of inline CSS formatting. + #view div:has(> .ifacebox > .ifacebox-body > img[src*="/icons/port_"]) { + display: grid !important; + grid-template-columns: repeat(auto-fit, minmax(~"min(100%, 8.5rem)", 1fr)) !important; + gap: var(--field-gap); + margin: 0 !important; + padding: var(--field-gap) var(--section-inset); - .ifacebox { - flex: 0 1 8.5rem; - min-width: 8rem !important; + > .ifacebox { + min-width: 0 !important; max-width: 100% !important; + margin: 0 !important; text-align: center; + > .ifacebox-head:first-child { + overflow-wrap: anywhere; + } + .ifacebox-body { font-size: .75rem; padding: .75rem .5rem; @@ -103,6 +108,11 @@ } } + > .ifacebox-body:nth-child(2) { + flex-grow: 1; + overflow-wrap: anywhere; + } + > .ifacebox-body:last-child { padding: .5rem .625rem; } diff --git a/luci-theme-argon/less/pages/passwall.less b/luci-theme-argon/less/pages/passwall.less index 54630e28c..409624c87 100644 --- a/luci-theme-argon/less/pages/passwall.less +++ b/luci-theme-argon/less/pages/passwall.less @@ -4,3 +4,241 @@ [data-page="admin-vpn-passwall"] h4 { background: transparent; } + +[data-page="admin-vpn-passwall"], +[data-page^="admin-vpn-passwall-"], +[data-page="admin-services-passwall"], +[data-page^="admin-services-passwall-"] { + .legacy-cbi-section-spacing(); + + .lv-dropdown-container { + display: inline-flex; + flex-wrap: wrap; + align-items: center; + gap: var(--control-gap); + min-width: 0; + max-width: 100%; + vertical-align: middle; + white-space: normal; + + > .node-actions { + margin: 0 !important; + } + } + + // Passwall snapshots select styles into per-ID rules, including the native + // arrow's padding and resolved colors. Keep the custom control responsive + // and its colors live when Argon's appearance changes. + .lv-dropdown-display { + display: inline-flex; + flex: 0 1 var(--form-control-min-width); + align-items: center; + gap: var(--control-gap); + width: var(--form-control-min-width) !important; + min-width: 0 !important; + max-width: 100%; + height: 2.5rem !important; + min-height: 2.5rem !important; + margin: 0 !important; + padding: .5rem .75rem !important; + line-height: 1.5rem !important; + border: 1px solid var(--control-border) !important; + border-radius: var(--radius-control) !important; + background-color: var(--select-bg) !important; + color: var(--control-text) !important; + + &:focus { + --control-border: var(--control-focus); + outline: 0; + box-shadow: var(--control-focus-shadow); + } + } + + .lv-dropdown-label { + flex: 1 1 auto; + width: auto; + min-width: 0; + text-align: start; + text-overflow: ellipsis; + } + + .lv-arrow-down, + .lv-arrow-down-small, + .lv-arrow-right { + flex: 0 0 1rem; + width: 1rem; + height: 1rem; + margin: 0; + border: 0; + background-color: currentColor; + -webkit-mask: var(--dropdown-arrow-icon) center / contain no-repeat; + mask: var(--dropdown-arrow-icon) center / contain no-repeat; + } + + .lv-arrow-right { + rotate: -90deg; + } + + // The plugin moves opened menus to body, outside the form container. + .lv-dropdown-panel { + max-height: ~"min(50vh, 18rem)" !important; + line-height: 1.5 !important; + border: 1px solid var(--border-color) !important; + border-radius: var(--radius-panel) !important; + background-color: var(--surface-panel) !important; + color: var(--dropdown-text) !important; + box-shadow: var(--dropdown-shadow); + + > div:first-child { + border-color: var(--border-color) !important; + } + + .lv-dropdown-search { + padding: .5rem .75rem; + border: 1px solid var(--control-border); + border-radius: var(--radius-control); + } + + &.cbi-listvalue-panel li[data-key] { + min-height: 2.5rem; + padding: .5rem .75rem; + border-radius: var(--radius-small); + background-color: transparent; + color: inherit; + text-align: start !important; + white-space: normal; + overflow-wrap: anywhere; + transition: none; + + &.is-selected, + &.is-selected:hover { + background-color: var(--dropdown-selected-bg) !important; + color: var(--dropdown-selected-text) !important; + font-weight: 500 !important; + } + + @media (hover: hover) { + &:not(.is-selected):hover { + background-color: var(--dropdown-hover-bg); + } + } + } + + .lv-item-label { + margin: 0 !important; + } + + .lv-group-title { + gap: var(--control-gap); + padding: .5rem .75rem; + border-radius: var(--radius-small); + line-height: 1.5; + white-space: normal; + overflow-wrap: anywhere; + + > b, + > span { + margin: 0 !important; + } + + > span[id^="group-count-"] { + margin-inline-start: auto !important; + color: var(--muted-text) !important; + } + } + + .lv-group-list { + margin: var(--control-gap) 0 0; + padding-inline-start: var(--control-gap); + } + } + + // Match the ID specificity of the plugin's !important group-title color, + // including after the menu has been moved outside #maincontent. + &:has(#maincontent) .lv-dropdown-panel .lv-group-title { + background-color: var(--surface-active) !important; + } + + // The section body supplies the toolbar's vertical inset. + .cbi-value-field > .share-toolbar { + padding-block: 0; + } + + #_passwall_status_fieldset { + padding-block: var(--control-gap); + + .status .block { + margin-block: var(--control-gap); + } + } + + #_log_fieldset { + display: flex; + flex-direction: column; + gap: var(--field-gap); + padding: var(--field-gap) var(--section-inset); + + > .cbi-button { + align-self: flex-start; + } + + > textarea { + display: block; + max-width: 100%; + margin: 0 !important; + } + } + + #app_version { + display: flex; + flex-direction: column; + gap: var(--field-gap); + + > .cbi-value > .cbi-value-field { + display: grid; + grid-template-columns: minmax(0, 10rem) auto; + align-items: center; + justify-content: start; + gap: var(--control-gap) var(--action-gap); + + > span:first-child { + grid-column: 1; + grid-row: 1; + min-width: 0; + line-height: 1.5; + overflow-wrap: anywhere; + unicode-bidi: plaintext; + } + + > input[data-update-app] { + grid-column: 2; + justify-self: start; + max-width: 100%; + } + + > span[id$="-detail"] { + grid-column: 1 / -1; + min-width: 0; + line-height: 1.5; + overflow-wrap: anywhere; + + &:empty { + display: none; + } + } + } + } +} + +@container (max-width: 40rem) { + [data-page="admin-vpn-passwall"], + [data-page^="admin-vpn-passwall-"], + [data-page="admin-services-passwall"], + [data-page^="admin-services-passwall-"] { + // Its label is an ideographic space in the native template; when + // fields stack, it otherwise leaves a blank line above the actions. + .cbi-value:has(> .cbi-value-field > .share-toolbar) > .cbi-value-title { + display: none; + } + } +} diff --git a/luci-theme-argon/less/sysauth.less b/luci-theme-argon/less/sysauth.less index c4592c042..b5b6c4b6f 100644 --- a/luci-theme-argon/less/sysauth.less +++ b/luci-theme-argon/less/sysauth.less @@ -131,9 +131,9 @@ .errorbox { padding: .75rem 1rem; overflow-wrap: anywhere; - border-inline-start: 3px solid var(--warning); + border: 1px solid var(--border-color); border-radius: var(--radius-control); - background: var(--surface-color); + background: color-mix(in srgb, var(--warning) 6%, var(--surface-color)); color: var(--text-strong); line-height: 1.5; text-align: start; diff --git a/luci-theme-argon/po/ar/argon-config.po b/luci-theme-argon/po/ar/argon-config.po index a7fc6daaf..9b6ed3130 100644 --- a/luci-theme-argon/po/ar/argon-config.po +++ b/luci-theme-argon/po/ar/argon-config.po @@ -380,3 +380,155 @@ msgstr "[الوضع الداكن] الشفافية" #: htdocs/luci-static/resources/view/argon-config.js:47 msgid "valid HEX color value" msgstr "قيمة لون صالحة بصيغة HEX" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Release notes" +msgstr "ملاحظات الإصدار" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "View release" +msgstr "عرض الإصدار" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Download package" +msgstr "تنزيل الحزمة" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Check for updates" +msgstr "التحقق من وجود تحديثات" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Current version" +msgstr "الإصدار الحالي" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Latest stable version" +msgstr "أحدث إصدار مستقر" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Unknown version" +msgstr "إصدار غير معروف" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Not checked yet." +msgstr "لم يتم التحقق بعد." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Checking for updates..." +msgstr "جارٍ التحقق من وجود تحديثات..." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Last checked: %s" +msgstr "آخر تحقق: %s" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "No release notes were published." +msgstr "لم تُنشر ملاحظات لهذا الإصدار." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Unable to check for updates. Check the router's connection to GitHub and try again." +msgstr "تعذر التحقق من وجود تحديثات. تحقق من اتصال الموجّه بـ GitHub وحاول مجددًا." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Unable to compare this version. View the release for details." +msgstr "تعذرت مقارنة هذا الإصدار. اعرض الإصدار لمعرفة التفاصيل." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Update available." +msgstr "يتوفر تحديث." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Your theme is up to date." +msgstr "السمة محدّثة." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "The installed version is newer than the latest stable release." +msgstr "الإصدار المثبّت أحدث من آخر إصدار مستقر." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Theme updates" +msgstr "تحديثات السمة" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Update now" +msgstr "التحديث الآن" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Reload page" +msgstr "إعادة تحميل الصفحة" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Automatic installation is unavailable. Download the package to update manually." +msgstr "التثبيت التلقائي غير متاح. نزّل الحزمة للتحديث يدوياً." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Installation log" +msgstr "سجل التثبيت" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Preparing the update..." +msgstr "جارٍ تجهيز التحديث..." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Downloading the update..." +msgstr "جارٍ تنزيل التحديث..." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Verifying the package..." +msgstr "جارٍ التحقق من الحزمة..." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Installing the update. Please wait..." +msgstr "جارٍ تثبيت التحديث. يُرجى الانتظار..." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Update installed. Reload the page to use the new version." +msgstr "تم تثبيت التحديث. أعد تحميل الصفحة لاستخدام الإصدار الجديد." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Download failed. Check the router's connection to GitHub and try again." +msgstr "فشل التنزيل. تحقق من اتصال الموجّه بـ GitHub وحاول مجدداً." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Package verification failed. Check for updates and try again." +msgstr "فشل التحقق من الحزمة. تحقق من التحديثات وحاول مجدداً." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Not enough free space to install the update." +msgstr "لا توجد مساحة خالية كافية لتثبيت التحديث." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "The installed version has changed. Check for updates again." +msgstr "تغيّر الإصدار المثبّت. تحقق من التحديثات مجدداً." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Release information has changed or expired. Check for updates again." +msgstr "تغيّرت معلومات الإصدار أو انتهت صلاحيتها. تحقق من التحديثات مجدداً." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "The update was interrupted. Check the installed version before trying again." +msgstr "انقطع التحديث. تحقق من الإصدار المثبّت قبل المحاولة مجدداً." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Installation failed. See the installation log for details." +msgstr "فشل التثبيت. راجع سجل التثبيت لمزيد من التفاصيل." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Unable to read update progress. Reconnecting..." +msgstr "تعذرت قراءة تقدم التحديث. جارٍ إعادة الاتصال..." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Unable to start the update. Check for updates and try again." +msgstr "تعذر بدء التحديث. تحقق من التحديثات وحاول مجدداً." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Update Argon to %s?" +msgstr "هل تريد تحديث Argon إلى %s؟" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "The theme will be updated using the system package manager. Your Argon settings will be preserved." +msgstr "سيُحدَّث المظهر باستخدام مدير حزم النظام. ستُحفظ إعدادات Argon الحالية." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Cancel" +msgstr "إلغاء" diff --git a/luci-theme-argon/po/de/argon-config.po b/luci-theme-argon/po/de/argon-config.po index 89b746644..632e3adce 100644 --- a/luci-theme-argon/po/de/argon-config.po +++ b/luci-theme-argon/po/de/argon-config.po @@ -380,3 +380,155 @@ msgstr "[Dunkler Modus] Transparenz" #: htdocs/luci-static/resources/view/argon-config.js:47 msgid "valid HEX color value" msgstr "gültiger HEX-Farbwert" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Release notes" +msgstr "Versionshinweise" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "View release" +msgstr "Veröffentlichung ansehen" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Download package" +msgstr "Paket herunterladen" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Check for updates" +msgstr "Nach Updates suchen" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Current version" +msgstr "Installierte Version" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Latest stable version" +msgstr "Neueste stabile Version" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Unknown version" +msgstr "Unbekannte Version" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Not checked yet." +msgstr "Noch nicht geprüft." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Checking for updates..." +msgstr "Updates werden gesucht..." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Last checked: %s" +msgstr "Zuletzt geprüft: %s" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "No release notes were published." +msgstr "Für diese Version wurden keine Versionshinweise veröffentlicht." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Unable to check for updates. Check the router's connection to GitHub and try again." +msgstr "Updates konnten nicht geprüft werden. Prüfen Sie die Verbindung des Routers zu GitHub und versuchen Sie es erneut." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Unable to compare this version. View the release for details." +msgstr "Diese Version kann nicht verglichen werden. Details finden Sie auf der Veröffentlichungsseite." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Update available." +msgstr "Ein Update ist verfügbar." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Your theme is up to date." +msgstr "Ihr Theme ist auf dem neuesten Stand." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "The installed version is newer than the latest stable release." +msgstr "Die installierte Version ist neuer als die neueste stabile Version." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Theme updates" +msgstr "Theme-Updates" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Update now" +msgstr "Jetzt aktualisieren" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Reload page" +msgstr "Seite neu laden" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Automatic installation is unavailable. Download the package to update manually." +msgstr "Die automatische Installation ist nicht verfügbar. Laden Sie das Paket für eine manuelle Aktualisierung herunter." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Installation log" +msgstr "Installationsprotokoll" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Preparing the update..." +msgstr "Aktualisierung wird vorbereitet..." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Downloading the update..." +msgstr "Aktualisierung wird heruntergeladen..." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Verifying the package..." +msgstr "Paket wird überprüft..." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Installing the update. Please wait..." +msgstr "Aktualisierung wird installiert. Bitte warten..." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Update installed. Reload the page to use the new version." +msgstr "Aktualisierung installiert. Laden Sie die Seite neu, um die neue Version zu verwenden." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Download failed. Check the router's connection to GitHub and try again." +msgstr "Download fehlgeschlagen. Prüfen Sie die Verbindung des Routers zu GitHub und versuchen Sie es erneut." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Package verification failed. Check for updates and try again." +msgstr "Paketprüfung fehlgeschlagen. Suchen Sie erneut nach Aktualisierungen und versuchen Sie es noch einmal." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Not enough free space to install the update." +msgstr "Nicht genügend freier Speicherplatz für die Aktualisierung." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "The installed version has changed. Check for updates again." +msgstr "Die installierte Version hat sich geändert. Suchen Sie erneut nach Aktualisierungen." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Release information has changed or expired. Check for updates again." +msgstr "Die Versionsinformationen haben sich geändert oder sind abgelaufen. Suchen Sie erneut nach Aktualisierungen." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "The update was interrupted. Check the installed version before trying again." +msgstr "Die Aktualisierung wurde unterbrochen. Prüfen Sie vor einem erneuten Versuch die installierte Version." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Installation failed. See the installation log for details." +msgstr "Installation fehlgeschlagen. Einzelheiten finden Sie im Installationsprotokoll." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Unable to read update progress. Reconnecting..." +msgstr "Der Aktualisierungsfortschritt kann nicht gelesen werden. Verbindung wird wiederhergestellt..." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Unable to start the update. Check for updates and try again." +msgstr "Die Aktualisierung kann nicht gestartet werden. Suchen Sie erneut nach Aktualisierungen und versuchen Sie es noch einmal." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Update Argon to %s?" +msgstr "Argon auf %s aktualisieren?" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "The theme will be updated using the system package manager. Your Argon settings will be preserved." +msgstr "Das Theme wird mit der Paketverwaltung des Systems aktualisiert. Ihre Argon-Einstellungen bleiben erhalten." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Cancel" +msgstr "Abbrechen" diff --git a/luci-theme-argon/po/es/argon-config.po b/luci-theme-argon/po/es/argon-config.po index 5fcb20d47..6e300a5d9 100644 --- a/luci-theme-argon/po/es/argon-config.po +++ b/luci-theme-argon/po/es/argon-config.po @@ -382,3 +382,155 @@ msgstr "[Modo oscuro] Transparencia" #: htdocs/luci-static/resources/view/argon-config.js:47 msgid "valid HEX color value" msgstr "un valor de color HEX válido" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Release notes" +msgstr "Notas de la versión" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "View release" +msgstr "Ver publicación" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Download package" +msgstr "Descargar paquete" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Check for updates" +msgstr "Buscar actualizaciones" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Current version" +msgstr "Versión actual" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Latest stable version" +msgstr "Última versión estable" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Unknown version" +msgstr "Versión desconocida" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Not checked yet." +msgstr "Aún no se ha comprobado." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Checking for updates..." +msgstr "Buscando actualizaciones..." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Last checked: %s" +msgstr "Última comprobación: %s" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "No release notes were published." +msgstr "No se publicaron notas para esta versión." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Unable to check for updates. Check the router's connection to GitHub and try again." +msgstr "No se pudieron buscar actualizaciones. Compruebe la conexión del router con GitHub e inténtelo de nuevo." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Unable to compare this version. View the release for details." +msgstr "No se puede comparar esta versión. Consulte la publicación para más detalles." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Update available." +msgstr "Hay una actualización disponible." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Your theme is up to date." +msgstr "El tema está actualizado." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "The installed version is newer than the latest stable release." +msgstr "La versión instalada es más reciente que la última versión estable." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Theme updates" +msgstr "Actualizaciones del tema" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Update now" +msgstr "Actualizar ahora" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Reload page" +msgstr "Recargar página" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Automatic installation is unavailable. Download the package to update manually." +msgstr "La instalación automática no está disponible. Descargue el paquete para actualizar manualmente." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Installation log" +msgstr "Registro de instalación" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Preparing the update..." +msgstr "Preparando la actualización..." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Downloading the update..." +msgstr "Descargando la actualización..." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Verifying the package..." +msgstr "Verificando el paquete..." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Installing the update. Please wait..." +msgstr "Instalando la actualización. Espere..." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Update installed. Reload the page to use the new version." +msgstr "Actualización instalada. Recargue la página para utilizar la nueva versión." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Download failed. Check the router's connection to GitHub and try again." +msgstr "Error de descarga. Compruebe la conexión del router con GitHub e inténtelo de nuevo." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Package verification failed. Check for updates and try again." +msgstr "Error al verificar el paquete. Vuelva a buscar actualizaciones e inténtelo de nuevo." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Not enough free space to install the update." +msgstr "No hay suficiente espacio libre para instalar la actualización." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "The installed version has changed. Check for updates again." +msgstr "La versión instalada ha cambiado. Vuelva a buscar actualizaciones." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Release information has changed or expired. Check for updates again." +msgstr "La información de la versión ha cambiado o ha caducado. Vuelva a buscar actualizaciones." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "The update was interrupted. Check the installed version before trying again." +msgstr "La actualización se ha interrumpido. Compruebe la versión instalada antes de intentarlo de nuevo." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Installation failed. See the installation log for details." +msgstr "Error de instalación. Consulte el registro de instalación para obtener más información." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Unable to read update progress. Reconnecting..." +msgstr "No se puede leer el progreso de la actualización. Reconectando..." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Unable to start the update. Check for updates and try again." +msgstr "No se puede iniciar la actualización. Vuelva a buscar actualizaciones e inténtelo de nuevo." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Update Argon to %s?" +msgstr "¿Actualizar Argon a %s?" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "The theme will be updated using the system package manager. Your Argon settings will be preserved." +msgstr "El tema se actualizará con el gestor de paquetes del sistema. Se conservará su configuración de Argon." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Cancel" +msgstr "Cancelar" diff --git a/luci-theme-argon/po/fr/argon-config.po b/luci-theme-argon/po/fr/argon-config.po index 1c5ff0ab8..41178806f 100644 --- a/luci-theme-argon/po/fr/argon-config.po +++ b/luci-theme-argon/po/fr/argon-config.po @@ -380,3 +380,155 @@ msgstr "[Mode sombre] Transparence" #: htdocs/luci-static/resources/view/argon-config.js:47 msgid "valid HEX color value" msgstr "une valeur de couleur HEX valide" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Release notes" +msgstr "Notes de version" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "View release" +msgstr "Voir la publication" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Download package" +msgstr "Télécharger le paquet" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Check for updates" +msgstr "Rechercher des mises à jour" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Current version" +msgstr "Version actuelle" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Latest stable version" +msgstr "Dernière version stable" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Unknown version" +msgstr "Version inconnue" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Not checked yet." +msgstr "Aucune vérification effectuée." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Checking for updates..." +msgstr "Recherche de mises à jour..." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Last checked: %s" +msgstr "Dernière vérification : %s" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "No release notes were published." +msgstr "Aucune note n’a été publiée pour cette version." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Unable to check for updates. Check the router's connection to GitHub and try again." +msgstr "Impossible de rechercher les mises à jour. Vérifiez la connexion du routeur à GitHub, puis réessayez." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Unable to compare this version. View the release for details." +msgstr "Impossible de comparer cette version. Consultez la publication pour plus de détails." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Update available." +msgstr "Une mise à jour est disponible." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Your theme is up to date." +msgstr "Votre thème est à jour." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "The installed version is newer than the latest stable release." +msgstr "La version installée est plus récente que la dernière version stable." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Theme updates" +msgstr "Mises à jour du thème" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Update now" +msgstr "Mettre à jour maintenant" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Reload page" +msgstr "Recharger la page" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Automatic installation is unavailable. Download the package to update manually." +msgstr "L’installation automatique est indisponible. Téléchargez le paquet pour une mise à jour manuelle." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Installation log" +msgstr "Journal d’installation" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Preparing the update..." +msgstr "Préparation de la mise à jour..." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Downloading the update..." +msgstr "Téléchargement de la mise à jour..." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Verifying the package..." +msgstr "Vérification du paquet..." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Installing the update. Please wait..." +msgstr "Installation de la mise à jour. Veuillez patienter..." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Update installed. Reload the page to use the new version." +msgstr "Mise à jour installée. Rechargez la page pour utiliser la nouvelle version." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Download failed. Check the router's connection to GitHub and try again." +msgstr "Échec du téléchargement. Vérifiez la connexion du routeur à GitHub et réessayez." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Package verification failed. Check for updates and try again." +msgstr "Échec de la vérification du paquet. Recherchez à nouveau les mises à jour et réessayez." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Not enough free space to install the update." +msgstr "Espace libre insuffisant pour installer la mise à jour." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "The installed version has changed. Check for updates again." +msgstr "La version installée a changé. Recherchez à nouveau les mises à jour." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Release information has changed or expired. Check for updates again." +msgstr "Les informations de version ont changé ou ont expiré. Recherchez à nouveau les mises à jour." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "The update was interrupted. Check the installed version before trying again." +msgstr "La mise à jour a été interrompue. Vérifiez la version installée avant de réessayer." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Installation failed. See the installation log for details." +msgstr "Échec de l’installation. Consultez le journal d’installation pour plus de détails." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Unable to read update progress. Reconnecting..." +msgstr "Impossible de lire la progression. Reconnexion en cours..." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Unable to start the update. Check for updates and try again." +msgstr "Impossible de lancer la mise à jour. Recherchez à nouveau les mises à jour et réessayez." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Update Argon to %s?" +msgstr "Mettre à jour Argon vers %s ?" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "The theme will be updated using the system package manager. Your Argon settings will be preserved." +msgstr "Le thème sera mis à jour avec le gestionnaire de paquets du système. Vos paramètres Argon seront conservés." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Cancel" +msgstr "Annuler" diff --git a/luci-theme-argon/po/it/argon-config.po b/luci-theme-argon/po/it/argon-config.po index 3318ad702..88c253769 100644 --- a/luci-theme-argon/po/it/argon-config.po +++ b/luci-theme-argon/po/it/argon-config.po @@ -380,3 +380,155 @@ msgstr "[Modalità scura] Trasparenza" #: htdocs/luci-static/resources/view/argon-config.js:47 msgid "valid HEX color value" msgstr "un valore di colore HEX valido" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Release notes" +msgstr "Note di rilascio" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "View release" +msgstr "Visualizza rilascio" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Download package" +msgstr "Scarica pacchetto" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Check for updates" +msgstr "Controlla aggiornamenti" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Current version" +msgstr "Versione attuale" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Latest stable version" +msgstr "Ultima versione stabile" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Unknown version" +msgstr "Versione sconosciuta" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Not checked yet." +msgstr "Controllo non ancora eseguito." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Checking for updates..." +msgstr "Ricerca aggiornamenti..." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Last checked: %s" +msgstr "Ultimo controllo: %s" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "No release notes were published." +msgstr "Non sono state pubblicate note per questa versione." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Unable to check for updates. Check the router's connection to GitHub and try again." +msgstr "Impossibile controllare gli aggiornamenti. Verificare la connessione del router a GitHub e riprovare." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Unable to compare this version. View the release for details." +msgstr "Impossibile confrontare questa versione. Consultare il rilascio per i dettagli." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Update available." +msgstr "È disponibile un aggiornamento." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Your theme is up to date." +msgstr "Il tema è aggiornato." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "The installed version is newer than the latest stable release." +msgstr "La versione installata è più recente dell’ultima versione stabile." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Theme updates" +msgstr "Aggiornamenti del tema" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Update now" +msgstr "Aggiorna ora" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Reload page" +msgstr "Ricarica pagina" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Automatic installation is unavailable. Download the package to update manually." +msgstr "L’installazione automatica non è disponibile. Scarica il pacchetto per aggiornare manualmente." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Installation log" +msgstr "Registro di installazione" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Preparing the update..." +msgstr "Preparazione dell’aggiornamento..." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Downloading the update..." +msgstr "Download dell’aggiornamento..." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Verifying the package..." +msgstr "Verifica del pacchetto..." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Installing the update. Please wait..." +msgstr "Installazione dell’aggiornamento. Attendere..." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Update installed. Reload the page to use the new version." +msgstr "Aggiornamento installato. Ricarica la pagina per usare la nuova versione." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Download failed. Check the router's connection to GitHub and try again." +msgstr "Download non riuscito. Controlla la connessione del router a GitHub e riprova." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Package verification failed. Check for updates and try again." +msgstr "Verifica del pacchetto non riuscita. Cerca di nuovo gli aggiornamenti e riprova." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Not enough free space to install the update." +msgstr "Spazio libero insufficiente per installare l’aggiornamento." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "The installed version has changed. Check for updates again." +msgstr "La versione installata è cambiata. Cerca di nuovo gli aggiornamenti." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Release information has changed or expired. Check for updates again." +msgstr "Le informazioni sulla versione sono cambiate o scadute. Cerca di nuovo gli aggiornamenti." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "The update was interrupted. Check the installed version before trying again." +msgstr "L’aggiornamento è stato interrotto. Controlla la versione installata prima di riprovare." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Installation failed. See the installation log for details." +msgstr "Installazione non riuscita. Consulta il registro di installazione per i dettagli." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Unable to read update progress. Reconnecting..." +msgstr "Impossibile leggere l’avanzamento dell’aggiornamento. Riconnessione..." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Unable to start the update. Check for updates and try again." +msgstr "Impossibile avviare l’aggiornamento. Cerca di nuovo gli aggiornamenti e riprova." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Update Argon to %s?" +msgstr "Aggiornare Argon alla versione %s?" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "The theme will be updated using the system package manager. Your Argon settings will be preserved." +msgstr "Il tema verrà aggiornato con il gestore di pacchetti del sistema. Le impostazioni di Argon saranno mantenute." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Cancel" +msgstr "Annulla" diff --git a/luci-theme-argon/po/ja/argon-config.po b/luci-theme-argon/po/ja/argon-config.po index 3e872c203..3a1fc255b 100644 --- a/luci-theme-argon/po/ja/argon-config.po +++ b/luci-theme-argon/po/ja/argon-config.po @@ -380,3 +380,155 @@ msgstr "[ダークモード] 透明度" #: htdocs/luci-static/resources/view/argon-config.js:47 msgid "valid HEX color value" msgstr "有効な 16 進数のカラーコード" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Release notes" +msgstr "リリースノート" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "View release" +msgstr "リリースを表示" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Download package" +msgstr "パッケージをダウンロード" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Check for updates" +msgstr "更新を確認" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Current version" +msgstr "現在のバージョン" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Latest stable version" +msgstr "最新の安定版" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Unknown version" +msgstr "不明なバージョン" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Not checked yet." +msgstr "まだ確認していません。" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Checking for updates..." +msgstr "更新を確認しています..." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Last checked: %s" +msgstr "前回の確認:%s" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "No release notes were published." +msgstr "このバージョンのリリースノートはありません。" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Unable to check for updates. Check the router's connection to GitHub and try again." +msgstr "更新を確認できません。ルーターと GitHub の接続を確認して、もう一度お試しください。" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Unable to compare this version. View the release for details." +msgstr "このバージョンを比較できません。詳しくはリリースをご覧ください。" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Update available." +msgstr "更新があります。" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Your theme is up to date." +msgstr "テーマは最新です。" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "The installed version is newer than the latest stable release." +msgstr "インストール済みのバージョンは、最新の安定版より新しいものです。" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Theme updates" +msgstr "テーマの更新" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Update now" +msgstr "今すぐ更新" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Reload page" +msgstr "ページを再読み込み" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Automatic installation is unavailable. Download the package to update manually." +msgstr "自動インストールを利用できません。パッケージをダウンロードして手動で更新してください。" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Installation log" +msgstr "インストールログ" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Preparing the update..." +msgstr "更新を準備中..." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Downloading the update..." +msgstr "更新をダウンロード中..." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Verifying the package..." +msgstr "パッケージを検証中..." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Installing the update. Please wait..." +msgstr "更新をインストール中です。お待ちください..." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Update installed. Reload the page to use the new version." +msgstr "更新をインストールしました。ページを再読み込みして新しいバージョンを使用してください。" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Download failed. Check the router's connection to GitHub and try again." +msgstr "ダウンロードに失敗しました。ルーターから GitHub への接続を確認して再試行してください。" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Package verification failed. Check for updates and try again." +msgstr "パッケージの検証に失敗しました。更新を再確認して再試行してください。" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Not enough free space to install the update." +msgstr "更新のインストールに必要な空き容量が不足しています。" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "The installed version has changed. Check for updates again." +msgstr "インストール済みのバージョンが変わりました。更新を再確認してください。" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Release information has changed or expired. Check for updates again." +msgstr "リリース情報が変更されたか、有効期限が切れています。更新を再確認してください。" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "The update was interrupted. Check the installed version before trying again." +msgstr "更新が中断されました。再試行する前にインストール済みのバージョンを確認してください。" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Installation failed. See the installation log for details." +msgstr "インストールに失敗しました。詳細はインストールログを確認してください。" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Unable to read update progress. Reconnecting..." +msgstr "更新の進行状況を取得できません。再接続中..." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Unable to start the update. Check for updates and try again." +msgstr "更新を開始できません。更新を再確認して再試行してください。" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Update Argon to %s?" +msgstr "Argon を %s に更新しますか?" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "The theme will be updated using the system package manager. Your Argon settings will be preserved." +msgstr "システムのパッケージマネージャーでテーマを更新します。現在の Argon 設定は保持されます。" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Cancel" +msgstr "キャンセル" diff --git a/luci-theme-argon/po/ko/argon-config.po b/luci-theme-argon/po/ko/argon-config.po index 02b071446..6f4ca866c 100644 --- a/luci-theme-argon/po/ko/argon-config.po +++ b/luci-theme-argon/po/ko/argon-config.po @@ -380,3 +380,155 @@ msgstr "[다크 모드] 투명도" #: htdocs/luci-static/resources/view/argon-config.js:47 msgid "valid HEX color value" msgstr "유효한 16진수 색상 값" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Release notes" +msgstr "릴리스 노트" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "View release" +msgstr "릴리스 보기" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Download package" +msgstr "패키지 다운로드" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Check for updates" +msgstr "업데이트 확인" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Current version" +msgstr "현재 버전" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Latest stable version" +msgstr "최신 안정 버전" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Unknown version" +msgstr "알 수 없는 버전" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Not checked yet." +msgstr "아직 확인하지 않았습니다." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Checking for updates..." +msgstr "업데이트 확인 중..." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Last checked: %s" +msgstr "마지막 확인: %s" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "No release notes were published." +msgstr "이 버전에는 릴리스 노트가 없습니다." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Unable to check for updates. Check the router's connection to GitHub and try again." +msgstr "업데이트를 확인할 수 없습니다. 라우터의 GitHub 연결을 확인한 후 다시 시도하세요." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Unable to compare this version. View the release for details." +msgstr "이 버전을 비교할 수 없습니다. 자세한 내용은 릴리스를 확인하세요." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Update available." +msgstr "업데이트가 있습니다." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Your theme is up to date." +msgstr "테마가 최신 버전입니다." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "The installed version is newer than the latest stable release." +msgstr "설치된 버전이 최신 안정 버전보다 새 버전입니다." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Theme updates" +msgstr "테마 업데이트" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Update now" +msgstr "지금 업데이트" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Reload page" +msgstr "페이지 새로고침" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Automatic installation is unavailable. Download the package to update manually." +msgstr "자동 설치를 사용할 수 없습니다. 패키지를 다운로드하여 수동으로 업데이트하세요." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Installation log" +msgstr "설치 로그" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Preparing the update..." +msgstr "업데이트 준비 중..." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Downloading the update..." +msgstr "업데이트 다운로드 중..." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Verifying the package..." +msgstr "패키지 검증 중..." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Installing the update. Please wait..." +msgstr "업데이트 설치 중입니다. 잠시 기다려 주세요..." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Update installed. Reload the page to use the new version." +msgstr "업데이트가 설치되었습니다. 새 버전을 사용하려면 페이지를 새로고침하세요." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Download failed. Check the router's connection to GitHub and try again." +msgstr "다운로드에 실패했습니다. 라우터의 GitHub 연결을 확인하고 다시 시도하세요." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Package verification failed. Check for updates and try again." +msgstr "패키지 검증에 실패했습니다. 업데이트를 다시 확인하고 시도하세요." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Not enough free space to install the update." +msgstr "업데이트를 설치할 여유 공간이 부족합니다." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "The installed version has changed. Check for updates again." +msgstr "설치된 버전이 변경되었습니다. 업데이트를 다시 확인하세요." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Release information has changed or expired. Check for updates again." +msgstr "릴리스 정보가 변경되었거나 만료되었습니다. 업데이트를 다시 확인하세요." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "The update was interrupted. Check the installed version before trying again." +msgstr "업데이트가 중단되었습니다. 다시 시도하기 전에 설치된 버전을 확인하세요." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Installation failed. See the installation log for details." +msgstr "설치에 실패했습니다. 자세한 내용은 설치 로그를 확인하세요." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Unable to read update progress. Reconnecting..." +msgstr "업데이트 진행 상황을 읽을 수 없습니다. 다시 연결 중..." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Unable to start the update. Check for updates and try again." +msgstr "업데이트를 시작할 수 없습니다. 업데이트를 다시 확인하고 시도하세요." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Update Argon to %s?" +msgstr "Argon을 %s 버전으로 업데이트할까요?" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "The theme will be updated using the system package manager. Your Argon settings will be preserved." +msgstr "시스템 패키지 관리자로 테마를 업데이트합니다. 현재 Argon 설정은 유지됩니다." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Cancel" +msgstr "취소" diff --git a/luci-theme-argon/po/nl/argon-config.po b/luci-theme-argon/po/nl/argon-config.po index 0a43271b7..8bfa176a2 100644 --- a/luci-theme-argon/po/nl/argon-config.po +++ b/luci-theme-argon/po/nl/argon-config.po @@ -380,3 +380,155 @@ msgstr "[Donkere modus] Transparantie" #: htdocs/luci-static/resources/view/argon-config.js:47 msgid "valid HEX color value" msgstr "een geldige HEX-kleurwaarde" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Release notes" +msgstr "Uitgaveopmerkingen" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "View release" +msgstr "Uitgave bekijken" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Download package" +msgstr "Pakket downloaden" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Check for updates" +msgstr "Op updates controleren" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Current version" +msgstr "Huidige versie" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Latest stable version" +msgstr "Nieuwste stabiele versie" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Unknown version" +msgstr "Onbekende versie" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Not checked yet." +msgstr "Nog niet gecontroleerd." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Checking for updates..." +msgstr "Controleren op updates..." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Last checked: %s" +msgstr "Laatst gecontroleerd: %s" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "No release notes were published." +msgstr "Er zijn geen opmerkingen voor deze uitgave gepubliceerd." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Unable to check for updates. Check the router's connection to GitHub and try again." +msgstr "Kan niet op updates controleren. Controleer de verbinding van de router met GitHub en probeer het opnieuw." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Unable to compare this version. View the release for details." +msgstr "Deze versie kan niet worden vergeleken. Bekijk de uitgave voor meer informatie." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Update available." +msgstr "Er is een update beschikbaar." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Your theme is up to date." +msgstr "Uw thema is bijgewerkt." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "The installed version is newer than the latest stable release." +msgstr "De geïnstalleerde versie is nieuwer dan de nieuwste stabiele uitgave." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Theme updates" +msgstr "Thema-updates" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Update now" +msgstr "Nu bijwerken" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Reload page" +msgstr "Pagina herladen" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Automatic installation is unavailable. Download the package to update manually." +msgstr "Automatische installatie is niet beschikbaar. Download het pakket om handmatig bij te werken." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Installation log" +msgstr "Installatielogboek" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Preparing the update..." +msgstr "Update voorbereiden..." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Downloading the update..." +msgstr "Update downloaden..." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Verifying the package..." +msgstr "Pakket controleren..." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Installing the update. Please wait..." +msgstr "Update installeren. Een ogenblik geduld..." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Update installed. Reload the page to use the new version." +msgstr "Update geïnstalleerd. Herlaad de pagina om de nieuwe versie te gebruiken." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Download failed. Check the router's connection to GitHub and try again." +msgstr "Download mislukt. Controleer de verbinding van de router met GitHub en probeer het opnieuw." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Package verification failed. Check for updates and try again." +msgstr "Pakketcontrole mislukt. Controleer opnieuw op updates en probeer het nogmaals." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Not enough free space to install the update." +msgstr "Onvoldoende vrije ruimte om de update te installeren." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "The installed version has changed. Check for updates again." +msgstr "De geïnstalleerde versie is gewijzigd. Controleer opnieuw op updates." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Release information has changed or expired. Check for updates again." +msgstr "De versiegegevens zijn gewijzigd of verlopen. Controleer opnieuw op updates." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "The update was interrupted. Check the installed version before trying again." +msgstr "De update is onderbroken. Controleer de geïnstalleerde versie voordat u het opnieuw probeert." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Installation failed. See the installation log for details." +msgstr "Installatie mislukt. Raadpleeg het installatielogboek voor meer informatie." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Unable to read update progress. Reconnecting..." +msgstr "Kan de voortgang niet lezen. Opnieuw verbinden..." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Unable to start the update. Check for updates and try again." +msgstr "Kan de update niet starten. Controleer opnieuw op updates en probeer het nogmaals." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Update Argon to %s?" +msgstr "Argon bijwerken naar %s?" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "The theme will be updated using the system package manager. Your Argon settings will be preserved." +msgstr "Het thema wordt bijgewerkt met de pakketbeheerder van het systeem. Uw Argon-instellingen blijven behouden." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Cancel" +msgstr "Annuleren" diff --git a/luci-theme-argon/po/pl/argon-config.po b/luci-theme-argon/po/pl/argon-config.po index f6551c1fa..645419662 100644 --- a/luci-theme-argon/po/pl/argon-config.po +++ b/luci-theme-argon/po/pl/argon-config.po @@ -380,3 +380,155 @@ msgstr "[Ciemny motyw] Przezroczystość" #: htdocs/luci-static/resources/view/argon-config.js:47 msgid "valid HEX color value" msgstr "prawidłowy kolor w formacie HEX" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Release notes" +msgstr "Informacje o wydaniu" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "View release" +msgstr "Zobacz wydanie" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Download package" +msgstr "Pobierz pakiet" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Check for updates" +msgstr "Sprawdź aktualizacje" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Current version" +msgstr "Bieżąca wersja" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Latest stable version" +msgstr "Najnowsza wersja stabilna" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Unknown version" +msgstr "Nieznana wersja" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Not checked yet." +msgstr "Jeszcze nie sprawdzono." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Checking for updates..." +msgstr "Sprawdzanie aktualizacji..." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Last checked: %s" +msgstr "Ostatnio sprawdzono: %s" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "No release notes were published." +msgstr "Nie opublikowano informacji o tym wydaniu." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Unable to check for updates. Check the router's connection to GitHub and try again." +msgstr "Nie można sprawdzić aktualizacji. Sprawdź połączenie routera z GitHub i spróbuj ponownie." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Unable to compare this version. View the release for details." +msgstr "Nie można porównać tej wersji. Szczegóły znajdziesz na stronie wydania." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Update available." +msgstr "Dostępna jest aktualizacja." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Your theme is up to date." +msgstr "Motyw jest aktualny." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "The installed version is newer than the latest stable release." +msgstr "Zainstalowana wersja jest nowsza od najnowszego wydania stabilnego." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Theme updates" +msgstr "Aktualizacje motywu" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Update now" +msgstr "Aktualizuj teraz" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Reload page" +msgstr "Odśwież stronę" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Automatic installation is unavailable. Download the package to update manually." +msgstr "Automatyczna instalacja jest niedostępna. Pobierz pakiet i zaktualizuj ręcznie." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Installation log" +msgstr "Dziennik instalacji" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Preparing the update..." +msgstr "Przygotowywanie aktualizacji..." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Downloading the update..." +msgstr "Pobieranie aktualizacji..." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Verifying the package..." +msgstr "Weryfikowanie pakietu..." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Installing the update. Please wait..." +msgstr "Instalowanie aktualizacji. Proszę czekać..." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Update installed. Reload the page to use the new version." +msgstr "Aktualizacja zainstalowana. Odśwież stronę, aby korzystać z nowej wersji." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Download failed. Check the router's connection to GitHub and try again." +msgstr "Pobieranie nie powiodło się. Sprawdź połączenie routera z GitHub i spróbuj ponownie." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Package verification failed. Check for updates and try again." +msgstr "Weryfikacja pakietu nie powiodła się. Sprawdź aktualizacje i spróbuj ponownie." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Not enough free space to install the update." +msgstr "Za mało wolnego miejsca na instalację aktualizacji." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "The installed version has changed. Check for updates again." +msgstr "Zainstalowana wersja uległa zmianie. Sprawdź aktualizacje ponownie." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Release information has changed or expired. Check for updates again." +msgstr "Informacje o wersji uległy zmianie lub wygasły. Sprawdź aktualizacje ponownie." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "The update was interrupted. Check the installed version before trying again." +msgstr "Aktualizacja została przerwana. Przed ponowną próbą sprawdź zainstalowaną wersję." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Installation failed. See the installation log for details." +msgstr "Instalacja nie powiodła się. Szczegóły znajdziesz w dzienniku instalacji." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Unable to read update progress. Reconnecting..." +msgstr "Nie można odczytać postępu aktualizacji. Ponowne łączenie..." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Unable to start the update. Check for updates and try again." +msgstr "Nie można rozpocząć aktualizacji. Sprawdź aktualizacje i spróbuj ponownie." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Update Argon to %s?" +msgstr "Zaktualizować Argon do %s?" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "The theme will be updated using the system package manager. Your Argon settings will be preserved." +msgstr "Motyw zostanie zaktualizowany przy użyciu systemowego menedżera pakietów. Ustawienia Argon zostaną zachowane." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Cancel" +msgstr "Anuluj" diff --git a/luci-theme-argon/po/pt_BR/argon-config.po b/luci-theme-argon/po/pt_BR/argon-config.po index 7c2501a73..d40609743 100644 --- a/luci-theme-argon/po/pt_BR/argon-config.po +++ b/luci-theme-argon/po/pt_BR/argon-config.po @@ -382,3 +382,155 @@ msgstr "[Modo escuro] Transparência" #: htdocs/luci-static/resources/view/argon-config.js:47 msgid "valid HEX color value" msgstr "um valor de cor HEX válido" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Release notes" +msgstr "Notas da versão" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "View release" +msgstr "Ver lançamento" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Download package" +msgstr "Baixar pacote" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Check for updates" +msgstr "Verificar atualizações" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Current version" +msgstr "Versão atual" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Latest stable version" +msgstr "Última versão estável" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Unknown version" +msgstr "Versão desconhecida" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Not checked yet." +msgstr "Ainda não verificado." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Checking for updates..." +msgstr "Verificando atualizações..." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Last checked: %s" +msgstr "Última verificação: %s" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "No release notes were published." +msgstr "Não foram publicadas notas para esta versão." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Unable to check for updates. Check the router's connection to GitHub and try again." +msgstr "Não foi possível verificar atualizações. Verifique a conexão do roteador com o GitHub e tente novamente." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Unable to compare this version. View the release for details." +msgstr "Não foi possível comparar esta versão. Consulte o lançamento para mais detalhes." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Update available." +msgstr "Há uma atualização disponível." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Your theme is up to date." +msgstr "Seu tema está atualizado." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "The installed version is newer than the latest stable release." +msgstr "A versão instalada é mais recente que a última versão estável." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Theme updates" +msgstr "Atualizações do tema" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Update now" +msgstr "Atualizar agora" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Reload page" +msgstr "Recarregar página" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Automatic installation is unavailable. Download the package to update manually." +msgstr "A instalação automática não está disponível. Baixe o pacote para atualizar manualmente." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Installation log" +msgstr "Registro de instalação" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Preparing the update..." +msgstr "Preparando a atualização..." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Downloading the update..." +msgstr "Baixando a atualização..." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Verifying the package..." +msgstr "Verificando o pacote..." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Installing the update. Please wait..." +msgstr "Instalando a atualização. Aguarde..." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Update installed. Reload the page to use the new version." +msgstr "Atualização instalada. Recarregue a página para usar a nova versão." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Download failed. Check the router's connection to GitHub and try again." +msgstr "Falha no download. Verifique a conexão do roteador com o GitHub e tente novamente." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Package verification failed. Check for updates and try again." +msgstr "Falha na verificação do pacote. Verifique as atualizações e tente novamente." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Not enough free space to install the update." +msgstr "Não há espaço livre suficiente para instalar a atualização." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "The installed version has changed. Check for updates again." +msgstr "A versão instalada mudou. Verifique as atualizações novamente." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Release information has changed or expired. Check for updates again." +msgstr "As informações da versão mudaram ou expiraram. Verifique as atualizações novamente." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "The update was interrupted. Check the installed version before trying again." +msgstr "A atualização foi interrompida. Confira a versão instalada antes de tentar novamente." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Installation failed. See the installation log for details." +msgstr "Falha na instalação. Consulte o registro de instalação para mais detalhes." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Unable to read update progress. Reconnecting..." +msgstr "Não foi possível ler o progresso da atualização. Reconectando..." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Unable to start the update. Check for updates and try again." +msgstr "Não foi possível iniciar a atualização. Verifique as atualizações e tente novamente." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Update Argon to %s?" +msgstr "Atualizar o Argon para %s?" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "The theme will be updated using the system package manager. Your Argon settings will be preserved." +msgstr "O tema será atualizado com o gerenciador de pacotes do sistema. Suas configurações do Argon serão preservadas." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Cancel" +msgstr "Cancelar" diff --git a/luci-theme-argon/po/ru/argon-config.po b/luci-theme-argon/po/ru/argon-config.po index d6a2a5709..a1d03c2e7 100644 --- a/luci-theme-argon/po/ru/argon-config.po +++ b/luci-theme-argon/po/ru/argon-config.po @@ -380,3 +380,155 @@ msgstr "[Тёмная тема] Прозрачность" #: htdocs/luci-static/resources/view/argon-config.js:47 msgid "valid HEX color value" msgstr "корректное значение HEX-цвета" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Release notes" +msgstr "Примечания к выпуску" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "View release" +msgstr "Открыть выпуск" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Download package" +msgstr "Скачать пакет" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Check for updates" +msgstr "Проверить обновления" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Current version" +msgstr "Текущая версия" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Latest stable version" +msgstr "Последняя стабильная версия" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Unknown version" +msgstr "Неизвестная версия" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Not checked yet." +msgstr "Проверка ещё не выполнялась." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Checking for updates..." +msgstr "Проверка обновлений..." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Last checked: %s" +msgstr "Последняя проверка: %s" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "No release notes were published." +msgstr "Примечания к этому выпуску не опубликованы." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Unable to check for updates. Check the router's connection to GitHub and try again." +msgstr "Не удалось проверить обновления. Проверьте подключение маршрутизатора к GitHub и повторите попытку." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Unable to compare this version. View the release for details." +msgstr "Не удалось сравнить эту версию. Подробности доступны на странице выпуска." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Update available." +msgstr "Доступно обновление." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Your theme is up to date." +msgstr "Тема обновлена до последней версии." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "The installed version is newer than the latest stable release." +msgstr "Установленная версия новее последнего стабильного выпуска." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Theme updates" +msgstr "Обновления темы" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Update now" +msgstr "Обновить сейчас" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Reload page" +msgstr "Перезагрузить страницу" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Automatic installation is unavailable. Download the package to update manually." +msgstr "Автоматическая установка недоступна. Скачайте пакет для обновления вручную." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Installation log" +msgstr "Журнал установки" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Preparing the update..." +msgstr "Подготовка обновления..." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Downloading the update..." +msgstr "Загрузка обновления..." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Verifying the package..." +msgstr "Проверка пакета..." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Installing the update. Please wait..." +msgstr "Установка обновления. Подождите..." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Update installed. Reload the page to use the new version." +msgstr "Обновление установлено. Перезагрузите страницу, чтобы использовать новую версию." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Download failed. Check the router's connection to GitHub and try again." +msgstr "Ошибка загрузки. Проверьте подключение маршрутизатора к GitHub и повторите попытку." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Package verification failed. Check for updates and try again." +msgstr "Проверка пакета не пройдена. Проверьте обновления и повторите попытку." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Not enough free space to install the update." +msgstr "Недостаточно свободного места для установки обновления." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "The installed version has changed. Check for updates again." +msgstr "Установленная версия изменилась. Проверьте обновления ещё раз." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Release information has changed or expired. Check for updates again." +msgstr "Сведения о выпуске изменились или устарели. Проверьте обновления ещё раз." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "The update was interrupted. Check the installed version before trying again." +msgstr "Обновление прервано. Перед повторной попыткой проверьте установленную версию." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Installation failed. See the installation log for details." +msgstr "Ошибка установки. Подробности доступны в журнале установки." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Unable to read update progress. Reconnecting..." +msgstr "Не удалось прочитать ход обновления. Повторное подключение..." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Unable to start the update. Check for updates and try again." +msgstr "Не удалось начать обновление. Проверьте обновления и повторите попытку." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Update Argon to %s?" +msgstr "Обновить Argon до %s?" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "The theme will be updated using the system package manager. Your Argon settings will be preserved." +msgstr "Тема будет обновлена системным менеджером пакетов. Ваши настройки Argon будут сохранены." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Cancel" +msgstr "Отмена" diff --git a/luci-theme-argon/po/templates/argon-config.pot b/luci-theme-argon/po/templates/argon-config.pot index 134ce380f..2862720d6 100644 --- a/luci-theme-argon/po/templates/argon-config.pot +++ b/luci-theme-argon/po/templates/argon-config.pot @@ -387,3 +387,155 @@ msgstr "" #: htdocs/luci-static/resources/view/argon-config.js:47 msgid "valid HEX color value" msgstr "" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Release notes" +msgstr "" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "View release" +msgstr "" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Download package" +msgstr "" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Check for updates" +msgstr "" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Current version" +msgstr "" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Latest stable version" +msgstr "" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Unknown version" +msgstr "" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Not checked yet." +msgstr "" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Checking for updates..." +msgstr "" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Last checked: %s" +msgstr "" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "No release notes were published." +msgstr "" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Unable to check for updates. Check the router's connection to GitHub and try again." +msgstr "" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Unable to compare this version. View the release for details." +msgstr "" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Update available." +msgstr "" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Your theme is up to date." +msgstr "" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "The installed version is newer than the latest stable release." +msgstr "" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Theme updates" +msgstr "" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Update now" +msgstr "" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Reload page" +msgstr "" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Automatic installation is unavailable. Download the package to update manually." +msgstr "" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Installation log" +msgstr "" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Preparing the update..." +msgstr "" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Downloading the update..." +msgstr "" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Verifying the package..." +msgstr "" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Installing the update. Please wait..." +msgstr "" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Update installed. Reload the page to use the new version." +msgstr "" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Download failed. Check the router's connection to GitHub and try again." +msgstr "" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Package verification failed. Check for updates and try again." +msgstr "" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Not enough free space to install the update." +msgstr "" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "The installed version has changed. Check for updates again." +msgstr "" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Release information has changed or expired. Check for updates again." +msgstr "" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "The update was interrupted. Check the installed version before trying again." +msgstr "" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Installation failed. See the installation log for details." +msgstr "" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Unable to read update progress. Reconnecting..." +msgstr "" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Unable to start the update. Check for updates and try again." +msgstr "" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Update Argon to %s?" +msgstr "" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "The theme will be updated using the system package manager. Your Argon settings will be preserved." +msgstr "" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Cancel" +msgstr "" diff --git a/luci-theme-argon/po/tr/argon-config.po b/luci-theme-argon/po/tr/argon-config.po index 7c6d50cf9..fc1e086c5 100644 --- a/luci-theme-argon/po/tr/argon-config.po +++ b/luci-theme-argon/po/tr/argon-config.po @@ -380,3 +380,155 @@ msgstr "[Koyu mod] Saydamlık" #: htdocs/luci-static/resources/view/argon-config.js:47 msgid "valid HEX color value" msgstr "geçerli bir HEX renk değeri" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Release notes" +msgstr "Sürüm notları" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "View release" +msgstr "Sürümü görüntüle" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Download package" +msgstr "Paketi indir" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Check for updates" +msgstr "Güncellemeleri denetle" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Current version" +msgstr "Mevcut sürüm" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Latest stable version" +msgstr "En son kararlı sürüm" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Unknown version" +msgstr "Bilinmeyen sürüm" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Not checked yet." +msgstr "Henüz denetlenmedi." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Checking for updates..." +msgstr "Güncellemeler denetleniyor..." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Last checked: %s" +msgstr "Son denetim: %s" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "No release notes were published." +msgstr "Bu sürüm için sürüm notları yayımlanmadı." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Unable to check for updates. Check the router's connection to GitHub and try again." +msgstr "Güncellemeler denetlenemedi. Yönlendiricinin GitHub bağlantısını kontrol edip yeniden deneyin." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Unable to compare this version. View the release for details." +msgstr "Bu sürüm karşılaştırılamadı. Ayrıntılar için sürüm sayfasını görüntüleyin." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Update available." +msgstr "Güncelleme mevcut." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Your theme is up to date." +msgstr "Temanız güncel." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "The installed version is newer than the latest stable release." +msgstr "Yüklü sürüm, en son kararlı sürümden daha yeni." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Theme updates" +msgstr "Tema güncellemeleri" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Update now" +msgstr "Şimdi güncelle" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Reload page" +msgstr "Sayfayı yeniden yükle" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Automatic installation is unavailable. Download the package to update manually." +msgstr "Otomatik kurulum kullanılamıyor. Elle güncellemek için paketi indirin." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Installation log" +msgstr "Kurulum günlüğü" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Preparing the update..." +msgstr "Güncelleme hazırlanıyor..." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Downloading the update..." +msgstr "Güncelleme indiriliyor..." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Verifying the package..." +msgstr "Paket doğrulanıyor..." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Installing the update. Please wait..." +msgstr "Güncelleme kuruluyor. Lütfen bekleyin..." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Update installed. Reload the page to use the new version." +msgstr "Güncelleme kuruldu. Yeni sürümü kullanmak için sayfayı yeniden yükleyin." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Download failed. Check the router's connection to GitHub and try again." +msgstr "İndirme başarısız. Yönlendiricinin GitHub bağlantısını kontrol edip yeniden deneyin." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Package verification failed. Check for updates and try again." +msgstr "Paket doğrulaması başarısız. Güncellemeleri yeniden denetleyip tekrar deneyin." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Not enough free space to install the update." +msgstr "Güncellemeyi kurmak için yeterli boş alan yok." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "The installed version has changed. Check for updates again." +msgstr "Yüklü sürüm değişti. Güncellemeleri yeniden denetleyin." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Release information has changed or expired. Check for updates again." +msgstr "Sürüm bilgileri değişti veya süresi doldu. Güncellemeleri yeniden denetleyin." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "The update was interrupted. Check the installed version before trying again." +msgstr "Güncelleme kesintiye uğradı. Yeniden denemeden önce yüklü sürümü kontrol edin." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Installation failed. See the installation log for details." +msgstr "Kurulum başarısız. Ayrıntılar için kurulum günlüğüne bakın." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Unable to read update progress. Reconnecting..." +msgstr "Güncelleme ilerlemesi okunamıyor. Yeniden bağlanılıyor..." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Unable to start the update. Check for updates and try again." +msgstr "Güncelleme başlatılamadı. Güncellemeleri yeniden denetleyip tekrar deneyin." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Update Argon to %s?" +msgstr "Argon, %s sürümüne güncellensin mi?" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "The theme will be updated using the system package manager. Your Argon settings will be preserved." +msgstr "Tema, sistemin paket yöneticisiyle güncellenecek. Argon ayarlarınız korunacak." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Cancel" +msgstr "İptal" diff --git a/luci-theme-argon/po/uk/argon-config.po b/luci-theme-argon/po/uk/argon-config.po index bcda01442..86cfe2e98 100644 --- a/luci-theme-argon/po/uk/argon-config.po +++ b/luci-theme-argon/po/uk/argon-config.po @@ -380,3 +380,155 @@ msgstr "[Темний режим] Прозорість" #: htdocs/luci-static/resources/view/argon-config.js:47 msgid "valid HEX color value" msgstr "коректне значення кольору у форматі HEX" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Release notes" +msgstr "Примітки до випуску" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "View release" +msgstr "Відкрити випуск" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Download package" +msgstr "Завантажити пакунок" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Check for updates" +msgstr "Перевірити оновлення" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Current version" +msgstr "Поточна версія" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Latest stable version" +msgstr "Остання стабільна версія" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Unknown version" +msgstr "Невідома версія" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Not checked yet." +msgstr "Перевірку ще не виконано." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Checking for updates..." +msgstr "Перевірка оновлень..." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Last checked: %s" +msgstr "Остання перевірка: %s" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "No release notes were published." +msgstr "Примітки до цього випуску не опубліковані." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Unable to check for updates. Check the router's connection to GitHub and try again." +msgstr "Не вдалося перевірити оновлення. Перевірте з’єднання маршрутизатора з GitHub і повторіть спробу." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Unable to compare this version. View the release for details." +msgstr "Не вдалося порівняти цю версію. Докладніше на сторінці випуску." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Update available." +msgstr "Доступне оновлення." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Your theme is up to date." +msgstr "Тему оновлено до останньої версії." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "The installed version is newer than the latest stable release." +msgstr "Встановлена версія новіша за останній стабільний випуск." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Theme updates" +msgstr "Оновлення теми" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Update now" +msgstr "Оновити зараз" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Reload page" +msgstr "Перезавантажити сторінку" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Automatic installation is unavailable. Download the package to update manually." +msgstr "Автоматичне встановлення недоступне. Завантажте пакунок для оновлення вручну." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Installation log" +msgstr "Журнал встановлення" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Preparing the update..." +msgstr "Підготовка оновлення..." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Downloading the update..." +msgstr "Завантаження оновлення..." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Verifying the package..." +msgstr "Перевірка пакунка..." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Installing the update. Please wait..." +msgstr "Встановлення оновлення. Зачекайте..." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Update installed. Reload the page to use the new version." +msgstr "Оновлення встановлено. Перезавантажте сторінку, щоб використовувати нову версію." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Download failed. Check the router's connection to GitHub and try again." +msgstr "Помилка завантаження. Перевірте з’єднання маршрутизатора з GitHub і повторіть спробу." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Package verification failed. Check for updates and try again." +msgstr "Перевірку пакунка не пройдено. Перевірте оновлення та повторіть спробу." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Not enough free space to install the update." +msgstr "Недостатньо вільного місця для встановлення оновлення." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "The installed version has changed. Check for updates again." +msgstr "Встановлена версія змінилася. Перевірте оновлення ще раз." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Release information has changed or expired. Check for updates again." +msgstr "Відомості про випуск змінилися або застаріли. Перевірте оновлення ще раз." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "The update was interrupted. Check the installed version before trying again." +msgstr "Оновлення перервано. Перед повторною спробою перевірте встановлену версію." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Installation failed. See the installation log for details." +msgstr "Помилка встановлення. Докладніше в журналі встановлення." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Unable to read update progress. Reconnecting..." +msgstr "Не вдалося прочитати перебіг оновлення. Повторне підключення..." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Unable to start the update. Check for updates and try again." +msgstr "Не вдалося почати оновлення. Перевірте оновлення та повторіть спробу." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Update Argon to %s?" +msgstr "Оновити Argon до %s?" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "The theme will be updated using the system package manager. Your Argon settings will be preserved." +msgstr "Тему буде оновлено системним менеджером пакунків. Ваші налаштування Argon буде збережено." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Cancel" +msgstr "Скасувати" diff --git a/luci-theme-argon/po/vi/argon-config.po b/luci-theme-argon/po/vi/argon-config.po index f69bf145e..4b377c645 100644 --- a/luci-theme-argon/po/vi/argon-config.po +++ b/luci-theme-argon/po/vi/argon-config.po @@ -380,3 +380,155 @@ msgstr "[Chế độ tối] Độ trong suốt" #: htdocs/luci-static/resources/view/argon-config.js:47 msgid "valid HEX color value" msgstr "mã màu HEX hợp lệ" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Release notes" +msgstr "Ghi chú phát hành" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "View release" +msgstr "Xem bản phát hành" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Download package" +msgstr "Tải gói" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Check for updates" +msgstr "Kiểm tra cập nhật" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Current version" +msgstr "Phiên bản hiện tại" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Latest stable version" +msgstr "Phiên bản ổn định mới nhất" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Unknown version" +msgstr "Phiên bản không xác định" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Not checked yet." +msgstr "Chưa kiểm tra." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Checking for updates..." +msgstr "Đang kiểm tra cập nhật..." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Last checked: %s" +msgstr "Lần kiểm tra gần nhất: %s" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "No release notes were published." +msgstr "Không có ghi chú cho bản phát hành này." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Unable to check for updates. Check the router's connection to GitHub and try again." +msgstr "Không thể kiểm tra cập nhật. Hãy kiểm tra kết nối của bộ định tuyến tới GitHub rồi thử lại." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Unable to compare this version. View the release for details." +msgstr "Không thể so sánh phiên bản này. Xem bản phát hành để biết chi tiết." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Update available." +msgstr "Có bản cập nhật." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Your theme is up to date." +msgstr "Giao diện đã được cập nhật." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "The installed version is newer than the latest stable release." +msgstr "Phiên bản đã cài đặt mới hơn bản ổn định mới nhất." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Theme updates" +msgstr "Cập nhật giao diện" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Update now" +msgstr "Cập nhật ngay" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Reload page" +msgstr "Tải lại trang" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Automatic installation is unavailable. Download the package to update manually." +msgstr "Không thể cài đặt tự động. Hãy tải gói để cập nhật thủ công." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Installation log" +msgstr "Nhật ký cài đặt" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Preparing the update..." +msgstr "Đang chuẩn bị cập nhật..." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Downloading the update..." +msgstr "Đang tải bản cập nhật..." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Verifying the package..." +msgstr "Đang xác minh gói..." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Installing the update. Please wait..." +msgstr "Đang cài đặt bản cập nhật. Vui lòng đợi..." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Update installed. Reload the page to use the new version." +msgstr "Đã cài đặt bản cập nhật. Hãy tải lại trang để dùng phiên bản mới." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Download failed. Check the router's connection to GitHub and try again." +msgstr "Tải xuống thất bại. Hãy kiểm tra kết nối của bộ định tuyến tới GitHub rồi thử lại." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Package verification failed. Check for updates and try again." +msgstr "Xác minh gói thất bại. Hãy kiểm tra cập nhật rồi thử lại." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Not enough free space to install the update." +msgstr "Không đủ dung lượng trống để cài đặt bản cập nhật." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "The installed version has changed. Check for updates again." +msgstr "Phiên bản đã cài đặt đã thay đổi. Hãy kiểm tra cập nhật lại." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Release information has changed or expired. Check for updates again." +msgstr "Thông tin phiên bản đã thay đổi hoặc hết hạn. Hãy kiểm tra cập nhật lại." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "The update was interrupted. Check the installed version before trying again." +msgstr "Cập nhật đã bị gián đoạn. Hãy kiểm tra phiên bản đã cài trước khi thử lại." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Installation failed. See the installation log for details." +msgstr "Cài đặt thất bại. Xem nhật ký cài đặt để biết chi tiết." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Unable to read update progress. Reconnecting..." +msgstr "Không thể đọc tiến trình cập nhật. Đang kết nối lại..." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Unable to start the update. Check for updates and try again." +msgstr "Không thể bắt đầu cập nhật. Hãy kiểm tra cập nhật rồi thử lại." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Update Argon to %s?" +msgstr "Cập nhật Argon lên %s?" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "The theme will be updated using the system package manager. Your Argon settings will be preserved." +msgstr "Giao diện sẽ được cập nhật bằng trình quản lý gói hệ thống. Cấu hình Argon của bạn sẽ được giữ lại." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Cancel" +msgstr "Hủy" diff --git a/luci-theme-argon/po/zh_Hans/argon-config.po b/luci-theme-argon/po/zh_Hans/argon-config.po index 54f60b9ec..f22517bcf 100644 --- a/luci-theme-argon/po/zh_Hans/argon-config.po +++ b/luci-theme-argon/po/zh_Hans/argon-config.po @@ -382,3 +382,155 @@ msgstr "[暗色模式] 透明度" #: htdocs/luci-static/resources/view/argon-config.js:47 msgid "valid HEX color value" msgstr "有效的十六进制颜色值" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Release notes" +msgstr "更新日志" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "View release" +msgstr "查看发布页" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Download package" +msgstr "下载安装包" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Check for updates" +msgstr "检查更新" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Current version" +msgstr "当前版本" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Latest stable version" +msgstr "最新稳定版" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Unknown version" +msgstr "未知版本" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Not checked yet." +msgstr "尚未检查。" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Checking for updates..." +msgstr "正在检查更新..." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Last checked: %s" +msgstr "上次检查:%s" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "No release notes were published." +msgstr "此版本未提供更新日志。" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Unable to check for updates. Check the router's connection to GitHub and try again." +msgstr "检查更新失败。请检查路由器与 GitHub 的连接后重试。" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Unable to compare this version. View the release for details." +msgstr "无法比较此版本。请查看发布页了解详情。" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Update available." +msgstr "有可用更新。" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Your theme is up to date." +msgstr "主题已是最新版本。" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "The installed version is newer than the latest stable release." +msgstr "本地安装版本高于最新稳定版。" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Theme updates" +msgstr "主题更新" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Update now" +msgstr "立即更新" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Reload page" +msgstr "重新加载页面" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Automatic installation is unavailable. Download the package to update manually." +msgstr "暂时无法自动安装。请下载安装包手动更新。" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Installation log" +msgstr "安装日志" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Preparing the update..." +msgstr "正在准备更新..." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Downloading the update..." +msgstr "正在下载更新..." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Verifying the package..." +msgstr "正在校验安装包..." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Installing the update. Please wait..." +msgstr "正在安装更新,请稍候..." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Update installed. Reload the page to use the new version." +msgstr "更新已安装。请重新加载页面以使用新版本。" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Download failed. Check the router's connection to GitHub and try again." +msgstr "下载失败。请检查路由器与 GitHub 的连接后重试。" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Package verification failed. Check for updates and try again." +msgstr "安装包校验失败。请重新检查更新后重试。" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Not enough free space to install the update." +msgstr "可用空间不足,无法安装更新。" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "The installed version has changed. Check for updates again." +msgstr "已安装版本发生变化。请重新检查更新。" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Release information has changed or expired. Check for updates again." +msgstr "版本信息已变化或过期。请重新检查更新。" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "The update was interrupted. Check the installed version before trying again." +msgstr "更新已中断。重试前请检查已安装的版本。" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Installation failed. See the installation log for details." +msgstr "安装失败。请查看安装日志了解详情。" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Unable to read update progress. Reconnecting..." +msgstr "无法读取更新进度,正在重新连接..." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Unable to start the update. Check for updates and try again." +msgstr "无法开始更新。请重新检查更新后重试。" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Update Argon to %s?" +msgstr "将 Argon 更新到 %s?" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "The theme will be updated using the system package manager. Your Argon settings will be preserved." +msgstr "将使用系统包管理器更新主题,并保留当前 Argon 配置。" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Cancel" +msgstr "取消" diff --git a/luci-theme-argon/po/zh_Hant/argon-config.po b/luci-theme-argon/po/zh_Hant/argon-config.po index 290b80817..dc32672cc 100644 --- a/luci-theme-argon/po/zh_Hant/argon-config.po +++ b/luci-theme-argon/po/zh_Hant/argon-config.po @@ -382,3 +382,155 @@ msgstr "[深色模式] 透明度" #: htdocs/luci-static/resources/view/argon-config.js:47 msgid "valid HEX color value" msgstr "有效的十六進制顏色值" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Release notes" +msgstr "更新日誌" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "View release" +msgstr "查看發佈頁" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Download package" +msgstr "下載安裝套件" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Check for updates" +msgstr "檢查更新" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Current version" +msgstr "目前版本" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Latest stable version" +msgstr "最新穩定版" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Unknown version" +msgstr "未知版本" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Not checked yet." +msgstr "尚未檢查。" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Checking for updates..." +msgstr "正在檢查更新..." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Last checked: %s" +msgstr "上次檢查:%s" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "No release notes were published." +msgstr "此版本未提供更新日誌。" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Unable to check for updates. Check the router's connection to GitHub and try again." +msgstr "檢查更新失敗。請檢查路由器與 GitHub 的連線後重試。" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Unable to compare this version. View the release for details." +msgstr "無法比較此版本。請查看發佈頁以瞭解詳情。" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Update available." +msgstr "有可用更新。" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Your theme is up to date." +msgstr "佈景主題已是最新版本。" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "The installed version is newer than the latest stable release." +msgstr "本機安裝版本高於最新穩定版。" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Theme updates" +msgstr "佈景主題更新" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Update now" +msgstr "立即更新" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Reload page" +msgstr "重新載入頁面" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Automatic installation is unavailable. Download the package to update manually." +msgstr "暫時無法自動安裝。請下載安裝套件手動更新。" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Installation log" +msgstr "安裝日誌" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Preparing the update..." +msgstr "正在準備更新..." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Downloading the update..." +msgstr "正在下載更新..." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Verifying the package..." +msgstr "正在驗證安裝套件..." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Installing the update. Please wait..." +msgstr "正在安裝更新,請稍候..." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Update installed. Reload the page to use the new version." +msgstr "更新已安裝。請重新載入頁面以使用新版本。" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Download failed. Check the router's connection to GitHub and try again." +msgstr "下載失敗。請檢查路由器與 GitHub 的連線後重試。" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Package verification failed. Check for updates and try again." +msgstr "安裝套件驗證失敗。請重新檢查更新後重試。" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Not enough free space to install the update." +msgstr "可用空間不足,無法安裝更新。" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "The installed version has changed. Check for updates again." +msgstr "已安裝版本發生變化。請重新檢查更新。" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Release information has changed or expired. Check for updates again." +msgstr "版本資訊已變更或過期。請重新檢查更新。" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "The update was interrupted. Check the installed version before trying again." +msgstr "更新已中斷。重試前請檢查已安裝的版本。" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Installation failed. See the installation log for details." +msgstr "安裝失敗。請查看安裝日誌瞭解詳情。" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Unable to read update progress. Reconnecting..." +msgstr "無法讀取更新進度,正在重新連線..." + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Unable to start the update. Check for updates and try again." +msgstr "無法開始更新。請重新檢查更新後重試。" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Update Argon to %s?" +msgstr "將 Argon 更新至 %s?" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "The theme will be updated using the system package manager. Your Argon settings will be preserved." +msgstr "將使用系統套件管理器更新佈景主題,並保留目前的 Argon 設定。" + +#: htdocs/luci-static/resources/argon/updates.js +msgid "Cancel" +msgstr "取消" diff --git a/luci-theme-argon/root/usr/libexec/rpcd/luci.argon_update b/luci-theme-argon/root/usr/libexec/rpcd/luci.argon_update new file mode 100755 index 000000000..ab0d5fa05 --- /dev/null +++ b/luci-theme-argon/root/usr/libexec/rpcd/luci.argon_update @@ -0,0 +1,351 @@ +#!/bin/sh + +. /usr/share/libubox/jshn.sh + +readonly state_dir='/var/run/argon-update' +readonly cache_file='/var/run/argon-update/release.json' +readonly release_api='https://api.github.com/repos/jerrykuku/luci-theme-argon/releases/latest' + +installed_version() { + current_version='' + package_manager='' + if command -v apk >/dev/null 2>&1; then + current_version="$(apk list --installed luci-theme-argon 2>/dev/null | + awk '$1 ~ /^luci-theme-argon-/ { sub(/^luci-theme-argon-/, "", $1); print $1; exit }')" + [ -z "$current_version" ] || package_manager=apk + fi + if [ -z "$current_version" ] && command -v opkg >/dev/null 2>&1; then + current_version="$(opkg status luci-theme-argon 2>/dev/null | awk ' + /^Version: / { version=$2 } + /^Status: .* installed$/ { installed=1 } + END { if (installed) print version }')" + [ -z "$current_version" ] || package_manager=opkg + fi +} + +valid_tag() { + [ "${#1}" -le 48 ] && printf '%s\n' "$1" | grep -Eq '^v?[0-9]+(\.[0-9]+){1,3}$' +} + +read_cache() { + [ -f "$cache_file" ] && [ ! -L "$cache_file" ] && + [ "$(wc -c < "$cache_file")" -le 1048576 ] || return 1 + json_load_file "$cache_file" || return 1 + json_get_var tag tag + json_get_var checked_at checked_at + valid_tag "$tag" && printf '%s\n' "$checked_at" | grep -Eq '^[0-9]{1,11}$' +} + +select_package() { + case "$package_manager" in apk) format=apk ;; opkg) format=ipk ;; *) return 1 ;; esac + json_get_var package "$format" + json_get_var digest "${format}_sha256" + json_get_var size "${format}_size" + json_get_var tag tag + valid_tag "$tag" || return 1 + base="${tag#v}" + case "$package_manager:$package" in + apk:luci-theme-argon-"$base"-r*.apk) + target_version="${package#luci-theme-argon-}" + target_version="${target_version%.apk}" + revision="${target_version#"$base"-r}" ;; + opkg:luci-theme-argon_"$base"*_all.ipk) + target_version="${package#luci-theme-argon_}" + target_version="${target_version%_all.ipk}" + case "$target_version" in "$base") revision=1 ;; "$base"-*) revision="${target_version#"$base"-}" ;; *) return 1 ;; esac ;; + *) return 1 ;; + esac + printf '%s\n' "$revision" | grep -Eq '^[0-9]{1,8}$' && + printf '%s\n' "$digest" | grep -Eq '^[a-f0-9]{64}$' && + printf '%s\n' "$size" | grep -Eq '^[0-9]{1,8}$' && + [ "$size" -gt 0 ] && [ "$size" -le 8388608 ] +} + +is_upgrade() { + # Reject unknown/custom version syntax before asking the native comparator. + printf '%s\n' "$current_version" | grep -Eq '^[0-9]+(\.[0-9]+){1,3}((~|_)(alpha|beta|rc)[0-9]+|-(alpha|beta|rc)\.[0-9]+)?(-r?[0-9]+)?$' || return 1 + case "$package_manager" in + apk) [ "$(apk version -t "$current_version" "$target_version" 2>/dev/null)" = '<' ] ;; + opkg) opkg compare-versions "$current_version" '<<' "$target_version" ;; + *) return 1 ;; + esac +} + +prepare_state() { + [ ! -L "$state_dir" ] && { [ -d "$state_dir" ] || mkdir -m 700 "$state_dir"; } && + command -v flock >/dev/null 2>&1 && command -v sha256sum >/dev/null 2>&1 && command -v timeout >/dev/null 2>&1 +} + +add_status() { + # Keep release data in the caller's namespace while loading the small job file. + json_set_namespace upgrade_status previous_namespace + json_init + phase=idle + job_error='' + job_version='' + if [ -f "$state_dir/status.json" ] && [ ! -L "$state_dir/status.json" ] && + [ "$(wc -c < "$state_dir/status.json")" -le 4096 ] && json_load_file "$state_dir/status.json"; then + json_get_var phase phase + json_get_var job_error error + json_get_var job_version version + fi + active=0 + case "$phase" in + starting|downloading|verifying|installing) + # A kernel lock survives the initiating RPC and is released on worker exit. + if command -v flock >/dev/null 2>&1; then + exec 8>"$state_dir/lock" + if flock -n 8; then + # The worker may have finished between our snapshot and lock probe. + # Read its final state while holding the lock against a new start. + json_load_file "$state_dir/status.json" + json_get_var phase phase + json_get_var job_error error + json_get_var job_version version + case "$phase" in starting|downloading|verifying|installing) phase=failed; job_error=interrupted ;; esac + else + active=1 + fi + exec 8>&- + else + phase=failed + job_error=interrupted + fi ;; + esac + json_set_namespace "$previous_namespace" + json_add_object upgrade + json_add_string phase "$phase" + json_add_string error "$job_error" + json_add_string version "$job_version" + json_add_boolean active "$active" + if [ -f "$state_dir/log" ] && [ ! -L "$state_dir/log" ]; then + json_add_string log "$(tail -c 8192 "$state_dir/log")" + fi + json_close_object +} + +respond() { + add_status + # Read after the job snapshot so a completed job reports its installed version. + installed_version + can_upgrade=0 + if select_package && is_upgrade && command -v flock >/dev/null 2>&1 && command -v sha256sum >/dev/null 2>&1 && command -v timeout >/dev/null 2>&1; then + can_upgrade=1 + fi + json_add_int result "$1" + json_add_string current_version "$current_version" + json_add_string package_manager "$package_manager" + json_add_boolean can_upgrade "$can_upgrade" + json_dump +} + +fail() { + json_init + respond "$1" +} + +write_status() { + json_init + json_add_string phase "$1" + json_add_string error "${2:-}" + json_add_string version "$target_version" + json_dump > "$state_dir/status.$$" && mv -f "$state_dir/status.$$" "$state_dir/status.json" +} + +run_upgrade() { + # Run a private copy, since installing the theme replaces this RPC script. + work="${0%/*}" + case "$work" in "$state_dir"/job.??????) ;; *) return 1 ;; esac + [ -d "$work" ] && [ ! -L "$work" ] && [ -f "$work/release.json" ] || return 1 + trap 'rm -rf "$work"' EXIT + trap 'write_status failed interrupted; exit 1' INT TERM + json_load_file "$work/release.json" && select_package || { write_status failed metadata; return; } + installed_version + is_upgrade || { write_status failed version; return; } + # Leave room for download metadata and unpacking. The package manager also + # performs its own dependency and storage checks; never force those checks. + tmp_free="$(df -Pk "$state_dir" | awk 'END { print $4 }')" + root_path=/ + [ ! -d /overlay ] || root_path=/overlay + root_free="$(df -Pk "$root_path" | awk 'END { print $4 }')" + if [ "${tmp_free:-0}" -lt "$((size / 1024 + 2048))" ] || + [ "${root_free:-0}" -lt "$((size * 3 / 1024 + 1024))" ]; then + write_status failed space + return + fi + write_status downloading + url="https://github.com/jerrykuku/luci-theme-argon/releases/download/$tag/$package" + (ulimit -f 16384; timeout -k 2 90 wget -T 20 -q -U 'luci-theme-argon' \ + -O "$work/$package" "$url") 2>/dev/null || { write_status failed network; return; } + write_status verifying + if [ "$(wc -c < "$work/$package")" -ne "$size" ] || + [ "$(sha256sum "$work/$package" | awk '{ print $1 }')" != "$digest" ]; then + write_status failed checksum + return + fi + # Recheck immediately before modifying the package database. + installed_version + is_upgrade || { write_status failed version; return; } + write_status installing + # Bound captured output without imposing a file-size limit on the installer. + ( + case "$package_manager" in + apk) apk add --allow-untrusted "$work/$package" ;; + opkg) opkg install "$work/$package" ;; + esac + printf '%s\n' "$?" > "$work/exit" + ) 2>&1 | tail -c 8192 > "$state_dir/log" + if [ "$(cat "$work/exit" 2>/dev/null)" != 0 ]; then + write_status failed install + return + fi + installed_version + if [ "$current_version" != "$target_version" ]; then + write_status failed install + return + fi + write_status complete +} + +start_upgrade() { + read -r request + json_load "$request" || { fail 3; return; } + json_get_var requested_tag tag + json_get_var requested_package package + now="$(date +%s)" + read_cache && [ "$now" -ge "$checked_at" ] && [ "$((now - checked_at))" -lt 300 ] && + select_package && [ "$tag" = "$requested_tag" ] && [ "$package" = "$requested_package" ] || { fail 3; return; } + is_upgrade || { fail 5; return; } + prepare_state || { fail 1; return; } + exec 9>"$state_dir/lock" + flock -n 9 || { fail 4; return; } + work="$(mktemp -d "$state_dir/job.XXXXXX")" || { fail 1; return; } + if ! cp "$0" "$work/worker.sh" || ! json_dump > "$work/release.json"; then + rm -rf "$work" + fail 1 + return + fi + : > "$state_dir/log" + write_status starting + # FD 9 is inherited by the worker, keeping the lock until all installation + # work finishes. Detach every stdio stream so rpcd can reply immediately. + (trap '' HUP; exec sh "$work/worker.sh" run "$package_manager") /dev/null 2>&1 & + json_init + respond 0 +} + +umask 077 +case "$1" in +list) + printf '%s\n' '{"get":{},"check":{},"status":{},"start":{"tag":"String","package":"String"}}' + ;; +run) + package_manager="$2" + run_upgrade + ;; +call) + case "$2" in get|check|status|start) ;; *) exit 1 ;; esac + if [ "$2" = status ]; then + json_init + respond 0 + exit 0 + fi + if [ "$2" = start ]; then + installed_version + start_upgrade + exit 0 + fi + if [ "$2" = get ]; then + read_cache || json_init + respond 0 + exit 0 + fi + now="$(date +%s)" + if read_cache && [ "$now" -ge "$checked_at" ] && [ "$((now - checked_at))" -lt 300 ]; then + respond 0 + exit 0 + fi + [ -L "$state_dir" ] || [ -d "$state_dir" ] || mkdir -m 700 "$state_dir" 2>/dev/null || : + umask 077 + work="$(mktemp -d /tmp/argon-update.XXXXXX)" || { fail 1; exit 0; } + trap 'rm -rf "$work"' EXIT + trap 'exit 1' HUP INT TERM + # Bound the request to less than rpcd's timeout and limit the response size. + (ulimit -f 2048; timeout -k 2 12 wget -T 10 -q -U 'luci-theme-argon' \ + --header='Accept: application/vnd.github+json' \ + --header='Cache-Control: no-cache' \ + -O "$work/release.json" "$release_api") 2>/dev/null || { fail 1; exit 0; } + [ "$(wc -c < "$work/release.json")" -le 1048576 ] && + json_load_file "$work/release.json" || { fail 2; exit 0; } + json_get_var tag tag_name + json_get_var draft draft + json_get_var prerelease prerelease + valid_tag "$tag" && [ "$draft" = 0 ] && [ "$prerelease" = 0 ] || { fail 2; exit 0; } + json_get_var published_at published_at + json_get_var notes body + base="${tag#v}" + ipk='' + apk='' + ipk_sha256='' + apk_sha256='' + ipk_size=0 + apk_size=0 + ipk_revision=-1 + apk_revision=-1 + if json_select assets; then + json_get_keys asset_keys + for asset_key in $asset_keys; do + json_select "$asset_key" || continue + json_get_var asset name + json_get_var asset_digest digest + json_get_var asset_size size + # Older releases may not expose a checksum. Keep manual downloads, + # but only checksum-backed assets can be installed through this RPC. + asset_digest="${asset_digest#sha256:}" + printf '%s\n' "$asset_digest" | grep -Eq '^[a-f0-9]{64}$' || asset_digest='' + printf '%s\n' "$asset_size" | grep -Eq '^[0-9]{1,8}$' || asset_size=0 + case "$asset" in + "luci-theme-argon_${base}"*_all.ipk) + revision="${asset#luci-theme-argon_${base}}" + revision="${revision%_all.ipk}" + case "$revision" in '') revision=1 ;; -*) revision="${revision#-}" ;; *) revision='' ;; esac + if printf '%s\n' "$revision" | grep -Eq '^[0-9]{1,8}$' && [ "$revision" -gt "$ipk_revision" ]; then + ipk="$asset" + ipk_sha256="$asset_digest" + ipk_size="$asset_size" + ipk_revision="$revision" + fi + ;; + "luci-theme-argon-${base}-r"*.apk) + revision="${asset#luci-theme-argon-${base}-r}" + revision="${revision%.apk}" + if printf '%s\n' "$revision" | grep -Eq '^[0-9]{1,8}$' && [ "$revision" -gt "$apk_revision" ]; then + apk="$asset" + apk_sha256="$asset_digest" + apk_size="$asset_size" + apk_revision="$revision" + fi + ;; + esac + json_select .. + done + fi + json_init + json_add_string tag "$tag" + json_add_string published_at "$published_at" + json_add_string notes "$notes" + json_add_string ipk "$ipk" + json_add_string apk "$apk" + json_add_string ipk_sha256 "$ipk_sha256" + json_add_string apk_sha256 "$apk_sha256" + json_add_int ipk_size "$ipk_size" + json_add_int apk_size "$apk_size" + json_add_int checked_at "$now" + json_dump > "$work/cache.json" + # Cache only successful checks, atomically; a failed cache write is nonfatal. + if [ ! -L "$cache_file" ] && { [ ! -e "$cache_file" ] || [ -f "$cache_file" ]; }; then + mv -f "$work/cache.json" "$cache_file" 2>/dev/null || : + fi + respond 0 + ;; +esac diff --git a/luci-theme-argon/root/usr/share/rpcd/acl.d/luci-app-argon-config.json b/luci-theme-argon/root/usr/share/rpcd/acl.d/luci-app-argon-config.json index c9c80e9df..c5a4d1aed 100644 --- a/luci-theme-argon/root/usr/share/rpcd/acl.d/luci-app-argon-config.json +++ b/luci-theme-argon/root/usr/share/rpcd/acl.d/luci-app-argon-config.json @@ -7,6 +7,7 @@ }, "ubus": { "luci.argon": [ "avail" ], + "luci.argon_update": [ "get", "check", "status" ], "luci.argon_appearance": [ "get" ], "luci.argon_branding": [ "get" ] }, @@ -19,6 +20,7 @@ }, "ubus": { "luci.argon": [ "remove", "rename" ], + "luci.argon_update": [ "start" ], "luci.argon_appearance": [ "set" ], "luci.argon_branding": [ "set", "reset" ] }, diff --git a/luci-theme-argon/tests/argon-config.test.js b/luci-theme-argon/tests/argon-config.test.js index a73f3fc1f..8b39cba13 100644 --- a/luci-theme-argon/tests/argon-config.test.js +++ b/luci-theme-argon/tests/argon-config.test.js @@ -97,11 +97,12 @@ function fixture(options = {}) { }; const L = { dom: { callClassMethod(node, method, value) { assert.equal(method, 'setValue'); node.value = value; } }, bind: (fn, context) => fn.bind(context), resolveDefault: (promise, value) => Promise.resolve(promise).catch(() => value), resource: name => '/luci-static/resources/' + name }; state.window = new EventTarget(); - state.view = new Function('form', 'fs', 'rpc', 'uci', 'ui', 'view', 'L', 'E', '_', 'cbi_update_table', 'location', 'document', 'branding', 'window', source)( + state.view = new Function('form', 'fs', 'rpc', 'uci', 'ui', 'view', 'L', 'E', '_', 'cbi_update_table', 'location', 'document', 'branding', 'window', 'updates', source)( form, fileApi, rpc, { load: () => Promise.resolve(), get: (config, section, key) => state.settings?.[key] }, ui, { extend: value => value }, L, E, value => value, (table, rows) => { state.rows = rows; }, { reload() { state.reloads++; } }, { getElementById: id => state.nodes[id] }, - { load: () => Promise.resolve({ result: 0 }), render: () => E('div', {}, []) }, state.window + { load: () => Promise.resolve({ result: 0 }), render: () => E('div', {}, []) }, state.window, + { load: () => Promise.resolve({ result: 0 }), render: () => E('div', {}, []) } ); state.render = async () => state.view.render(await state.view.load()); state.button = name => state.map.options.find(option => option.name === name); diff --git a/luci-theme-argon/tests/helpers/render-templates.js b/luci-theme-argon/tests/helpers/render-templates.js index d9fd7cc05..247fdf8b9 100644 --- a/luci-theme-argon/tests/helpers/render-templates.js +++ b/luci-theme-argon/tests/helpers/render-templates.js @@ -46,7 +46,7 @@ const env = proto({ urlencode: value => replace(replace(replace(value, ' ', '%20'), '#', '%23'), '?', '%3F') }, ubus: { call: (object, method) => object == 'luci.argon_wallpaper' ? fixture.wallpaper : { hostname: fixture.hostname ?? 'Router' } }, - ctx: { path: ['admin', 'status', 'overview'], request_path: ['admin', 'status', 'overview'], authsession: 'session' }, + ctx: fixture.ctx ?? { path: ['admin', 'status', 'overview'], request_path: ['admin', 'status', 'overview'], authsession: 'session' }, version: { luciname: 'LuCI', luciversion: 'test-build', distname: 'OpenWrt', distversion: '25.12.5', distrevision: 'test', disturl: 'https://openwrt.org/' }, _: value => value, entityencode: encode, striptags: value => replace(value, /<[^>]*>/g, ''), node: fixture.node ?? {}, css: fixture.css, duser: fixture.duser ?? 'root', diff --git a/luci-theme-argon/tests/template-composition.test.js b/luci-theme-argon/tests/template-composition.test.js index 8b54f2745..d366dada5 100644 --- a/luci-theme-argon/tests/template-composition.test.js +++ b/luci-theme-argon/tests/template-composition.test.js @@ -41,6 +41,22 @@ test('application and login compose the same head with their own resource bounda } finally { renderer.close(); } }); +test('first-child entry routes identify the resolved page and retain wildcard request suffixes', () => { + const renderer = createRenderer(templates); + try { + for (const request_path of [[], ['admin'], ['admin', 'status'], ['admin', 'status', 'overview']]) { + const { html } = renderer.render('application', { + ctx: { path: ['admin', 'status', 'overview'], request_path, authsession: 'session' } + }); + assert.match(html, /data-page="admin-status-overview"/); + } + const { html } = renderer.render('application', { + ctx: { path: ['admin', 'network', 'network'], request_path: ['admin', 'network', 'network', 'lan'], authsession: 'session' } + }); + assert.match(html, /data-page="admin-network-network-lan"/); + } finally { renderer.close(); } +}); + test('login partials retain image/video, branding and authentication scope and script order', () => { const renderer = createRenderer(templates); try { diff --git a/luci-theme-argon/tests/test_update_rpc.py b/luci-theme-argon/tests/test_update_rpc.py new file mode 100644 index 000000000..89109fdf4 --- /dev/null +++ b/luci-theme-argon/tests/test_update_rpc.py @@ -0,0 +1,320 @@ +"""Run the real update RPC with isolated package managers, HTTP and cache files.""" +import hashlib +import json +import os +from pathlib import Path +import subprocess +import tempfile +import time +import unittest + +ROOT = Path(__file__).resolve().parents[1] +API = 'https://api.github.com/repos/jerrykuku/luci-theme-argon/releases/latest' + + +class UpdateRpcTests(unittest.TestCase): + def setUp(self): + self.temp = tempfile.TemporaryDirectory() + self.addCleanup(self.temp.cleanup) + self.directory = Path(self.temp.name) + self.cache = self.directory / 'cache.json' + self.payload = self.directory / 'release.json' + self.requests = self.directory / 'requests' + fakebin = self.directory / 'bin' + fakebin.mkdir() + scripts = { + 'apk': '''case "$1" in +list) test -n "$APK_VERSION" || exit 1; v=$APK_VERSION; [ ! -f "$INSTALLED" ] || v=$(cat "$INSTALLED"); test -n "$v" || exit 1; printf 'luci-theme-argon-%s noarch [installed]\\n' "$v" ;; +version) test "$COMPARE_FAIL" != 1 || exit 1; [ "$3" = "$4" ] && printf '=\\n' || { [ "$3" = 3.0.0-r20261015 ] && printf '>\\n' || printf '<\\n'; } ;; +add) printf '%s\\n' "$@" >> "$MUTATIONS"; test "$INSTALL_FAIL" != 1 || { echo 'database locked'; exit 1; }; test "$WRONG_VERSION" = 1 || printf '3.0.0-r2' > "$INSTALLED"; echo 'Theme installed' ;; +esac +''', + 'opkg': '''case "$1" in +status) v=$OPKG_VERSION; [ ! -f "$INSTALLED" ] || v=$(cat "$INSTALLED"); test -n "$v" || exit 1; printf 'Package: luci-theme-argon\\nVersion: %s\\nStatus: install ok installed\\n' "$v" ;; +compare-versions) [ "$3" = "<<" ] && [ "$COMPARE_FAIL" != 1 ] && [ "$2" != "$4" ] && [ "$2" != 3.0.0-20261015 ] ;; +install) printf '%s\\n' "$@" >> "$MUTATIONS"; test "$INSTALL_FAIL" != 1 || { echo 'database locked'; exit 1; }; test "$WRONG_VERSION" = 1 || printf '3.0.0-2' > "$INSTALLED"; echo 'Theme installed' ;; +esac +''', + 'df': 'printf "Filesystem 1024-blocks Used Available Capacity Mounted on\\nroot 100000 1000 %s 1%% /\\n" "${FREE_KB:-99000}"\n', + 'wget': '''printf '%s\\n' "$@" >> "$REQUESTS" +test "$FETCH_FAIL" != 1 || exit 8 +while [ "$#" -gt 0 ]; do + if [ "$1" = -O ]; then shift; destination=$1; fi + shift +done +case "$destination" in +*release.json) cp "$PAYLOAD" "$destination" ;; +*) sleep "${DOWNLOAD_DELAY:-0}"; test "$DOWNLOAD_FAIL" != 1 || exit 8; cp "$PACKAGE_DATA" "$destination" ;; +esac +''' + } + for name, content in scripts.items(): + path = fakebin / name + path.write_text('#!/bin/sh\n' + content) + path.chmod(0o755) + helper = self.directory / 'json_fixture.py' + helper.write_text('''import json,sys +root=json.load(sys.stdin); path=json.loads(sys.argv[1]); op=sys.argv[2]; args=sys.argv[3:] +obj=root +for key in path: obj=obj[int(key)] if isinstance(obj,list) else obj[key] +if op=='select': + if args[0]=='..': path=path[:-1] + else: + child=obj[int(args[0])] if isinstance(obj,list) else obj[args[0]] + if not isinstance(child,(dict,list)): raise ValueError('not a container') + path.append(args[0]) + print(json.dumps(path)) +elif op=='keys': print(' '.join(map(str,range(len(obj)) if isinstance(obj,list) else obj.keys()))) +elif op=='get': + value=obj.get(args[0],'') + print(int(value) if isinstance(value,bool) else '' if value is None else value) +elif op=='add': + obj[args[1]]=int(args[2]) if args[0]=='int' else bool(int(args[2])) if args[0]=='boolean' else {} if args[0]=='object' else args[2] + print(json.dumps(root)) +elif op=='validate': + if not isinstance(root,(dict,list)): raise ValueError('invalid root') +''') + shim = self.directory / 'jshn.sh' + shim.write_text(f'''fixture_json() {{ printf '%s' "$FIXTURE_JSON" | python3 '{helper}' "$FIXTURE_PATH" "$@"; }} +json_load() {{ FIXTURE_JSON=$1; FIXTURE_PATH='[]'; fixture_json validate >/dev/null 2>&1; }} +json_load_file() {{ json_load "$(cat "$1")"; }} +json_init() {{ FIXTURE_JSON='{{}}'; FIXTURE_PATH='[]'; }} +json_get_var() {{ fixture_value=$(fixture_json get "$2"); export "$1=$fixture_value"; }} +json_get_keys() {{ fixture_value=$(fixture_json keys); export "$1=$fixture_value"; }} +json_select() {{ fixture_value=$(fixture_json select "$1" 2>/dev/null) || return 1; FIXTURE_PATH=$fixture_value; }} +json_add_string() {{ FIXTURE_JSON=$(fixture_json add string "$1" "$2"); }} +json_add_int() {{ FIXTURE_JSON=$(fixture_json add int "$1" "$2"); }} +json_add_boolean() {{ FIXTURE_JSON=$(fixture_json add boolean "$1" "$2"); }} +json_add_object() {{ FIXTURE_JSON=$(fixture_json add object "$1" ''); json_select "$1"; }} +json_close_object() {{ json_select ..; }} +json_set_namespace() {{ + if [ "$1" = upgrade_status ]; then FIXTURE_SAVED_JSON=$FIXTURE_JSON; FIXTURE_SAVED_PATH=$FIXTURE_PATH; export "$2=base"; + else FIXTURE_JSON=$FIXTURE_SAVED_JSON; FIXTURE_PATH=$FIXTURE_SAVED_PATH; fi +}} + +json_dump() {{ printf '%s\\n' "$FIXTURE_JSON"; }} +''') + self.script = self.directory / 'rpc.sh' + self.script.write_text((ROOT / 'root/usr/libexec/rpcd/luci.argon_update').read_text() + .replace('/usr/share/libubox/jshn.sh', str(shim)) + .replace('/var/run/argon-update/release.json', str(self.cache)) + .replace('/var/run/argon-update', str(self.directory / 'state'))) + self.env = dict(os.environ, PATH=str(fakebin) + os.pathsep + os.environ['PATH'], + APK_VERSION='3.0.0-r1', OPKG_VERSION='', PAYLOAD=str(self.payload), + REQUESTS=str(self.requests), FETCH_FAIL='0', INSTALLED=str(self.directory / 'installed'), + MUTATIONS=str(self.directory / 'mutations'), PACKAGE_DATA=str(self.directory / 'package')) + (self.directory / 'package').write_bytes(b'argon-package') + self.release = {'tag_name': 'v3.0.0', 'draft': False, 'prerelease': False, + 'published_at': '2026-10-16T01:00:00Z', 'body': '## 更新\n- 修复布局。', + 'assets': [{'name': name, 'digest': 'sha256:' + hashlib.sha256(b'argon-package').hexdigest(), 'size': 13} for name in [ + 'luci-theme-argon-3.0.0-r1.apk', 'luci-theme-argon_3.0.0_all.ipk', + 'luci-theme-argon-3.0.0-r2.apk', 'luci-theme-argon_3.0.0-2_all.ipk', + 'luci-theme-argon-3.0.0-r1.apk', 'luci-theme-argon_3.0.0_all.ipk']]} + self.payload.write_text(json.dumps(self.release)) + + def call(self, method, **arguments): + result = subprocess.run(['sh', str(self.script), 'call', method], + input=json.dumps(arguments) + '\n', env=self.env, + capture_output=True, text=True, check=True) + return json.loads(result.stdout) + + def test_local_get_and_protocol_have_no_network_or_package_mutation(self): + result = self.call('get') + self.assertEqual(result['result'], 0) + self.assertEqual(result['current_version'], '3.0.0-r1') + self.assertFalse(result['can_upgrade']) + self.assertEqual(result['upgrade']['phase'], 'idle') + self.assertFalse(self.requests.exists()) + protocol = subprocess.check_output(['sh', str(self.script), 'list'], text=True) + self.assertEqual(json.loads(protocol), {'get': {}, 'check': {}, 'status': {}, 'start': {'tag': 'String', 'package': 'String'}}) + self.env.update(APK_VERSION='', OPKG_VERSION='3.0.0-2') + self.assertEqual(self.call('get')['package_manager'], 'opkg') + self.assertEqual(self.call('get')['current_version'], '3.0.0-2') + self.env['OPKG_VERSION'] = '' + self.assertEqual(self.call('get')['current_version'], '') + + def test_check_uses_official_url_and_highest_matching_revision(self): + result = self.call('check', url='http://untrusted.invalid/', version='99.0.0') + self.assertEqual(result['result'], 0) + self.assertEqual(result['apk'], 'luci-theme-argon-3.0.0-r2.apk') + self.assertEqual(result['ipk'], 'luci-theme-argon_3.0.0-2_all.ipk') + self.assertEqual(result['notes'], self.release['body']) + self.assertEqual(result['current_version'], '3.0.0-r1') + requests = self.requests.read_text() + self.assertIn(API, requests) + self.assertIn('Cache-Control: no-cache', requests) + self.assertNotIn('untrusted.invalid', requests) + self.assertEqual(self.cache.stat().st_mode & 0o777, 0o600) + + def test_success_cache_avoids_network_but_reloads_the_installed_version(self): + self.call('check') + before = self.requests.read_text() + self.env['APK_VERSION'] = '3.0.0-r2' + self.assertEqual(self.call('check')['current_version'], '3.0.0-r2') + self.assertEqual(self.requests.read_text(), before) + self.assertEqual(self.call('get')['tag'], 'v3.0.0') + + def test_expired_or_future_cache_refreshes_and_failed_refresh_keeps_notes(self): + first = self.call('check') + for checked_at in [int(time.time()) - 400, int(time.time()) + 1000]: + old = dict(first, checked_at=checked_at) + self.cache.write_text(json.dumps(old)) + self.env['FETCH_FAIL'] = '1' + self.assertEqual(self.call('check')['result'], 1) + self.assertEqual(json.loads(self.cache.read_text()), old) + self.assertEqual(self.call('get')['notes'], first['notes']) + + def test_invalid_and_prerelease_responses_never_enter_cache(self): + for value in ['not JSON', '{}', '[]', json.dumps(dict(self.release, draft=True)), + json.dumps(dict(self.release, prerelease=True)), + json.dumps(dict(self.release, tag_name='v3.1.0-beta.1'))]: + with self.subTest(value=value[:60]): + self.payload.write_text(value) + self.assertNotEqual(self.call('check')['result'], 0) + self.assertFalse(self.cache.exists()) + + def test_mismatched_and_unsafe_asset_names_are_ignored(self): + self.release['assets'] = [{'name': name} for name in [ + 'luci-theme-argon-4.0.0-r2.apk', 'luci-theme-argon_4.0.0_all.ipk', + 'luci-theme-argon-3.0.0-r2.apk?evil', 'luci-theme-argon_3.0.0-../../tmp_all.ipk']] + self.payload.write_text(json.dumps(self.release)) + result = self.call('check') + self.assertEqual(result['result'], 0) + self.assertEqual(result['apk'], '') + self.assertEqual(result['ipk'], '') + + def test_linked_cache_is_not_read_or_overwritten_and_failed_download_is_retryable(self): + outside = self.directory / 'outside' + outside.write_text('keep me') + self.cache.symlink_to(outside) + self.assertNotIn('tag', self.call('get')) + self.env['FETCH_FAIL'] = '1' + self.assertEqual(self.call('check')['result'], 1) + self.env['FETCH_FAIL'] = '0' + self.assertEqual(self.call('check')['result'], 0) + self.assertEqual(outside.read_text(), 'keep me') + + def test_acl_separates_read_only_status_and_write_install(self): + acl = json.loads((ROOT / 'root/usr/share/rpcd/acl.d/luci-app-argon-config.json').read_text())['luci-app-argon-config'] + self.assertEqual(set(acl['read']['ubus']['luci.argon_update']), {'get', 'check', 'status'}) + self.assertEqual(acl['write']['ubus']['luci.argon_update'], ['start']) + + def start(self, **patch): + return self.call('start', **dict({'tag': 'v3.0.0', 'package': + 'luci-theme-argon-3.0.0-r2.apk' if self.env['APK_VERSION'] else 'luci-theme-argon_3.0.0-2_all.ipk'}, **patch)) + + def finished(self): + for _ in range(100): + result = self.call('status') + if not result['upgrade']['active']: + return result + time.sleep(.05) + self.fail('worker did not finish') + + def test_background_install_for_both_managers_and_status_survives_reloads(self): + for manager in ['apk', 'opkg']: + with self.subTest(manager=manager): + installed = self.directory / 'installed' + installed.unlink(missing_ok=True) + self.env.update(APK_VERSION='3.0.0-r1' if manager == 'apk' else '', + OPKG_VERSION='3.0.0-1' if manager == 'opkg' else '') + checked = self.call('check') + self.assertTrue(checked['can_upgrade']) + self.assertEqual(self.start()['result'], 0) + done = self.finished() + self.assertEqual(done['upgrade']['phase'], 'complete', done) + self.assertEqual(done['current_version'], '3.0.0-r2' if manager == 'apk' else '3.0.0-2') + self.assertFalse(self.call('get')['can_upgrade']) + self.assertEqual(self.call('get')['upgrade']['phase'], 'complete') + command = (self.directory / 'mutations').read_text() + self.assertNotIn('force-', command) + self.assertIn('Theme installed', done['upgrade']['log']) + self.assertEqual((self.directory / 'state/status.json').stat().st_mode & 0o777, 0o600) + self.assertEqual(list((self.directory / 'state').glob('job.*')), []) + + def test_start_rejects_changed_or_expired_metadata_unknown_versions_and_downgrades(self): + self.assertEqual(self.start()['result'], 3) + initial = self.call('check') + for patch in [{'tag': 'v4.0.0'}, {'package': '../../unsafe.apk'}, {'package': 'luci-theme-argon-3.0.0-r1.apk'}]: + self.assertEqual(self.start(**patch)['result'], 3) + for value in ['unknown', '3.0.0-r2', '3.0.0-r20261015']: + self.env['APK_VERSION'] = value + self.assertEqual(self.start()['result'], 5) + self.env['APK_VERSION'] = '3.0.0-r1' + self.cache.write_text(json.dumps(dict(initial, checked_at=int(time.time()) - 301))) + self.assertEqual(self.start()['result'], 3) + self.assertFalse((self.directory / 'mutations').exists()) + + def test_unverified_assets_remain_manual_downloads(self): + for patch in [{'digest': None}, {'digest': 'bad'}, {'size': 0}, {'size': 9000000}]: + self.cache.unlink(missing_ok=True) + release = dict(self.release, assets=[dict(self.release['assets'][2], **patch)]) + self.payload.write_text(json.dumps(release)) + checked = self.call('check') + self.assertEqual(checked['apk'], 'luci-theme-argon-3.0.0-r2.apk') + self.assertFalse(checked['can_upgrade']) + self.assertEqual(self.start()['result'], 3) + self.assertFalse((self.directory / 'mutations').exists()) + + def test_download_checksum_storage_and_package_manager_failures_are_retryable(self): + self.call('check') + for patch, error in [({'DOWNLOAD_FAIL': '1'}, 'network'), ({'FREE_KB': '10'}, 'space'), + ({'INSTALL_FAIL': '1'}, 'install'), ({'WRONG_VERSION': '1'}, 'install')]: + with self.subTest(error=error): + old = self.env.copy() + self.env.update(patch) + self.assertEqual(self.start()['result'], 0) + result = self.finished() + self.assertEqual(result['upgrade']['phase'], 'failed') + self.assertEqual(result['upgrade']['error'], error, result) + self.env = old + (self.directory / 'package').write_bytes(b'wrong-package') + self.assertEqual(self.start()['result'], 0) + self.assertEqual(self.finished()['upgrade']['error'], 'checksum') + (self.directory / 'package').write_bytes(b'argon-package') + self.assertEqual(self.start()['result'], 0) + self.assertEqual(self.finished()['upgrade']['phase'], 'complete') + + def test_one_worker_at_a_time_and_private_metadata_snapshot(self): + self.call('check') + self.env['DOWNLOAD_DELAY'] = '4' + start = time.monotonic() + self.assertEqual(self.start()['result'], 0) + self.assertLess(time.monotonic() - start, 3) + self.assertEqual(self.start()['result'], 4) + self.assertTrue(self.call('get')['upgrade']['active']) + cached = json.loads(self.cache.read_text()) + cached['apk_sha256'] = '0' * 64 + self.cache.write_text(json.dumps(cached)) + self.assertEqual(self.finished()['upgrade']['phase'], 'complete') + mutations = (self.directory / 'mutations').read_text() + self.assertEqual(mutations.count('add'), 1) + + def test_version_is_rechecked_after_download_before_mutation(self): + self.call('check') + self.env['DOWNLOAD_DELAY'] = '2' + self.assertEqual(self.start()['result'], 0) + (self.directory / 'installed').write_text('3.0.0-r2') + self.assertEqual(self.finished()['upgrade']['error'], 'version') + self.assertFalse((self.directory / 'mutations').exists()) + + def test_internal_worker_refuses_to_run_or_clean_up_outside_its_private_job(self): + result = subprocess.run(['sh', str(self.script), 'run', 'apk'], env=self.env, + capture_output=True, text=True) + self.assertNotEqual(result.returncode, 0) + self.assertTrue(self.script.exists()) + self.assertTrue(self.payload.exists()) + self.assertFalse((self.directory / 'mutations').exists()) + + def test_interrupted_job_is_reported_without_a_stale_lock(self): + state = self.directory / 'state' + state.mkdir() + (state / 'status.json').write_text(json.dumps({'phase': 'installing', 'version': '3.0.0-r2', 'error': ''})) + self.assertEqual(self.call('status')['upgrade']['error'], 'interrupted') + self.call('check') + self.assertEqual(self.start()['result'], 0) + self.assertEqual(self.finished()['upgrade']['phase'], 'complete') + + +if __name__ == '__main__': + unittest.main() diff --git a/luci-theme-argon/tests/updates.test.js b/luci-theme-argon/tests/updates.test.js new file mode 100644 index 000000000..5cc5c5603 --- /dev/null +++ b/luci-theme-argon/tests/updates.test.js @@ -0,0 +1,333 @@ +'use strict'; +const assert = require('node:assert/strict'); +const fs = require('node:fs'); +const path = require('node:path'); +const test = require('node:test'); +const source = fs.readFileSync(path.join(__dirname, '../htdocs/luci-static/resources/argon/updates.js'), 'utf8'); +String.prototype.format = function(value) { return this.replace('%s', value); }; + +function fixture(options = {}) { + const state = { nodes: [], calls: [], args: [], watchers: new Set(), ...options }; + const E = (tag, attrs = {}, children = []) => { + const node = { tag, attrs, children, isConnected: true, ...attrs, setAttribute(key, value) { this.attrs[key] = value; } }; + state.nodes.push(node); + return node; + }; + const rpc = { declare: spec => async (...args) => { + assert.equal(spec.object, 'luci.argon_update'); + assert.equal(spec.raise, true); + state.calls.push(spec.method); + state.args.push(args); + if (state[spec.method + 'Error']) throw new Error('network unavailable'); + if (spec.method === 'check') { await state.pending; return state.check; } + if (spec.method === 'start') { await state.startPending; return state.start; } + if (spec.method === 'status') return state.progress; + return state.initial || { result: 0, current_version: '3.0.0-r1', package_manager: 'apk' }; + } }; + const ui = { showModal(title, children) { state.modal = { title, children }; }, hideModal() { state.modal = null; } }; + const poll = { add(fn) { state.watchers.add(fn); }, remove(fn) { state.watchers.delete(fn); } }; + state.api = new Function('baseclass', 'rpc', 'ui', 'poll', 'window', 'E', '_', source)( + { extend: v => v }, rpc, ui, poll, { location: { reload() { state.reloaded = true; } } }, E, v => v); + state.render = async () => state.api.render(await state.api.load(), { readonly: !!state.readonly }); + state.find = (tag, value) => state.nodes.find(n => n.tag === tag && (n.textContent || n.children) === value); + state.installButton = () => state.nodes.find(n => n.tag === 'button' && n.children === 'Update now'); + state.confirm = () => state.nodes.filter(n => n.tag === 'button' && n.children === 'Update now').at(-1).click(); + state.tick = () => Promise.all(Array.from(state.watchers, fn => fn())); + state.button = () => state.nodes.find(n => n.tag === 'button'); + state.status = () => state.nodes.find(n => n.role === 'status').children[1].textContent; + return state; +} +function checked(current, latest = '3.0.0-r2', manager = 'apk') { + return { result: 0, can_upgrade: true, upgrade: { phase: 'idle', active: false }, current_version: current, package_manager: manager, tag: 'v' + latest.match(/^[0-9]+(?:\.[0-9]+)*/)[0], + apk: manager === 'apk' ? 'luci-theme-argon-' + latest + '.apk' : '', + ipk: manager === 'opkg' ? 'luci-theme-argon_' + latest + '_all.ipk' : '', + notes: '## Changes\n\n- Fixed layout.', checked_at: 1792468800 }; +} + +test('loading the settings reads local state without a remote check; checks are explicit', async () => { + const f = fixture({ check: checked('3.0.0-r1') }); + await f.render(); + assert.deepEqual(f.calls, ['get']); + assert.equal(f.status(), 'Not checked yet.'); + assert.equal(f.find('a', 'Download package').hidden, true); + await f.button().click(); + assert.deepEqual(f.calls, ['get', 'check']); + assert.equal(f.status(), 'Update available.'); + assert.match(f.find('a', 'Download package').href, /v3\.0\.0\/luci-theme-argon-3\.0\.0-r2\.apk$/); + assert.equal(f.nodes.find(n => n.tag === 'details').open, true); +}); + +test('package revisions, numeric versions, prereleases and locally newer builds compare correctly', async () => { + for (const [current, latest, manager, expected] of [ + ['3.0.0-r1', '3.0.0-r2', 'apk', 'Update available.'], + ['3.0.0', '3.0.0-2', 'opkg', 'Update available.'], + ['3.0.0-2', '3.0.0-2', 'opkg', 'Your theme is up to date.'], + ['3.0.0-r2', '3.0.0-r2', 'apk', 'Your theme is up to date.'], + ['3.0.0-r20261015', '3.0.0-r2', 'apk', 'The installed version is newer than the latest stable release.'], + ['3.0.0-r20261015', '3.0.1-r1', 'apk', 'Update available.'], + ['3.9.0-r1', '3.10.0-r1', 'apk', 'Update available.'], + ['3.0.0_rc1-r2', '3.0.0-r1', 'apk', 'Update available.'], + ['3.0.0~beta1-2', '3.0.0', 'opkg', 'Update available.'], + ['unknown', '3.0.0-r2', 'apk', 'Unable to compare this version. View the release for details.'] + ]) { + const f = fixture({ initial: checked(current, latest, manager) }); + await f.render(); + assert.equal(f.status(), expected, `${current} / ${latest}`); + } +}); + +test('unmatched packages and unknown managers cannot produce an up-to-date claim or download link', async () => { + for (const patch of [{ apk: 'luci-theme-argon-4.0.0-r2.apk' }, { apk: '../../unsafe.apk' }, { package_manager: 'unknown' }, { apk: '' }]) { + const f = fixture({ initial: { ...checked('3.0.0-r2'), ...patch } }); + await f.render(); + assert.equal(f.find('a', 'Download package').hidden, true); + assert.equal(f.status(), 'Unable to compare this version. View the release for details.'); + } +}); + +test('repeated clicks share a check and restore the button after transport or backend failure', async () => { + for (const patch of [{ checkError: true }, { check: { result: 1 } }, { check: { result: 0, tag: 'not-a-version' } }]) { + let finish; + const f = fixture({ ...patch, pending: new Promise(resolve => { finish = resolve; }) }); + await f.render(); + const first = f.button().click(); + assert.equal(f.button().disabled, true); + await f.button().click(); + assert.deepEqual(f.calls, ['get', 'check']); + finish(); await first; + assert.equal(f.button().disabled, false); + assert.match(f.status(), /^Unable to check for updates/); + } +}); + +test('failed checks preserve cached notes, versions and release links', async () => { + const f = fixture({ initial: checked('3.0.0-r1'), checkError: true }); + await f.render(); + const link = f.find('a', 'View release').href; + const notes = f.nodes.find(n => n.tag === 'pre').textContent; + await f.button().click(); + assert.equal(f.find('a', 'View release').href, link); + assert.equal(f.nodes.find(n => n.tag === 'pre').textContent, notes); + assert.match(f.status(), /^Unable to check for updates/); +}); + +test('release notes remain text, are bounded, and have an explicit empty state', async () => { + for (const text of ['\n', '', '文'.repeat(40000)]) { + const f = fixture({ initial: { ...checked('3.0.0-r2'), notes: text } }); + await f.render(); + const notes = f.nodes.find(n => n.tag === 'pre'); + assert.equal(notes.innerHTML, undefined); + assert.equal(notes.textContent, text ? text.slice(0,32768) + (text.length > 32768 ? '\n…' : '') : 'No release notes were published.'); + } +}); + +test('a failed local state load can recover through a manual check', async () => { + const f = fixture({ getError: true, check: checked('3.0.0-r1') }); + await f.render(); + assert.match(f.status(), /^Unable to check for updates/); + await f.button().click(); + assert.equal(f.status(), 'Update available.'); +}); + + +test('installation is offered only for an upgrade with backend verification and write access', async () => { + for (const [patch, readonly, visible] of [ + [{}, false, true], [{ can_upgrade: false }, false, false], [{ current_version: '3.0.0-r2' }, false, false], + [{ current_version: '3.0.0-r20261015' }, false, false], [{ apk: '' }, false, false], [{}, true, false] + ]) { + const f = fixture({ initial: { ...checked('3.0.0-r1'), ...patch }, readonly }); + await f.render(); + assert.equal(f.installButton().hidden, !visible); + if (!visible) { f.installButton().click(); assert.equal(f.modal, undefined); } + } +}); + +test('confirmation names the version and cancellation never starts installation', async () => { + const f = fixture({ initial: checked('3.0.0-r1') }); + await f.render(); + f.installButton().click(); + assert.equal(f.modal.title, 'Update Argon to 3.0.0-r2?'); + assert.equal(f.button().disabled, true); + await f.button().click(); + f.find('button', 'Cancel').click(); + assert.equal(f.modal, null); + assert.equal(f.installButton().disabled, false); + assert.deepEqual(f.calls, ['get']); +}); + +test('confirmed upgrade runs once, polls phases, records plain logs and offers a reload', async () => { + const f = fixture({ initial: checked('3.0.0-r1'), start: { result: 0, upgrade: { phase: 'starting', active: true } } }); + await f.render(); f.installButton().click(); await f.confirm(); + assert.deepEqual(f.calls, ['get', 'start']); + assert.deepEqual(f.args.at(-1), ['v3.0.0', 'luci-theme-argon-3.0.0-r2.apk']); + assert.equal(f.watchers.size, 1); + assert.equal(f.button().disabled, true); + f.installButton().click(); + await f.button().click(); + assert.deepEqual(f.calls, ['get', 'start']); + for (const [phase, text] of [['downloading', 'Downloading the update...'], ['verifying', 'Verifying the package...'], ['installing', 'Installing the update. Please wait...']]) { + f.progress = { result: 0, current_version: '3.0.0-r1', upgrade: { phase, active: true } }; + await f.tick(); assert.equal(f.status(), text); + } + const upgrade = { phase: 'complete', active: false, log: 'Installed' }; + f.progress = { result: 0, current_version: '3.0.0-r2', upgrade }; + f.initial = { ...checked('3.0.0-r2'), can_upgrade: false, upgrade }; + await f.tick(); + assert.equal(f.watchers.size, 0); + assert.equal(f.installButton().hidden, true); + assert.match(f.status(), /^Update installed/); + const log = f.nodes.filter(n => n.tag === 'pre').at(-1); + assert.equal(log.textContent, upgrade.log); + assert.equal(log.innerHTML, undefined); + const reload = f.find('button', 'Reload page'); + assert.equal(reload.hidden, false); + reload.click(); assert.equal(f.reloaded, true); +}); + +test('page reload resumes monitoring; connection failures keep installation disabled until status recovers', async () => { + const f = fixture({ initial: { ...checked('3.0.0-r1'), upgrade: { phase: 'installing', active: true } }, statusError: true }); + await f.render(); assert.equal(f.watchers.size, 1); + await f.tick(); assert.match(f.status(), /^Unable to read update progress/); + assert.equal(f.installButton().disabled, true); + f.statusError = false; + const upgrade = { phase: 'failed', active: false, error: 'install', log: 'database locked' }; + f.initial = { ...checked('3.0.0-r1'), upgrade }; + f.progress = { result: 0, current_version: '3.0.0-r1', upgrade }; + await f.tick(); + assert.equal(f.watchers.size, 0); + assert.equal(f.installButton().disabled, false); + assert.match(f.status(), /^Installation failed/); +}); + +test('a lost start response cannot trigger a duplicate installation and stale metadata requires another check', async () => { + const f = fixture({ initial: checked('3.0.0-r1'), startError: true }); + await f.render(); f.installButton().click(); await f.confirm(); + assert.equal(f.watchers.size, 1); + assert.match(f.status(), /^Unable to read update progress/); + f.installButton().click(); assert.equal(f.calls.filter(m => m === 'start').length, 1); + for (const result of [3, 5]) { + const stale = fixture({ initial: checked('3.0.0-r1'), start: { result } }); + await stale.render(); stale.installButton().click(); await stale.confirm(); + assert.equal(stale.watchers.size, 0); + assert.equal(stale.installButton().hidden, true); + assert.match(stale.status(), /Check for updates again/); + } +}); + +test('monitoring stops when its card is removed', async () => { + const f = fixture({ initial: { ...checked('3.0.0-r1'), upgrade: { phase: 'installing', active: true } } }); + await f.render(); + f.progress = { result: 0, current_version: '3.0.0-r1', upgrade: { phase: 'installing', active: true } }; + await f.tick(); + f.nodes.find(n => n.attrs.class === 'argon-update-content').isConnected = false; + await f.tick(); + assert.equal(f.watchers.size, 0); + assert.deepEqual(f.calls, ['get', 'status']); +}); + + +test('an early idle poll cannot finish monitoring before the start response arrives', async () => { + let accept; + const f = fixture({ initial: checked('3.0.0-r1'), startPending: new Promise(resolve => { accept = resolve; }), + start: { result: 0, upgrade: { phase: 'starting', active: true } }, + progress: { result: 0, current_version: '3.0.0-r1', upgrade: { phase: 'idle', active: false } } }); + await f.render(); f.installButton().click(); const starting = f.confirm(); + await f.tick(); + assert.equal(f.watchers.size, 1); + assert.equal(f.installButton().disabled, true); + accept(); await starting; + assert.equal(f.watchers.size, 1); + assert.equal(f.calls.filter(m => m === 'start').length, 1); + assert.equal(f.status(), 'Preparing the update...'); +}); + +test('a resumed job waits for its card to mount before polling', async () => { + const f = fixture({ initial: { ...checked('3.0.0-r1'), upgrade: { phase: 'installing', active: true } }, + progress: { result: 0, current_version: '3.0.0-r1', upgrade: { phase: 'installing', active: true } } }); + await f.render(); + const content = f.nodes.find(n => n.attrs.class === 'argon-update-content'); + content.isConnected = false; await f.tick(); + assert.equal(f.watchers.size, 1); + assert.deepEqual(f.calls, ['get']); + content.isConnected = true; await f.tick(); + assert.deepEqual(f.calls, ['get', 'status']); +}); + +test('monitoring follows a new job started while the previous terminal status was being read', async () => { + const f = fixture({ initial: { ...checked('3.0.0-r1'), upgrade: { phase: 'installing', active: true } }, + progress: { result: 0, current_version: '3.0.0-r1', upgrade: { phase: 'failed', active: false, error: 'install' } } }); + await f.render(); + f.initial = { ...checked('3.0.0-r1'), upgrade: { phase: 'downloading', active: true } }; + await f.tick(); + assert.equal(f.watchers.size, 1); + assert.equal(f.installButton().disabled, true); + assert.equal(f.status(), 'Downloading the update...'); +}); + + +test('historical successful installs render as up to date after reloading, without pending update actions', async () => { + for (const manager of ['apk', 'opkg']) { + const current = manager === 'apk' ? '3.0.0-r2' : '3.0.0-2'; + const initial = { ...checked(current, current, manager), can_upgrade: false, + upgrade: { phase: 'complete', active: false, version: current, log: 'Installed' } }; + const f = fixture({ initial, check: initial }); + await f.render(); + assert.equal(f.status(), 'Your theme is up to date.'); + assert.equal(f.find('button', 'Reload page').hidden, true); + assert.equal(f.installButton().hidden, true); + assert.equal(f.find('a', 'Download package').hidden, true); + assert.equal(f.nodes.find(n => n.role === 'status').attrs['data-state'], 'current'); + assert.equal(f.nodes.find(n => n.attrs.class === 'argon-update-status-icon').hidden, false); + assert.ok(f.nodes.filter(n => n.tag === 'details').every(n => !n.open)); + await f.button().click(); + assert.equal(f.status(), 'Your theme is up to date.'); + assert.ok(f.nodes.filter(n => n.tag === 'details').every(n => !n.open)); + assert.equal(f.find('button', 'Reload page').hidden, true); + } +}); + +test('a previous completed job cannot conceal a newly available release', async () => { + const f = fixture({ initial: { ...checked('3.0.0-r2', '3.0.0-r3'), + upgrade: { phase: 'complete', active: false, version: '3.0.0-r2' } } }); + await f.render(); + assert.equal(f.status(), 'Update available.'); + assert.equal(f.installButton().hidden, false); + assert.equal(f.find('button', 'Reload page').hidden, true); + assert.equal(f.find('a', 'Download package').hidden, false); +}); + +test('completion collapses notes once and requires a reload for a job observed in this document', async () => { + const current = '3.0.0-r2'; + const f = fixture({ initial: { ...checked(current), + upgrade: { phase: 'installing', active: true, version: current } } }); + await f.render(); + const details = f.nodes.filter(n => n.tag === 'details'); + details.forEach(n => { n.open = true; }); + const upgrade = { phase: 'complete', active: false, version: current, log: 'Installed' }; + f.initial = { ...checked(current), can_upgrade: false, upgrade }; + f.progress = { result: 0, current_version: current, upgrade }; + await f.tick(); + assert.match(f.status(), /^Update installed/); + assert.equal(f.find('button', 'Reload page').hidden, false); + assert.ok(details.every(n => !n.open)); + assert.equal(f.find('a', 'Download package').hidden, true); +}); + +test('recovering a failed local read does not treat a historical installation as a new one', async () => { + const f = fixture({ getError: true, check: { ...checked('3.0.0-r2'), can_upgrade: false, + upgrade: { phase: 'complete', active: false, version: '3.0.0-r2' } } }); + await f.render(); await f.button().click(); + assert.equal(f.status(), 'Your theme is up to date.'); + assert.equal(f.find('button', 'Reload page').hidden, true); +}); + +test('failed refreshes remove the success icon while preserving the last checked versions', async () => { + const f = fixture({ initial: checked('3.0.0-r2'), checkError: true }); + await f.render(); + const icon = f.nodes.find(n => n.attrs.class === 'argon-update-status-icon'); + assert.equal(icon.hidden, false); + await f.button().click(); + assert.match(f.status(), /^Unable to check for updates/); + assert.equal(icon.hidden, true); + assert.equal(f.nodes.find(n => n.role === 'status').attrs['data-state'], 'error'); +}); diff --git a/luci-theme-argon/ucode/template/themes/argon/header.ut b/luci-theme-argon/ucode/template/themes/argon/header.ut index 0005c12d9..476c7c3d9 100644 --- a/luci-theme-argon/ucode/template/themes/argon/header.ut +++ b/luci-theme-argon/ucode/template/themes/argon/header.ut @@ -20,12 +20,14 @@ import { getuid, getspnam } from 'luci.core'; const hostname = striptags(ubus.call('system', 'board')?.hostname ?? '?'); + // First-child routes keep the entry URL while resolving to a deeper page. + const page_path = length(ctx.path) > length(ctx.request_path) ? ctx.path : ctx.request_path; include('themes/' + theme + '/head', { hostname: hostname, is_login: false }); %} + data-page="{{ entityencode(join('-', page_path), true) }}">