🗽 Sync 2026-10-23 00:46:23

This commit is contained in:
github-actions[bot] committed 2026-10-23 00:46:23 +08:00
1 parent 6032a57538
commit 2b29b0c4e1
112 files changed
+1859 -6208

No files matched your search

+4 -4
View File
@@ -1,17 +1,17 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=clashoo
PKG_SHORT_SHA:=94b13ae
PKG_COMMIT_DATE:=2026.10.13
PKG_SHORT_SHA:=3f27ef3
PKG_COMMIT_DATE:=2026.10.21
PKG_VERSION:=$(PKG_COMMIT_DATE)~$(PKG_SHORT_SHA)
PKG_RELEASE:=15
PKG_RELEASE:=16
PKG_SOURCE:=$(PKG_NAME)-alpha-$(PKG_SHORT_SHA).tar.gz
PKG_SOURCE_SUBDIR:=$(PKG_NAME)-alpha-$(PKG_SHORT_SHA)
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-alpha-$(PKG_SHORT_SHA)
PKG_SOURCE_URL:=https://github.com/kenzok8/openwrt-clashoo/releases/download/mihomo-src
PKG_SOURCE_VERSION:=65acfca73432da9ed3a588d3a8f482654504497f
PKG_SOURCE_VERSION:=c8979247b7baf46202891be29e174e3f54173cee
PKG_HASH:=skip
PKG_BUILD_VERSION:=alpha-$(PKG_SHORT_SHA)
+2 -2
View File
@@ -1,8 +1,8 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=cpulimit
PKG_VERSION:=0.3.2
PKG_RELEASE:=1
PKG_VERSION:=1.0.1
PKG_RELEASE:=2
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
PKG_SOURCE_URL:=https://codeload.github.com/denji/cpulimit/tar.gz/$(PKG_VERSION)?
+2 -2
View File
@@ -5,8 +5,8 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=gately
PKG_VERSION:=0.5.5.2
PKG_RELEASE:=6
PKG_VERSION:=0.5.6.1
PKG_RELEASE:=7
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
PKG_SOURCE_URL:=https://codeload.github.com/wangwanjie/gately/tar.gz/v$(PKG_VERSION)?
+30 -13
View File
@@ -6,28 +6,42 @@
include $(TOPDIR)/rules.mk
PKG_ARCH_kaiplus:=$(ARCH)
KAIPLUS_ARCH_x86_64:=amd64
KAIPLUS_ARCH_aarch64:=arm64
KAIPLUS_ARCH:=$(KAIPLUS_ARCH_$(ARCH))
KAIPLUS_HASH_x86_64:=5588a5e1b7874bc5e631ab8ff1288226f567a84d3115808f22352d142c40f5d6
KAIPLUS_HASH_aarch64:=5be29e4715a1181937c0156a6954738ce96fde2f338a1b03cd32c68b00e61524
PKG_NAME:=kaiplus
PKG_VERSION:=1.0.9
PKG_RELEASE:=14
PKG_SOURCE:=$(PKG_NAME)-binary-$(PKG_VERSION).tar.gz
PKG_SOURCE_URL:=https://github.com/istoreos/istoreos-app-hub/releases/download/kaiplus-runtime-v$(PKG_VERSION)/
PKG_HASH:=skip
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-binary-$(PKG_VERSION)
PKG_RELEASE:=15
KAIPLUS_URL_FILE:=kaiplus-linux-$(KAIPLUS_ARCH)
KAIPLUS_DOWNLOAD:=$(KAIPLUS_URL_FILE)-$(KAIPLUS_HASH_$(ARCH))
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)
PKG_BUILD_PARALLEL:=1
PKG_USE_MIPS16:=0
STRIP:=true
RSTRIP:=:
include $(INCLUDE_DIR)/package.mk
define Download/kaiplus
URL:=https://fw.koolcenter.com/binary/kai/releases/build/
URL_FILE:=$(KAIPLUS_URL_FILE)
FILE:=$(KAIPLUS_DOWNLOAD)
HASH:=skip
endef
define Package/$(PKG_NAME)
SECTION:=net
CATEGORY:=System
SUBMENU:=
TITLE:=KaiPlus
URL:=https://github.com/linkease/istore-packages
DEPENDS:=+linkease-app-entry
DEPENDS:=@(x86_64||aarch64) +linkease-app-entry
endef
define Package/$(PKG_NAME)/description
@@ -51,6 +65,11 @@ fi
exit 0
endef
define Build/Prepare
$(INSTALL_DIR) $(PKG_BUILD_DIR)
$(CP) $(DL_DIR)/$(KAIPLUS_DOWNLOAD) $(PKG_BUILD_DIR)/kaiplus
endef
define Build/Configure
endef
@@ -58,12 +77,9 @@ define Build/Compile
endef
define Package/$(PKG_NAME)/install
$(INSTALL_DIR) $(1)/usr/sbin $(1)/usr/share/kaiplus/www $(1)/usr/share/kaiplus/defaults $(1)/usr/share/kaiplus/helpers $(1)/usr/share/linkease/apps.d $(1)/usr/share/linkeasefull/desktop-apps.d $(1)/etc/init.d $(1)/etc/config
$(INSTALL_BIN) $(PKG_BUILD_DIR)/kaiplus_bin.$(PKG_ARCH_kaiplus) $(1)/usr/sbin/kaiplus_bin
$(CP) $(PKG_BUILD_DIR)/www/* $(1)/usr/share/kaiplus/www/
$(INSTALL_DATA) ./files/logo.png $(1)/usr/share/kaiplus/www/logo.png
$(CP) $(PKG_BUILD_DIR)/defaults/* $(1)/usr/share/kaiplus/defaults/
$(INSTALL_BIN) $(PKG_BUILD_DIR)/helpers/kaiplus_workspace_tool.* $(1)/usr/share/kaiplus/helpers/
$(INSTALL_DIR) $(1)/usr/sbin $(1)/usr/share/kaiplus $(1)/usr/share/linkease/apps.d $(1)/usr/share/linkeasefull/desktop-apps.d $(1)/etc/init.d $(1)/etc/config
$(INSTALL_BIN) $(PKG_BUILD_DIR)/kaiplus $(1)/usr/sbin/kaiplus
$(INSTALL_DATA) ./files/logo.png $(1)/usr/share/kaiplus/logo.png
$(INSTALL_DATA) ./files/kaiplus-plugin.json $(1)/usr/share/kaiplus/kaiplus-plugin.json
ln -sf /usr/share/kaiplus/kaiplus-plugin.json $(1)/usr/share/linkeasefull/desktop-apps.d/00-kaiplus-plugin.json
ln -sf /usr/share/kaiplus/kaiplus-plugin.json $(1)/usr/share/linkease/apps.d/00-kaiplus-plugin.json
@@ -71,4 +87,5 @@ define Package/$(PKG_NAME)/install
$(INSTALL_CONF) ./files/kaiplus.config $(1)/etc/config/kaiplus
endef
$(eval $(call Download,kaiplus))
$(eval $(call BuildPackage,$(PKG_NAME)))
+10 -35
View File
@@ -3,16 +3,19 @@
"id": "kaiplus",
"name": "KaiPlus",
"icon": "logo.png",
"staticRoot": "/usr/share/kaiplus/www",
"staticRoot": "/usr/share/kaiplus",
"desktop": {
"mode": "module",
"entry": "desktop-entry.js",
"isolation": "shadow-dom"
},
"standalone": {
"entry": "index.html",
"basePath": "/apps/kaiplus/",
"url": "/apps/kaiplus/"
"url": "/apps/kaiplus/",
"externalOpen": {
"enabled": true,
"label": "在浏览器中打开酷友社AI"
}
},
"config": {
"providerOrder": ["uci"],
@@ -24,42 +27,14 @@
},
"backend": {
"type": "http",
"transport": "unix",
"scheme": "http",
"values": {
"socketPath": {
"default": "/var/run/kaiplus.sock",
"keys": {
"uci": "kaiplus.@kaiplus[0].socket_path"
}
},
"listenMode": {
"default": "auto",
"keys": {
"uci": "kaiplus.@kaiplus[0].listen_mode"
}
},
"externalPortEnabled": {
"default": false,
"keys": {
"uci": "kaiplus.@kaiplus[0].external_port_enabled"
}
},
"port": {
"default": 8189,
"keys": {
"uci": "kaiplus.@kaiplus[0].port"
}
}
},
"host": "127.0.0.1",
"portFromUci": "kaiplus.@kaiplus[0].port",
"defaultPort": 8189,
"upstreamBasePath": "/apps/kaiplus/",
"apiPath": "api/",
"pathMode": "preserve",
"fallback": {
"transport": "tcp",
"scheme": "http",
"host": "127.0.0.1"
}
"proxyMode": "app-base"
},
"window": {
"width": 1180,
-8
View File
@@ -1,12 +1,4 @@
config kaiplus
option 'enabled' '0'
option 'data_dir' ''
option 'listen_mode' 'auto'
option 'external_port_enabled' '0'
option 'socket_path' '/var/run/kaiplus.sock'
option 'port' '8189'
option 'bind_addr' '0.0.0.0'
option 'base_path' '/apps/kaiplus/'
option 'system_role' 'istoreos'
option 'release_channel' 'stable'
option 'auth_mode' 'disabled'
+16 -65
View File
@@ -6,15 +6,7 @@ USE_PROCD=1
get_config() {
config_get_bool enabled "$1" enabled 0
config_get data_dir "$1" data_dir ""
config_get listen_mode "$1" listen_mode "auto"
config_get_bool external_port_enabled "$1" external_port_enabled 0
config_get socket_path "$1" socket_path "/var/run/kaiplus.sock"
config_get port "$1" port "8189"
config_get bind_addr "$1" bind_addr "0.0.0.0"
config_get base_path "$1" base_path "/apps/kaiplus/"
config_get system_role "$1" system_role "istoreos"
config_get release_channel "$1" release_channel "stable"
config_get auth_mode "$1" auth_mode "disabled"
}
mkdir_p() {
@@ -26,7 +18,7 @@ start_service() {
config_foreach get_config kaiplus
if [ "$enabled" != 1 ]; then
return 1
return 0
fi
if [ -z "$data_dir" ]; then
logger -t kaiplus "data_dir is empty; please set option data_dir in /etc/config/kaiplus"
@@ -41,64 +33,23 @@ start_service() {
mkdir_p "$data_dir/state"
chmod 0700 "$data_dir/config" "$data_dir/state"
helper_token_file="$data_dir/state/ssh-helper.token"
if [ ! -s "$helper_token_file" ]; then
umask 077
if [ -r /proc/sys/kernel/random/uuid ]; then
cat /proc/sys/kernel/random/uuid > "$helper_token_file"
else
{
date +%s
cat /proc/uptime 2>/dev/null
dd if=/dev/urandom bs=24 count=1 2>/dev/null || true
} | sha256sum | awk '{print $1}' > "$helper_token_file"
fi
fi
helper_token="$(cat "$helper_token_file")"
logger -t kaiplus "Starting KaiPlus service"
procd_open_instance kaiplus_bin
if [ "$listen_mode" = "tcp" ] || [ "$external_port_enabled" = 1 ]; then
procd_set_param env \
KAIPLUS_HOME="$data_dir" \
KAIPLUS_SYSTEM_ROLE="$system_role" \
KAIPLUS_RELEASE_CHANNEL="$release_channel" \
KAIPLUS_AUTH_MODE="$auth_mode" \
LINKEASE_AUTH_PROVIDER="$auth_mode" \
KAIPLUS_LISTEN_MODE="tcp" \
KAIPLUS_WORKSPACE_HELPER_DIR="/usr/share/kaiplus/helpers" \
KAIPLUS_WORKSPACE_TOOL_INSTALL_DIR="/tmp/kaiplus_workspace_tool" \
KAIPLUS_SSH_HELPER_TOKEN="$helper_token" \
REASONIX_CREDENTIALS_STORE="file"
else
mkdir_p "$(dirname "$socket_path")"
procd_set_param env \
KAIPLUS_HOME="$data_dir" \
KAIPLUS_SYSTEM_ROLE="$system_role" \
KAIPLUS_RELEASE_CHANNEL="$release_channel" \
KAIPLUS_AUTH_MODE="$auth_mode" \
LINKEASE_AUTH_PROVIDER="$auth_mode" \
KAIPLUS_LISTEN_MODE="unix" \
KAIPLUS_SOCKET_PATH="$socket_path" \
KAIPLUS_WORKSPACE_HELPER_DIR="/usr/share/kaiplus/helpers" \
KAIPLUS_WORKSPACE_TOOL_INSTALL_DIR="/tmp/kaiplus_workspace_tool" \
KAIPLUS_SSH_HELPER_TOKEN="$helper_token" \
REASONIX_CREDENTIALS_STORE="file"
fi
procd_set_param command /usr/sbin/kaiplus_bin kaiplus-web
if [ "$listen_mode" = "tcp" ] || [ "$external_port_enabled" = 1 ]; then
procd_append_param command --listen-mode tcp
procd_append_param command --addr "$bind_addr:$port"
else
procd_append_param command --listen-mode unix
procd_append_param command --socket-path "$socket_path"
fi
procd_open_instance kaiplus
procd_set_param env \
KAIPLUS_HOME="$data_dir" \
KAIPLUS_SYSTEM_ROLE="istoreos" \
KAIPLUS_RELEASE_CHANNEL="stable" \
KAIPLUS_AUTH_MODE="openwrt_luci" \
LINKEASE_AUTH_PROVIDER="openwrt_luci" \
KAIPLUS_LISTEN_MODE="tcp" \
REASONIX_CREDENTIALS_STORE="file"
procd_set_param command /usr/sbin/kaiplus kaiplus-web
procd_append_param command --listen-mode tcp
procd_append_param command --addr "0.0.0.0:$port"
procd_append_param command --data-dir "$data_dir"
procd_append_param command --static-dir /usr/share/kaiplus/www
procd_append_param command --defaults-dir /usr/share/kaiplus/defaults
procd_append_param command --base-path "$base_path"
procd_append_param command --system-role "$system_role"
procd_append_param command --release-channel "$release_channel"
procd_append_param command --base-path /apps/kaiplus/
procd_append_param command --system-role istoreos
procd_append_param command --release-channel stable
procd_set_param stdout 1
procd_set_param stderr 1
procd_set_param respawn
+2 -2
View File
@@ -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.2002
PKG_VERSION:=26.10.2202
# 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:=24
PKG_RELEASE:=25
PKG_LICENSE:=GPL-2.0 License
PKG_MAINTAINER:=ophub <https://github.com/ophub/luci-app-amlogic>
@@ -47,6 +47,18 @@ case "$PLATFORM" in
*) MENU_ARMCPU=yes ;;
esac
# Raise uhttpd max_requests (default 3 is too low for this plugin's concurrent
# polling and can crash some uhttpd builds), but never override a higher value.
cur_max="$(uci -q get uhttpd.main.max_requests 2>/dev/null)"
if [ -z "$cur_max" ] || [ "$cur_max" -lt 50 ] 2>/dev/null; then
uci -q batch <<-EOF >/dev/null
set uhttpd.main.max_requests='50'
commit uhttpd
EOF
# Apply now (skip during image build).
[ -z "${IPKG_INSTROOT}" ] && /etc/init.d/uhttpd reload >/dev/null 2>&1 || true
fi
uci -q batch <<-EOF >/dev/null
delete ucitrack.@amlogic[-1]
add ucitrack amlogic
-5
View File
@@ -1,5 +0,0 @@
# Local AI planning notes
/task_plan.md
/progress.md
/progess.md
/findings.md
-201
View File
@@ -1,201 +0,0 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
+1 -11
View File
@@ -1,19 +1,9 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=luci-app-argon-config
PKG_VERSION:=1.0
PKG_RELEASE:=11
PKG_MAINTAINER:=jerrykuku <jerrykuku@qq.com>
LUCI_TITLE:=LuCI app for Argon theme configuration
LUCI_TITLE:=LuCI for Argon theme configuration
LUCI_PKGARCH:=all
LUCI_DEPENDS:=+luci-theme-argon
define Package/$(PKG_NAME)/conffiles
/etc/config/argon
endef
include $(TOPDIR)/feeds/luci/luci.mk
# call BuildPackage - OpenWrt buildroot signature
-111
View File
@@ -1,111 +0,0 @@
<!-- markdownlint-configure-file {
"MD013": {
"code_blocks": false,
"tables": false,
"line_length":200
},
"MD033": false,
"MD041": false
} -->
[license]: /LICENSE
[license-badge]: https://img.shields.io/github/license/jerrykuku/luci-app-argon-config?style=flat-square&a=1
[prs]: https://github.com/jerrykuku/luci-app-argon-config/pulls
[prs-badge]: https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square
[issues]: https://github.com/jerrykuku/luci-app-argon-config/issues/new
[issues-badge]: https://img.shields.io/badge/Issues-welcome-brightgreen.svg?style=flat-square
[release]: https://github.com/jerrykuku/luci-app-argon-config/releases
[release-badge]: https://img.shields.io/github/v/release/jerrykuku/luci-app-argon-config?include_prereleases&style=flat-square
[download]: https://github.com/jerrykuku/luci-app-argon-config/releases
[download-badge]: https://img.shields.io/github/downloads/jerrykuku/luci-app-argon-config/total?style=flat-square
[contact]: https://t.me/jerryk6
[contact-badge]: https://img.shields.io/badge/Contact-telegram-blue?style=flat-square
[en-us-link]: /README.md
[zh-cn-link]: /README_ZH.md
[en-us-release-log]: /RELEASE.md
[zh-cn-release-log]: /RELEASE_ZH.md
[config-link]: https://github.com/jerrykuku/luci-app-argon-config/releases
[lede]: https://github.com/coolsnowwolf/lede
[official]: https://github.com/openwrt/openwrt
[immortalwrt]: https://github.com/immortalwrt/immortalwrt
<div align="center">
<img src="https://raw.githubusercontent.com/jerrykuku/staff/master/argon_title4.svg">
# Argon Theme Config Plugin
You can set the blur and transparency of the login page of argon theme,
and manage the background pictures and videos.
[![license][license-badge]][license]
[![prs][prs-badge]][prs]
[![issues][issues-badge]][issues]
[![release][release-badge]][release]
[![download][download-badge]][download]
[![contact][contact-badge]][contact]
**English** |
[简体中文][zh-cn-link]
<img src="https://raw.githubusercontent.com/jerrykuku/staff/master/argon2.gif">
</div>
## Login page styles
In **System → Argon Config**, choose **Classic sidebar** (default) or **Centered card**. The preview updates as you select a style. Save the settings, then reopen the login page to see the change. Wallpaper, light/dark mode, blur and transparency settings apply to both layouts.
This feature requires a theme version supporting `login_style`. Update the theme and this plugin together. Existing configurations without this option continue to use the classic layout.
## Custom browser icon and login logo
Under **System → Argon Config → Custom branding**, upload a browser icon and login logo separately, or use one image for both. Each can be restored to its default. PNG images must be 16–1024 pixels per side and at most 1 MiB. Browser icons must be square; login logos retain their aspect ratio in both login layouts.
Update both the theme and configuration plugin. Uploads and resets apply immediately without saving other settings; reload open pages to update their icons. The custom browser icon also supplies the touch icon and web manifest. Existing home-screen shortcuts may need to be added again.
Files are stored in `/www/luci-static/argon/branding/` without replacing packaged assets. The configuration plugin includes this directory in `keep.d` backups for upgrades that preserve configuration. Upgrades without configuration preservation reset the icons.
## Branch Introduction
There are currently two main branches that are adapted to different versions of the **OpenWrt** source code.
The table below will provide a detailed introduction:
| Branch | Version | Description | Matching source |
| ------ | ------- | ---------------------------------- | --------------------------------------------------------- |
| master | v1.x.x | Support the latest version of LuCI | [Official OpenWrt][official] • [ImmortalWrt][immortalwrt] |
| 18.06 | v0.9.x | Support the 18.06 version of LuCI | [Lean's LEDE][lede] |
## Getting started
### Build for Lean's LEDE project
```bash
cd lede/package/lean
rm -rf luci-app-argon-config # if have
git clone -b 18.06 https://github.com/jerrykuku/luci-app-argon-config.git luci-app-argon-config
make menuconfig #choose LUCI->Application->Luci-app-argon-config
make -j1 V=s
```
### Build for OpenWrt official SnapShots and ImmortalWrt
```bash
cd openwrt/package
git clone https://github.com/jerrykuku/luci-app-argon-config.git
make menuconfig #choose LUCI->Application->Luci-app-argon-config
make -j1 V=s
```
## Contributors
<a href="https://github.com/jerrykuku/luci-app-argon-config/graphs/contributors">
<img src="https://contrib.rocks/image?repo=jerrykuku/luci-app-argon-config" />
</a>
Made with [contrib.rocks](https://contrib.rocks).
## Related Projects
- [luci-theme-argon](https://github.com/jerrykuku/luci-theme-argon): Argon theme
- [openwrt-package](https://github.com/jerrykuku/openwrt-package): My OpenWrt package
- [CasaOS](https://github.com/IceWhaleTech/CasaOS): A simple, easy-to-use, elegant open-source Personal Cloud system (My current main project)
-110
View File
@@ -1,110 +0,0 @@
<!-- markdownlint-configure-file {
"MD013": {
"code_blocks": false,
"tables": false,
"line_length":200
},
"MD033": false,
"MD041": false
} -->
[license]: /LICENSE
[license-badge]: https://img.shields.io/github/license/jerrykuku/luci-app-argon-config?style=flat-square&a=1
[prs]: https://github.com/jerrykuku/luci-app-argon-config/pulls
[prs-badge]: https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square
[issues]: https://github.com/jerrykuku/luci-app-argon-config/issues/new
[issues-badge]: https://img.shields.io/badge/Issues-welcome-brightgreen.svg?style=flat-square
[release]: https://github.com/jerrykuku/luci-app-argon-config/releases
[release-badge]: https://img.shields.io/github/v/release/jerrykuku/luci-app-argon-config?include_prereleases&style=flat-square
[download]: https://github.com/jerrykuku/luci-app-argon-config/releases
[download-badge]: https://img.shields.io/github/downloads/jerrykuku/luci-app-argon-config/total?style=flat-square
[contact]: https://t.me/jerryk6
[contact-badge]: https://img.shields.io/badge/Contact-telegram-blue?style=flat-square
[en-us-link]: /README.md
[zh-cn-link]: /README_ZH.md
[en-us-release-log]: /RELEASE.md
[zh-cn-release-log]: /RELEASE_ZH.md
[config-link]: https://github.com/jerrykuku/luci-app-argon-config/releases
[lede]: https://github.com/coolsnowwolf/lede
[official]: https://github.com/openwrt/openwrt
[immortalwrt]: https://github.com/immortalwrt/immortalwrt
<div align="center">
<img src="https://raw.githubusercontent.com/jerrykuku/staff/master/argon_title4.svg">
# Argon 主题设置插件
您可以设置 Argon 主题登录页面的模糊度和透明度,并管理背景图片和视频。
[![license][license-badge]][license]
[![prs][prs-badge]][prs]
[![issues][issues-badge]][issues]
[![release][release-badge]][release]
[![download][download-badge]][download]
[![contact][contact-badge]][contact]
[Engilish][en-us-link] |
**简体中文**
<img src="https://raw.githubusercontent.com/jerrykuku/staff/master/argon2.gif">
</div>
## 登录页样式
进入 **系统 → Argon 主题设置**,选择默认的**经典侧栏**或**居中卡片**。切换选项时会更新预览缩略图;保存后,重新打开登录页即可看到变化。两种布局共用壁纸、深浅色、模糊度和透明度设置。
此功能需要支持 `login_style` 的主题版本,请同时更新主题和本插件。已有配置未设置该选项时,继续使用经典布局。
## 自定义网站图标与登录 Logo
在 **系统 → Argon 主题设置 → 自定义图标** 中,可以分别上传网站图标和登录页 Logo,也可以将同一张图片同时用于两处;每项都可恢复默认。支持 PNG 格式,每边 16–1024 像素,最大 1 MiB。网站图标需为正方形;登录 Logo 按原比例缩放,兼容经典侧栏和居中卡片。
请同时更新主题和配置插件。上传或恢复后立即生效,无需保存其他设置;已打开的页面需要刷新才能更新图标。自定义网站图标也用于手机桌面图标和 manifest,已添加到桌面的快捷方式可能需要重新添加。
自定义文件保存在 `/www/luci-static/argon/branding/`,不会覆盖主题内置图标。配置插件通过 `keep.d` 将此目录纳入保留配置升级的备份;不保留配置时不会保留自定义图标。
## Branch Introduction
目前有两个主要的分支,适应于不同版本的**OpenWrt**源代码。
下表为详细的介绍:
| 分支 | 版本 | 介绍 | 匹配源码 |
| ------ | ------ | --------------------------- | ----------------------------------------------------- |
| master | v1.x.x | 支持最新和比较新版本的 LuCI | [官方 OpenWrt][official] • [ImmortalWrt][immortalwrt] |
| 18.06 | v0.9.x | 支持 18.06 版本的 LuCI | [Lean's LEDE][lede] |
## G快速开始
### 使用 Lean's LEDE 构建
```bash
cd lede/package/lean
rm -rf luci-app-argon-config # if have
git clone -b 18.06 https://github.com/jerrykuku/luci-app-argon-config.git luci-app-argon-config
make menuconfig #choose LUCI->Application->Luci-app-argon-config
make -j1 V=s
```
### 使用官方 OpenWrt SnapShots 和 ImmortalWrt 构建
```bash
cd openwrt/package
git clone https://github.com/jerrykuku/luci-app-argon-config.git
make menuconfig #choose LUCI->Application->Luci-app-argon-config
make -j1 V=s
```
## 贡献者
<a href="https://github.com/jerrykuku/luci-app-argon-config/graphs/contributors">
<img src="https://contrib.rocks/image?repo=jerrykuku/luci-app-argon-config" />
</a>
Made with [contrib.rocks](https://contrib.rocks).
## 相关项目
- [luci-theme-argon](https://github.com/jerrykuku/luci-theme-argon): Argon theme
- [openwrt-package](https://github.com/jerrykuku/openwrt-package): My OpenWrt package
- [CasaOS](https://github.com/IceWhaleTech/CasaOS): A simple, easy-to-use, elegant open-source Personal Cloud system (My current main project)
@@ -1,13 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 180" width="320" height="180">
<defs><linearGradient id="sky" x2="1" y2="1"><stop stop-color="#dbeafe"/><stop offset="1" stop-color="#818cf8"/></linearGradient></defs>
<rect width="320" height="180" fill="url(#sky)"/>
<circle cx="260" cy="38" r="15" fill="#fef3c7"/>
<path d="M0 130 72 76 148 140 237 66 320 124V180H0Z" fill="#6366a0"/>
<path d="M0 164 111 110 207 158 280 115 320 145V180H0Z" fill="#414679"/>
<rect x="104" y="27" width="112" height="126" rx="6" fill="#f4f5f7" fill-opacity=".94"/><g transform="translate(118 41)">
<rect x="13" width="16" height="16" rx="4" fill="#5e72e4"/>
<circle cx="21" cy="8" r="4" fill="none" stroke="#fff" stroke-width="2"/>
<rect x="37" y="5" width="34" height="5" rx="2" fill="#32325d"/>
<rect x="7" y="32" width="70" height="3" rx="1.5" fill="#8898aa"/><rect x="7" y="50" width="70" height="3" rx="1.5" fill="#8898aa"/><rect x="7" y="67" width="70" height="16" rx="3" fill="#5e72e4"/><rect x="26" y="93" width="32" height="2" rx="1" fill="#8898aa"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.1 KiB

@@ -1,13 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 180" width="320" height="180">
<defs><linearGradient id="sky" x2="1" y2="1"><stop stop-color="#dbeafe"/><stop offset="1" stop-color="#818cf8"/></linearGradient></defs>
<rect width="320" height="180" fill="url(#sky)"/>
<circle cx="260" cy="38" r="15" fill="#fef3c7"/>
<path d="M0 130 72 76 148 140 237 66 320 124V180H0Z" fill="#6366a0"/>
<path d="M0 164 111 110 207 158 280 115 320 145V180H0Z" fill="#414679"/>
<rect x="20" width="112" height="180" fill="#f4f5f7" fill-opacity=".94"/><g transform="translate(34 20)">
<rect x="13" width="16" height="16" rx="4" fill="#5e72e4"/>
<circle cx="21" cy="8" r="4" fill="none" stroke="#fff" stroke-width="2"/>
<rect x="37" y="5" width="34" height="5" rx="2" fill="#32325d"/>
<rect x="7" y="48" width="70" height="3" rx="1.5" fill="#8898aa"/><rect x="7" y="68" width="70" height="3" rx="1.5" fill="#8898aa"/><rect x="7" y="92" width="70" height="16" rx="3" fill="#5e72e4"/><rect x="26" y="139" width="32" height="2" rx="1" fill="#8898aa"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.1 KiB

@@ -1,118 +0,0 @@
'use strict';
'require baseclass';
'require fs';
'require rpc';
'require ui';
var callGet = rpc.declare({ object: 'luci.argon_branding', method: 'get', expect: { '': {} }, raise: true });
var callSet = rpc.declare({ object: 'luci.argon_branding', method: 'set', params: ['target', 'token'], expect: { '': {} }, raise: true });
var callReset = rpc.declare({ object: 'luci.argon_branding', method: 'reset', params: ['target'], expect: { '': {} }, raise: true });
return baseclass.extend({
load: function() {
return callGet().catch(function() { return null; });
},
render: function(map, state) {
var busy = false;
var buttons = [];
var previews = {};
var defaults = {
favicon: L.resource('../argon/icon/favicon-32x32.png'),
logo: L.resource('../argon/img/argon.svg')
};
var labels = { favicon: _('Browser icon'), logo: _('Login logo') };
var available = state && state.result === 0;
function assetUrl(kind) {
return state && /^image-[0-9a-f]{64}\.png$/.test(state[kind] || '') ?
L.resource('../argon/branding/' + state[kind]) : defaults[kind];
}
function refresh() {
Object.keys(previews).forEach(function(kind) {
previews[kind].src = assetUrl(kind);
});
buttons.forEach(function(button) {
button.node.disabled = !!(map.readonly || busy || !available ||
(button.reset && !state[button.target]));
});
}
function update(target, upload) {
if (map.readonly || busy || !available)
return Promise.resolve();
busy = true;
refresh();
var file;
return Promise.resolve().then(function() {
if (!upload)
return callReset(target);
var token = Array.from(crypto.getRandomValues(new Uint32Array(4)), function(n) {
return ('00000000' + n.toString(16)).slice(-8);
}).join('');
file = '/tmp/argon_branding_' + token + '.png';
return ui.uploadFile(file).then(function() {
return callSet(target, token);
});
}).then(function(result) {
if (result.result === 2)
throw new Error(_('Invalid PNG image or dimensions.'));
if (result.result === 3)
throw new Error(_('Another update is running. Please try again.'));
if (result.result !== 0)
throw new Error(_('Unable to save custom branding.'));
state = result;
}).catch(function(error) {
ui.addNotification(null, E('p', {}, error.message), 'error');
}).finally(function() {
return (file ? L.resolveDefault(fs.remove(file)) : Promise.resolve()).finally(function() {
busy = false;
refresh();
});
});
}
function action(target, upload, label) {
var node = E('button', {
'type': 'button',
'class': 'btn cbi-button ' + (upload ? 'cbi-button-action' : 'cbi-button-reset'),
'style': 'max-width:100%;height:auto;white-space:normal',
'click': function() { return update(target, upload); }
}, label);
buttons.push({ node: node, target: target, reset: !upload });
return node;
}
var cards = Object.keys(labels).map(function(kind) {
var preview = E('img', {
'src': assetUrl(kind), 'alt': labels[kind], 'width': 64, 'height': 64,
'style': 'object-fit:contain;flex-shrink:0',
'error': function() { if (this.getAttribute('src') !== defaults[kind]) this.src = defaults[kind]; }
});
previews[kind] = preview;
return E('div', { 'style': 'flex:1 1 18rem;min-width:0' }, [
E('h4', { 'style': 'padding:0;margin:0 0 .75rem' }, labels[kind]),
E('div', { 'style': 'display:flex;align-items:center;flex-wrap:wrap;gap:1rem' }, [
preview,
E('div', { 'style': 'display:flex;flex-wrap:wrap;gap:.5rem' }, [
action(kind, true, _('Upload PNG...')),
action(kind, false, _('Restore default'))
])
])
]);
});
var content = E('div', { 'style': 'padding:0 1.25rem 1.25rem' }, [
E('p', { 'style': 'padding:0;margin:0 0 1rem;line-height:1.5' }, _('PNG images, 16–1024 pixels per side, up to 1 MiB. Browser icons must be square.')),
E('div', { 'style': 'display:flex;flex-wrap:wrap;gap:1.5rem;margin-bottom:1rem' }, cards),
action('both', true, _('Upload for both...')),
E('p', { 'style': 'padding:0;margin:1rem 0 0;line-height:1.5' }, _('Changes apply immediately. Reload open pages to update their icons.'))
]);
if (!available)
content.appendChild(E('p', { 'class': 'error', 'style': 'padding:0;margin:1rem 0 0' }, _('Unable to load custom branding. Update the theme and configuration packages.')));
refresh();
return E('div', { 'class': 'cbi-section', 'id': 'argon-branding' }, [
E('h3', {}, _('Custom branding')), content
]);
}
});
@@ -1,58 +1,46 @@
'use strict';
'require form';
'require argon.branding as branding';
'require fs';
'require rpc';
'require uci';
'require ui';
'require view';
var callAvailSpace = rpc.declare({
object: 'luci.argon',
method: 'avail',
raise: true,
expect: { '': { avail: 0 } }
const callSystemInfo = rpc.declare({
object: 'system',
method: 'info'
});
var callRemoveArgon = rpc.declare({
const callRemoveArgon = rpc.declare({
object: 'luci.argon',
method: 'remove',
params: ['filename'],
raise: true,
expect: { '': {} }
});
var callRenameArgon = rpc.declare({
const callRenameArgon = rpc.declare({
object: 'luci.argon',
method: 'rename',
params: ['newname'],
raise: true,
expect: { '': {} }
});
var bg_path = '/www/luci-static/argon/background/';
const bg_path = '/www/luci-static/argon/background/';
var trans_set = [0, 0.1, 0.2, 0.3, 0.4,
const trans_set = [0, 0.1, 0.2, 0.3, 0.4,
0.5, 0.6, 0.7, 0.8, 0.9, 1 ];
return view.extend({
load: function() {
load() {
return Promise.all([
uci.load('argon'),
callAvailSpace().catch(function(e) {
ui.addNotification(null, E('p', _('Failed to read available space: %s.').format(e.message)));
return { avail: 0 };
}),
fs.list(bg_path).catch(function(e) {
ui.addNotification(null, E('p', _('Failed to list background files: %s.').format(e.message)));
return [];
}),
branding.load()
L.resolveDefault(callSystemInfo(), {}),
L.resolveDefault(fs.list(bg_path), {})
]);
},
render: function(data) {
var m, s, o;
render(data) {
let m, s, o;
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.'));
@@ -61,46 +49,47 @@ return view.extend({
s.addremove = false;
s.anonymous = true;
var loginStyles = {
classic: _('Classic sidebar'),
centered: _('Centered card')
};
o = s.option(form.ListValue, 'login_style', _('Login page style'),
_('Applies the next time you open the login page.'));
o.value('classic', loginStyles.classic);
o.value('centered', loginStyles.centered);
o.default = 'classic';
o.rmempty = false;
o.renderWidget = function(section_id, option_index, cfgvalue) {
var style = cfgvalue === 'centered' ? 'centered' : 'classic';
return E('div', {}, [
this.super('renderWidget', [section_id, option_index, style]),
E('img', {
'id': this.cbid(section_id) + '-preview',
'src': L.resource('argon-config/login-' + style + '.svg'),
'alt': loginStyles[style],
'width': 320,
'height': 180,
'style': 'display:block;max-width:100%;height:auto;margin-top:1rem;border-radius:.5rem'
})
]);
};
o.onchange = function(ev, section_id, value) {
var preview = document.getElementById(this.cbid(section_id) + '-preview');
var style = value === 'centered' ? 'centered' : 'classic';
if (preview) {
preview.src = L.resource('argon-config/login-' + style + '.svg');
preview.alt = loginStyles[style];
}
};
o = s.option(form.ListValue, 'online_wallpaper', _('Wallpaper source'));
o.value('none', _('Built-in'));
o.value('bing', _('Bing'));
o.value('ghser', _('GHSer'));
o.value('unsplash', _('Unsplash'));
o.value('wallhaven', _('Wallhaven'));
o.default = 'bing';
o.forcewrite = true;
o.rmempty = false;
o.cfgvalue = function(section_id) {
let value = uci.get(data[0], section_id, 'online_wallpaper') || 'bing';
return value.split('_')[0];
}
o.write = function(section_id, value) {
let collection_id = this.section.formvalue(section_id, 'collection_id');
if (collection_id && (value === 'unsplash' || value === 'wallhaven')) {
value = value + '_' + collection_id;
}
uci.set(data[0], section_id, 'online_wallpaper', value);
}
o = s.option(form.Value, 'collection_id', _('Collection ID'), _('Collection ID for Unsplash or Wallhaven.'));
o.datatype = 'uinteger';
o.depends('online_wallpaper', 'unsplash');
o.depends('online_wallpaper', 'wallhaven');
o.cfgvalue = function(section_id) {
let value = uci.get(data[0], section_id, 'online_wallpaper');
if (!value || !value.includes('_'))
return '';
return value.split('_')[1];
}
o.write = function() { };
o = s.option(form.Value, 'use_api_key', _('API key'), _('Specify API key for Unsplash or Wallhaven.'));
o.depends('online_wallpaper', 'unsplash');
o.depends('online_wallpaper', 'wallhaven');
o = s.option(form.Flag, 'use_exact_resolution', _('Use exact resolution'), _('Use exact resolution or at least 1080P for Wallhaven.'));
o.default = o.enabled;
o.depends('online_wallpaper', 'wallhaven');
o = s.option(form.ListValue, 'mode', _('Theme mode'));
o.value('normal', _('Follow system'));
@@ -109,7 +98,7 @@ return view.extend({
o.default = 'normal';
o.rmempty = false;
o = s.option(form.Value, 'primary', _('[Light mode] Primary Color'), _('A HEX color (default: #5e72e4).'));
o = s.option(form.Value, 'primary', _('[Light mode] Primary Color'), _('A HEX color (default: #5e72e4).'))
o.default = '#5e72e4';
o.rmempty = false;
o.validate = function(section_id, value) {
@@ -117,11 +106,11 @@ return view.extend({
return /(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i.test(value) ||
_('Expecting: %s').format(_('valid HEX color value'));
return true;
};
}
o = s.option(form.ListValue, 'transparency', _('[Light mode] Transparency'),
_('0 transparent - 1 opaque (suggest: transparent: 0 or translucent preset: 0.5).'));
for (var i of trans_set)
for (let i of trans_set)
o.value(i);
o.default = '0.5';
o.rmempty = false;
@@ -133,7 +122,7 @@ return view.extend({
o.rmempty = false;
o = s.option(form.Value, 'dark_primary', _('[Dark mode] Primary Color'),
_('A HEX Color (default: #483d8b).'));
_('A HEX Color (default: #483d8b).'))
o.default = '#483d8b';
o.rmempty = false;
o.validate = function(section_id, value) {
@@ -141,17 +130,17 @@ return view.extend({
return /(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i.test(value) ||
_('Expecting: %s').format(_('valid HEX color value'));
return true;
};
}
o = s.option(form.ListValue, 'transparency_dark', _('[Dark mode] Transparency'),
_('0 transparent - 1 opaque (suggest: black translucent preset: 0.5).'));
for (var i of trans_set)
for (let i of trans_set)
o.value(i);
o.default = '0.5';
o.rmempty = false;
o = s.option(form.Value, 'blur_dark', _('[Dark mode] Frosted Glass Radius'),
_('Larger value will more blurred (suggest: clear: 1 or blur preset: 10).'));
_('Larger value will more blurred (suggest: clear: 1 or blur preset: 10).'))
o.datatype = 'ufloat';
o.default = '10';
o.rmempty = false;
@@ -160,18 +149,13 @@ return view.extend({
o.inputstyle = 'apply';
o.inputtitle = _('Save current settings');
o.onclick = function() {
return this.map.save(null, true).then(function() {
return this.map.save(null, true).then(() => {
ui.changes.apply(true);
}).catch(function(e) {
ui.addNotification(null, E('p', e.message));
});
};
s = m.section(form.TypedSection);
s.render = function() { return branding.render(this.map, data[3]); };
}
s = m.section(form.TypedSection, null, _('Upload background (available space: %1024.2mB)')
.format(data[1].avail * 1024),
.format(data[1].root.avail * 1024),
_('You can upload files such as gif/jpg/mp4/png/webm/webp files, to change the login page background.'));
s.addremove = false;
s.anonymous = true;
@@ -181,27 +165,24 @@ return view.extend({
o.inputstyle = 'action';
o.inputtitle = _('Upload...');
o.onclick = function(ev, section_id) {
var file = '/tmp/argon_background.tmp';
var uploaded = false;
return ui.uploadFile(file, ev.target).then(function(res) {
uploaded = true;
return callRenameArgon(res.name).then(function(ret) {
let file = '/tmp/argon_background.tmp';
return ui.uploadFile(file, ev.target).then((res) => {
return L.resolveDefault(callRenameArgon(res.name), {}).then((ret) => {
if (ret.result === 0)
return location.reload();
throw new Error(_('Failed to upload file: %s.').format(res.name));
else {
ui.addNotification(null, E('p', _('Failed to upload file: %s.').format(res.name)));
return L.resolveDefault(fs.remove(file), {});
}
});
})
.catch(function(e) {
ui.addNotification(null, E('p', e.message));
if (uploaded)
return L.resolveDefault(fs.remove(file));
});
.catch((e) => { ui.addNotification(null, E('p', e.message)); });
};
o.modalonly = true;
s = m.section(form.TableSection);
s.render = function() {
var tbl = E('table', { 'class': 'table cbi-section-table' },
let tbl = E('table', { 'class': 'table cbi-section-table' },
E('tr', { 'class': 'tr table-titles' }, [
E('th', { 'class': 'th' }, [ _('Filename') ]),
E('th', { 'class': 'th' }, [ _('Modified date') ]),
@@ -210,22 +191,16 @@ return view.extend({
])
);
cbi_update_table(tbl, data[2].map(L.bind(function(file) {
cbi_update_table(tbl, data[2].map(L.bind((file) => {
return [
file.name,
new Date(file.mtime * 1000).toLocaleString(),
String.format('%1024.2mB', file.size),
E('button', {
'class': 'btn cbi-button cbi-button-remove',
'disabled': this.map.readonly || null,
'click': ui.createHandlerFn(this, function() {
return callRemoveArgon(file.name).then(function(ret) {
if (ret.result === 0)
return location.reload();
throw new Error(_('Failed to delete file: %s.').format(file.name));
}).catch(function(e) {
ui.addNotification(null, E('p', e.message));
});
'click': ui.createHandlerFn(this, () => {
return L.resolveDefault(callRemoveArgon(file.name), {})
.then(() => { return location.reload(); });
})
}, [ _('Delete') ])
];
-258
View File
@@ -1,258 +0,0 @@
msgid ""
msgstr ""
"Project-Id-Version: luci-app-argon-config\n"
"PO-Revision-Date: 2026-10-08 00:00+0800\n"
"Last-Translator: Automatically generated\n"
"Language-Team: ar\n"
"Language: ar\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=6; plural=(n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5);\n"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:112
msgid "0 transparent - 1 opaque (suggest: black translucent preset: 0.5)."
msgstr "0 شفاف - 1 معتم (المقترح: أسود شبه شفاف: 0.5)."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:88
msgid "0 transparent - 1 opaque (suggest: transparent: 0 or translucent preset: 0.5)."
msgstr "0 شفاف - 1 معتم (المقترح: شفاف: 0 أو شبه شفاف: 0.5)."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:101
msgid "A HEX Color (default: #483d8b)."
msgstr "لون بصيغة HEX (الافتراضي: #483d8b)."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:77
msgid "A HEX color (default: #5e72e4)."
msgstr "لون بصيغة HEX (الافتراضي: #5e72e4)."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:171
msgid "Action"
msgstr "الإجراء"
#: applications/luci-app-argon-config/root/usr/share/luci/menu.d/luci-app-argon-config.json:3
msgid "Argon Config"
msgstr "إعدادات Argon"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:55
msgid "Argon theme configuration"
msgstr "إعدادات سمة Argon"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:197
msgid "Background file list"
msgstr "قائمة ملفات الخلفية"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:64
msgid "Bing"
msgstr "Bing"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:63
msgid "Built-in"
msgstr "مدمج"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:73
msgid "Dark mode"
msgstr "الوضع الداكن"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:192
msgid "Delete"
msgstr "حذف"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:83
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:107
msgid "Expecting: %s"
msgstr "القيمة المتوقعة: %s"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:187
msgid "Failed to delete file: %s."
msgstr "تعذر حذف الملف: %s."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:46
msgid "Failed to list background files: %s."
msgstr "تعذر عرض قائمة ملفات الخلفية: %s."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:42
msgid "Failed to read available space: %s."
msgstr "تعذر تحديد المساحة المتاحة: %s."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:153
msgid "Failed to upload file: %s."
msgstr "تعذر رفع الملف: %s."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:168
msgid "Filename"
msgstr "اسم الملف"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:142
msgid "Files will be uploaded to <code>%s</code>."
msgstr "ستُرفع الملفات إلى <code>%s</code>."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:71
msgid "Follow system"
msgstr "اتباع إعدادات النظام"
#: applications/luci-app-argon-config/root/usr/share/rpcd/acl.d/luci-app-argon-config.json:3
msgid "Grant UCI access for luci-app-argon-config"
msgstr "منح صلاحية الوصول إلى UCI لتطبيق luci-app-argon-config"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:56
msgid "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."
msgstr "يمكنك هنا ضبط التمويه والشفافية لصفحة تسجيل الدخول في سمة Argon، وإدارة صور الخلفية ومقاطع الفيديو. يُنصح باستخدام Chrome."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:95
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:119
msgid "Larger value will more blurred (suggest: clear: 1 or blur preset: 10)."
msgstr "تزيد القيم الأكبر من التمويه (المقترح: واضح: 1 أو مموّه: 10)."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:72
msgid "Light mode"
msgstr "الوضع الفاتح"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:169
msgid "Modified date"
msgstr "تاريخ التعديل"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:194
msgid "No files found."
msgstr "لم يتم العثور على ملفات."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:126
msgid "Save current settings"
msgstr "حفظ الإعدادات الحالية"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:124
msgid "Save settings"
msgstr "حفظ الإعدادات"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:170
msgid "Size"
msgstr "الحجم"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:58
msgid "Theme configuration"
msgstr "إعدادات السمة"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:70
msgid "Theme mode"
msgstr "وضع السمة"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:65
msgid "Unsplash"
msgstr "Unsplash"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:141
msgid "Upload background"
msgstr "رفع خلفية"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:135
msgid "Upload background (available space: %1024.2mB)"
msgstr "رفع خلفية (المساحة المتاحة: %1024.2mB)"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:144
msgid "Upload..."
msgstr "رفع..."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:66
msgid "Wallhaven"
msgstr "Wallhaven"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:62
msgid "Wallpaper source"
msgstr "مصدر الخلفية"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:137
msgid "You can upload files such as gif/jpg/mp4/png/webm/webp files, to change the login page background."
msgstr "يمكنك رفع ملفات بصيغ gif/jpg/mp4/png/webm/webp لتغيير خلفية صفحة تسجيل الدخول."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:118
msgid "[Dark mode] Frosted Glass Radius"
msgstr "[الوضع الداكن] نصف قطر التمويه لتأثير الزجاج المصنفر"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:100
msgid "[Dark mode] Primary Color"
msgstr "[الوضع الداكن] اللون الأساسي"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:111
msgid "[Dark mode] Transparency"
msgstr "[الوضع الداكن] الشفافية"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:94
msgid "[Light mode] Frosted Glass Radius"
msgstr "[الوضع الفاتح] نصف قطر التمويه لتأثير الزجاج المصنفر"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:77
msgid "[Light mode] Primary Color"
msgstr "[الوضع الفاتح] اللون الأساسي"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:87
msgid "[Light mode] Transparency"
msgstr "[الوضع الفاتح] الشفافية"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:83
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:107
msgid "valid HEX color value"
msgstr "قيمة لون صالحة بصيغة HEX"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js
msgid "Login page style"
msgstr "نمط صفحة تسجيل الدخول"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js
msgid "Classic sidebar"
msgstr "شريط جانبي كلاسيكي"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js
msgid "Centered card"
msgstr "بطاقة في المنتصف"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js
msgid "Applies the next time you open the login page."
msgstr "يُطبّق عند فتح صفحة تسجيل الدخول في المرة القادمة."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Browser icon"
msgstr "أيقونة المتصفح"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Login logo"
msgstr "شعار تسجيل الدخول"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Invalid PNG image or dimensions."
msgstr "صورة PNG أو أبعاد غير صالحة."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Another update is running. Please try again."
msgstr "يوجد تحديث آخر قيد التنفيذ. يرجى المحاولة لاحقًا."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Unable to save custom branding."
msgstr "تعذر حفظ الأيقونات المخصصة."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Upload PNG..."
msgstr "رفع PNG…"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Restore default"
msgstr "استعادة الافتراضي"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Custom branding"
msgstr "أيقونات مخصصة"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "PNG images, 16–1024 pixels per side, up to 1 MiB. Browser icons must be square."
msgstr "صور PNG، من 16 إلى 1024 بكسل لكل جانب، وبحد أقصى 1 MiB. يجب أن تكون أيقونات المتصفح مربعة."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Upload for both..."
msgstr "رفع لكليهما…"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Changes apply immediately. Reload open pages to update their icons."
msgstr "تُطبق التغييرات فورًا. أعد تحميل الصفحات المفتوحة لتحديث أيقوناتها."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Unable to load custom branding. Update the theme and configuration packages."
msgstr "تعذر تحميل الأيقونات المخصصة. حدّث القالب وحزمة الإعدادات."
-258
View File
@@ -1,258 +0,0 @@
msgid ""
msgstr ""
"Project-Id-Version: luci-app-argon-config\n"
"PO-Revision-Date: 2026-10-08 00:00+0800\n"
"Last-Translator: Automatically generated\n"
"Language-Team: de\n"
"Language: de\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"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:112
msgid "0 transparent - 1 opaque (suggest: black translucent preset: 0.5)."
msgstr "0 transparent – 1 undurchsichtig (Empfehlung: halbtransparentes Schwarz: 0.5)."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:88
msgid "0 transparent - 1 opaque (suggest: transparent: 0 or translucent preset: 0.5)."
msgstr "0 transparent – 1 undurchsichtig (Empfehlung: transparent: 0 oder halbtransparent: 0.5)."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:101
msgid "A HEX Color (default: #483d8b)."
msgstr "Eine HEX-Farbe (Standard: #483d8b)."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:77
msgid "A HEX color (default: #5e72e4)."
msgstr "Eine HEX-Farbe (Standard: #5e72e4)."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:171
msgid "Action"
msgstr "Aktion"
#: applications/luci-app-argon-config/root/usr/share/luci/menu.d/luci-app-argon-config.json:3
msgid "Argon Config"
msgstr "Argon-Einstellungen"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:55
msgid "Argon theme configuration"
msgstr "Einstellungen des Argon-Designs"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:197
msgid "Background file list"
msgstr "Liste der Hintergrunddateien"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:64
msgid "Bing"
msgstr "Bing"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:63
msgid "Built-in"
msgstr "Integriert"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:73
msgid "Dark mode"
msgstr "Dunkler Modus"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:192
msgid "Delete"
msgstr "Löschen"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:83
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:107
msgid "Expecting: %s"
msgstr "Erwartet: %s"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:187
msgid "Failed to delete file: %s."
msgstr "Datei konnte nicht gelöscht werden: %s."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:46
msgid "Failed to list background files: %s."
msgstr "Hintergrunddateien konnten nicht aufgelistet werden: %s."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:42
msgid "Failed to read available space: %s."
msgstr "Verfügbarer Speicherplatz konnte nicht ermittelt werden: %s."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:153
msgid "Failed to upload file: %s."
msgstr "Datei konnte nicht hochgeladen werden: %s."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:168
msgid "Filename"
msgstr "Dateiname"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:142
msgid "Files will be uploaded to <code>%s</code>."
msgstr "Dateien werden nach <code>%s</code> hochgeladen."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:71
msgid "Follow system"
msgstr "Systemeinstellung verwenden"
#: applications/luci-app-argon-config/root/usr/share/rpcd/acl.d/luci-app-argon-config.json:3
msgid "Grant UCI access for luci-app-argon-config"
msgstr "UCI-Zugriff für luci-app-argon-config gewähren"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:56
msgid "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."
msgstr "Hier können Sie die Unschärfe und Transparenz der Anmeldeseite des Argon-Designs einstellen sowie Hintergrundbilder und -videos verwalten. Chrome wird empfohlen."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:95
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:119
msgid "Larger value will more blurred (suggest: clear: 1 or blur preset: 10)."
msgstr "Höhere Werte erzeugen mehr Unschärfe (Empfehlung: scharf: 1 oder unscharf: 10)."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:72
msgid "Light mode"
msgstr "Heller Modus"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:169
msgid "Modified date"
msgstr "Änderungsdatum"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:194
msgid "No files found."
msgstr "Keine Dateien gefunden."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:126
msgid "Save current settings"
msgstr "Aktuelle Einstellungen speichern"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:124
msgid "Save settings"
msgstr "Einstellungen speichern"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:170
msgid "Size"
msgstr "Größe"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:58
msgid "Theme configuration"
msgstr "Design-Einstellungen"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:70
msgid "Theme mode"
msgstr "Darstellungsmodus"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:65
msgid "Unsplash"
msgstr "Unsplash"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:141
msgid "Upload background"
msgstr "Hintergrund hochladen"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:135
msgid "Upload background (available space: %1024.2mB)"
msgstr "Hintergrund hochladen (verfügbarer Speicherplatz: %1024.2mB)"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:144
msgid "Upload..."
msgstr "Hochladen..."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:66
msgid "Wallhaven"
msgstr "Wallhaven"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:62
msgid "Wallpaper source"
msgstr "Hintergrundquelle"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:137
msgid "You can upload files such as gif/jpg/mp4/png/webm/webp files, to change the login page background."
msgstr "Sie können Dateien im Format gif/jpg/mp4/png/webm/webp hochladen, um den Hintergrund der Anmeldeseite zu ändern."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:118
msgid "[Dark mode] Frosted Glass Radius"
msgstr "[Dunkler Modus] Unschärferadius des Milchglaseffekts"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:100
msgid "[Dark mode] Primary Color"
msgstr "[Dunkler Modus] Primärfarbe"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:111
msgid "[Dark mode] Transparency"
msgstr "[Dunkler Modus] Transparenz"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:94
msgid "[Light mode] Frosted Glass Radius"
msgstr "[Heller Modus] Unschärferadius des Milchglaseffekts"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:77
msgid "[Light mode] Primary Color"
msgstr "[Heller Modus] Primärfarbe"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:87
msgid "[Light mode] Transparency"
msgstr "[Heller Modus] Transparenz"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:83
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:107
msgid "valid HEX color value"
msgstr "gültiger HEX-Farbwert"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js
msgid "Login page style"
msgstr "Stil der Anmeldeseite"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js
msgid "Classic sidebar"
msgstr "Klassische Seitenleiste"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js
msgid "Centered card"
msgstr "Zentrierte Karte"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js
msgid "Applies the next time you open the login page."
msgstr "Wird beim nächsten Öffnen der Anmeldeseite angewendet."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Browser icon"
msgstr "Browser-Symbol"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Login logo"
msgstr "Anmeldelogo"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Invalid PNG image or dimensions."
msgstr "Ungültiges PNG-Bild oder ungültige Abmessungen."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Another update is running. Please try again."
msgstr "Eine andere Aktualisierung läuft. Bitte später erneut versuchen."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Unable to save custom branding."
msgstr "Benutzerdefinierte Symbole konnten nicht gespeichert werden."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Upload PNG..."
msgstr "PNG hochladen…"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Restore default"
msgstr "Standard wiederherstellen"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Custom branding"
msgstr "Benutzerdefinierte Symbole"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "PNG images, 16–1024 pixels per side, up to 1 MiB. Browser icons must be square."
msgstr "PNG-Bilder, 16–1024 Pixel pro Seite, maximal 1 MiB. Browser-Symbole müssen quadratisch sein."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Upload for both..."
msgstr "Für beide hochladen…"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Changes apply immediately. Reload open pages to update their icons."
msgstr "Änderungen werden sofort wirksam. Laden Sie offene Seiten neu, um ihre Symbole zu aktualisieren."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Unable to load custom branding. Update the theme and configuration packages."
msgstr "Benutzerdefinierte Symbole konnten nicht geladen werden. Aktualisieren Sie das Theme und das Konfigurationspaket."
-260
View File
@@ -1,260 +0,0 @@
msgid ""
msgstr ""
"Project-Id-Version: \n"
"POT-Creation-Date: 2021-03-15 21:25-0300\n"
"PO-Revision-Date: 2022-04-23 15:21-0300\n"
"Last-Translator: Franco Castillo <castillofrancodamian@gmail.com>\n"
"Language-Team: \n"
"Language: es\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: Poedit 3.0.1\n"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:112
msgid "0 transparent - 1 opaque (suggest: black translucent preset: 0.5)."
msgstr "0 transparente - 1 opaco (sugerencia: negro translúcido: 0.5)."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:88
msgid "0 transparent - 1 opaque (suggest: transparent: 0 or translucent preset: 0.5)."
msgstr "0 transparente - 1 opaco (sugerencia: transparente: 0 o translúcido: 0.5)."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:101
msgid "A HEX Color (default: #483d8b)."
msgstr "Un color HEX (predeterminado: #483d8b)."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:77
msgid "A HEX color (default: #5e72e4)."
msgstr "Un color HEX (predeterminado: #5e72e4)."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:171
msgid "Action"
msgstr "Acción"
#: applications/luci-app-argon-config/root/usr/share/luci/menu.d/luci-app-argon-config.json:3
msgid "Argon Config"
msgstr "Configuración de Argon"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:55
msgid "Argon theme configuration"
msgstr "Configuración del tema Argon"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:197
msgid "Background file list"
msgstr "Lista de archivos de fondo"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:64
msgid "Bing"
msgstr "Bing"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:63
msgid "Built-in"
msgstr "Integrado"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:73
msgid "Dark mode"
msgstr "Modo oscuro"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:192
msgid "Delete"
msgstr "Eliminar"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:83
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:107
msgid "Expecting: %s"
msgstr "Se espera: %s"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:187
msgid "Failed to delete file: %s."
msgstr "No se pudo eliminar el archivo: %s."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:46
msgid "Failed to list background files: %s."
msgstr "No se pudo obtener la lista de archivos de fondo: %s."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:42
msgid "Failed to read available space: %s."
msgstr "No se pudo consultar el espacio disponible: %s."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:153
msgid "Failed to upload file: %s."
msgstr "No se pudo subir el archivo: %s."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:168
msgid "Filename"
msgstr "Nombre del archivo"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:142
msgid "Files will be uploaded to <code>%s</code>."
msgstr "Los archivos se subirán a <code>%s</code>."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:71
msgid "Follow system"
msgstr "Seguir el sistema"
#: applications/luci-app-argon-config/root/usr/share/rpcd/acl.d/luci-app-argon-config.json:3
msgid "Grant UCI access for luci-app-argon-config"
msgstr "Otorgar acceso UCI para luci-app-argon-config"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:56
msgid "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."
msgstr "Aquí puede configurar el desenfoque y la transparencia de la página de inicio de sesión del tema Argon y administrar las imágenes y los vídeos de fondo. Se recomienda Chrome."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:95
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:119
msgid "Larger value will more blurred (suggest: clear: 1 or blur preset: 10)."
msgstr "Un valor mayor produce más desenfoque (sugerencia: nítido: 1 o desenfocado: 10)."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:72
msgid "Light mode"
msgstr "Modo claro"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:169
msgid "Modified date"
msgstr "Fecha de modificación"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:194
msgid "No files found."
msgstr "No se encontraron archivos."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:126
msgid "Save current settings"
msgstr "Guardar la configuración actual"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:124
msgid "Save settings"
msgstr "Guardar configuración"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:170
msgid "Size"
msgstr "Tamaño"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:58
msgid "Theme configuration"
msgstr "Configuración del tema"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:70
msgid "Theme mode"
msgstr "Modo del tema"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:65
msgid "Unsplash"
msgstr "Unsplash"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:141
msgid "Upload background"
msgstr "Subir fondo"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:135
msgid "Upload background (available space: %1024.2mB)"
msgstr "Subir fondo (espacio disponible: %1024.2mB)"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:144
msgid "Upload..."
msgstr "Subir..."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:66
msgid "Wallhaven"
msgstr "Wallhaven"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:62
msgid "Wallpaper source"
msgstr "Fuente del fondo de pantalla"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:137
msgid "You can upload files such as gif/jpg/mp4/png/webm/webp files, to change the login page background."
msgstr "Puede subir archivos gif/jpg/mp4/png/webm/webp para cambiar el fondo de la página de inicio de sesión."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:118
msgid "[Dark mode] Frosted Glass Radius"
msgstr "[Modo oscuro] Radio de vidrio esmerilado"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:100
msgid "[Dark mode] Primary Color"
msgstr "[Modo oscuro] Color primario"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:111
msgid "[Dark mode] Transparency"
msgstr "[Modo oscuro] Transparencia"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:94
msgid "[Light mode] Frosted Glass Radius"
msgstr "[Modo claro] Radio de vidrio esmerilado"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:77
msgid "[Light mode] Primary Color"
msgstr "[Modo claro] Color primario"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:87
msgid "[Light mode] Transparency"
msgstr "[Modo claro] Transparencia"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:83
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:107
msgid "valid HEX color value"
msgstr "un valor de color HEX válido"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js
msgid "Login page style"
msgstr "Estilo de la página de inicio de sesión"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js
msgid "Classic sidebar"
msgstr "Barra lateral clásica"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js
msgid "Centered card"
msgstr "Tarjeta centrada"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js
msgid "Applies the next time you open the login page."
msgstr "Se aplica la próxima vez que abra la página de inicio de sesión."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Browser icon"
msgstr "Icono del navegador"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Login logo"
msgstr "Logotipo de inicio de sesión"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Invalid PNG image or dimensions."
msgstr "Imagen PNG o dimensiones no válidas."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Another update is running. Please try again."
msgstr "Hay otra actualización en curso. Inténtelo de nuevo más tarde."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Unable to save custom branding."
msgstr "No se pueden guardar los iconos personalizados."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Upload PNG..."
msgstr "Subir PNG…"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Restore default"
msgstr "Restaurar predeterminado"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Custom branding"
msgstr "Iconos personalizados"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "PNG images, 16–1024 pixels per side, up to 1 MiB. Browser icons must be square."
msgstr "Imágenes PNG, 16–1024 píxeles por lado, hasta 1 MiB. Los iconos del navegador deben ser cuadrados."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Upload for both..."
msgstr "Subir para ambos…"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Changes apply immediately. Reload open pages to update their icons."
msgstr "Los cambios se aplican inmediatamente. Recargue las páginas abiertas para actualizar sus iconos."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Unable to load custom branding. Update the theme and configuration packages."
msgstr "No se pueden cargar los iconos personalizados. Actualice el tema y el paquete de configuración."
-258
View File
@@ -1,258 +0,0 @@
msgid ""
msgstr ""
"Project-Id-Version: luci-app-argon-config\n"
"PO-Revision-Date: 2026-10-08 00:00+0800\n"
"Last-Translator: Automatically generated\n"
"Language-Team: fr\n"
"Language: fr\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"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:112
msgid "0 transparent - 1 opaque (suggest: black translucent preset: 0.5)."
msgstr "0 transparent – 1 opaque (recommandation : noir semi-transparent : 0.5)."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:88
msgid "0 transparent - 1 opaque (suggest: transparent: 0 or translucent preset: 0.5)."
msgstr "0 transparent – 1 opaque (recommandation : transparent : 0 ou semi-transparent : 0.5)."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:101
msgid "A HEX Color (default: #483d8b)."
msgstr "Une couleur HEX (par défaut : #483d8b)."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:77
msgid "A HEX color (default: #5e72e4)."
msgstr "Une couleur HEX (par défaut : #5e72e4)."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:171
msgid "Action"
msgstr "Action"
#: applications/luci-app-argon-config/root/usr/share/luci/menu.d/luci-app-argon-config.json:3
msgid "Argon Config"
msgstr "Configuration d’Argon"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:55
msgid "Argon theme configuration"
msgstr "Configuration du thème Argon"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:197
msgid "Background file list"
msgstr "Liste des fichiers d’arrière-plan"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:64
msgid "Bing"
msgstr "Bing"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:63
msgid "Built-in"
msgstr "Intégré"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:73
msgid "Dark mode"
msgstr "Mode sombre"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:192
msgid "Delete"
msgstr "Supprimer"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:83
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:107
msgid "Expecting: %s"
msgstr "Valeur attendue : %s"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:187
msgid "Failed to delete file: %s."
msgstr "Impossible de supprimer le fichier : %s."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:46
msgid "Failed to list background files: %s."
msgstr "Impossible de lister les fichiers d’arrière-plan : %s."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:42
msgid "Failed to read available space: %s."
msgstr "Impossible de déterminer l’espace disponible : %s."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:153
msgid "Failed to upload file: %s."
msgstr "Impossible de téléverser le fichier : %s."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:168
msgid "Filename"
msgstr "Nom du fichier"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:142
msgid "Files will be uploaded to <code>%s</code>."
msgstr "Les fichiers seront téléversés vers <code>%s</code>."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:71
msgid "Follow system"
msgstr "Suivre le système"
#: applications/luci-app-argon-config/root/usr/share/rpcd/acl.d/luci-app-argon-config.json:3
msgid "Grant UCI access for luci-app-argon-config"
msgstr "Accorder l’accès UCI à luci-app-argon-config"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:56
msgid "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."
msgstr "Vous pouvez régler ici le flou et la transparence de la page de connexion du thème Argon, ainsi que gérer les images et les vidéos d’arrière-plan. Chrome est recommandé."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:95
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:119
msgid "Larger value will more blurred (suggest: clear: 1 or blur preset: 10)."
msgstr "Une valeur plus élevée augmente le flou (recommandation : net : 1 ou flou : 10)."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:72
msgid "Light mode"
msgstr "Mode clair"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:169
msgid "Modified date"
msgstr "Date de modification"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:194
msgid "No files found."
msgstr "Aucun fichier trouvé."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:126
msgid "Save current settings"
msgstr "Enregistrer les paramètres actuels"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:124
msgid "Save settings"
msgstr "Enregistrer les paramètres"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:170
msgid "Size"
msgstr "Taille"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:58
msgid "Theme configuration"
msgstr "Configuration du thème"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:70
msgid "Theme mode"
msgstr "Mode du thème"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:65
msgid "Unsplash"
msgstr "Unsplash"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:141
msgid "Upload background"
msgstr "Téléverser un arrière-plan"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:135
msgid "Upload background (available space: %1024.2mB)"
msgstr "Téléverser un arrière-plan (espace disponible : %1024.2mB)"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:144
msgid "Upload..."
msgstr "Téléverser..."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:66
msgid "Wallhaven"
msgstr "Wallhaven"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:62
msgid "Wallpaper source"
msgstr "Source du fond d’écran"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:137
msgid "You can upload files such as gif/jpg/mp4/png/webm/webp files, to change the login page background."
msgstr "Vous pouvez téléverser des fichiers gif/jpg/mp4/png/webm/webp pour modifier l’arrière-plan de la page de connexion."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:118
msgid "[Dark mode] Frosted Glass Radius"
msgstr "[Mode sombre] Rayon du flou de l’effet verre dépoli"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:100
msgid "[Dark mode] Primary Color"
msgstr "[Mode sombre] Couleur principale"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:111
msgid "[Dark mode] Transparency"
msgstr "[Mode sombre] Transparence"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:94
msgid "[Light mode] Frosted Glass Radius"
msgstr "[Mode clair] Rayon du flou de l’effet verre dépoli"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:77
msgid "[Light mode] Primary Color"
msgstr "[Mode clair] Couleur principale"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:87
msgid "[Light mode] Transparency"
msgstr "[Mode clair] Transparence"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:83
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:107
msgid "valid HEX color value"
msgstr "une valeur de couleur HEX valide"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js
msgid "Login page style"
msgstr "Style de la page de connexion"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js
msgid "Classic sidebar"
msgstr "Barre latérale classique"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js
msgid "Centered card"
msgstr "Carte centrée"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js
msgid "Applies the next time you open the login page."
msgstr "S’applique à la prochaine ouverture de la page de connexion."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Browser icon"
msgstr "Icône du navigateur"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Login logo"
msgstr "Logo de connexion"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Invalid PNG image or dimensions."
msgstr "Image PNG ou dimensions non valides."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Another update is running. Please try again."
msgstr "Une autre mise à jour est en cours. Veuillez réessayer plus tard."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Unable to save custom branding."
msgstr "Impossible de sauvegarder les icônes personnalisées."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Upload PNG..."
msgstr "Téléverser un PNG…"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Restore default"
msgstr "Rétablir par défaut"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Custom branding"
msgstr "Icônes personnalisées"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "PNG images, 16–1024 pixels per side, up to 1 MiB. Browser icons must be square."
msgstr "Images PNG, 16–1024 pixels par côté, jusqu’à 1 MiB. Les icônes du navigateur doivent être carrées."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Upload for both..."
msgstr "Téléverser pour les deux…"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Changes apply immediately. Reload open pages to update their icons."
msgstr "Les modifications sont immédiates. Rechargez les pages ouvertes pour actualiser leurs icônes."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Unable to load custom branding. Update the theme and configuration packages."
msgstr "Impossible de charger les icônes personnalisées. Mettez à jour le thème et le paquet de configuration."
-258
View File
@@ -1,258 +0,0 @@
msgid ""
msgstr ""
"Project-Id-Version: luci-app-argon-config\n"
"PO-Revision-Date: 2026-10-08 00:00+0800\n"
"Last-Translator: Automatically generated\n"
"Language-Team: it\n"
"Language: it\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"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:112
msgid "0 transparent - 1 opaque (suggest: black translucent preset: 0.5)."
msgstr "0 trasparente - 1 opaco (consiglio: nero semitrasparente: 0.5)."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:88
msgid "0 transparent - 1 opaque (suggest: transparent: 0 or translucent preset: 0.5)."
msgstr "0 trasparente - 1 opaco (consiglio: trasparente: 0 o semitrasparente: 0.5)."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:101
msgid "A HEX Color (default: #483d8b)."
msgstr "Un colore HEX (predefinito: #483d8b)."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:77
msgid "A HEX color (default: #5e72e4)."
msgstr "Un colore HEX (predefinito: #5e72e4)."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:171
msgid "Action"
msgstr "Azione"
#: applications/luci-app-argon-config/root/usr/share/luci/menu.d/luci-app-argon-config.json:3
msgid "Argon Config"
msgstr "Configurazione di Argon"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:55
msgid "Argon theme configuration"
msgstr "Configurazione del tema Argon"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:197
msgid "Background file list"
msgstr "Elenco dei file di sfondo"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:64
msgid "Bing"
msgstr "Bing"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:63
msgid "Built-in"
msgstr "Integrato"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:73
msgid "Dark mode"
msgstr "Modalità scura"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:192
msgid "Delete"
msgstr "Elimina"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:83
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:107
msgid "Expecting: %s"
msgstr "Valore atteso: %s"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:187
msgid "Failed to delete file: %s."
msgstr "Impossibile eliminare il file: %s."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:46
msgid "Failed to list background files: %s."
msgstr "Impossibile elencare i file di sfondo: %s."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:42
msgid "Failed to read available space: %s."
msgstr "Impossibile determinare lo spazio disponibile: %s."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:153
msgid "Failed to upload file: %s."
msgstr "Impossibile caricare il file: %s."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:168
msgid "Filename"
msgstr "Nome del file"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:142
msgid "Files will be uploaded to <code>%s</code>."
msgstr "I file verranno caricati in <code>%s</code>."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:71
msgid "Follow system"
msgstr "Segui il sistema"
#: applications/luci-app-argon-config/root/usr/share/rpcd/acl.d/luci-app-argon-config.json:3
msgid "Grant UCI access for luci-app-argon-config"
msgstr "Concedi l’accesso UCI a luci-app-argon-config"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:56
msgid "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."
msgstr "Qui puoi impostare la sfocatura e la trasparenza della pagina di accesso del tema Argon e gestire le immagini e i video di sfondo. Si consiglia Chrome."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:95
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:119
msgid "Larger value will more blurred (suggest: clear: 1 or blur preset: 10)."
msgstr "Un valore maggiore aumenta la sfocatura (consiglio: nitido: 1 o sfocato: 10)."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:72
msgid "Light mode"
msgstr "Modalità chiara"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:169
msgid "Modified date"
msgstr "Data di modifica"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:194
msgid "No files found."
msgstr "Nessun file trovato."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:126
msgid "Save current settings"
msgstr "Salva le impostazioni attuali"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:124
msgid "Save settings"
msgstr "Salva le impostazioni"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:170
msgid "Size"
msgstr "Dimensione"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:58
msgid "Theme configuration"
msgstr "Configurazione del tema"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:70
msgid "Theme mode"
msgstr "Modalità del tema"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:65
msgid "Unsplash"
msgstr "Unsplash"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:141
msgid "Upload background"
msgstr "Carica uno sfondo"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:135
msgid "Upload background (available space: %1024.2mB)"
msgstr "Carica uno sfondo (spazio disponibile: %1024.2mB)"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:144
msgid "Upload..."
msgstr "Carica..."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:66
msgid "Wallhaven"
msgstr "Wallhaven"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:62
msgid "Wallpaper source"
msgstr "Fonte dello sfondo"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:137
msgid "You can upload files such as gif/jpg/mp4/png/webm/webp files, to change the login page background."
msgstr "Puoi caricare file gif/jpg/mp4/png/webm/webp per cambiare lo sfondo della pagina di accesso."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:118
msgid "[Dark mode] Frosted Glass Radius"
msgstr "[Modalità scura] Raggio di sfocatura dell’effetto vetro smerigliato"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:100
msgid "[Dark mode] Primary Color"
msgstr "[Modalità scura] Colore principale"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:111
msgid "[Dark mode] Transparency"
msgstr "[Modalità scura] Trasparenza"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:94
msgid "[Light mode] Frosted Glass Radius"
msgstr "[Modalità chiara] Raggio di sfocatura dell’effetto vetro smerigliato"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:77
msgid "[Light mode] Primary Color"
msgstr "[Modalità chiara] Colore principale"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:87
msgid "[Light mode] Transparency"
msgstr "[Modalità chiara] Trasparenza"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:83
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:107
msgid "valid HEX color value"
msgstr "un valore di colore HEX valido"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js
msgid "Login page style"
msgstr "Stile della pagina di accesso"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js
msgid "Classic sidebar"
msgstr "Barra laterale classica"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js
msgid "Centered card"
msgstr "Scheda centrata"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js
msgid "Applies the next time you open the login page."
msgstr "Si applica alla prossima apertura della pagina di accesso."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Browser icon"
msgstr "Icona del browser"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Login logo"
msgstr "Logo di accesso"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Invalid PNG image or dimensions."
msgstr "Immagine PNG o dimensioni non valide."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Another update is running. Please try again."
msgstr "Un altro aggiornamento è in corso. Riprova più tardi."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Unable to save custom branding."
msgstr "Impossibile salvare le icone personalizzate."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Upload PNG..."
msgstr "Carica PNG…"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Restore default"
msgstr "Ripristina predefinito"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Custom branding"
msgstr "Icone personalizzate"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "PNG images, 16–1024 pixels per side, up to 1 MiB. Browser icons must be square."
msgstr "Immagini PNG, 16–1024 pixel per lato, fino a 1 MiB. Le icone del browser devono essere quadrate."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Upload for both..."
msgstr "Carica per entrambi…"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Changes apply immediately. Reload open pages to update their icons."
msgstr "Le modifiche si applicano subito. Ricarica le pagine aperte per aggiornare le icone."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Unable to load custom branding. Update the theme and configuration packages."
msgstr "Impossibile caricare le icone personalizzate. Aggiorna il tema e il pacchetto di configurazione."
-258
View File
@@ -1,258 +0,0 @@
msgid ""
msgstr ""
"Project-Id-Version: luci-app-argon-config\n"
"PO-Revision-Date: 2026-10-08 00:00+0800\n"
"Last-Translator: Automatically generated\n"
"Language-Team: ja\n"
"Language: ja\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:112
msgid "0 transparent - 1 opaque (suggest: black translucent preset: 0.5)."
msgstr "0 は透明、1 は不透明です(推奨:黒の半透明は 0.5)。"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:88
msgid "0 transparent - 1 opaque (suggest: transparent: 0 or translucent preset: 0.5)."
msgstr "0 は透明、1 は不透明です(推奨:透明は 0、半透明は 0.5)。"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:101
msgid "A HEX Color (default: #483d8b)."
msgstr "16 進数のカラーコード(既定値:#483d8b)。"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:77
msgid "A HEX color (default: #5e72e4)."
msgstr "16 進数のカラーコード(既定値:#5e72e4)。"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:171
msgid "Action"
msgstr "操作"
#: applications/luci-app-argon-config/root/usr/share/luci/menu.d/luci-app-argon-config.json:3
msgid "Argon Config"
msgstr "Argon 設定"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:55
msgid "Argon theme configuration"
msgstr "Argon テーマ設定"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:197
msgid "Background file list"
msgstr "背景ファイル一覧"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:64
msgid "Bing"
msgstr "Bing"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:63
msgid "Built-in"
msgstr "内蔵"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:73
msgid "Dark mode"
msgstr "ダークモード"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:192
msgid "Delete"
msgstr "削除"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:83
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:107
msgid "Expecting: %s"
msgstr "必要な値:%s"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:187
msgid "Failed to delete file: %s."
msgstr "ファイルを削除できませんでした:%s。"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:46
msgid "Failed to list background files: %s."
msgstr "背景ファイルの一覧を取得できませんでした:%s。"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:42
msgid "Failed to read available space: %s."
msgstr "空き容量を取得できませんでした:%s。"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:153
msgid "Failed to upload file: %s."
msgstr "ファイルをアップロードできませんでした:%s。"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:168
msgid "Filename"
msgstr "ファイル名"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:142
msgid "Files will be uploaded to <code>%s</code>."
msgstr "ファイルは <code>%s</code> にアップロードされます。"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:71
msgid "Follow system"
msgstr "システム設定に従う"
#: applications/luci-app-argon-config/root/usr/share/rpcd/acl.d/luci-app-argon-config.json:3
msgid "Grant UCI access for luci-app-argon-config"
msgstr "luci-app-argon-config に UCI へのアクセスを許可"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:56
msgid "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."
msgstr "Argon テーマのログインページのぼかしと透明度を設定し、背景画像や動画を管理できます。Chrome の使用を推奨します。"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:95
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:119
msgid "Larger value will more blurred (suggest: clear: 1 or blur preset: 10)."
msgstr "値が大きいほどぼかしが強くなります(推奨:鮮明にする場合は 1、ぼかす場合は 10)。"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:72
msgid "Light mode"
msgstr "ライトモード"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:169
msgid "Modified date"
msgstr "更新日時"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:194
msgid "No files found."
msgstr "ファイルが見つかりません。"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:126
msgid "Save current settings"
msgstr "現在の設定を保存"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:124
msgid "Save settings"
msgstr "設定を保存"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:170
msgid "Size"
msgstr "サイズ"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:58
msgid "Theme configuration"
msgstr "テーマ設定"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:70
msgid "Theme mode"
msgstr "テーマモード"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:65
msgid "Unsplash"
msgstr "Unsplash"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:141
msgid "Upload background"
msgstr "背景をアップロード"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:135
msgid "Upload background (available space: %1024.2mB)"
msgstr "背景をアップロード(空き容量:%1024.2mB)"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:144
msgid "Upload..."
msgstr "アップロード..."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:66
msgid "Wallhaven"
msgstr "Wallhaven"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:62
msgid "Wallpaper source"
msgstr "壁紙の取得元"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:137
msgid "You can upload files such as gif/jpg/mp4/png/webm/webp files, to change the login page background."
msgstr "gif/jpg/mp4/png/webm/webp 形式のファイルをアップロードして、ログインページの背景を変更できます。"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:118
msgid "[Dark mode] Frosted Glass Radius"
msgstr "[ダークモード] すりガラス効果のぼかし半径"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:100
msgid "[Dark mode] Primary Color"
msgstr "[ダークモード] メインカラー"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:111
msgid "[Dark mode] Transparency"
msgstr "[ダークモード] 透明度"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:94
msgid "[Light mode] Frosted Glass Radius"
msgstr "[ライトモード] すりガラス効果のぼかし半径"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:77
msgid "[Light mode] Primary Color"
msgstr "[ライトモード] メインカラー"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:87
msgid "[Light mode] Transparency"
msgstr "[ライトモード] 透明度"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:83
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:107
msgid "valid HEX color value"
msgstr "有効な 16 進数のカラーコード"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js
msgid "Login page style"
msgstr "ログインページのスタイル"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js
msgid "Classic sidebar"
msgstr "クラシックサイドバー"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js
msgid "Centered card"
msgstr "中央カード"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js
msgid "Applies the next time you open the login page."
msgstr "次にログインページを開いたときに適用されます。"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Browser icon"
msgstr "ブラウザーアイコン"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Login logo"
msgstr "ログインロゴ"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Invalid PNG image or dimensions."
msgstr "PNG 画像またはサイズが無効です。"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Another update is running. Please try again."
msgstr "別の更新が進行中です。後でもう一度お試しください。"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Unable to save custom branding."
msgstr "カスタムアイコンを保存できません。"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Upload PNG..."
msgstr "PNG をアップロード…"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Restore default"
msgstr "既定値に戻す"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Custom branding"
msgstr "カスタムアイコン"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "PNG images, 16–1024 pixels per side, up to 1 MiB. Browser icons must be square."
msgstr "PNG 画像、各辺 16–1024 ピクセル、最大 1 MiB。ブラウザーアイコンは正方形にしてください。"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Upload for both..."
msgstr "両方にアップロード…"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Changes apply immediately. Reload open pages to update their icons."
msgstr "変更はすぐに適用されます。開いているページを再読み込みしてアイコンを更新してください。"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Unable to load custom branding. Update the theme and configuration packages."
msgstr "カスタムアイコンを読み込めません。テーマと設定パッケージを更新してください。"
-258
View File
@@ -1,258 +0,0 @@
msgid ""
msgstr ""
"Project-Id-Version: luci-app-argon-config\n"
"PO-Revision-Date: 2026-10-08 00:00+0800\n"
"Last-Translator: Automatically generated\n"
"Language-Team: ko\n"
"Language: ko\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:112
msgid "0 transparent - 1 opaque (suggest: black translucent preset: 0.5)."
msgstr "0은 투명, 1은 불투명입니다(권장: 검은색 반투명은 0.5)."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:88
msgid "0 transparent - 1 opaque (suggest: transparent: 0 or translucent preset: 0.5)."
msgstr "0은 투명, 1은 불투명입니다(권장: 투명은 0, 반투명은 0.5)."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:101
msgid "A HEX Color (default: #483d8b)."
msgstr "16진수 색상 코드(기본값: #483d8b)."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:77
msgid "A HEX color (default: #5e72e4)."
msgstr "16진수 색상 코드(기본값: #5e72e4)."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:171
msgid "Action"
msgstr "작업"
#: applications/luci-app-argon-config/root/usr/share/luci/menu.d/luci-app-argon-config.json:3
msgid "Argon Config"
msgstr "Argon 설정"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:55
msgid "Argon theme configuration"
msgstr "Argon 테마 설정"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:197
msgid "Background file list"
msgstr "배경 파일 목록"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:64
msgid "Bing"
msgstr "Bing"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:63
msgid "Built-in"
msgstr "내장"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:73
msgid "Dark mode"
msgstr "다크 모드"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:192
msgid "Delete"
msgstr "삭제"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:83
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:107
msgid "Expecting: %s"
msgstr "필요한 값: %s"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:187
msgid "Failed to delete file: %s."
msgstr "파일을 삭제하지 못했습니다: %s."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:46
msgid "Failed to list background files: %s."
msgstr "배경 파일 목록을 불러오지 못했습니다: %s."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:42
msgid "Failed to read available space: %s."
msgstr "사용 가능한 공간을 확인하지 못했습니다: %s."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:153
msgid "Failed to upload file: %s."
msgstr "파일을 업로드하지 못했습니다: %s."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:168
msgid "Filename"
msgstr "파일 이름"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:142
msgid "Files will be uploaded to <code>%s</code>."
msgstr "파일은 <code>%s</code>에 업로드됩니다."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:71
msgid "Follow system"
msgstr "시스템 설정 따르기"
#: applications/luci-app-argon-config/root/usr/share/rpcd/acl.d/luci-app-argon-config.json:3
msgid "Grant UCI access for luci-app-argon-config"
msgstr "luci-app-argon-config에 UCI 접근 권한 부여"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:56
msgid "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."
msgstr "Argon 테마 로그인 페이지의 흐림 효과와 투명도를 설정하고 배경 이미지와 동영상을 관리할 수 있습니다. Chrome 사용을 권장합니다."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:95
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:119
msgid "Larger value will more blurred (suggest: clear: 1 or blur preset: 10)."
msgstr "값이 클수록 더 흐려집니다(권장: 선명하게는 1, 흐리게는 10)."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:72
msgid "Light mode"
msgstr "라이트 모드"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:169
msgid "Modified date"
msgstr "수정 날짜"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:194
msgid "No files found."
msgstr "파일이 없습니다."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:126
msgid "Save current settings"
msgstr "현재 설정 저장"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:124
msgid "Save settings"
msgstr "설정 저장"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:170
msgid "Size"
msgstr "크기"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:58
msgid "Theme configuration"
msgstr "테마 설정"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:70
msgid "Theme mode"
msgstr "테마 모드"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:65
msgid "Unsplash"
msgstr "Unsplash"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:141
msgid "Upload background"
msgstr "배경 업로드"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:135
msgid "Upload background (available space: %1024.2mB)"
msgstr "배경 업로드(사용 가능한 공간: %1024.2mB)"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:144
msgid "Upload..."
msgstr "업로드..."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:66
msgid "Wallhaven"
msgstr "Wallhaven"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:62
msgid "Wallpaper source"
msgstr "배경 화면 소스"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:137
msgid "You can upload files such as gif/jpg/mp4/png/webm/webp files, to change the login page background."
msgstr "gif/jpg/mp4/png/webm/webp 형식의 파일을 업로드하여 로그인 페이지의 배경을 변경할 수 있습니다."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:118
msgid "[Dark mode] Frosted Glass Radius"
msgstr "[다크 모드] 반투명 유리 효과의 흐림 반경"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:100
msgid "[Dark mode] Primary Color"
msgstr "[다크 모드] 기본 색상"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:111
msgid "[Dark mode] Transparency"
msgstr "[다크 모드] 투명도"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:94
msgid "[Light mode] Frosted Glass Radius"
msgstr "[라이트 모드] 반투명 유리 효과의 흐림 반경"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:77
msgid "[Light mode] Primary Color"
msgstr "[라이트 모드] 기본 색상"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:87
msgid "[Light mode] Transparency"
msgstr "[라이트 모드] 투명도"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:83
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:107
msgid "valid HEX color value"
msgstr "유효한 16진수 색상 값"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js
msgid "Login page style"
msgstr "로그인 페이지 스타일"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js
msgid "Classic sidebar"
msgstr "클래식 사이드바"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js
msgid "Centered card"
msgstr "가운데 카드"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js
msgid "Applies the next time you open the login page."
msgstr "다음에 로그인 페이지를 열 때 적용됩니다."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Browser icon"
msgstr "브라우저 아이콘"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Login logo"
msgstr "로그인 로고"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Invalid PNG image or dimensions."
msgstr "PNG 이미지 또는 크기가 올바르지 않습니다."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Another update is running. Please try again."
msgstr "다른 업데이트가 진행 중입니다. 나중에 다시 시도하세요."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Unable to save custom branding."
msgstr "사용자 지정 아이콘을 저장할 수 없습니다."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Upload PNG..."
msgstr "PNG 업로드…"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Restore default"
msgstr "기본값 복원"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Custom branding"
msgstr "사용자 지정 아이콘"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "PNG images, 16–1024 pixels per side, up to 1 MiB. Browser icons must be square."
msgstr "PNG 이미지, 각 변 16–1024픽셀, 최대 1 MiB. 브라우저 아이콘은 정사각형이어야 합니다."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Upload for both..."
msgstr "두 곳 모두에 업로드…"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Changes apply immediately. Reload open pages to update their icons."
msgstr "변경 사항은 즉시 적용됩니다. 열려 있는 페이지를 새로 고쳐 아이콘을 업데이트하세요."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Unable to load custom branding. Update the theme and configuration packages."
msgstr "사용자 지정 아이콘을 불러올 수 없습니다. 테마와 설정 패키지를 업데이트하세요."
-258
View File
@@ -1,258 +0,0 @@
msgid ""
msgstr ""
"Project-Id-Version: luci-app-argon-config\n"
"PO-Revision-Date: 2026-10-08 00:00+0800\n"
"Last-Translator: Automatically generated\n"
"Language-Team: nl\n"
"Language: nl\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"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:112
msgid "0 transparent - 1 opaque (suggest: black translucent preset: 0.5)."
msgstr "0 transparant - 1 ondoorzichtig (aanbevolen: halfdoorzichtig zwart: 0.5)."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:88
msgid "0 transparent - 1 opaque (suggest: transparent: 0 or translucent preset: 0.5)."
msgstr "0 transparant - 1 ondoorzichtig (aanbevolen: transparant: 0 of halfdoorzichtig: 0.5)."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:101
msgid "A HEX Color (default: #483d8b)."
msgstr "Een HEX-kleur (standaard: #483d8b)."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:77
msgid "A HEX color (default: #5e72e4)."
msgstr "Een HEX-kleur (standaard: #5e72e4)."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:171
msgid "Action"
msgstr "Actie"
#: applications/luci-app-argon-config/root/usr/share/luci/menu.d/luci-app-argon-config.json:3
msgid "Argon Config"
msgstr "Argon-instellingen"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:55
msgid "Argon theme configuration"
msgstr "Instellingen van het Argon-thema"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:197
msgid "Background file list"
msgstr "Lijst met achtergrondbestanden"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:64
msgid "Bing"
msgstr "Bing"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:63
msgid "Built-in"
msgstr "Ingebouwd"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:73
msgid "Dark mode"
msgstr "Donkere modus"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:192
msgid "Delete"
msgstr "Verwijderen"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:83
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:107
msgid "Expecting: %s"
msgstr "Verwacht: %s"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:187
msgid "Failed to delete file: %s."
msgstr "Kan bestand niet verwijderen: %s."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:46
msgid "Failed to list background files: %s."
msgstr "Kan achtergrondbestanden niet weergeven: %s."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:42
msgid "Failed to read available space: %s."
msgstr "Kan beschikbare ruimte niet bepalen: %s."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:153
msgid "Failed to upload file: %s."
msgstr "Kan bestand niet uploaden: %s."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:168
msgid "Filename"
msgstr "Bestandsnaam"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:142
msgid "Files will be uploaded to <code>%s</code>."
msgstr "Bestanden worden geüpload naar <code>%s</code>."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:71
msgid "Follow system"
msgstr "Systeeminstelling volgen"
#: applications/luci-app-argon-config/root/usr/share/rpcd/acl.d/luci-app-argon-config.json:3
msgid "Grant UCI access for luci-app-argon-config"
msgstr "UCI-toegang verlenen aan luci-app-argon-config"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:56
msgid "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."
msgstr "Hier kunt u de vervaging en transparantie van de aanmeldpagina van het Argon-thema instellen en achtergrondafbeeldingen en -video’s beheren. Chrome wordt aanbevolen."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:95
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:119
msgid "Larger value will more blurred (suggest: clear: 1 or blur preset: 10)."
msgstr "Een hogere waarde zorgt voor meer vervaging (aanbevolen: scherp: 1 of vervaagd: 10)."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:72
msgid "Light mode"
msgstr "Lichte modus"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:169
msgid "Modified date"
msgstr "Wijzigingsdatum"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:194
msgid "No files found."
msgstr "Geen bestanden gevonden."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:126
msgid "Save current settings"
msgstr "Huidige instellingen opslaan"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:124
msgid "Save settings"
msgstr "Instellingen opslaan"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:170
msgid "Size"
msgstr "Grootte"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:58
msgid "Theme configuration"
msgstr "Thema-instellingen"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:70
msgid "Theme mode"
msgstr "Themamodus"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:65
msgid "Unsplash"
msgstr "Unsplash"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:141
msgid "Upload background"
msgstr "Achtergrond uploaden"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:135
msgid "Upload background (available space: %1024.2mB)"
msgstr "Achtergrond uploaden (beschikbare ruimte: %1024.2mB)"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:144
msgid "Upload..."
msgstr "Uploaden..."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:66
msgid "Wallhaven"
msgstr "Wallhaven"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:62
msgid "Wallpaper source"
msgstr "Achtergrondbron"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:137
msgid "You can upload files such as gif/jpg/mp4/png/webm/webp files, to change the login page background."
msgstr "U kunt bestanden in de indelingen gif/jpg/mp4/png/webm/webp uploaden om de achtergrond van de aanmeldpagina te wijzigen."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:118
msgid "[Dark mode] Frosted Glass Radius"
msgstr "[Donkere modus] Vervagingsradius van het matglaseffect"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:100
msgid "[Dark mode] Primary Color"
msgstr "[Donkere modus] Primaire kleur"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:111
msgid "[Dark mode] Transparency"
msgstr "[Donkere modus] Transparantie"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:94
msgid "[Light mode] Frosted Glass Radius"
msgstr "[Lichte modus] Vervagingsradius van het matglaseffect"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:77
msgid "[Light mode] Primary Color"
msgstr "[Lichte modus] Primaire kleur"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:87
msgid "[Light mode] Transparency"
msgstr "[Lichte modus] Transparantie"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:83
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:107
msgid "valid HEX color value"
msgstr "een geldige HEX-kleurwaarde"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js
msgid "Login page style"
msgstr "Stijl van de aanmeldpagina"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js
msgid "Classic sidebar"
msgstr "Klassieke zijbalk"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js
msgid "Centered card"
msgstr "Gecentreerde kaart"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js
msgid "Applies the next time you open the login page."
msgstr "Wordt toegepast wanneer u de aanmeldpagina opnieuw opent."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Browser icon"
msgstr "Browserpictogram"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Login logo"
msgstr "Aanmeldlogo"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Invalid PNG image or dimensions."
msgstr "Ongeldige PNG-afbeelding of afmetingen."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Another update is running. Please try again."
msgstr "Er wordt al een update uitgevoerd. Probeer het later opnieuw."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Unable to save custom branding."
msgstr "Aangepaste pictogrammen kunnen niet worden opgeslagen."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Upload PNG..."
msgstr "PNG uploaden…"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Restore default"
msgstr "Standaard herstellen"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Custom branding"
msgstr "Aangepaste pictogrammen"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "PNG images, 16–1024 pixels per side, up to 1 MiB. Browser icons must be square."
msgstr "PNG-afbeeldingen, 16–1024 pixels per zijde, maximaal 1 MiB. Browserpictogrammen moeten vierkant zijn."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Upload for both..."
msgstr "Voor beide uploaden…"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Changes apply immediately. Reload open pages to update their icons."
msgstr "Wijzigingen worden direct toegepast. Herlaad geopende pagina’s om hun pictogrammen bij te werken."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Unable to load custom branding. Update the theme and configuration packages."
msgstr "Aangepaste pictogrammen kunnen niet worden geladen. Werk het thema en het configuratiepakket bij."
-257
View File
@@ -1,257 +0,0 @@
msgid ""
msgstr ""
"Project-Id-Version: luci-app-argon-config 1.0\n"
"PO-Revision-Date: \n"
"Last-Translator: \n"
"Language-Team: \n"
"Language: pl\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:112
msgid "0 transparent - 1 opaque (suggest: black translucent preset: 0.5)."
msgstr "0 przezroczysty - 1 nieprzezroczysty (sugerowane: czarny półprzezroczysty preset: 0.5)."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:88
msgid "0 transparent - 1 opaque (suggest: transparent: 0 or translucent preset: 0.5)."
msgstr "0 przezroczysty - 1 nieprzezroczysty (sugerowane: przezroczysty: 0 lub półprzezroczysty preset: 0.5)."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:101
msgid "A HEX Color (default: #483d8b)."
msgstr "Kolor zapisany za pomocą kodu HEX (domyślnie: #483d8b)."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:77
msgid "A HEX color (default: #5e72e4)."
msgstr "Kolor zapisany za pomocą kodu HEX (domyślnie: #5e72e4)."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:171
msgid "Action"
msgstr "Akcja"
#: applications/luci-app-argon-config/root/usr/share/luci/menu.d/luci-app-argon-config.json:3
msgid "Argon Config"
msgstr "Konfiguracja Argon"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:55
msgid "Argon theme configuration"
msgstr "Konfiguracja motywu Argon"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:197
msgid "Background file list"
msgstr "Lista plików tła"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:64
msgid "Bing"
msgstr "Bing"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:63
msgid "Built-in"
msgstr "Wbudowane"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:73
msgid "Dark mode"
msgstr "Ciemny motyw"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:192
msgid "Delete"
msgstr "Usuń"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:83
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:107
msgid "Expecting: %s"
msgstr "Spodziewano się: %s"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:187
msgid "Failed to delete file: %s."
msgstr "Nie udało się usunąć pliku: %s."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:46
msgid "Failed to list background files: %s."
msgstr "Nie udało się wyświetlić listy plików tła: %s."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:42
msgid "Failed to read available space: %s."
msgstr "Nie udało się odczytać dostępnego miejsca: %s."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:153
msgid "Failed to upload file: %s."
msgstr "Nie udało się przesłać pliku: %s."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:168
msgid "Filename"
msgstr "Nazwa pliku"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:142
msgid "Files will be uploaded to <code>%s</code>."
msgstr "Pliki zostaną przesłane do <code>%s</code>."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:71
msgid "Follow system"
msgstr "Użyj ustawień systemu"
#: applications/luci-app-argon-config/root/usr/share/rpcd/acl.d/luci-app-argon-config.json:3
msgid "Grant UCI access for luci-app-argon-config"
msgstr "Zezwól na dostęp UCI dla luci-app-argon-config"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:56
msgid "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."
msgstr "Tutaj możesz ustawić rozmycie i przezroczystość strony logowania motywu Argon, oraz zarządzać obrazami i filmami tła. Zalecana jest przeglądarka Chrome."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:95
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:119
msgid "Larger value will more blurred (suggest: clear: 1 or blur preset: 10)."
msgstr "Większa wartość oznacza mocniejsze rozmycie (sugerowane wartości: 1 – brak rozmycia, 10 – domyślny poziom rozmycia)."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:72
msgid "Light mode"
msgstr "Jasny motyw"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:169
msgid "Modified date"
msgstr "Data modyfikacji"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:194
msgid "No files found."
msgstr "Nie znaleziono plików."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:126
msgid "Save current settings"
msgstr "Zapisz bieżące ustawienia"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:124
msgid "Save settings"
msgstr "Zapisz ustawienia"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:170
msgid "Size"
msgstr "Rozmiar"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:58
msgid "Theme configuration"
msgstr "Konfiguracja motywu"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:70
msgid "Theme mode"
msgstr "Tryb motywu"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:65
msgid "Unsplash"
msgstr "Unsplash"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:141
msgid "Upload background"
msgstr "Prześlij tło"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:135
msgid "Upload background (available space: %1024.2mB)"
msgstr "Prześlij tło (dostępne miejsce: %1024.2mB)"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:144
msgid "Upload..."
msgstr "Prześlij..."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:66
msgid "Wallhaven"
msgstr "Wallhaven"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:62
msgid "Wallpaper source"
msgstr "Źródło tapety"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:137
msgid "You can upload files such as gif/jpg/mp4/png/webm/webp files, to change the login page background."
msgstr "Możesz przesłać pliki takie jak gif/jpg/mp4/png/webm/webp, aby zmienić tło strony logowania."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:118
msgid "[Dark mode] Frosted Glass Radius"
msgstr "[Ciemny motyw] Stopień rozmycia szkła"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:100
msgid "[Dark mode] Primary Color"
msgstr "[Ciemny motyw] Kolor podstawowy"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:111
msgid "[Dark mode] Transparency"
msgstr "[Ciemny motyw] Przezroczystość"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:94
msgid "[Light mode] Frosted Glass Radius"
msgstr "[Jasny motyw] Stopień rozmycia szkła"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:77
msgid "[Light mode] Primary Color"
msgstr "[Jasny motyw] Kolor podstawowy"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:87
msgid "[Light mode] Transparency"
msgstr "[Jasny motyw] Przezroczystość"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:83
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:107
msgid "valid HEX color value"
msgstr "prawidłowy kolor w formacie HEX"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js
msgid "Login page style"
msgstr "Styl strony logowania"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js
msgid "Classic sidebar"
msgstr "Klasyczny panel boczny"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js
msgid "Centered card"
msgstr "Wyśrodkowana karta"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js
msgid "Applies the next time you open the login page."
msgstr "Zmiana zostanie zastosowana przy następnym otwarciu strony logowania."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Browser icon"
msgstr "Ikona przeglądarki"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Login logo"
msgstr "Logo logowania"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Invalid PNG image or dimensions."
msgstr "Nieprawidłowy obraz PNG lub wymiary."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Another update is running. Please try again."
msgstr "Trwa inna aktualizacja. Spróbuj ponownie później."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Unable to save custom branding."
msgstr "Nie można zapisać niestandardowych ikon."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Upload PNG..."
msgstr "Prześlij PNG…"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Restore default"
msgstr "Przywróć domyślne"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Custom branding"
msgstr "Niestandardowe ikony"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "PNG images, 16–1024 pixels per side, up to 1 MiB. Browser icons must be square."
msgstr "Obrazy PNG, 16–1024 pikseli na bok, maksymalnie 1 MiB. Ikony przeglądarki muszą być kwadratowe."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Upload for both..."
msgstr "Prześlij dla obu…"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Changes apply immediately. Reload open pages to update their icons."
msgstr "Zmiany są stosowane natychmiast. Odśwież otwarte strony, aby zaktualizować ich ikony."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Unable to load custom branding. Update the theme and configuration packages."
msgstr "Nie można wczytać niestandardowych ikon. Zaktualizuj motyw i pakiet konfiguracji."
@@ -1,260 +0,0 @@
msgid ""
msgstr ""
"Project-Id-Version: \n"
"POT-Creation-Date: 2024-06-24 15:34-0300\n"
"PO-Revision-Date: 2024-06-24 15:35-0300\n"
"Last-Translator: Janderson Vieira Santos <jandersonvs79@gmail.com>\n"
"Language-Team: \n"
"Language: pt_BR\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: Poedit 3.0.1\n"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:112
msgid "0 transparent - 1 opaque (suggest: black translucent preset: 0.5)."
msgstr "0 transparente - 1 opaco (sugestão: preto translúcido: 0.5)."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:88
msgid "0 transparent - 1 opaque (suggest: transparent: 0 or translucent preset: 0.5)."
msgstr "0 transparente - 1 opaco (sugestão: transparente: 0 ou translúcido: 0.5)."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:101
msgid "A HEX Color (default: #483d8b)."
msgstr "Uma cor HEX (padrão: #483d8b)."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:77
msgid "A HEX color (default: #5e72e4)."
msgstr "Uma cor HEX (padrão: #5e72e4)."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:171
msgid "Action"
msgstr "Ação"
#: applications/luci-app-argon-config/root/usr/share/luci/menu.d/luci-app-argon-config.json:3
msgid "Argon Config"
msgstr "Configuração Argon"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:55
msgid "Argon theme configuration"
msgstr "Configuração do tema Argon"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:197
msgid "Background file list"
msgstr "Lista de arquivos de fundo"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:64
msgid "Bing"
msgstr "Bing"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:63
msgid "Built-in"
msgstr "Integrado"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:73
msgid "Dark mode"
msgstr "Modo escuro"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:192
msgid "Delete"
msgstr "Excluir"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:83
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:107
msgid "Expecting: %s"
msgstr "Esperado: %s"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:187
msgid "Failed to delete file: %s."
msgstr "Falha ao excluir o arquivo: %s."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:46
msgid "Failed to list background files: %s."
msgstr "Falha ao listar os arquivos de fundo: %s."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:42
msgid "Failed to read available space: %s."
msgstr "Falha ao consultar o espaço disponível: %s."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:153
msgid "Failed to upload file: %s."
msgstr "Falha ao enviar o arquivo: %s."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:168
msgid "Filename"
msgstr "Nome do arquivo"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:142
msgid "Files will be uploaded to <code>%s</code>."
msgstr "Os arquivos serão enviados para <code>%s</code>."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:71
msgid "Follow system"
msgstr "Seguir o sistema"
#: applications/luci-app-argon-config/root/usr/share/rpcd/acl.d/luci-app-argon-config.json:3
msgid "Grant UCI access for luci-app-argon-config"
msgstr "Conceder acesso UCI para luci-app-argon-config"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:56
msgid "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."
msgstr "Aqui você pode configurar o desfoque e a transparência da página de login do tema Argon e gerenciar as imagens e os vídeos de fundo. Recomenda-se o Chrome."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:95
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:119
msgid "Larger value will more blurred (suggest: clear: 1 or blur preset: 10)."
msgstr "Um valor maior aumenta o desfoque (sugestão: nítido: 1 ou desfocado: 10)."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:72
msgid "Light mode"
msgstr "Modo claro"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:169
msgid "Modified date"
msgstr "Data de modificação"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:194
msgid "No files found."
msgstr "Nenhum arquivo encontrado."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:126
msgid "Save current settings"
msgstr "Salvar configurações atuais"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:124
msgid "Save settings"
msgstr "Salvar configurações"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:170
msgid "Size"
msgstr "Tamanho"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:58
msgid "Theme configuration"
msgstr "Configuração do tema"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:70
msgid "Theme mode"
msgstr "Modo do tema"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:65
msgid "Unsplash"
msgstr "Unsplash"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:141
msgid "Upload background"
msgstr "Enviar fundo"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:135
msgid "Upload background (available space: %1024.2mB)"
msgstr "Enviar fundo (espaço disponível: %1024.2mB)"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:144
msgid "Upload..."
msgstr "Enviar..."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:66
msgid "Wallhaven"
msgstr "Wallhaven"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:62
msgid "Wallpaper source"
msgstr "Fonte do papel de parede"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:137
msgid "You can upload files such as gif/jpg/mp4/png/webm/webp files, to change the login page background."
msgstr "Você pode enviar arquivos gif/jpg/mp4/png/webm/webp para alterar o fundo da página de login."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:118
msgid "[Dark mode] Frosted Glass Radius"
msgstr "[Modo escuro] Raio de vidro fosco"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:100
msgid "[Dark mode] Primary Color"
msgstr "[Modo escuro] Cor primária"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:111
msgid "[Dark mode] Transparency"
msgstr "[Modo escuro] Transparência"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:94
msgid "[Light mode] Frosted Glass Radius"
msgstr "[Modo claro] Raio de vidro fosco"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:77
msgid "[Light mode] Primary Color"
msgstr "[Modo claro] Cor primária"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:87
msgid "[Light mode] Transparency"
msgstr "[Modo claro] Transparência"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:83
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:107
msgid "valid HEX color value"
msgstr "um valor de cor HEX válido"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js
msgid "Login page style"
msgstr "Estilo da página de login"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js
msgid "Classic sidebar"
msgstr "Barra lateral clássica"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js
msgid "Centered card"
msgstr "Cartão centralizado"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js
msgid "Applies the next time you open the login page."
msgstr "Aplicado na próxima vez que você abrir a página de login."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Browser icon"
msgstr "Ícone do navegador"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Login logo"
msgstr "Logotipo de login"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Invalid PNG image or dimensions."
msgstr "Imagem PNG ou dimensões inválidas."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Another update is running. Please try again."
msgstr "Outra atualização está em andamento. Tente novamente mais tarde."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Unable to save custom branding."
msgstr "Não foi possível salvar os ícones personalizados."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Upload PNG..."
msgstr "Enviar PNG…"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Restore default"
msgstr "Restaurar padrão"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Custom branding"
msgstr "Ícones personalizados"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "PNG images, 16–1024 pixels per side, up to 1 MiB. Browser icons must be square."
msgstr "Imagens PNG, 16–1024 pixels por lado, até 1 MiB. Os ícones do navegador devem ser quadrados."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Upload for both..."
msgstr "Enviar para ambos…"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Changes apply immediately. Reload open pages to update their icons."
msgstr "As alterações são aplicadas imediatamente. Recarregue as páginas abertas para atualizar seus ícones."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Unable to load custom branding. Update the theme and configuration packages."
msgstr "Não foi possível carregar os ícones personalizados. Atualize o tema e o pacote de configuração."
-257
View File
@@ -1,257 +0,0 @@
msgid ""
msgstr ""
"Project-Id-Version: luci-app-argon-config 1.0\n"
"PO-Revision-Date: \n"
"Last-Translator: \n"
"Language-Team: \n"
"Language: ru\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:112
msgid "0 transparent - 1 opaque (suggest: black translucent preset: 0.5)."
msgstr "0 — прозрачно, 1 — непрозрачно (рекомендуется: чёрный полупрозрачный, предустановка: 0.5)."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:88
msgid "0 transparent - 1 opaque (suggest: transparent: 0 or translucent preset: 0.5)."
msgstr "0 — прозрачно, 1 — непрозрачно (рекомендуется: прозрачный 0 или полупрозрачный, предустановка: 0.5)."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:101
msgid "A HEX Color (default: #483d8b)."
msgstr "HEX-цвет (родной: #483d8b)."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:77
msgid "A HEX color (default: #5e72e4)."
msgstr "HEX-цвет (родной: #5e72e4)."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:171
msgid "Action"
msgstr "Действие"
#: applications/luci-app-argon-config/root/usr/share/luci/menu.d/luci-app-argon-config.json:3
msgid "Argon Config"
msgstr "тема Argon"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:55
msgid "Argon theme configuration"
msgstr "Конфигурация темы Argon"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:197
msgid "Background file list"
msgstr "Список файлов фона"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:64
msgid "Bing"
msgstr "Bing"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:63
msgid "Built-in"
msgstr "Встроенные"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:73
msgid "Dark mode"
msgstr "Тёмная тема"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:192
msgid "Delete"
msgstr "Удалить"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:83
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:107
msgid "Expecting: %s"
msgstr "Ожидалось: %s"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:187
msgid "Failed to delete file: %s."
msgstr "Не удалось удалить файл: %s."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:46
msgid "Failed to list background files: %s."
msgstr "Не удалось получить список файлов фона: %s."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:42
msgid "Failed to read available space: %s."
msgstr "Не удалось определить свободное место: %s."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:153
msgid "Failed to upload file: %s."
msgstr "Не удалось загрузить файл: %s."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:168
msgid "Filename"
msgstr "Имя файла"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:142
msgid "Files will be uploaded to <code>%s</code>."
msgstr "Файлы будут загружены в <code>%s</code>."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:71
msgid "Follow system"
msgstr "Как в системе"
#: applications/luci-app-argon-config/root/usr/share/rpcd/acl.d/luci-app-argon-config.json:3
msgid "Grant UCI access for luci-app-argon-config"
msgstr "Предоставить доступ к UCI для luci-app-argon-config"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:56
msgid "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."
msgstr "Здесь можно настроить размытие и прозрачность страницы логина темы Argon, управлять фоновыми изображениями и видео. Рекомендуется использовать Chrome."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:95
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:119
msgid "Larger value will more blurred (suggest: clear: 1 or blur preset: 10)."
msgstr "Выше цифра, сильнее размыто (от чёткого: 1 к размытому: 10)."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:72
msgid "Light mode"
msgstr "Светлая тема"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:169
msgid "Modified date"
msgstr "Дата изменения"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:194
msgid "No files found."
msgstr "Файлы не найдены."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:126
msgid "Save current settings"
msgstr "Сохранить текущие настройки"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:124
msgid "Save settings"
msgstr "Сохранить настройки"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:170
msgid "Size"
msgstr "Размер"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:58
msgid "Theme configuration"
msgstr "Конфигурация темы"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:70
msgid "Theme mode"
msgstr "Режим темы"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:65
msgid "Unsplash"
msgstr "Unsplash"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:141
msgid "Upload background"
msgstr "Загрузить фон"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:135
msgid "Upload background (available space: %1024.2mB)"
msgstr "Загрузить фон (доступно: %1024.2mB)"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:144
msgid "Upload..."
msgstr "Загрузить..."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:66
msgid "Wallhaven"
msgstr "Wallhaven"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:62
msgid "Wallpaper source"
msgstr "Обои"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:137
msgid "You can upload files such as gif/jpg/mp4/png/webm/webp files, to change the login page background."
msgstr "Вы можете загрузить файлы gif/jpg/mp4/png/webm/webp, чтобы изменить фон страницы входа."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:118
msgid "[Dark mode] Frosted Glass Radius"
msgstr "[Тёмная тема] Радиус матового стекла"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:100
msgid "[Dark mode] Primary Color"
msgstr "[Тёмная тема] Основной цвет"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:111
msgid "[Dark mode] Transparency"
msgstr "[Тёмная тема] Прозрачность"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:94
msgid "[Light mode] Frosted Glass Radius"
msgstr "[Светлая тема] Радиус матового стекла"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:77
msgid "[Light mode] Primary Color"
msgstr "[Светлая тема] Основной цвет"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:87
msgid "[Light mode] Transparency"
msgstr "[Светлая тема] Прозрачность"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:83
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:107
msgid "valid HEX color value"
msgstr "корректное значение HEX-цвета"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js
msgid "Login page style"
msgstr "Стиль страницы входа"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js
msgid "Classic sidebar"
msgstr "Классическая боковая панель"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js
msgid "Centered card"
msgstr "Карточка по центру"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js
msgid "Applies the next time you open the login page."
msgstr "Применяется при следующем открытии страницы входа."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Browser icon"
msgstr "Значок браузера"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Login logo"
msgstr "Логотип входа"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Invalid PNG image or dimensions."
msgstr "Недопустимое изображение PNG или размеры."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Another update is running. Please try again."
msgstr "Выполняется другое обновление. Повторите попытку позже."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Unable to save custom branding."
msgstr "Не удалось сохранить пользовательские значки."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Upload PNG..."
msgstr "Загрузить PNG…"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Restore default"
msgstr "Восстановить по умолчанию"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Custom branding"
msgstr "Пользовательские значки"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "PNG images, 16–1024 pixels per side, up to 1 MiB. Browser icons must be square."
msgstr "Изображения PNG, 16–1024 пикселей на сторону, до 1 MiB. Значки браузера должны быть квадратными."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Upload for both..."
msgstr "Загрузить для обоих…"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Changes apply immediately. Reload open pages to update their icons."
msgstr "Изменения применяются сразу. Перезагрузите открытые страницы, чтобы обновить их значки."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Unable to load custom branding. Update the theme and configuration packages."
msgstr "Не удалось загрузить пользовательские значки. Обновите тему и пакет настроек."
@@ -1,24 +1,29 @@
msgid ""
msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
msgstr "Content-Type: text/plain; charset=UTF-8"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:112
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:136
msgid "0 transparent - 1 opaque (suggest: black translucent preset: 0.5)."
msgstr ""
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:88
msgid "0 transparent - 1 opaque (suggest: transparent: 0 or translucent preset: 0.5)."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:112
msgid ""
"0 transparent - 1 opaque (suggest: transparent: 0 or translucent preset: "
"0.5)."
msgstr ""
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:101
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:125
msgid "A HEX Color (default: #483d8b)."
msgstr ""
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:77
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:101
msgid "A HEX color (default: #5e72e4)."
msgstr ""
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:171
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:86
msgid "API key"
msgstr ""
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:189
msgid "Action"
msgstr ""
@@ -26,225 +31,177 @@ msgstr ""
msgid "Argon Config"
msgstr ""
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:55
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:45
msgid "Argon theme configuration"
msgstr ""
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:197
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:209
msgid "Background file list"
msgstr ""
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:64
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:54
msgid "Bing"
msgstr ""
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:63
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:53
msgid "Built-in"
msgstr ""
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:73
msgid "Collection ID"
msgstr ""
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:73
msgid "Collection ID for Unsplash or Wallhaven."
msgstr ""
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:97
msgid "Dark mode"
msgstr ""
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:192
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:204
msgid "Delete"
msgstr ""
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:83
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:107
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:131
msgid "Expecting: %s"
msgstr ""
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:187
msgid "Failed to delete file: %s."
msgstr ""
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:46
msgid "Failed to list background files: %s."
msgstr ""
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:42
msgid "Failed to read available space: %s."
msgstr ""
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:153
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:173
msgid "Failed to upload file: %s."
msgstr ""
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:168
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:186
msgid "Filename"
msgstr ""
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:142
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:163
msgid "Files will be uploaded to <code>%s</code>."
msgstr ""
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:71
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:95
msgid "Follow system"
msgstr ""
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:55
msgid "GHSer"
msgstr ""
#: applications/luci-app-argon-config/root/usr/share/rpcd/acl.d/luci-app-argon-config.json:3
msgid "Grant UCI access for luci-app-argon-config"
msgstr ""
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:56
msgid "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."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:46
msgid ""
"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."
msgstr ""
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:95
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:119
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:143
msgid "Larger value will more blurred (suggest: clear: 1 or blur preset: 10)."
msgstr ""
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:72
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:96
msgid "Light mode"
msgstr ""
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:169
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:187
msgid "Modified date"
msgstr ""
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:194
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:206
msgid "No files found."
msgstr ""
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:126
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:150
msgid "Save current settings"
msgstr ""
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:124
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:148
msgid "Save settings"
msgstr ""
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:170
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:188
msgid "Size"
msgstr ""
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:58
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:86
msgid "Specify API key for Unsplash or Wallhaven."
msgstr ""
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:48
msgid "Theme configuration"
msgstr ""
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:70
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:94
msgid "Theme mode"
msgstr ""
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:65
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:56
msgid "Unsplash"
msgstr ""
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:141
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:162
msgid "Upload background"
msgstr ""
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:135
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:156
msgid "Upload background (available space: %1024.2mB)"
msgstr ""
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:144
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:165
msgid "Upload..."
msgstr ""
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:66
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:90
msgid "Use exact resolution"
msgstr ""
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:90
msgid "Use exact resolution or at least 1080P for Wallhaven."
msgstr ""
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:57
msgid "Wallhaven"
msgstr ""
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:62
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:52
msgid "Wallpaper source"
msgstr ""
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:137
msgid "You can upload files such as gif/jpg/mp4/png/webm/webp files, to change the login page background."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:158
msgid ""
"You can upload files such as gif/jpg/mp4/png/webm/webp files, to change the "
"login page background."
msgstr ""
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:118
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:142
msgid "[Dark mode] Frosted Glass Radius"
msgstr ""
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:100
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:124
msgid "[Dark mode] Primary Color"
msgstr ""
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:111
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:135
msgid "[Dark mode] Transparency"
msgstr ""
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:94
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:118
msgid "[Light mode] Frosted Glass Radius"
msgstr ""
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:77
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:101
msgid "[Light mode] Primary Color"
msgstr ""
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:87
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:111
msgid "[Light mode] Transparency"
msgstr ""
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:83
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:107
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:131
msgid "valid HEX color value"
msgstr ""
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js
msgid "Login page style"
msgstr ""
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js
msgid "Classic sidebar"
msgstr ""
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js
msgid "Centered card"
msgstr ""
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js
msgid "Applies the next time you open the login page."
msgstr ""
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Browser icon"
msgstr ""
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Login logo"
msgstr ""
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Invalid PNG image or dimensions."
msgstr ""
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Another update is running. Please try again."
msgstr ""
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Unable to save custom branding."
msgstr ""
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Upload PNG..."
msgstr ""
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Restore default"
msgstr ""
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Custom branding"
msgstr ""
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "PNG images, 16–1024 pixels per side, up to 1 MiB. Browser icons must be square."
msgstr ""
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Upload for both..."
msgstr ""
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Changes apply immediately. Reload open pages to update their icons."
msgstr ""
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Unable to load custom branding. Update the theme and configuration packages."
msgstr ""
-258
View File
@@ -1,258 +0,0 @@
msgid ""
msgstr ""
"Project-Id-Version: luci-app-argon-config\n"
"PO-Revision-Date: 2026-10-08 00:00+0800\n"
"Last-Translator: Automatically generated\n"
"Language-Team: tr\n"
"Language: tr\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"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:112
msgid "0 transparent - 1 opaque (suggest: black translucent preset: 0.5)."
msgstr "0 saydam - 1 opak (öneri: yarı saydam siyah: 0.5)."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:88
msgid "0 transparent - 1 opaque (suggest: transparent: 0 or translucent preset: 0.5)."
msgstr "0 saydam - 1 opak (öneri: saydam: 0 veya yarı saydam: 0.5)."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:101
msgid "A HEX Color (default: #483d8b)."
msgstr "HEX renk kodu (varsayılan: #483d8b)."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:77
msgid "A HEX color (default: #5e72e4)."
msgstr "HEX renk kodu (varsayılan: #5e72e4)."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:171
msgid "Action"
msgstr "İşlem"
#: applications/luci-app-argon-config/root/usr/share/luci/menu.d/luci-app-argon-config.json:3
msgid "Argon Config"
msgstr "Argon Ayarları"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:55
msgid "Argon theme configuration"
msgstr "Argon teması ayarları"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:197
msgid "Background file list"
msgstr "Arka plan dosyaları listesi"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:64
msgid "Bing"
msgstr "Bing"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:63
msgid "Built-in"
msgstr "Yerleşik"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:73
msgid "Dark mode"
msgstr "Koyu mod"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:192
msgid "Delete"
msgstr "Sil"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:83
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:107
msgid "Expecting: %s"
msgstr "Beklenen: %s"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:187
msgid "Failed to delete file: %s."
msgstr "Dosya silinemedi: %s."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:46
msgid "Failed to list background files: %s."
msgstr "Arka plan dosyaları listelenemedi: %s."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:42
msgid "Failed to read available space: %s."
msgstr "Kullanılabilir alan belirlenemedi: %s."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:153
msgid "Failed to upload file: %s."
msgstr "Dosya yüklenemedi: %s."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:168
msgid "Filename"
msgstr "Dosya adı"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:142
msgid "Files will be uploaded to <code>%s</code>."
msgstr "Dosyalar <code>%s</code> konumuna yüklenecek."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:71
msgid "Follow system"
msgstr "Sistem ayarını kullan"
#: applications/luci-app-argon-config/root/usr/share/rpcd/acl.d/luci-app-argon-config.json:3
msgid "Grant UCI access for luci-app-argon-config"
msgstr "luci-app-argon-config için UCI erişimi ver"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:56
msgid "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."
msgstr "Burada Argon temasının giriş sayfasının bulanıklığını ve saydamlığını ayarlayabilir, arka plan resimlerini ve videolarını yönetebilirsiniz. Chrome kullanılması önerilir."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:95
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:119
msgid "Larger value will more blurred (suggest: clear: 1 or blur preset: 10)."
msgstr "Daha yüksek değer daha fazla bulanıklık sağlar (öneri: net: 1 veya bulanık: 10)."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:72
msgid "Light mode"
msgstr "Açık mod"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:169
msgid "Modified date"
msgstr "Değiştirilme tarihi"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:194
msgid "No files found."
msgstr "Dosya bulunamadı."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:126
msgid "Save current settings"
msgstr "Geçerli ayarları kaydet"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:124
msgid "Save settings"
msgstr "Ayarları kaydet"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:170
msgid "Size"
msgstr "Boyut"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:58
msgid "Theme configuration"
msgstr "Tema ayarları"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:70
msgid "Theme mode"
msgstr "Tema modu"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:65
msgid "Unsplash"
msgstr "Unsplash"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:141
msgid "Upload background"
msgstr "Arka plan yükle"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:135
msgid "Upload background (available space: %1024.2mB)"
msgstr "Arka plan yükle (kullanılabilir alan: %1024.2mB)"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:144
msgid "Upload..."
msgstr "Yükle..."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:66
msgid "Wallhaven"
msgstr "Wallhaven"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:62
msgid "Wallpaper source"
msgstr "Duvar kâğıdı kaynağı"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:137
msgid "You can upload files such as gif/jpg/mp4/png/webm/webp files, to change the login page background."
msgstr "Giriş sayfasının arka planını değiştirmek için gif/jpg/mp4/png/webm/webp biçiminde dosyalar yükleyebilirsiniz."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:118
msgid "[Dark mode] Frosted Glass Radius"
msgstr "[Koyu mod] Buzlu cam efekti bulanıklık yarıçapı"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:100
msgid "[Dark mode] Primary Color"
msgstr "[Koyu mod] Ana renk"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:111
msgid "[Dark mode] Transparency"
msgstr "[Koyu mod] Saydamlık"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:94
msgid "[Light mode] Frosted Glass Radius"
msgstr "[Açık mod] Buzlu cam efekti bulanıklık yarıçapı"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:77
msgid "[Light mode] Primary Color"
msgstr "[Açık mod] Ana renk"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:87
msgid "[Light mode] Transparency"
msgstr "[Açık mod] Saydamlık"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:83
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:107
msgid "valid HEX color value"
msgstr "geçerli bir HEX renk değeri"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js
msgid "Login page style"
msgstr "Giriş sayfası stili"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js
msgid "Classic sidebar"
msgstr "Klasik kenar çubuğu"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js
msgid "Centered card"
msgstr "Ortalanmış kart"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js
msgid "Applies the next time you open the login page."
msgstr "Giriş sayfasını bir sonraki açışınızda uygulanır."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Browser icon"
msgstr "Tarayıcı simgesi"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Login logo"
msgstr "Giriş logosu"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Invalid PNG image or dimensions."
msgstr "Geçersiz PNG görüntüsü veya boyutları."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Another update is running. Please try again."
msgstr "Başka bir güncelleme sürüyor. Lütfen daha sonra tekrar deneyin."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Unable to save custom branding."
msgstr "Özel simgeler kaydedilemedi."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Upload PNG..."
msgstr "PNG yükle…"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Restore default"
msgstr "Varsayılanı geri yükle"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Custom branding"
msgstr "Özel simgeler"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "PNG images, 16–1024 pixels per side, up to 1 MiB. Browser icons must be square."
msgstr "PNG görüntüleri, her kenar 16–1024 piksel, en fazla 1 MiB. Tarayıcı simgeleri kare olmalıdır."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Upload for both..."
msgstr "İkisi için yükle…"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Changes apply immediately. Reload open pages to update their icons."
msgstr "Değişiklikler hemen uygulanır. Simgeleri güncellemek için açık sayfaları yeniden yükleyin."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Unable to load custom branding. Update the theme and configuration packages."
msgstr "Özel simgeler yüklenemedi. Temayı ve yapılandırma paketini güncelleyin."
-258
View File
@@ -1,258 +0,0 @@
msgid ""
msgstr ""
"Project-Id-Version: luci-app-argon-config\n"
"PO-Revision-Date: 2026-10-08 00:00+0800\n"
"Last-Translator: Automatically generated\n"
"Language-Team: uk\n"
"Language: uk\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%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : 2);\n"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:112
msgid "0 transparent - 1 opaque (suggest: black translucent preset: 0.5)."
msgstr "0 — прозорий, 1 — непрозорий (рекомендовано: напівпрозорий чорний: 0.5)."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:88
msgid "0 transparent - 1 opaque (suggest: transparent: 0 or translucent preset: 0.5)."
msgstr "0 — прозорий, 1 — непрозорий (рекомендовано: прозорий: 0 або напівпрозорий: 0.5)."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:101
msgid "A HEX Color (default: #483d8b)."
msgstr "Колір у форматі HEX (типово: #483d8b)."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:77
msgid "A HEX color (default: #5e72e4)."
msgstr "Колір у форматі HEX (типово: #5e72e4)."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:171
msgid "Action"
msgstr "Дія"
#: applications/luci-app-argon-config/root/usr/share/luci/menu.d/luci-app-argon-config.json:3
msgid "Argon Config"
msgstr "Налаштування Argon"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:55
msgid "Argon theme configuration"
msgstr "Налаштування теми Argon"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:197
msgid "Background file list"
msgstr "Список файлів тла"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:64
msgid "Bing"
msgstr "Bing"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:63
msgid "Built-in"
msgstr "Вбудоване"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:73
msgid "Dark mode"
msgstr "Темний режим"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:192
msgid "Delete"
msgstr "Видалити"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:83
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:107
msgid "Expecting: %s"
msgstr "Очікується: %s"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:187
msgid "Failed to delete file: %s."
msgstr "Не вдалося видалити файл: %s."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:46
msgid "Failed to list background files: %s."
msgstr "Не вдалося отримати список файлів тла: %s."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:42
msgid "Failed to read available space: %s."
msgstr "Не вдалося визначити доступний простір: %s."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:153
msgid "Failed to upload file: %s."
msgstr "Не вдалося вивантажити файл: %s."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:168
msgid "Filename"
msgstr "Назва файлу"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:142
msgid "Files will be uploaded to <code>%s</code>."
msgstr "Файли буде вивантажено до <code>%s</code>."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:71
msgid "Follow system"
msgstr "Як у системі"
#: applications/luci-app-argon-config/root/usr/share/rpcd/acl.d/luci-app-argon-config.json:3
msgid "Grant UCI access for luci-app-argon-config"
msgstr "Надати доступ до UCI для luci-app-argon-config"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:56
msgid "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."
msgstr "Тут можна налаштувати розмиття та прозорість сторінки входу теми Argon, а також керувати фоновими зображеннями та відео. Рекомендовано використовувати Chrome."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:95
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:119
msgid "Larger value will more blurred (suggest: clear: 1 or blur preset: 10)."
msgstr "Більше значення посилює розмиття (рекомендовано: чітко: 1 або розмито: 10)."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:72
msgid "Light mode"
msgstr "Світлий режим"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:169
msgid "Modified date"
msgstr "Дата зміни"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:194
msgid "No files found."
msgstr "Файлів не знайдено."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:126
msgid "Save current settings"
msgstr "Зберегти поточні налаштування"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:124
msgid "Save settings"
msgstr "Зберегти налаштування"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:170
msgid "Size"
msgstr "Розмір"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:58
msgid "Theme configuration"
msgstr "Налаштування теми"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:70
msgid "Theme mode"
msgstr "Режим теми"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:65
msgid "Unsplash"
msgstr "Unsplash"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:141
msgid "Upload background"
msgstr "Вивантажити тло"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:135
msgid "Upload background (available space: %1024.2mB)"
msgstr "Вивантажити тло (доступний простір: %1024.2mB)"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:144
msgid "Upload..."
msgstr "Вивантажити..."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:66
msgid "Wallhaven"
msgstr "Wallhaven"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:62
msgid "Wallpaper source"
msgstr "Джерело шпалер"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:137
msgid "You can upload files such as gif/jpg/mp4/png/webm/webp files, to change the login page background."
msgstr "Ви можете вивантажити файли у форматах gif/jpg/mp4/png/webm/webp, щоб змінити тло сторінки входу."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:118
msgid "[Dark mode] Frosted Glass Radius"
msgstr "[Темний режим] Радіус розмиття ефекту матового скла"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:100
msgid "[Dark mode] Primary Color"
msgstr "[Темний режим] Основний колір"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:111
msgid "[Dark mode] Transparency"
msgstr "[Темний режим] Прозорість"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:94
msgid "[Light mode] Frosted Glass Radius"
msgstr "[Світлий режим] Радіус розмиття ефекту матового скла"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:77
msgid "[Light mode] Primary Color"
msgstr "[Світлий режим] Основний колір"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:87
msgid "[Light mode] Transparency"
msgstr "[Світлий режим] Прозорість"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:83
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:107
msgid "valid HEX color value"
msgstr "коректне значення кольору у форматі HEX"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js
msgid "Login page style"
msgstr "Стиль сторінки входу"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js
msgid "Classic sidebar"
msgstr "Класична бічна панель"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js
msgid "Centered card"
msgstr "Картка по центру"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js
msgid "Applies the next time you open the login page."
msgstr "Застосовується під час наступного відкриття сторінки входу."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Browser icon"
msgstr "Піктограма браузера"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Login logo"
msgstr "Логотип входу"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Invalid PNG image or dimensions."
msgstr "Неприпустиме зображення PNG або розміри."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Another update is running. Please try again."
msgstr "Триває інше оновлення. Спробуйте пізніше."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Unable to save custom branding."
msgstr "Не вдалося зберегти власні піктограми."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Upload PNG..."
msgstr "Завантажити PNG…"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Restore default"
msgstr "Відновити типові"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Custom branding"
msgstr "Власні піктограми"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "PNG images, 16–1024 pixels per side, up to 1 MiB. Browser icons must be square."
msgstr "Зображення PNG, 16–1024 пікселів на сторону, до 1 MiB. Піктограми браузера мають бути квадратними."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Upload for both..."
msgstr "Завантажити для обох…"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Changes apply immediately. Reload open pages to update their icons."
msgstr "Зміни застосовуються одразу. Перезавантажте відкриті сторінки, щоб оновити їхні піктограми."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Unable to load custom branding. Update the theme and configuration packages."
msgstr "Не вдалося завантажити власні піктограми. Оновіть тему та пакет налаштувань."
-258
View File
@@ -1,258 +0,0 @@
msgid ""
msgstr ""
"Project-Id-Version: luci-app-argon-config\n"
"PO-Revision-Date: 2026-10-08 00:00+0800\n"
"Last-Translator: Automatically generated\n"
"Language-Team: vi\n"
"Language: vi\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:112
msgid "0 transparent - 1 opaque (suggest: black translucent preset: 0.5)."
msgstr "0 trong suốt - 1 không trong suốt (đề xuất: màu đen bán trong suốt: 0.5)."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:88
msgid "0 transparent - 1 opaque (suggest: transparent: 0 or translucent preset: 0.5)."
msgstr "0 trong suốt - 1 không trong suốt (đề xuất: trong suốt: 0 hoặc bán trong suốt: 0.5)."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:101
msgid "A HEX Color (default: #483d8b)."
msgstr "Mã màu HEX (mặc định: #483d8b)."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:77
msgid "A HEX color (default: #5e72e4)."
msgstr "Mã màu HEX (mặc định: #5e72e4)."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:171
msgid "Action"
msgstr "Thao tác"
#: applications/luci-app-argon-config/root/usr/share/luci/menu.d/luci-app-argon-config.json:3
msgid "Argon Config"
msgstr "Cấu hình Argon"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:55
msgid "Argon theme configuration"
msgstr "Cấu hình giao diện Argon"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:197
msgid "Background file list"
msgstr "Danh sách tệp nền"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:64
msgid "Bing"
msgstr "Bing"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:63
msgid "Built-in"
msgstr "Tích hợp sẵn"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:73
msgid "Dark mode"
msgstr "Chế độ tối"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:192
msgid "Delete"
msgstr "Xóa"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:83
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:107
msgid "Expecting: %s"
msgstr "Giá trị yêu cầu: %s"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:187
msgid "Failed to delete file: %s."
msgstr "Không thể xóa tệp: %s."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:46
msgid "Failed to list background files: %s."
msgstr "Không thể liệt kê các tệp nền: %s."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:42
msgid "Failed to read available space: %s."
msgstr "Không thể xác định dung lượng trống: %s."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:153
msgid "Failed to upload file: %s."
msgstr "Không thể tải tệp lên: %s."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:168
msgid "Filename"
msgstr "Tên tệp"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:142
msgid "Files will be uploaded to <code>%s</code>."
msgstr "Các tệp sẽ được tải lên <code>%s</code>."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:71
msgid "Follow system"
msgstr "Theo hệ thống"
#: applications/luci-app-argon-config/root/usr/share/rpcd/acl.d/luci-app-argon-config.json:3
msgid "Grant UCI access for luci-app-argon-config"
msgstr "Cấp quyền truy cập UCI cho luci-app-argon-config"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:56
msgid "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."
msgstr "Tại đây, bạn có thể thiết lập độ mờ và độ trong suốt của trang đăng nhập giao diện Argon, đồng thời quản lý hình ảnh và video nền. Khuyến nghị sử dụng Chrome."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:95
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:119
msgid "Larger value will more blurred (suggest: clear: 1 or blur preset: 10)."
msgstr "Giá trị càng lớn thì càng mờ (đề xuất: rõ nét: 1 hoặc làm mờ: 10)."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:72
msgid "Light mode"
msgstr "Chế độ sáng"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:169
msgid "Modified date"
msgstr "Ngày sửa đổi"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:194
msgid "No files found."
msgstr "Không tìm thấy tệp nào."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:126
msgid "Save current settings"
msgstr "Lưu cài đặt hiện tại"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:124
msgid "Save settings"
msgstr "Lưu cài đặt"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:170
msgid "Size"
msgstr "Kích thước"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:58
msgid "Theme configuration"
msgstr "Cấu hình giao diện"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:70
msgid "Theme mode"
msgstr "Chế độ giao diện"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:65
msgid "Unsplash"
msgstr "Unsplash"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:141
msgid "Upload background"
msgstr "Tải nền lên"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:135
msgid "Upload background (available space: %1024.2mB)"
msgstr "Tải nền lên (dung lượng trống: %1024.2mB)"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:144
msgid "Upload..."
msgstr "Tải lên..."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:66
msgid "Wallhaven"
msgstr "Wallhaven"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:62
msgid "Wallpaper source"
msgstr "Nguồn hình nền"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:137
msgid "You can upload files such as gif/jpg/mp4/png/webm/webp files, to change the login page background."
msgstr "Bạn có thể tải lên các tệp định dạng gif/jpg/mp4/png/webm/webp để thay đổi nền của trang đăng nhập."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:118
msgid "[Dark mode] Frosted Glass Radius"
msgstr "[Chế độ tối] Bán kính làm mờ của hiệu ứng kính mờ"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:100
msgid "[Dark mode] Primary Color"
msgstr "[Chế độ tối] Màu chủ đạo"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:111
msgid "[Dark mode] Transparency"
msgstr "[Chế độ tối] Độ trong suốt"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:94
msgid "[Light mode] Frosted Glass Radius"
msgstr "[Chế độ sáng] Bán kính làm mờ của hiệu ứng kính mờ"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:77
msgid "[Light mode] Primary Color"
msgstr "[Chế độ sáng] Màu chủ đạo"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:87
msgid "[Light mode] Transparency"
msgstr "[Chế độ sáng] Độ trong suốt"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:83
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:107
msgid "valid HEX color value"
msgstr "mã màu HEX hợp lệ"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js
msgid "Login page style"
msgstr "Kiểu trang đăng nhập"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js
msgid "Classic sidebar"
msgstr "Thanh bên cổ điển"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js
msgid "Centered card"
msgstr "Thẻ ở giữa"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js
msgid "Applies the next time you open the login page."
msgstr "Áp dụng vào lần tiếp theo bạn mở trang đăng nhập."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Browser icon"
msgstr "Biểu tượng trình duyệt"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Login logo"
msgstr "Logo đăng nhập"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Invalid PNG image or dimensions."
msgstr "Ảnh PNG hoặc kích thước không hợp lệ."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Another update is running. Please try again."
msgstr "Một bản cập nhật khác đang chạy. Vui lòng thử lại sau."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Unable to save custom branding."
msgstr "Không thể lưu biểu tượng tùy chỉnh."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Upload PNG..."
msgstr "Tải PNG lên…"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Restore default"
msgstr "Khôi phục mặc định"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Custom branding"
msgstr "Biểu tượng tùy chỉnh"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "PNG images, 16–1024 pixels per side, up to 1 MiB. Browser icons must be square."
msgstr "Ảnh PNG, mỗi cạnh 16–1024 pixel, tối đa 1 MiB. Biểu tượng trình duyệt phải có dạng hình vuông."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Upload for both..."
msgstr "Tải lên cho cả hai…"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Changes apply immediately. Reload open pages to update their icons."
msgstr "Thay đổi có hiệu lực ngay. Tải lại các trang đang mở để cập nhật biểu tượng."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Unable to load custom branding. Update the theme and configuration packages."
msgstr "Không thể tải biểu tượng tùy chỉnh. Hãy cập nhật giao diện và gói cấu hình."
+81 -120
View File
@@ -11,23 +11,29 @@ msgstr ""
"Language: zh_CN\n"
"X-Generator: Poedit 2.3.1\n"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:112
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:136
msgid "0 transparent - 1 opaque (suggest: black translucent preset: 0.5)."
msgstr "0 最透明 - 1 不透明(建议:黑色半透明 0.5)"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:88
msgid "0 transparent - 1 opaque (suggest: transparent: 0 or translucent preset: 0.5)."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:112
msgid ""
"0 transparent - 1 opaque (suggest: transparent: 0 or translucent preset: "
"0.5)."
msgstr "0 最透明 - 1 不透明(建议: 透明 0 或 半透明预设 0.5)。"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:101
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:125
msgid "A HEX Color (default: #483d8b)."
msgstr "十六进制颜色值(预设为:#483d8b)。"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:77
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:101
msgid "A HEX color (default: #5e72e4)."
msgstr "十六进制颜色值(预设为:#5e72e4)。"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:171
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:86
msgid "API key"
msgstr "API 密钥"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:189
msgid "Action"
msgstr "操作"
@@ -35,225 +41,180 @@ msgstr "操作"
msgid "Argon Config"
msgstr "Argon 主题设置"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:55
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:45
msgid "Argon theme configuration"
msgstr "Argon 主题设置"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:197
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:209
msgid "Background file list"
msgstr "背景文件列表"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:64
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:54
msgid "Bing"
msgstr "Bing"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:63
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:53
msgid "Built-in"
msgstr "内建"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:73
msgid "Collection ID"
msgstr "分类 ID"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:73
msgid "Collection ID for Unsplash or Wallhaven."
msgstr "为 Unsplash 或 Wallhaven 指定分类 ID"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:97
msgid "Dark mode"
msgstr "暗黑模式"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:192
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:204
msgid "Delete"
msgstr "删除"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:83
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:107
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:131
msgid "Expecting: %s"
msgstr "请输入:%s"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:187
msgid "Failed to delete file: %s."
msgstr "删除文件失败:%s。"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:46
msgid "Failed to list background files: %s."
msgstr "读取背景文件列表失败:%s。"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:42
msgid "Failed to read available space: %s."
msgstr "读取可用空间失败:%s。"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:153
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:173
msgid "Failed to upload file: %s."
msgstr "上传文件失败:%s。"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:168
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:186
msgid "Filename"
msgstr "文件名"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:142
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:163
msgid "Files will be uploaded to <code>%s</code>."
msgstr "文件将被上传至<code>%s</code>。"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:71
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:95
msgid "Follow system"
msgstr "跟随系统"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:55
msgid "GHSer"
msgstr "GHSer"
#: applications/luci-app-argon-config/root/usr/share/rpcd/acl.d/luci-app-argon-config.json:3
msgid "Grant UCI access for luci-app-argon-config"
msgstr "授予 luci-app-argon-config 访问 UCI 配置的权限"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:56
msgid "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."
msgstr "在这里你可以设置argon 主题的登录页面的模糊和透明度,并管理背景图片与视频。推荐使用 Chrome。"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:46
msgid ""
"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."
msgstr ""
"在这里你可以设置argon 主题的登录页面的模糊和透明度,并管理背景图片与视频。推"
"荐使用 Chrome。"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:95
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:119
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:143
msgid "Larger value will more blurred (suggest: clear: 1 or blur preset: 10)."
msgstr "值越大越模糊(建议:清透 1 或 模糊预设 10)"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:72
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:96
msgid "Light mode"
msgstr "亮色模式"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:169
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:187
msgid "Modified date"
msgstr "修改时间"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:194
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:206
msgid "No files found."
msgstr "没有找到文件。"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:126
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:150
msgid "Save current settings"
msgstr "保存当前设置"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:124
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:148
msgid "Save settings"
msgstr "保存设置"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:170
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:188
msgid "Size"
msgstr "大小"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:58
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:86
msgid "Specify API key for Unsplash or Wallhaven."
msgstr "为 Unsplash 或 Wallhaven 指定 API 密钥。"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:48
msgid "Theme configuration"
msgstr "主题配置"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:70
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:94
msgid "Theme mode"
msgstr "主题模式"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:65
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:56
msgid "Unsplash"
msgstr "Unsplash"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:141
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:162
msgid "Upload background"
msgstr "上传背景"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:135
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:156
msgid "Upload background (available space: %1024.2mB)"
msgstr "上传背景(可用空间:%1024.2mB)"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:144
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:165
msgid "Upload..."
msgstr "上传..."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:66
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:90
msgid "Use exact resolution"
msgstr "精确匹配分辨率"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:90
msgid "Use exact resolution or at least 1080P for Wallhaven."
msgstr "精确匹配 1080P 分辨率或至少 1080P 分辨率(Wallhaven)。"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:57
msgid "Wallhaven"
msgstr "Wallhaven"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:62
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:52
msgid "Wallpaper source"
msgstr "壁纸来源"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:137
msgid "You can upload files such as gif/jpg/mp4/png/webm/webp files, to change the login page background."
msgstr "你可以上传 gif/jpg/mp4/png/webm/webp 等格式的文件,以创建自己喜欢的登录界面。"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:158
msgid ""
"You can upload files such as gif/jpg/mp4/png/webm/webp files, to change the "
"login page background."
msgstr ""
"你可以上传 gif/jpg/mp4/png/webm/webp 等格式的文件,以创建自己喜欢的登录界面。"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:118
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:142
msgid "[Dark mode] Frosted Glass Radius"
msgstr "[暗色模式] 毛玻璃模糊半径"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:100
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:124
msgid "[Dark mode] Primary Color"
msgstr "[暗色模式] 主色调"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:111
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:135
msgid "[Dark mode] Transparency"
msgstr "[暗色模式] 透明度"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:94
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:118
msgid "[Light mode] Frosted Glass Radius"
msgstr "[亮色模式] 毛玻璃模糊半径"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:77
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:101
msgid "[Light mode] Primary Color"
msgstr "[亮色模式] 主色调"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:87
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:111
msgid "[Light mode] Transparency"
msgstr "[亮色模式] 透明度"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:83
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:107
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:131
msgid "valid HEX color value"
msgstr "有效十六进制颜色值"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js
msgid "Login page style"
msgstr "登录页样式"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js
msgid "Classic sidebar"
msgstr "经典侧栏"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js
msgid "Centered card"
msgstr "居中卡片"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js
msgid "Applies the next time you open the login page."
msgstr "下次打开登录页时生效。"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Browser icon"
msgstr "网站图标"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Login logo"
msgstr "登录页 Logo"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Invalid PNG image or dimensions."
msgstr "PNG 图片或尺寸不符合要求。"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Another update is running. Please try again."
msgstr "有其他更新正在进行,请稍后重试。"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Unable to save custom branding."
msgstr "无法保存自定义图标。"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Upload PNG..."
msgstr "上传 PNG…"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Restore default"
msgstr "恢复默认"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Custom branding"
msgstr "自定义图标"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "PNG images, 16–1024 pixels per side, up to 1 MiB. Browser icons must be square."
msgstr "支持 PNG,每边 16–1024 像素,最大 1 MiB。网站图标须为正方形。"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Upload for both..."
msgstr "同时用于两处…"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Changes apply immediately. Reload open pages to update their icons."
msgstr "更改立即生效。请刷新已打开的页面以更新图标。"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Unable to load custom branding. Update the theme and configuration packages."
msgstr "无法加载自定义图标。请更新主题和配置插件。"
@@ -1,259 +0,0 @@
msgid ""
msgstr ""
"Project-Id-Version: \n"
"POT-Creation-Date: \n"
"PO-Revision-Date: \n"
"Last-Translator: Victor Tseng <palatis@gmail.com>\n"
"Language-Team: \n"
"Language: zh_TW\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 3.2.2\n"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:112
msgid "0 transparent - 1 opaque (suggest: black translucent preset: 0.5)."
msgstr "0 全透明 - 1 不透明(建議:黑色半透明 0.5)"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:88
msgid "0 transparent - 1 opaque (suggest: transparent: 0 or translucent preset: 0.5)."
msgstr "0 全透明 - 1 不透明(建議:全透明 0 或半透明 0.5)"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:101
msgid "A HEX Color (default: #483d8b)."
msgstr "十六進制顏色(預設 #483d8b)"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:77
msgid "A HEX color (default: #5e72e4)."
msgstr "十六進制顏色(預設 #5e72e4)"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:171
msgid "Action"
msgstr "動作"
#: applications/luci-app-argon-config/root/usr/share/luci/menu.d/luci-app-argon-config.json:3
msgid "Argon Config"
msgstr "Argon 設定"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:55
msgid "Argon theme configuration"
msgstr "Argon 主題設定"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:197
msgid "Background file list"
msgstr "背景檔案清單"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:64
msgid "Bing"
msgstr "Bing"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:63
msgid "Built-in"
msgstr "內建"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:73
msgid "Dark mode"
msgstr "深色模式"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:192
msgid "Delete"
msgstr "刪除"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:83
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:107
msgid "Expecting: %s"
msgstr "期望:%s"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:187
msgid "Failed to delete file: %s."
msgstr "刪除檔案失敗:%s。"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:46
msgid "Failed to list background files: %s."
msgstr "讀取背景檔案清單失敗:%s。"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:42
msgid "Failed to read available space: %s."
msgstr "讀取可用空間失敗:%s。"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:153
msgid "Failed to upload file: %s."
msgstr "上傳檔案失敗:%s"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:168
msgid "Filename"
msgstr "檔案名稱"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:142
msgid "Files will be uploaded to <code>%s</code>."
msgstr "檔案將被上傳至 <code>%s</code>"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:71
msgid "Follow system"
msgstr "跟隨系統"
#: applications/luci-app-argon-config/root/usr/share/rpcd/acl.d/luci-app-argon-config.json:3
msgid "Grant UCI access for luci-app-argon-config"
msgstr "為 luci-app-argon-config 授予 UCI 權限"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:56
msgid "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."
msgstr "您可以在此設定登入畫面的模糊度、透明度、以及管理背景圖片與影片(推薦使用 Chrome)"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:95
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:119
msgid "Larger value will more blurred (suggest: clear: 1 or blur preset: 10)."
msgstr "數值越大越模糊(建議:清晰 1 或模糊程度 10)"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:72
msgid "Light mode"
msgstr "淺色模式"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:169
msgid "Modified date"
msgstr "修改時間"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:194
msgid "No files found."
msgstr "未找到任何檔案"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:126
msgid "Save current settings"
msgstr "保存目前設定"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:124
msgid "Save settings"
msgstr "保存設定"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:170
msgid "Size"
msgstr "容量"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:58
msgid "Theme configuration"
msgstr "主題設定"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:70
msgid "Theme mode"
msgstr "佈景主題模式"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:65
msgid "Unsplash"
msgstr "Unsplash"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:141
msgid "Upload background"
msgstr "上傳背景"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:135
msgid "Upload background (available space: %1024.2mB)"
msgstr "上傳背景(可用空間:%1024.2mB)"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:144
msgid "Upload..."
msgstr "上傳..."
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:66
msgid "Wallhaven"
msgstr "Wallhaven"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:62
msgid "Wallpaper source"
msgstr "背景圖片來源"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:137
msgid "You can upload files such as gif/jpg/mp4/png/webm/webp files, to change the login page background."
msgstr "可以上傳諸如 gif、jpg、mp4、png、webm、webp 等類型的檔案來更換登入畫面的背景"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:118
msgid "[Dark mode] Frosted Glass Radius"
msgstr "[深色模式] 模糊效果半徑"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:100
msgid "[Dark mode] Primary Color"
msgstr "[深色模式] 主色彩"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:111
msgid "[Dark mode] Transparency"
msgstr "[深色模式] 透明度"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:94
msgid "[Light mode] Frosted Glass Radius"
msgstr "[淺色模式] 模糊效果半徑"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:77
msgid "[Light mode] Primary Color"
msgstr "[淺色模式] 主色彩"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:87
msgid "[Light mode] Transparency"
msgstr "[淺色模式] 透明度"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:83
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:107
msgid "valid HEX color value"
msgstr "有效的十六進制顏色值"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js
msgid "Login page style"
msgstr "登入頁面樣式"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js
msgid "Classic sidebar"
msgstr "經典側欄"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js
msgid "Centered card"
msgstr "置中卡片"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js
msgid "Applies the next time you open the login page."
msgstr "下次開啟登入頁面時生效。"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Browser icon"
msgstr "網站圖示"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Login logo"
msgstr "登入頁 Logo"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Invalid PNG image or dimensions."
msgstr "PNG 圖片或尺寸不符合要求。"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Another update is running. Please try again."
msgstr "有其他更新正在進行,請稍後重試。"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Unable to save custom branding."
msgstr "無法儲存自訂圖示。"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Upload PNG..."
msgstr "上傳 PNG…"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Restore default"
msgstr "恢復預設"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Custom branding"
msgstr "自訂圖示"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "PNG images, 16–1024 pixels per side, up to 1 MiB. Browser icons must be square."
msgstr "支援 PNG,每邊 16–1024 像素,最大 1 MiB。網站圖示須為正方形。"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Upload for both..."
msgstr "同時用於兩處…"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Changes apply immediately. Reload open pages to update their icons."
msgstr "變更立即生效。請重新整理已開啟的頁面以更新圖示。"
#: applications/luci-app-argon-config/htdocs/luci-static/resources/argon/branding.js
msgid "Unable to load custom branding. Update the theme and configuration packages."
msgstr "無法載入自訂圖示。請更新主題和設定套件。"
+4 -5
View File
@@ -1,11 +1,10 @@
config global
option login_style 'classic'
option primary '#5e72e4'
option dark_primary '#483d8b'
option blur '10'
option blur_dark '10'
option transparency '0.5'
option transparency_dark '0.5'
option blur '0'
option blur_dark '0'
option transparency '0.3'
option transparency_dark '0.3'
option mode 'normal'
option online_wallpaper 'bing'
@@ -1 +0,0 @@
/www/luci-static/argon/branding/
@@ -6,22 +6,9 @@
readonly bg_path="/www/luci-static/argon/background"
readonly tmp_path="/tmp/argon_background.tmp"
valid_filename() {
case "$1" in
""|"."|".."|*/*|*\\*) return 1 ;;
esac
return 0
}
result() {
printf '{ "result": %s }\n' "$1"
}
case "$1" in
"list")
json_init
json_add_object "avail"
json_close_object
json_add_object "remove"
json_add_string "filename" "filename"
json_close_object
@@ -33,49 +20,36 @@ case "$1" in
;;
"call")
case "$2" in
"avail")
json_init
json_add_int "avail" "$(df | grep -E '/$' | awk '{print $4}')"
json_dump
json_cleanup
;;
"remove")
read -r input
json_load "$input" || { result 255; exit 0; }
json_load "$input"
json_get_var filename "filename"
json_cleanup
if ! valid_filename "$filename"; then
result 255
exit 0
if dirname "$filename" | grep -q ".."; then
echo '{ "result": 255 }'
exit 255
fi
if [ -d "$bg_path/$filename" ]; then
result 255
elif rm -f "$bg_path/$filename" 2>/dev/null; then
result 0
else
result 1
fi
rm -f "$bg_path/$filename"
echo '{ "result": 0 }'
;;
"rename")
read -r input
json_load "$input" || { result 255; exit 0; }
json_load "$input"
json_get_var newname "newname"
json_cleanup
if ! valid_filename "$newname" || [ -L "$bg_path/$newname" ] ||
{ [ -e "$bg_path/$newname" ] && [ ! -f "$bg_path/$newname" ]; }; then
result 255
exit 0
if dirname "$newname" | grep -q ".."; then
echo '{ "result": 255 }'
exit 255
fi
if [ -f "$tmp_path" ] && [ ! -L "$tmp_path" ] &&
mkdir -p "$bg_path" && chmod 0644 "$tmp_path" &&
mv -f "$tmp_path" "$bg_path/$newname" 2>/dev/null; then
result 0
if mv "$tmp_path" "$bg_path/$newname" 2>"/dev/null"; then
chmod 0644 "$bg_path/$newname"
echo '{ "result": 0 }'
else
result 1
echo '{ "result": 1 }'
fi
;;
esac
@@ -1,133 +0,0 @@
#!/bin/sh
. /usr/share/libubox/jshn.sh
readonly branding_dir='/www/luci-static/argon/branding'
readonly lock_dir='/tmp/argon_branding.lock'
readonly upload_prefix='/tmp/argon_branding_'
valid_destination() {
[ ! -L "$1" ] && { [ ! -e "$1" ] || [ -f "$1" ]; }
}
valid_asset() {
printf '%s\n' "$1" | grep -Eq '^image-[0-9a-f]{64}\.png$' &&
[ -f "$branding_dir/$1" ] && [ ! -L "$branding_dir/$1" ]
}
read_state() {
favicon=''
logo=''
[ -d "$branding_dir" ] && [ ! -L "$branding_dir" ] || return 0
if [ -f "$branding_dir/current.json" ] && [ ! -L "$branding_dir/current.json" ] &&
[ "$(wc -c < "$branding_dir/current.json")" -le 1024 ] &&
json_load "$(cat "$branding_dir/current.json")"; then
json_get_var favicon favicon
json_get_var logo logo
fi
valid_asset "$favicon" || favicon=''
valid_asset "$logo" || logo=''
}
status() {
json_init
json_add_int result "$1"
json_add_string favicon "$favicon"
json_add_string logo "$logo"
json_dump
}
# Check the PNG header, bounded dimensions, IDAT presence and complete IEND.
# Images are served as PNG only, never as user-supplied filenames or SVG/HTML.
validate_png() {
local size header ending
size="$(wc -c < "$1")"
[ "$size" -ge 67 ] && [ "$size" -le 1048576 ] || return 1
# OpenWrt enables hexdump, but od is absent or lacks -A/-t/-N.
header="$(hexdump -v -n 29 -e '1/1 "%u "' "$1")" || return 1
set -- $header
[ "$#" -eq 29 ] || return 1
[ "$1 $2 $3 $4 $5 $6 $7 $8" = '137 80 78 71 13 10 26 10' ] || return 1
shift 8
[ "$1 $2 $3 $4 $5 $6 $7 $8" = '0 0 0 13 73 72 68 82' ] || return 1
shift 8
width=$(( $1 * 16777216 + $2 * 65536 + $3 * 256 + $4 ))
height=$(( $5 * 16777216 + $6 * 65536 + $7 * 256 + $8 ))
[ "$width" -ge 16 ] && [ "$height" -ge 16 ] &&
[ "$width" -le 1024 ] && [ "$height" -le 1024 ] || return 1
[ "$target" = logo ] || [ "$width" -eq "$height" ] || return 1
shift 8
case "$1:$2" in 1:0|2:0|4:0|8:0|16:0|8:2|16:2|1:3|2:3|4:3|8:3|8:4|16:4|8:6|16:6) ;; *) return 1 ;; esac
[ "$3 $4" = '0 0' ] && [ "$5" -le 1 ] || return 1
ending="$(tail -c 12 "$work/image.png" | hexdump -v -e '1/1 "%02x"')" || return 1
[ "$ending" = '0000000049454e44ae426082' ] && LC_ALL=C grep -q 'IDAT' "$work/image.png"
}
cleanup() {
[ -z "$work" ] || rm -rf "$work"
rmdir "$lock_dir" 2>/dev/null
}
case "$1" in
list)
printf '%s\n' '{"get":{},"set":{"target":"","token":""},"reset":{"target":""}}'
;;
call)
method="$2"
case "$method" in
get) read_state; status 0; exit 0 ;;
set|reset) ;;
*) exit 1 ;;
esac
read -r input
json_load "$input" || { status 2; exit 0; }
json_get_var target target
json_get_var token token
case "$target" in favicon|logo|both) ;; *) status 2; exit 0 ;; esac
if [ "$method" = set ]; then
printf '%s\n' "$token" | grep -Eq '^[0-9a-f]{32}$' || { status 2; exit 0; }
upload="${upload_prefix}${token}.png"
[ -f "$upload" ] && [ ! -L "$upload" ] || { status 2; exit 0; }
fi
mkdir "$lock_dir" 2>/dev/null || { status 3; exit 0; }
work=''
trap cleanup EXIT
trap 'exit 1' HUP INT TERM
umask 077
[ ! -L "$branding_dir" ] && mkdir -p "$branding_dir" && chmod 0755 "$branding_dir" || { status 1; exit 0; }
work="$(mktemp -d "$branding_dir/.upload.XXXXXX")" || { status 1; exit 0; }
read_state
old_favicon="$favicon"
old_logo="$logo"
if [ "$method" = set ]; then
mv "$upload" "$work/image.png" || { status 1; exit 0; }
validate_png "$work/image.png" || { status 2; exit 0; }
hash="$(sha256sum "$work/image.png")"
hash="${hash%% *}"
printf '%s\n' "$hash" | grep -Eq '^[0-9a-f]{64}$' || { status 1; exit 0; }
asset="image-$hash.png"
manifest="image-$hash.webmanifest"
valid_destination "$branding_dir/$asset" && valid_destination "$branding_dir/$manifest" || { status 1; exit 0; }
printf '{"name":"OpenWrt","display":"standalone","icons":[{"src":"%s","sizes":"%sx%s","type":"image/png"}]}\n' "$asset" "$width" "$height" > "$work/manifest"
chmod 0644 "$work/image.png" "$work/manifest" &&
mv -f "$work/image.png" "$branding_dir/$asset" &&
mv -f "$work/manifest" "$branding_dir/$manifest" || { status 1; exit 0; }
else
asset=''
fi
case "$target" in favicon) favicon="$asset" ;; logo) logo="$asset" ;; both) favicon="$asset"; logo="$asset" ;; esac
json_init
json_add_string favicon "$favicon"
json_add_string logo "$logo"
json_dump > "$work/current.json"
valid_destination "$branding_dir/current.json" && chmod 0644 "$work/current.json" &&
mv -f "$work/current.json" "$branding_dir/current.json" || { status 1; exit 0; }
# Keep the active images and one previous generation for pages already open.
for file in "$branding_dir"/image-*.png; do
name="${file##*/}"
case "$name" in "$favicon"|"$logo"|"$old_favicon"|"$old_logo") continue ;; esac
rm -f "$file" "${file%.png}.webmanifest"
done
status 0
;;
esac
@@ -8,14 +8,7 @@
},
"depends": {
"acl": [ "luci-app-argon-config" ],
"uci": {
"argon": true,
"luci": {
"main": {
"mediaurlbase": "/luci-static/argon"
}
}
}
"uci": { "argon": true }
}
}
}
@@ -6,19 +6,14 @@
"/www/luci-static/argon/background/*": [ "list" ]
},
"ubus": {
"luci.argon": [ "avail" ],
"luci.argon_branding": [ "get" ]
"luci.argon": [ "remove", "rename" ],
"system": [ "info" ]
},
"uci": [ "argon" ]
},
"write": {
"file": {
"/tmp/argon_background.tmp": [ "write" ],
"/tmp/argon_branding_*.png": [ "write" ]
},
"ubus": {
"luci.argon": [ "remove", "rename" ],
"luci.argon_branding": [ "set", "reset" ]
"/tmp/argon_background.tmp": [ "write" ]
},
"uci": [ "argon" ]
}
-1
View File
@@ -1 +0,0 @@
__pycache__/
@@ -1,102 +0,0 @@
'use strict';
const assert = require('node:assert/strict');
const fs = require('node:fs');
const path = require('node:path');
const test = require('node:test');
const { webcrypto } = require('node:crypto');
const source = fs.readFileSync(path.join(__dirname, '../htdocs/luci-static/resources/argon/branding.js'), 'utf8');
const image = 'image-' + 'a'.repeat(64) + '.png';
function fixture(options = {}) {
const state = { notifications: [], uploads: [], calls: [], cleanups: [], buttons: [], images: [], ...options };
let config = { result: 0, favicon: '', logo: '' };
const E = (tag, attrs, children) => {
const node = { tag, attrs, children, ...attrs, appendChild(child) { this.children.push(child); } };
if (tag === 'button') state.buttons.push(node);
if (tag === 'img') state.images.push(node);
return node;
};
const rpc = { declare: spec => async (...args) => {
assert.equal(spec.raise, true);
state.calls.push([spec.method, ...args]);
if (state.rpcError) throw new Error('permission denied');
if (state.result) return { result: state.result };
if (spec.method !== 'get') {
for (const kind of (args[0] === 'both' ? ['favicon', 'logo'] : [args[0]]))
config[kind] = spec.method === 'set' ? image : '';
}
return { ...config };
} };
const api = new Function('baseclass', 'fs', 'rpc', 'ui', 'L', 'E', '_', 'crypto', source)(
{ extend: obj => obj }, { remove: async file => { state.cleanups.push(file); } }, rpc,
{ uploadFile: async file => {
state.uploads.push(file);
if (state.uploadError) throw new Error('cancelled');
await state.pending;
}, addNotification: (title, node) => state.notifications.push(node.children) },
{ resource: value => '/luci-static/resources/' + value, resolveDefault: promise => promise.catch(() => {}) },
E, value => value, webcrypto
);
state.render = async () => api.render({ readonly: state.readonly }, await api.load());
state.click = index => state.buttons[index].click();
return state;
}
test('branding can be set independently, shared, and restored without reloading the form', async () => {
const state = fixture();
await state.render();
assert.equal(state.buttons[1].disabled, true);
await state.click(0);
assert.ok(state.images[0].src.endsWith(image));
assert.ok(state.images[1].src.endsWith('argon.svg'));
assert.equal(state.buttons[1].disabled, false);
await state.click(2);
await state.click(1);
assert.ok(state.images[0].src.endsWith('favicon-32x32.png'));
assert.ok(state.images[1].src.endsWith(image));
await state.click(4);
assert.ok(state.images.every(node => node.src.endsWith(image)));
assert.equal(state.notifications.length, 0);
assert.equal(new Set(state.uploads).size, 3);
assert.deepEqual(state.cleanups, state.uploads);
for (const file of state.uploads) assert.match(file, /^\/tmp\/argon_branding_[0-9a-f]{32}\.png$/);
});
test('failed uploads and RPC operations keep the previews and restore the controls', async () => {
for (const options of [{ uploadError: true }, { result: 2 }, { result: 3 }, { result: 1 }, { rpcError: true }]) {
const state = fixture();
await state.render();
Object.assign(state, options);
await state.click(0);
assert.ok(state.images[0].src.endsWith('favicon-32x32.png'));
assert.equal(state.notifications.length, 1);
assert.equal(state.buttons[0].disabled, false);
assert.deepEqual(state.cleanups, state.uploads);
if (options.uploadError) assert.equal(state.calls.length, 1);
}
});
test('read-only and unavailable backends never allow mutations', async () => {
for (const options of [{ readonly: true }, { rpcError: true }]) {
const state = fixture(options);
await state.render();
assert.ok(state.buttons.every(button => button.disabled));
for (let i = 0; i < state.buttons.length; i++) await state.click(i);
assert.deepEqual(state.calls, [['get']]);
assert.equal(state.uploads.length, 0);
}
});
test('pending uploads prevent overlapping updates and leave controls usable afterwards', async () => {
let finish;
const state = fixture({ pending: new Promise(resolve => { finish = resolve; }) });
await state.render();
const upload = state.click(4);
await Promise.resolve();
assert.ok(state.buttons.every(button => button.disabled));
await state.click(0);
assert.equal(state.uploads.length, 1);
finish();
await upload;
assert.ok(state.buttons.every(button => !button.disabled));
});
-171
View File
@@ -1,171 +0,0 @@
'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/view/argon-config.js'), 'utf8');
String.prototype.format = function(...values) {
let index = 0;
return String(this).replace(/%s/g, () => String(values[index++]));
};
String.format = format => format;
function fixture(options = {}) {
const state = { notifications: [], reloads: 0, cleanups: [], events: [], nodes: {}, ...options };
const E = (tag, attrs, children) => {
const node = { tag, attrs, children };
if (attrs && attrs.id)
state.nodes[attrs.id] = node;
return node;
};
const ui = {
changes: { apply() { state.events.push('apply'); } },
addNotification(title, node) { state.notifications.push(node.attrs); },
createHandlerFn(context, fn) { return fn.bind(context); },
uploadFile() {
return state.uploadError ? Promise.reject(state.uploadError) : Promise.resolve({ name: '背景.jpg' });
}
};
class Map {
constructor() {
state.map = this;
this.readonly = state.readonly;
this.sections = [];
this.options = [];
}
section() {
const section = { map: this, option: (type, name) => {
const option = {
map: this, name, choices: {},
value(key, label) { this.choices[key] = label; },
cbid(section) { return 'cbid.argon.' + section + '.' + name; },
super(method, args) {
assert.equal(method, 'renderWidget');
return { value: args[2], disabled: this.map.readonly };
}
};
this.options.push(option);
return option;
} };
this.sections.push(section);
return section;
}
save() {
state.events.push('save-start');
return (state.saveTask || Promise.resolve()).then(() => state.events.push('save-complete'));
}
render() { return this.sections.map(section => section.render ? section.render() : null); }
}
const form = { Map, TypedSection() {}, TableSection() {}, Button() {}, Value() {}, ListValue() {} };
const rpc = { declare(spec) { return () => {
if (state[spec.method + 'Error'])
return Promise.reject(state[spec.method + 'Error']);
return Promise.resolve(spec.method === 'avail' ? { avail: 100 } : { result: state[spec.method + 'Result'] || 0 });
} } };
const fileApi = {
list() { return state.listError ? Promise.reject(state.listError) : Promise.resolve([{ name: 'background.jpg', size: 10, mtime: 0 }]); },
remove(filename) { state.cleanups.push(filename); return Promise.resolve(); }
};
const L = { bind: (fn, context) => fn.bind(context), resolveDefault: (promise, value) => Promise.resolve(promise).catch(() => value), resource: name => '/luci-static/resources/' + name };
state.view = new Function('form', 'fs', 'rpc', 'uci', 'ui', 'view', 'L', 'E', '_', 'cbi_update_table', 'location', 'document', 'branding', source)(
form, fileApi, rpc, { load: () => Promise.resolve() }, 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.render = async () => state.view.render(await state.view.load());
state.button = name => state.map.options.find(option => option.name === name);
return state;
}
test('apply starts only after saving finishes', async () => {
let finish;
const state = fixture({ saveTask: new Promise(resolve => { finish = resolve; }) });
await state.render();
const task = state.button('_save').onclick();
assert.deepEqual(state.events, ['save-start']);
finish();
await task;
assert.deepEqual(state.events, ['save-start', 'save-complete', 'apply']);
});
test('login style selector previews supported values and falls back for old configs', async () => {
const state = fixture({ readonly: true });
await state.render();
const option = state.button('login_style');
assert.deepEqual(Object.keys(option.choices), ['classic', 'centered']);
assert.equal(option.default, 'classic');
assert.equal(option.rmempty, false);
for (const value of [undefined, '', 'classic', 'centered', '../invalid']) {
const style = value === 'centered' ? 'centered' : 'classic';
const node = option.renderWidget('global', 0, value);
assert.equal(node.children[0].value, style);
assert.equal(node.children[0].disabled, true);
assert.equal(node.children[1].attrs.src, '/luci-static/resources/argon-config/login-' + style + '.svg');
assert.equal(node.children[1].attrs.alt, option.choices[style]);
assert.ok(fs.existsSync(path.join(__dirname, '../htdocs/luci-static/resources/argon-config/login-' + style + '.svg')));
}
const preview = state.nodes[option.cbid('global') + '-preview'];
for (const style of ['centered', 'classic']) {
option.onchange(null, 'global', style);
assert.equal(preview.src, '/luci-static/resources/argon-config/login-' + style + '.svg');
assert.equal(preview.alt, option.choices[style]);
}
});
test('failed saves are reported and never applied', async () => {
const state = fixture({ saveTask: Promise.reject(new Error('validation failed')) });
await state.render();
await state.button('_save').onclick();
assert.deepEqual(state.events, ['save-start']);
assert.deepEqual(state.notifications, ['validation failed']);
});
test('failed background and space reads still render the settings', async () => {
const state = fixture({ listError: new Error('missing directory'), availError: new Error('RPC unavailable') });
const data = await state.view.load();
assert.deepEqual(data[1], { avail: 0 });
assert.deepEqual(data[2], []);
assert.doesNotThrow(() => state.view.render(data));
assert.equal(state.notifications.length, 2);
});
test('successful deletion reloads; failed RPC results and transport errors are reported', async () => {
for (const options of [{}, { removeResult: 1 }, { removeError: new Error('permission denied') }]) {
const state = fixture(options);
await state.render();
await state.rows[0][3].attrs.click();
const success = !options.removeResult && !options.removeError;
assert.equal(state.reloads, success ? 1 : 0);
assert.equal(state.notifications.length, success ? 0 : 1);
}
});
test('read-only sessions cannot click the delete button', async () => {
const state = fixture({ readonly: true });
await state.render();
assert.equal(state.rows[0][3].attrs.disabled, true);
});
test('failed finalization cleans an uploaded temporary file and reports the error', async () => {
for (const options of [{ renameResult: 255 }, { renameError: new Error('permission denied') }]) {
const state = fixture(options);
await state.render();
await state.button('_upload_bg').onclick({ target: {} });
assert.equal(state.reloads, 0);
assert.equal(state.notifications.length, 1);
assert.deepEqual(state.cleanups, ['/tmp/argon_background.tmp']);
}
});
test('successful upload reloads; cancellation does not remove another upload', async () => {
for (const options of [{}, { uploadError: new Error('cancelled') }]) {
const state = fixture(options);
await state.render();
await state.button('_upload_bg').onclick({ target: {} });
assert.equal(state.reloads, options.uploadError ? 0 : 1);
assert.deepEqual(state.cleanups, []);
}
});
@@ -1,195 +0,0 @@
"""Exercise the actual branding RPC against an isolated filesystem and JSON shim."""
import hashlib
import json
import os
from pathlib import Path
import secrets
import shutil
import struct
import subprocess
import tempfile
import unittest
import zlib
ROOT = Path(__file__).resolve().parents[1]
def png(width=64, height=64, color=b'\x30\x70\xe0\xff'):
def chunk(kind, data):
return struct.pack('>I', len(data)) + kind + data + struct.pack('>I', zlib.crc32(kind + data))
return (b'\x89PNG\r\n\x1a\n' + chunk(b'IHDR', struct.pack('>IIBBBBB', width, height, 8, 6, 0, 0, 0)) +
chunk(b'IDAT', zlib.compress((b'\0' + color * width) * height)) + chunk(b'IEND', b''))
class BrandingTests(unittest.TestCase):
def setUp(self):
self.temp = tempfile.TemporaryDirectory()
self.addCleanup(self.temp.cleanup)
self.root = Path(self.temp.name)
self.directory = self.root / 'branding'
self.lock = self.root / 'lock'
self.prefix = str(self.root / 'upload_')
shim = self.root / 'jshn.sh'
shim.write_text('''json_load() {
FIXTURE_JSON=$1
printf '%s' "$FIXTURE_JSON" | python3 -c 'import json,sys; json.load(sys.stdin)' >/dev/null 2>&1
}
json_get_var() {
fixture_value=$(printf '%s' "$FIXTURE_JSON" | python3 -c 'import json,sys; v=json.load(sys.stdin); print(v.get(sys.argv[1], "") if isinstance(v,dict) else "")' "$2")
export "$1=$fixture_value"
}
json_init() { FIXTURE_JSON='{}'; }
json_add_string() {
FIXTURE_JSON=$(printf '%s' "$FIXTURE_JSON" | python3 -c 'import json,sys; v=json.load(sys.stdin); v[sys.argv[1]]=sys.argv[2]; print(json.dumps(v))' "$1" "$2")
}
json_add_int() {
FIXTURE_JSON=$(printf '%s' "$FIXTURE_JSON" | python3 -c 'import json,sys; v=json.load(sys.stdin); v[sys.argv[1]]=int(sys.argv[2]); print(json.dumps(v))' "$1" "$2")
}
json_dump() { printf '%s\\n' "$FIXTURE_JSON"; }
''')
source = (ROOT / 'root/usr/libexec/rpcd/luci.argon_branding').read_text()
self.script = self.root / 'rpc.sh'
self.script.write_text(source.replace('/usr/share/libubox/jshn.sh', str(shim))
.replace('/www/luci-static/argon/branding', str(self.directory))
.replace('/tmp/argon_branding.lock', str(self.lock))
.replace('/tmp/argon_branding_', self.prefix))
def call(self, method, args=None, env=None):
result = subprocess.run(['sh', str(self.script), 'call', method], input=json.dumps(args or {}) + '\n',
capture_output=True, text=True, check=True, env=env)
return json.loads(result.stdout)
def upload(self, target='both', data=None, env=None):
token = secrets.token_hex(16)
Path(self.prefix + token + '.png').write_bytes(data if data is not None else png())
result = self.call('set', {'target': target, 'token': token}, env=env)
self.assertFalse(self.lock.exists())
self.assertFalse(list(self.directory.glob('.upload.*')))
return result
def test_upload_without_od(self):
# OpenWrt enables hexdump by default, but does not enable od.
fakebin = self.root / 'bin'
fakebin.mkdir()
(fakebin / 'od').write_text('#!/bin/sh\nexit 127\n')
(fakebin / 'od').chmod(0o755)
env = dict(os.environ, PATH=str(fakebin) + os.pathsep + os.environ['PATH'])
for target, width, height in [('favicon', 99, 99), ('logo', 192, 48), ('both', 64, 64)]:
with self.subTest(target=target):
data = png(width, height)
result = self.upload(target, data, env=env)
self.assertEqual(result['result'], 0)
asset = 'image-' + hashlib.sha256(data).hexdigest() + '.png'
for kind in (['favicon', 'logo'] if target == 'both' else [target]):
self.assertEqual(result[kind], asset)
self.assertEqual((self.directory / asset).read_bytes(), data)
manifest = json.loads((self.directory / asset.replace('.png', '.webmanifest')).read_text())
self.assertEqual(manifest['icons'][0]['sizes'], f'{width}x{height}')
self.assertEqual(self.call('get', env=env), result)
def test_independent_upload_reset_and_manifest(self):
self.assertEqual(self.call('get'), {'result': 0, 'favicon': '', 'logo': ''})
first = self.upload()
image = 'image-' + hashlib.sha256(png()).hexdigest() + '.png'
self.assertEqual(first, {'result': 0, 'favicon': image, 'logo': image})
self.assertEqual(self.call('get'), first)
manifest = json.loads((self.directory / image.replace('.png', '.webmanifest')).read_text())
self.assertEqual(manifest['icons'], [{'src': image, 'sizes': '64x64', 'type': 'image/png'}])
self.assertEqual((self.directory / image).stat().st_mode & 0o777, 0o644)
self.assertEqual(self.directory.stat().st_mode & 0o777, 0o755)
second = self.upload('logo', png(192, 48))
self.assertEqual(second['favicon'], image)
self.assertNotEqual(second['logo'], image)
reset = self.call('reset', {'target': 'favicon'})
self.assertEqual(reset['favicon'], '')
self.assertEqual(reset['logo'], second['logo'])
self.assertEqual(self.call('reset', {'target': 'both'}), {'result': 0, 'favicon': '', 'logo': ''})
def test_invalid_images_leave_current_state_intact(self):
first = self.upload()
invalid = [b'<svg onload="alert(1)"></svg>', png()[:-4], png(15, 64), png(1025, 64),
png(64, 32), png() + b'\0' * 1048576, png().replace(b'IDAT', b'ABCD')]
for data in invalid:
with self.subTest(size=len(data)):
self.assertEqual(self.upload(data=data)['result'], 2)
self.assertEqual(self.call('get'), first)
self.assertEqual(list(self.root.glob('upload_*')), [])
def test_changed_content_changes_urls_and_old_generations_are_bounded(self):
first = self.upload()
self.assertEqual(self.upload(), first)
for value in range(5):
current = self.upload(data=png(color=bytes([value, 60, 90, 255])))
self.assertNotEqual(current['favicon'], first['favicon'])
self.assertLessEqual(len(list(self.directory.glob('*.png'))), 2)
self.assertLessEqual(len(list(self.directory.glob('*.webmanifest'))), 2)
self.assertEqual(self.call('get'), current)
def test_invalid_targets_tokens_and_symlink_sources(self):
for args in [{'target': '../elsewhere', 'token': 'a'*32}, {'target': 'logo', 'token': '../../etc/config/argon'},
{'target': 'both', 'token': 'b'*32}, {'target': 'logo', 'token': ''}]:
self.assertEqual(self.call('set', args)['result'], 2)
outside = self.root / 'outside.png'
outside.write_bytes(png())
Path(self.prefix + 'a'*32 + '.png').symlink_to(outside)
self.assertEqual(self.call('set', {'target': 'logo', 'token': 'a'*32})['result'], 2)
self.assertEqual(outside.read_bytes(), png())
self.assertFalse(self.directory.exists())
def test_corrupt_state_and_symlink_assets_fall_back(self):
state = self.upload()
(self.directory / 'current.json').write_text('{broken')
self.assertEqual(self.call('get')['favicon'], '')
(self.directory / 'current.json').write_text(json.dumps({'favicon': '../outside.png', 'logo': state['logo']}))
self.assertEqual(self.call('get')['favicon'], '')
image = self.directory / state['logo']
image.unlink()
image.symlink_to(self.root / 'missing')
self.assertEqual(self.call('get')['logo'], '')
def test_symlink_directory_and_index_cannot_overwrite_other_files(self):
outside = self.root / 'outside'
outside.mkdir()
self.directory.symlink_to(outside)
self.assertEqual(self.upload()['result'], 1)
self.assertEqual(list(outside.iterdir()), [])
self.directory.unlink()
self.directory.mkdir()
sentinel = outside / 'sentinel'
sentinel.write_text('keep me')
(self.directory / 'current.json').symlink_to(sentinel)
self.assertEqual(self.upload()['result'], 1)
self.assertEqual(sentinel.read_text(), 'keep me')
def test_busy_and_failed_publication_preserve_state(self):
first = self.upload()
self.lock.mkdir()
self.assertEqual(self.call('reset', {'target': 'both'})['result'], 3)
self.lock.rmdir()
fakebin = self.root / 'bin'
fakebin.mkdir()
(fakebin / 'mv').write_text('#!/bin/sh\nexit 1\n')
(fakebin / 'mv').chmod(0o755)
env = dict(os.environ, PATH=str(fakebin) + os.pathsep + os.environ['PATH'])
self.assertEqual(self.call('reset', {'target': 'both'}, env=env)['result'], 1)
self.assertEqual(self.call('get'), first)
self.assertFalse(self.lock.exists())
def test_backup_directory_contains_all_state_and_assets(self):
first = self.upload()
keep = (ROOT / 'root/lib/upgrade/keep.d/luci-argon-branding').read_text().splitlines()
self.assertIn('/www/luci-static/argon/branding/', keep)
shutil.copytree(self.directory, self.root / 'backup')
shutil.rmtree(self.directory)
shutil.copytree(self.root / 'backup', self.directory)
self.assertEqual(self.call('get'), first)
self.assertTrue((self.directory / first['favicon']).is_file())
self.assertTrue((self.directory / first['favicon'].replace('.png', '.webmanifest')).is_file())
def test_read_acl_and_fixed_upload_scope(self):
acl = json.loads((ROOT / 'root/usr/share/rpcd/acl.d/luci-app-argon-config.json').read_text())['luci-app-argon-config']
self.assertEqual(acl['read']['ubus']['luci.argon_branding'], ['get'])
self.assertEqual(acl['write']['ubus']['luci.argon_branding'], ['set', 'reset'])
self.assertEqual(acl['write']['file']['/tmp/argon_branding_*.png'], ['write'])
self.assertFalse(any('branding' in name for name in acl['read']['file']))
self.assertFalse(any(name.startswith('/www') for name in acl['write']['file']))
@@ -1,219 +0,0 @@
"""Run shell RPC/build regressions in temporary directories; no router required."""
import ast
import json
import os
from pathlib import Path
import re
import stat
import subprocess
import tempfile
import unittest
ROOT = Path(__file__).resolve().parents[1]
def executable(path, contents):
path.write_text('#!/bin/sh\n' + contents)
path.chmod(0o755)
class RpcTests(unittest.TestCase):
def setUp(self):
self.temp = tempfile.TemporaryDirectory()
self.addCleanup(self.temp.cleanup)
self.root = Path(self.temp.name)
self.background = self.root / 'argon/background'
self.background.mkdir(parents=True)
self.upload = self.root / 'upload.tmp'
self.upload.write_text('uploaded image')
shim = self.root / 'jshn.sh'
shim.write_text('''json_load() {
FIXTURE_JSON=$1
printf '%s' "$FIXTURE_JSON" | python3 -c 'import json,sys; json.load(sys.stdin)' 2>/dev/null
}
json_get_var() {
fixture_value=$(printf '%s' "$FIXTURE_JSON" | python3 -c 'import json,sys; print(json.load(sys.stdin).get(sys.argv[1], ""))' "$2")
export "$1=$fixture_value"
}
json_cleanup() { :; }
''')
source = (ROOT / 'root/usr/libexec/rpcd/luci.argon').read_text()
self.script = self.root / 'luci.argon'
self.script.write_text(source.replace('. /lib/functions.sh', ':')
.replace('. /usr/share/libubox/jshn.sh', f'. "{shim}"')
.replace('/www/luci-static/argon/background', str(self.background))
.replace('/tmp/argon_background.tmp', str(self.upload)))
def call(self, method, arguments, env=None):
process = subprocess.run(['sh', str(self.script), 'call', method],
input=json.dumps(arguments) + '\n', text=True,
capture_output=True, env=env, check=True)
return json.loads(process.stdout)['result']
def test_invalid_names_do_not_mutate_directories(self):
for name in ['', '.', '..', '../outside.jpg', 'a/b.jpg', r'a\b.jpg', '/absolute.jpg']:
for method, field in [('rename', 'newname'), ('remove', 'filename')]:
with self.subTest(name=name, method=method):
before = [stat.S_IMODE(p.stat().st_mode) for p in [self.background, self.background.parent]]
self.assertNotEqual(self.call(method, {field: name}), 0)
self.assertEqual(before, [stat.S_IMODE(p.stat().st_mode) for p in [self.background, self.background.parent]])
self.assertTrue(self.upload.exists())
def test_upload_and_delete_unicode_filename(self):
name = '背景 image.jpg'
self.assertEqual(self.call('rename', {'newname': name}), 0)
target = self.background / name
self.assertEqual(target.read_text(), 'uploaded image')
self.assertEqual(stat.S_IMODE(target.stat().st_mode), 0o644)
self.assertFalse(self.upload.exists())
self.assertEqual(self.call('remove', {'filename': name}), 0)
self.assertFalse(target.exists())
def test_directory_and_symlink_upload_targets_are_rejected(self):
outside = self.root / 'outside'
outside.write_text('keep me')
(self.background / 'directory').mkdir()
(self.background / 'link.jpg').symlink_to(outside)
(self.background / 'broken.jpg').symlink_to(self.root / 'missing')
for name in ['directory', 'link.jpg', 'broken.jpg']:
with self.subTest(name=name):
self.assertNotEqual(self.call('rename', {'newname': name}), 0)
self.assertTrue(self.upload.exists())
self.assertEqual(outside.read_text(), 'keep me')
self.assertNotEqual(self.call('remove', {'filename': 'directory'}), 0)
self.assertTrue((self.background / 'directory').is_dir())
def test_symlink_temporary_file_is_rejected(self):
self.upload.unlink()
outside = self.root / 'outside'
outside.write_text('keep me')
self.upload.symlink_to(outside)
self.assertNotEqual(self.call('rename', {'newname': 'image.jpg'}), 0)
self.assertEqual(outside.read_text(), 'keep me')
def test_failed_remove_reports_failure(self):
fakebin = self.root / 'fakebin'
fakebin.mkdir()
executable(fakebin / 'rm', 'exit 42\n')
target = self.background / 'image.jpg'
target.write_text('keep me')
env = dict(os.environ, PATH=str(fakebin) + os.pathsep + os.environ['PATH'])
self.assertNotEqual(self.call('remove', {'filename': 'image.jpg'}, env), 0)
self.assertTrue(target.exists())
def test_invalid_json_is_rejected(self):
process = subprocess.run(['sh', str(self.script), 'call', 'rename'],
input='invalid json\n', text=True, capture_output=True, check=True)
self.assertNotEqual(json.loads(process.stdout)['result'], 0)
self.assertTrue(self.upload.exists())
def test_read_acl_does_not_grant_mutation(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']), {'avail'})
self.assertEqual(set(acl['write']['ubus']['luci.argon']), {'remove', 'rename'})
class BuildTests(unittest.TestCase):
def setUp(self):
self.temp = tempfile.TemporaryDirectory()
self.addCleanup(self.temp.cleanup)
self.root = Path(self.temp.name)
self.builder = self.root / 'builder'
self.builder.mkdir()
for name in ['scripts', 'package', 'bin/luci-app-argon-config', 'bin/luci-theme-argon', 'logs']:
(self.builder / name).mkdir(parents=True)
(self.builder / 'feeds.conf.default').write_text('fixture feeds\n')
(self.builder / 'logs/build.log').write_text('build log')
executable(self.builder / 'scripts/feeds', '''[ "${FIXTURE_FEED_STATUS:-0}" -eq 0 ] || exit "$FIXTURE_FEED_STATUS"
if [ "$1" = update ]; then
shift
for feed in "$@"; do
mkdir -p "feeds/$feed"
done
elif [ "$1" = install ] && [ -d feeds/base ]; then
# Model a core dependency resolved from the SDK's base feed.
mkdir -p package/feeds/base/openssl
printf 'fixture dependency' > package/feeds/base/openssl/Makefile
fi
''')
fakebin = self.root / 'fakebin'
fakebin.mkdir()
executable(fakebin / 'sed', 'exit 0\n') # Avoid BSD/GNU sed differences.
executable(fakebin / 'nproc', 'echo 1\n')
executable(fakebin / 'make', '''[ "$1" = defconfig ] && exit 0
[ "${FIXTURE_COMPILE_STATUS:-0}" -eq 0 ] || exit "$FIXTURE_COMPILE_STATUS"
if [ "${FIXTURE_REQUIRE_BASE:-0}" -eq 1 ] && [ ! -f package/feeds/base/openssl/Makefile ]; then
echo 'fatal error: openssl/des.h: No such file or directory' >&2
exit 86
fi
mkdir -p bin/packages/x86_64/base
if [ "${FIXTURE_MISSING_PACKAGE:-0}" -eq 0 ]; then
printf 'package' > "bin/packages/x86_64/base/luci-app-argon-config.${FIXTURE_FORMAT:-ipk}"
fi
''')
self.env = dict(os.environ, PATH=str(fakebin) + os.pathsep + os.environ['PATH'])
self.script = self.root / 'build.sh'
self.script.write_text((ROOT / '.github/workflows/build.sh').read_text().replace('cd /builder', f'cd "{self.builder}"'))
def run_build(self, **variables):
env = dict(self.env, **variables)
return subprocess.run(['sh', str(self.script)], env=env, text=True, capture_output=True)
def test_compile_failure_is_preserved_and_logs_are_archived(self):
result = self.run_build(FIXTURE_COMPILE_STATUS='42')
self.assertEqual(result.returncode, 42, result.stderr)
self.assertTrue((self.builder / 'bin/logs.tar.xz').exists())
def test_core_dependencies_are_available_for_compilation(self):
result = self.run_build(FIXTURE_REQUIRE_BASE='1')
self.assertEqual(result.returncode, 0, result.stderr)
def test_feed_failure_stops_build(self):
result = self.run_build(FIXTURE_FEED_STATUS='39')
self.assertEqual(result.returncode, 39, result.stderr)
self.assertTrue((self.builder / 'bin/luci-app-argon-config').exists())
def test_missing_package_fails_even_if_compile_succeeds(self):
result = self.run_build(FIXTURE_MISSING_PACKAGE='1')
self.assertNotEqual(result.returncode, 0)
self.assertIn('did not produce', result.stderr)
def test_success_moves_packages_and_archives_logs(self):
result = self.run_build(FIXTURE_FORMAT='apk')
self.assertEqual(result.returncode, 0, result.stderr)
self.assertTrue((self.builder / 'package/luci-app-argon-config').is_dir())
self.assertTrue((self.builder / 'package/luci-theme-argon').is_dir())
self.assertTrue((self.builder / 'bin/logs.tar.xz').exists())
class TranslationTests(unittest.TestCase):
def test_catalogs_cover_current_messages_and_preserve_placeholders(self):
source = '\n'.join(path.read_text() for path in (ROOT / 'htdocs/luci-static/resources').rglob('*.js'))
acl = json.loads((ROOT / 'root/usr/share/rpcd/acl.d/luci-app-argon-config.json').read_text())
messages = set(re.findall(r"_\('([^']*)'\)", source)) | {'Argon Config', acl['luci-app-argon-config']['description']}
catalogs = sorted((ROOT / 'po').glob('*/argon-config.po'))
self.assertTrue(catalogs)
for path in catalogs:
language = path.parent.name
translations = {}
current = {}
field = None
for line in path.read_text().splitlines() + ['']:
if not line:
if 'msgid' in current:
translations[current['msgid']] = current.get('msgstr', '')
current, field = {}, None
elif line.startswith(('msgid ', 'msgstr ')):
field, value = line.split(' ', 1)
current[field] = ast.literal_eval(value)
elif line.startswith('"') and field:
current[field] += ast.literal_eval(line)
for message in messages:
with self.subTest(language=language, message=message):
self.assertTrue(translations.get(message))
self.assertEqual(re.findall(r'%[^\s]*?[sm]', message), re.findall(r'%[^\s]*?[sm]', translations[message]))
self.assertEqual(re.findall(r'</?[^>]+>', message), re.findall(r'</?[^>]+>', translations[message]))
if __name__ == '__main__':
unittest.main()
+1 -1
View File
@@ -12,7 +12,7 @@ LUCI_DEPENDS:=+luci-base +logd +jsonfilter
LUCI_PKGARCH:=all
PKG_VERSION:=0.1.55
PKG_RELEASE:=72
PKG_RELEASE:=73
# Reproducible build: honor SOURCE_DATE_EPOCH from the build environment (set by docker-sdk.sh / CI).
ifdef SOURCE_DATE_EPOCH
@@ -316,15 +316,18 @@ fwlive_adaptive_compute_limit() {
_limit=$_max
_probe=0
# Hot/warm: hold the previous limit while samples stay hot, and probe
# upward on the first healthy sample. Record may retain that step above
# the lines just served (same as a full-sized cold probe).
# Hot/warm: hold the previous limit while samples stay hot or warm, and
# probe upward on the first healthy sample. A hot sample never holds a
# limit above the hot floor. Record may retain a healthy step above the
# lines just served (same as a full-sized cold probe).
case "$_prev_b" in
hot|warm)
if [ "$_prev_c" -gt 0 ]; then
if [ "$_ms" -gt "$FWLIVE_ADAPTIVE_HOT_EXIT_MS" ] || \
[ "$_bucket" = hot ]; then
_limit=$_prev_l
[ "$_bucket" = hot ] && [ "$_limit" -gt "$FWLIVE_ADAPTIVE_HOT_FLOOR" ] && \
_limit=$FWLIVE_ADAPTIVE_HOT_FLOOR
fwlive_adaptive_clamp "$_req" "$_max"
printf '%s\n' "$_limit"
return 0
@@ -945,11 +945,10 @@ restore_wan_zone_log() {
logger -t fwlive "WAN log rollback skipped: commit generation unavailable" 2>/dev/null || true
return 1
}
# Capture the committed value before staging our rollback. If another
# writer stages a firewall delta after this point, the post-stage guard
# may revert our option only when its staged log delta is still uniquely
# identifiable; otherwise it preserves the ambiguous same-option change.
committed=$(wan_zone_log_value "$zone")
# If another writer stages a firewall delta after this point, the
# post-stage guard may revert our option only when its staged log
# delta is still uniquely identifiable; otherwise it preserves the
# ambiguous same-option change.
# Fail closed if set/delete never staged. Swallowed rc plus an empty
# changes list would make `uci commit` succeed as a no-op.
if [ -z "$previous" ]; then
+2 -1
View File
@@ -319,7 +319,8 @@ map_uci_rule_targets() {
done <<EOF
$_uci_names
EOF
[ -z "$_targets_overflow" ] || _map_overflow=1
# Target overflow omits remaining suffixes only. Do not set
# _map_overflow: truncated means rule labels were capped.
}
# One awk pass; output encoding depends on mode (default: raw). Raw mode emits
+2 -2
View File
@@ -8,8 +8,8 @@ include $(TOPDIR)/rules.mk
LUCI_TITLE:=KaiPlus
PKG_VERSION:=1.0.9
PKG_RELEASE:=11
LUCI_DEPENDS:=+kaiplus +luci-compat +luci-lib-linkeaseauth +linkease-app-entry
PKG_RELEASE:=12
LUCI_DEPENDS:=+kaiplus +luci-compat +luci-lib-taskd +luci-lib-linkeaseauth +linkease-app-entry
LUCI_MINIFY_CSS:=0
LUCI_MINIFY_JS:=0
+88 -6
View File
@@ -1,3 +1,5 @@
local http = require "luci.http"
module("luci.controller.kaiplus", package.seeall)
function index()
@@ -9,9 +11,36 @@ function index()
open.sysauth_authenticator = "htmlauth"
if not nixio.fs.access("/etc/config/kaiplus") then return end
local install_kai = entry({"admin", "services", "kaiplus", "install_kai"}, call("install_kai"))
install_kai.leaf = true
entry({"admin", "services", "kaiplus"}, cbi("kaiplus"), _("KaiPlus"), 100).dependent = true
end
local function write_json(obj)
http.prepare_content("application/json")
http.write_json(obj)
end
local function require_post_csrf()
local dispatcher = require "luci.dispatcher"
local context = dispatcher.context or {}
local expected = context.authtoken or context.token
if (http.getenv("REQUEST_METHOD") or "") ~= "POST" then
http.status(405, "Method Not Allowed")
write_json({ ok = false, error = "method not allowed" })
return false
end
if not context.authsession or not expected or http.formvalue("token") ~= expected then
http.status(403, "Forbidden")
write_json({ ok = false, error = "invalid csrf token" })
return false
end
return true
end
local function compat()
local dispatcher = require "luci.dispatcher"
return require("luci.model.linkease.apps_compat").new({
@@ -22,16 +51,19 @@ local function compat()
end
function kaiplus_status()
local fs = require "nixio.fs"
local sys = require "luci.sys"
local uci = require("luci.model.uci").cursor()
local external_port_enabled = uci:get_first("kaiplus", "kaiplus", "external_port_enabled") == "1"
compat():legacy_status("kaiplus", {
running = sys.call("pidof kaiplus_bin >/dev/null") == 0,
running = sys.call("pidof kaiplus >/dev/null") == 0,
kai_installed = not not (
fs.access("/usr/share/kai/kai-plugin.json")
and fs.access("/usr/lib/lua/luci/controller/kai.lua")
),
port = uci:get_first("kaiplus", "kaiplus", "port") or "8189",
base_path = uci:get_first("kaiplus", "kaiplus", "base_path") or "/apps/kaiplus/",
listen_mode = uci:get_first("kaiplus", "kaiplus", "listen_mode") or "auto",
socket_path = uci:get_first("kaiplus", "kaiplus", "socket_path") or "/var/run/kaiplus.sock",
external_port_enabled = external_port_enabled,
base_path = "/apps/kaiplus/",
listen_mode = "tcp",
external_port_enabled = true,
lan_ip = uci:get("network", "lan", "ipaddr") or ""
})
end
@@ -39,3 +71,53 @@ end
function kaiplus_open()
compat():open("kaiplus")
end
function install_kai()
local fs = require "nixio.fs"
local jsonc = require "luci.jsonc"
local sys = require "luci.sys"
local util = require "luci.util"
local task_id = "kaiplus-kai-install"
if not require_post_csrf() then
return
end
if fs.access("/usr/share/kai/kai-plugin.json")
and fs.access("/usr/lib/lua/luci/controller/kai.lua") then
write_json({ ok = true, installed = true })
return
end
if not fs.access("/etc/init.d/tasks") then
write_json({ ok = false, error = "taskd is not available" })
return
end
if not fs.access("/bin/is-opkg") then
write_json({ ok = false, error = "iStore package installer is not available" })
return
end
local task_status = sys.exec("/etc/init.d/tasks task_status " .. task_id .. " 2>/dev/null")
local status = jsonc.parse(task_status) or {}
local running = type(status) == "table" and status.running
if running == true or running == 1 or running == "1" or running == "true" then
write_json({ ok = true, busy = true, task_id = task_id })
return
end
local install_script = table.concat({
'set -e',
'echo "[KaiPlus] Installing classic KAI..."',
'/bin/is-opkg install luci-app-kai',
'rm -f /tmp/luci-indexcache',
'echo "[KaiPlus] Classic KAI installed successfully."'
}, "\n")
local command = "/bin/sh -c " .. util.shellquote(install_script)
local rc = sys.call("/etc/init.d/tasks task_add " .. task_id .. " " .. util.shellquote(command) .. " >/dev/null 2>&1")
if rc ~= 0 then
write_json({ ok = false, error = "failed to start KAI installation", task_id = task_id })
return
end
write_json({ ok = true, task_id = task_id })
end
+2 -33
View File
@@ -31,41 +31,10 @@ for _, val in pairs(paths) do
end
data_dir.default = default_path
local listen_mode = s:option(ListValue, "listen_mode", translate("Listen mode"))
listen_mode:value("auto", translate("Auto"))
listen_mode:value("unix", translate("Unix socket"))
listen_mode:value("tcp", translate("TCP port"))
listen_mode.default = "auto"
listen_mode.rmempty = false
local external_port_enabled = s:option(Flag, "external_port_enabled", translate("Enable external port access"))
external_port_enabled.default = "0"
external_port_enabled.rmempty = false
local socket_path = s:option(Value, "socket_path", translate("Unix socket path"))
socket_path.default = "/var/run/kaiplus.sock"
socket_path.rmempty = false
socket_path.readonly = true
local port = s:option(Value, "port", translate("Web port"))
local port = s:option(Value, "port", translate("Access port"))
port.default = "8189"
port.rmempty = false
port.datatype = "port"
port.description = translate("Port for the KaiPlus web service.")
local bind_addr = s:option(Value, "bind_addr", translate("Bind address"))
bind_addr.default = "0.0.0.0"
bind_addr.rmempty = false
local base_path = s:option(Value, "base_path", translate("Base path"))
base_path.default = "/apps/kaiplus/"
base_path.rmempty = false
base_path.readonly = true
local release_channel = s:option(ListValue, "release_channel", translate("Release channel"))
release_channel:value("stable", translate("Stable"))
release_channel:value("canary", translate("Canary"))
release_channel.default = "stable"
release_channel.rmempty = false
port.description = translate("KaiPlus is available at http://router-address:port/apps/kaiplus/.")
return m
@@ -1,7 +1,68 @@
<%+tasks/embed%>
<style type="text/css">
.kaiplus-actions {
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 8px;
margin: 16px;
}
.kaiplus-actions .cbi-button {
min-height: 40px;
transition: transform 120ms ease-out;
}
.kaiplus-actions .cbi-button:active {
transform: scale(0.96);
}
</style>
<script type="text/javascript">//<![CDATA[
var kaiInstalled = false;
var kaiLuciUrl = '<%=url("admin/services/kai")%>';
var kaiInstallUrl = '<%=url("admin/services/kaiplus/install_kai")%>';
var kaiCsrfToken = (window.taskd && window.taskd.csrfToken) || '';
function openClassicKai() {
var button = document.getElementById('kaiplus-open-kai');
if (kaiInstalled) {
window.location.href = kaiLuciUrl;
return;
}
if (!window.confirm('<%:Classic KAI is not installed. Install it now?%>')) return;
if (!window.taskd || !window.taskd.show_log) {
window.alert('<%:Task log window is not available.%>');
return;
}
button.disabled = true;
button.value = '<%:Starting installation...%>';
(new XHR()).post(kaiInstallUrl, { token: kaiCsrfToken }, function(x) {
var data = {};
button.disabled = false;
button.value = '<%:Classic KAI%>';
if (x && x.responseText) {
try { data = JSON.parse(x.responseText || '{}'); }
catch (e) { data = {}; }
}
if (!data.ok) {
window.alert(data.error || '<%:Failed to start KAI installation.%>');
return;
}
if (data.installed) {
kaiInstalled = true;
window.location.href = kaiLuciUrl;
return;
}
window.taskd.show_log(data.task_id || 'kaiplus-kai-install');
});
}
XHR.poll(5, '<%=url("admin/services/kaiplus_status")%>', null, function(x, st) {
var el = document.getElementById('kaiplus_status');
var openButton = document.getElementById('kaiplus-open');
if (st && el) {
kaiInstalled = st.kai_installed === true;
var status = st.running
? '<br/><em style=\"color:green\"><%:The KaiPlus service is running.%></em>'
: '<br/><em style=\"color:red\"><%:The KaiPlus service is not running.%></em>';
@@ -15,10 +76,7 @@ XHR.poll(5, '<%=url("admin/services/kaiplus_status")%>', null, function(x, st) {
status = status + '<br/><em><%:External port access is disabled.%></em>';
}
el.innerHTML = status;
if (st.running) {
el.innerHTML = el.innerHTML
+ "<br/><br/><input class=\"btn cbi-button cbi-button-apply\" type=\"button\" value=\" <%:Click to open KaiPlus%> \" onclick=\"window.open('<%=url("admin/services/kaiplus/open")%>')\"/>";
}
if (openButton) openButton.style.display = st.running ? '' : 'none';
}
});
//]]></script>
@@ -28,4 +86,8 @@ XHR.poll(5, '<%=url("admin/services/kaiplus_status")%>', null, function(x, st) {
<p id="kaiplus_status">
<em><%:Collecting data...%></em>
</p>
<div class="kaiplus-actions">
<input id="kaiplus-open" class="btn cbi-button cbi-button-apply" type="button" value=" <%:Click to open KaiPlus%> " onclick="window.open('<%=url("admin/services/kaiplus/open")%>')" style="display:none"/>
<input id="kaiplus-open-kai" class="btn cbi-button" type="button" value=" <%:Classic KAI%> " onclick="openClassicKai()"/>
</div>
</fieldset>
+65
View File
@@ -0,0 +1,65 @@
msgid ""
msgstr "Content-Type: text/plain; charset=UTF-8"
msgid "KaiPlus"
msgstr "酷友社AI"
msgid "KaiPlus is an AI workspace and session service."
msgstr "酷友社AI 是一款 AI 工作区与会话服务。"
msgid "Global settings"
msgstr "全局设置"
msgid "Enable"
msgstr "启用"
msgid "Data directory"
msgstr "数据目录"
msgid "Required. KaiPlus stores workspace, cache, config, and state under this directory."
msgstr "必填。酷友社AI 会在此目录中保存工作区、缓存、配置和状态数据。"
msgid "Access port"
msgstr "访问端口"
msgid "KaiPlus is available at http://router-address:port/apps/kaiplus/."
msgstr "可通过 http://路由器地址:端口/apps/kaiplus/ 访问酷友社AI。"
msgid "The KaiPlus service is running."
msgstr "酷友社AI 服务正在运行。"
msgid "The KaiPlus service is not running."
msgstr "酷友社AI 服务未运行。"
msgid "Access mode: LinkEase Desktop proxy."
msgstr "访问模式:LinkEase Desktop 代理。"
msgid "Access mode: external port."
msgstr "访问模式:外部端口。"
msgid "External port access is disabled."
msgstr "外部端口访问已禁用。"
msgid "Click to open KaiPlus"
msgstr "点击打开酷友社AI"
msgid "Classic KAI"
msgstr "经典版 KAI"
msgid "Classic KAI is not installed. Install it now?"
msgstr "尚未安装经典版 KAI,是否现在安装?"
msgid "Task log window is not available."
msgstr "任务日志窗口不可用。"
msgid "Starting installation..."
msgstr "正在启动安装……"
msgid "Failed to start KAI installation."
msgstr "无法启动经典版 KAI 安装任务。"
msgid "Status"
msgstr "状态"
msgid "Collecting data..."
msgstr "正在获取数据……"
+1
View File
@@ -0,0 +1 @@
zh-cn
@@ -0,0 +1,57 @@
from pathlib import Path
import unittest
APP_DIR = Path(__file__).resolve().parents[1]
class ClassicKaiEntryContractTest(unittest.TestCase):
def read(self, relative):
return (APP_DIR / relative).read_text(encoding="utf-8")
def test_status_reports_classic_kai_manifest(self):
controller = self.read("luasrc/controller/kaiplus.lua")
self.assertIn('fs.access("/usr/share/kai/kai-plugin.json")', controller)
self.assertIn('fs.access("/usr/lib/lua/luci/controller/kai.lua")', controller)
def test_entry_opens_kai_luci_and_prompts_to_install_when_missing(self):
controller = self.read("luasrc/controller/kaiplus.lua")
status = self.read("luasrc/view/kaiplus/kaiplus_status.htm")
self.assertNotIn('entry({"admin", "services", "kaiplus", "open_kai"}', controller)
self.assertIn('url("admin/services/kai")', status)
self.assertIn("st.kai_installed === true", status)
self.assertIn("function openClassicKai()", status)
self.assertIn("Classic KAI is not installed. Install it now?", status)
self.assertIn("window.location.href = kaiLuciUrl", status)
def test_missing_kai_starts_taskd_install_and_opens_log(self):
makefile = self.read("Makefile")
controller = self.read("luasrc/controller/kaiplus.lua")
status = self.read("luasrc/view/kaiplus/kaiplus_status.htm")
self.assertIn("+luci-lib-taskd", makefile)
self.assertIn('<%+tasks/embed%>', status)
self.assertIn('entry({"admin", "services", "kaiplus", "install_kai"}', controller)
self.assertIn("require_post_csrf()", controller)
self.assertIn("/bin/is-opkg install luci-app-kai", controller)
self.assertNotIn("app-meta-kai", controller)
self.assertIn("/etc/init.d/tasks task_add ", controller)
self.assertIn("window.taskd.show_log", status)
self.assertIn("token: kaiCsrfToken", status)
def test_action_buttons_share_one_row(self):
status = self.read("luasrc/view/kaiplus/kaiplus_status.htm")
actions = status.index('<div class="kaiplus-actions">')
kaiplus = status.index('id="kaiplus-open"', actions)
classic = status.index('id="kaiplus-open-kai"', actions)
actions_end = status.index("</div>", classic)
self.assertLess(kaiplus, classic)
self.assertLess(classic, actions_end)
self.assertIn("margin: 16px;", status)
if __name__ == "__main__":
unittest.main()
+2 -2
View File
@@ -1,8 +1,8 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=luci-app-open-box
PKG_VERSION:=0.1.344
PKG_RELEASE:=40
PKG_VERSION:=0.1.347.1
PKG_RELEASE:=41
PKG_MAINTAINER:=liandu2024
PKG_LICENSE:=GPL-3.0-or-later
+1 -1
View File
@@ -4,7 +4,7 @@ include $(TOPDIR)/rules.mk
PKG_NAME:=luci-app-openvpn-client
PKG_VERSION:=20250227
PKG_RELEASE:=3
PKG_RELEASE:=4
LUCI_TITLE:=LuCI support for OpenVPN Client
LUCI_DEPENDS:=+openvpn-openssl +kmod-tun
@@ -35,10 +35,6 @@ o:value("tun", "TUN")
o:value("tap", "TAP")
o.rmempty = false
o = s:option(Flag, "lzo", translate("LZO compression"))
o.default = "1"
o.rmempty = false
o = s:option(Flag, "route_nopull", translate("No pull route"))
o.default = "1"
o.rmempty = false
@@ -43,9 +43,6 @@ msgstr "协议"
msgid "Type"
msgstr "类型"
msgid "LZO compression"
msgstr "LZO 压缩"
msgid "No pull route"
msgstr "不拉取路由"
@@ -47,9 +47,6 @@ start_instance() {
local _key="key key"
}
local c_lzo=$(uci -q get ${CONFIG}.${cfgid}.lzo)
[ "${c_lzo}" = "1" ] && local _lzo="comp-lzo"
local c_route_nopull=$(uci -q get ${CONFIG}.${cfgid}.route_nopull)
[ "${c_route_nopull}" = "1" ] && local _route_nopull="route-nopull"
@@ -201,7 +198,6 @@ start_instance() {
${_auth_user_pass}
${_tls_auth}
${_tls_crypt}
${_lzo}
${_route_nopull}
verb 3
+1 -1
View File
@@ -8,7 +8,7 @@ include $(TOPDIR)/rules.mk
PKG_NAME:=luci-app-passwall
PKG_VERSION:=26.10.22
PKG_RELEASE:=345
PKG_RELEASE:=346
PKG_PO_VERSION:=$(PKG_VERSION)
PKG_CONFIG_DEPENDS:= \
@@ -261,8 +261,9 @@ function get_redir_log()
if id and id ~= "default" then
local global_node = uci_get("@global[0]", "node") or "nil"
local acl_node = uci_get(id, "node") or "nil"
local use_global_config = uci_get(id, "use_global_config") == "1"
local global_enabled = uci_get("@global[0]", "enabled") == "1"
if acl_node == global_node and global_enabled then
if (use_global_config or acl_node == global_node) and global_enabled then
path = api.TMP_PATH .. "/acl/default"
if uci_get("@global[0]", "log_node") ~= "1" then
alert("The access control node is the same as the global node. Please enable global logging.")
@@ -273,7 +274,8 @@ function get_redir_log()
end
end
if fs.access(path .. "/" .. name .. ".log") then
path = path .. "/" .. name .. ".log"
if fs.access(path) then
http.prepare_content("text/plain; charset=utf-8")
http.write(luci.sys.exec("tail -n 5000 " .. util.shellquote(path)))
else
@@ -299,9 +301,11 @@ function get_chinadns_log()
if flag ~= "default" then
local global_node = uci_get("@global[0]", "node") or "nil"
local acl_node = uci_get(flag, "node") or "nil"
if acl_node == global_node and uci_get("@global[0]", "enabled") == "1" then
local use_global_config = uci_get(flag, "use_global_config") == "1"
if (use_global_config or acl_node == global_node) and uci_get("@global[0]", "enabled") == "1" then
path = api.TMP_PATH .. "/acl/default/chinadns_ng.log"
if uci_get("@global[0]", "log_chinadns_ng") ~= "1" then
http.prepare_content("text/html; charset=utf-8")
http.write(string.format("<script>alert('%s');window.close();</script>", i18n.translate("The access control node is the same as the global node. Please enable global logging.")))
return
end
+1 -1
View File
@@ -4,7 +4,7 @@ LUCI_TITLE:=luci-app-ssr-plus
LUCI_PKGARCH:=all
PKG_NAME:=luci-app-ssr-plus
PKG_VERSION:=198
PKG_RELEASE:=95
PKG_RELEASE:=96
PKG_CONFIG_DEPENDS:= \
CONFIG_PACKAGE_$(PKG_NAME)_Iptables_Transparent_Proxy \
@@ -932,9 +932,11 @@ o:value("5", "v5 (UUID / Password)")
o:value("4", "v4 (Token)")
o.default = "5"
o:depends({type = "v2ray", v2ray_protocol = "tuic"})
o = s:option(Value, "xray_tuic_token", "TUIC Token")
o.password = true
o:depends({type = "v2ray", v2ray_protocol = "tuic", xray_tuic_version = "4"})
o = s:option(Value, "xray_tuic_ca", translate("Certificate File Path"))
o:depends({type = "v2ray", v2ray_protocol = "tuic"})
@@ -1136,26 +1138,32 @@ o = s:option(Value, "xray_kcptun_key", "Kcptun Key")
o:depends("transport", "kcptun")
o.password = true
o.rmempty = false
o = s:option(ListValue, "xray_kcptun_crypt", "Kcptun Encryption")
o:depends("transport", "kcptun")
for _, crypt in ipairs({"aes", "aes-128", "aes-192", "aes-128-gcm", "salsa20", "tea", "xor", "none", "null", "blowfish", "twofish", "cast5", "3des", "xtea"}) do o:value(crypt, crypt) end
o.default = "aes"
o = s:option(ListValue, "xray_kcptun_mode", "Kcptun Mode")
o:depends("transport", "kcptun")
for _, mode in ipairs({"normal", "fast", "fast2", "fast3", "manual"}) do o:value(mode, mode) end
o.default = "fast"
o = s:option(ListValue, "xray_kcptun_smuxver", "Kcptun smux Version")
o:depends("transport", "kcptun")
o:value("1", "v1")
o:value("2", "v2")
o.default = "1"
o = s:option(Flag, "xray_kcptun_nocomp", translate("Disable Compression"))
o:depends("transport", "kcptun")
o.default = "0"
o = s:option(Value, "xray_kcptun_conn", translate("Connections"))
o:depends("transport", "kcptun")
o.datatype = "range(1,256)"
o.default = "1"
o = s:option(TextValue, "xray_kcptun_options", "Kcptun Advanced Options (JSON)")
o:depends("transport", "kcptun")
o.rows = 4
@@ -1538,28 +1546,34 @@ for _, proto in ipairs({"vmess", "vless", "trojan", "shadowsocks"}) do
o:depends({type = "v2ray", v2ray_protocol = proto, transport = "raw", tls = false, reality = false})
end
o.description = translate("ShadowTLS protects TCP connections. The inner proxy protocol must provide encryption.")
o = s:option(ListValue, "xray_shadowtls_version", "ShadowTLS Version")
o:depends("xray_shadowtls", "1")
o:value("3", "v3")
o:value("2", "v2")
o:value("1", "v1")
o.default = "3"
o = s:option(Value, "xray_shadowtls_password", "ShadowTLS Password")
o:depends({xray_shadowtls = "1", xray_shadowtls_version = "2"})
o:depends({xray_shadowtls = "1", xray_shadowtls_version = "3"})
o.password = true
o.rmempty = false
o = s:option(Value, "xray_shadowtls_sni", "ShadowTLS SNI")
o:depends("xray_shadowtls", "1")
o.datatype = "hostname"
o.rmempty = false
o = s:option(ListValue, "xray_shadowtls_fingerprint", translate("TLS Client Fingerprint"))
o:depends("xray_shadowtls", "1")
for _, fp in ipairs({"chrome", "firefox", "safari", "ios", "android", "edge", "none"}) do o:value(fp, fp) end
o.default = "chrome"
o = s:option(Flag, "xray_shadowtls_strict", translate("TLS 1.3 Strict mode"))
o:depends({xray_shadowtls = "1", xray_shadowtls_version = "3"})
o.default = "1"
o = s:option(Flag, "xray_shadowtls_insecure", translate("Allow Insecure"))
o:depends("xray_shadowtls", "1")
o.default = "0"
@@ -1699,7 +1713,6 @@ o:depends("xtls", true)
o:depends("reality", true)
o.rmempty = true
o:depends({type = "v2ray", v2ray_protocol = "tuic"})
o:depends({type = "v2ray", v2ray_protocol = "naive"})
-- TLS ALPN
@@ -1983,6 +1996,7 @@ for _, field in ipairs({
o.default = "0"
o:depends({type = "v2ray", v2ray_protocol = "naive"})
end
for _, field in ipairs({
{"naive_certificate_file", "Naive trusted CA certificate file"},
{"naive_ech_config", "Naive ECH config list (base64)"}
@@ -242,7 +242,6 @@ o.rmempty = true
o:depends("tls", "1")
o:depends("type", "tuic")
o:depends("type", "anytls")
o:depends("type", "naive")
o = s:option(Value, "tls_keyFile", translate("Private Key File Path"))
@@ -251,9 +250,9 @@ o.rmempty = true
o:depends("tls", "1")
o:depends("type", "tuic")
o:depends("type", "anytls")
o:depends("type", "naive")
-- ========== 传输层设置 (Transport) ==========
o:depends("type", "naive")
o = s:option(ListValue, "transport", translate("Transport Protocol"))
o:value("tcp", "TCP")
@@ -430,15 +429,18 @@ end
o = s:option(Value, "snell_psk", translate("Snell PSK"))
o.password = true
o:depends("type", "snell")
o = s:option(ListValue, "snell_version", translate("Snell Version"))
for _, version in ipairs({"1", "2", "3", "4", "5"}) do o:value(version, "v" .. version) end
o.default = "4"
o:depends("type", "snell")
o = s:option(ListValue, "snell_obfs", translate("Snell Obfs"))
o:value("", translate("Disable"))
o:value("http", "HTTP")
o:value("tls", "TLS")
o:depends("type", "snell")
o = s:option(Flag, "snell_udp", translate("UDP Relay"))
o.default = "1"
for _, version in ipairs({"3", "4", "5"}) do
@@ -448,6 +450,7 @@ end
o = s:option(Value, "anytls_password", translate("Password"))
o.password = true
o:depends("type", "anytls")
o = s:option(TextValue, "anytls_padding", "AnyTLS Padding Scheme")
o.rows = 5
o.rmempty = true
@@ -459,19 +462,23 @@ for _, v in ipairs({"aes-128-cfb", "aes-192-cfb", "aes-256-cfb", "aes-128-ctr",
o.default = "aes-128-cfb"
o.rmempty = false
o:depends("type", "ssr-xray")
o = s:option(ListValue, "ssr_protocol", translate("Protocol"))
for _, v in ipairs({"origin", "auth_sha1_v4", "auth_aes128_md5", "auth_aes128_sha1", "auth_chain_a", "auth_chain_b"}) do o:value(v) end
o.default = "auth_aes128_sha1"
o.rmempty = false
o:depends("type", "ssr-xray")
o = s:option(Value, "ssr_protocol_param", "SSR Protocol Param")
o.description = "1001:password1,1002:password2"
o:depends("type", "ssr-xray")
o = s:option(ListValue, "ssr_obfs", translate("Obfs"))
for _, v in ipairs({"plain", "http_simple", "http_post", "random_head", "tls1.2_ticket_auth", "tls1.2_ticket_fastauth"}) do o:value(v) end
o.default = "plain"
o.rmempty = false
o:depends("type", "ssr-xray")
o = s:option(Value, "ssr_obfs_param", translate("Obfs param (optional)"))
o.description = "HTTP Host: example.com,example.org"
o:depends({type = "ssr-xray", ssr_obfs = "http_simple"})
+28 -34
View File
@@ -1571,15 +1571,15 @@ generate_xray_config() {
{
"log": {
"loglevel": "warning"
},
"inbounds": [$inbound_json],
"outbounds": [
{
"protocol": "freedom",
"settings": {}
}
]
}
},
"inbounds": [$inbound_json],
"outbounds": [
{
"protocol": "freedom",
"settings": {}
}
]
}
EOF
return 0
}
@@ -2260,7 +2260,6 @@ get_udp_relay_mode() {
naive)
[ "$(uci_get_by_name "$node" naive_udp_over_tcp 0)" = "1" ] && echo "native" || echo "disabled"
;;
http)
echo "disabled"
;;
@@ -2754,7 +2753,6 @@ start_server() {
ln_start_bin "$xray_bin" xray-server-$server_count run -c "$config_file"
echolog "Server: Xray NaiveProxy Server$server_count Started!"
;;
ssr-xray)
xray_bin="$(first_type xray)"
[ -x "$xray_bin" ] || return 1
@@ -2764,7 +2762,6 @@ start_server() {
ln_start_bin "$xray_bin" xray-server-$server_count run -c "$config_file"
echolog "Server: Xray ShadowsocksR Server$server_count Started!"
;;
anytls)
xray_bin="$(first_type xray)"
[ -x "$xray_bin" ] || return 1
@@ -2774,7 +2771,6 @@ start_server() {
ln_start_bin "$xray_bin" xray-server-$server_count run -c "$config_file"
echolog "Server: Xray AnyTLS Server$server_count Started!"
;;
snell)
xray_bin="$(first_type xray)"
[ -x "$xray_bin" ] || return 1
@@ -2784,7 +2780,6 @@ start_server() {
ln_start_bin "$xray_bin" xray-server-$server_count run -c "$config_file"
echolog "Server: Xray Snell Server$server_count Started!"
;;
tuic)
xray_bin="$(first_type xray)"
[ -x "$xray_bin" ] || return 1
@@ -2794,7 +2789,6 @@ start_server() {
ln_start_bin "$xray_bin" xray-server-$server_count run -c "$config_file"
echolog "Server: Xray TUIC Server$server_count Started!"
;;
vmess|vless|trojan|shadowsocks)
# Xray 服务端支持
port=$(uci_get_by_name "$1" server_port)
@@ -3060,26 +3054,26 @@ start_rules() {
fi
elif [ "$USE_TABLES" = "iptables" ]; then
ARG_A=""
fi
/usr/share/shadowsocksr/gfw2ipset.sh
/usr/bin/ssr-rules \
-s "$server" \
-l "$local_port" \
-S "$udp_server" \
-L "$udp_local_port" \
-a "$ac_ips" \
-i "/etc/ssrplus/china_ssr.txt" \
-b "$(uci_get_by_type access_control wan_bp_ips)" \
-w "$(uci_get_by_type access_control wan_fw_ips)" \
-B "$(uci_get_by_type access_control lan_bp_ips)" \
-p "$(uci_get_by_type access_control lan_fp_ips)" \
-G "$(uci_get_by_type access_control lan_gm_ips)" \
-m "$(uci_get_by_type access_control Interface)" \
-D "$proxyport" \
$(get_arg_out) $(gfwmode) $ARG_UDP $ARG_UDP_RULES $ARG_A
fi
/usr/share/shadowsocksr/gfw2ipset.sh
/usr/bin/ssr-rules \
-s "$server" \
-l "$local_port" \
-S "$udp_server" \
-L "$udp_local_port" \
-a "$ac_ips" \
-i "/etc/ssrplus/china_ssr.txt" \
-b "$(uci_get_by_type access_control wan_bp_ips)" \
-w "$(uci_get_by_type access_control wan_fw_ips)" \
-B "$(uci_get_by_type access_control lan_bp_ips)" \
-p "$(uci_get_by_type access_control lan_fp_ips)" \
-G "$(uci_get_by_type access_control lan_gm_ips)" \
-m "$(uci_get_by_type access_control Interface)" \
-D "$proxyport" \
$(get_arg_out) $(gfwmode) $ARG_UDP $ARG_UDP_RULES $ARG_A
return $?
}
return $?
}
start() {
local run_mode
@@ -364,41 +364,41 @@ function outbound:handleIndex(index)
trojan_shadowsocks()
end,
snell = function()
outbound_settings = {
address = server.server, port = tonumber(server.server_port),
psk = server.snell_psk, version = tonumber(server.snell_version) or 4,
obfs = server.snell_obfs or "", obfsHost = server.snell_obfs_host,
reuse = server.snell_reuse == "1"
}
end,
outbound_settings = {
address = server.server, port = tonumber(server.server_port),
psk = server.snell_psk, version = tonumber(server.snell_version) or 4,
obfs = server.snell_obfs or "", obfsHost = server.snell_obfs_host,
reuse = server.snell_reuse == "1"
}
end,
tuic = function()
local version = tonumber(server.xray_tuic_version) or 5
local alpn = {}
for value in (server.tuic_alpn or ""):gmatch("[^,]+") do alpn[#alpn + 1] = value end
if #alpn == 0 then alpn = {"h3"} end
outbound_settings = {
address = server.server, port = tonumber(server.server_port), version = version,
token = version == 4 and server.xray_tuic_token or nil,
uuid = version == 5 and server.tuic_uuid or nil,
password = version == 5 and server.tuic_passwd or nil,
serverName = server.tls_host, certificateFile = server.xray_tuic_ca,
allowInsecure = server.insecure == "1",
alpn = alpn,
congestionControl = server.congestion_control or "cubic",
udpRelayMode = server.udp_relay_mode or "native",
heartbeatInterval = (tonumber(server.heartbeat) or 10) * 1000,
requestTimeout = (tonumber(server.timeout) or 8) * 1000,
reduceRtt = server.zero_rtt_handshake == "1"
}
end,
local version = tonumber(server.xray_tuic_version) or 5
local alpn = {}
for value in (server.tuic_alpn or ""):gmatch("[^,]+") do alpn[#alpn + 1] = value end
if #alpn == 0 then alpn = {"h3"} end
outbound_settings = {
address = server.server, port = tonumber(server.server_port), version = version,
token = version == 4 and server.xray_tuic_token or nil,
uuid = version == 5 and server.tuic_uuid or nil,
password = version == 5 and server.tuic_passwd or nil,
serverName = server.tls_host, certificateFile = server.xray_tuic_ca,
allowInsecure = server.insecure == "1",
alpn = alpn,
congestionControl = server.congestion_control or "cubic",
udpRelayMode = server.udp_relay_mode or "native",
heartbeatInterval = (tonumber(server.heartbeat) or 10) * 1000,
requestTimeout = (tonumber(server.timeout) or 8) * 1000,
reduceRtt = server.zero_rtt_handshake == "1"
}
end,
shadowsocksr = function()
outbound_settings = {
address = server.server, port = tonumber(server.server_port),
password = server.password, method = server.ssr_method or "aes-128-cfb",
protocol = server.ssr_protocol or "origin", protocolParam = server.protocol_param,
obfs = server.ssr_obfs or "plain", obfsParam = server.obfs_param
}
end,
outbound_settings = {
address = server.server, port = tonumber(server.server_port),
password = server.password, method = server.ssr_method or "aes-128-cfb",
protocol = server.ssr_protocol or "origin", protocolParam = server.protocol_param,
obfs = server.ssr_obfs or "plain", obfsParam = server.obfs_param
}
end,
shadowsocks = function()
trojan_shadowsocks()
end,
@@ -412,18 +412,18 @@ function outbound:handleIndex(index)
wireguard()
end,
naive = function()
outbound_settings = {
address = server.server, port = tonumber(server.server_port),
username = server.username, password = server.password,
serverName = server.tls_host,
certificateFile = server.naive_certificate_file,
quic = server.naive_quic == "1",
udpOverTcp = server.naive_udp_over_tcp == "1",
insecureConcurrency = tonumber(server.naive_concurrency),
quicCongestionControl = server.naive_quic_congestion,
echConfigList = server.naive_ech_config
}
end,
outbound_settings = {
address = server.server, port = tonumber(server.server_port),
username = server.username, password = server.password,
serverName = server.tls_host,
certificateFile = server.naive_certificate_file,
quic = server.naive_quic == "1",
udpOverTcp = server.naive_udp_over_tcp == "1",
insecureConcurrency = tonumber(server.naive_concurrency),
quicCongestionControl = server.naive_quic_congestion,
echConfigList = server.naive_ech_config
}
end,
anytls = function()
outbound_settings = {
address = server.server,
@@ -930,48 +930,48 @@ Xray.outbounds = {
-- These protocols own their framing, obfuscation and multiplexing.
-- Preserve Xray socket marks and dialer chains.
if server.v2ray_protocol == "naive" or server.v2ray_protocol == "shadowsocksr" or server.v2ray_protocol == "tuic" or server.v2ray_protocol == "snell" then
local ob = Xray.outbounds[1]
ob.streamSettings = { network = "raw", sockopt = ob.streamSettings.sockopt }
ob.mux = nil
local ob = Xray.outbounds[1]
ob.streamSettings = { network = "raw", sockopt = ob.streamSettings.sockopt }
ob.mux = nil
end
if server.type == "v2ray" and server.transport == "kcptun" then
local supported = {vmess = true, vless = true, trojan = true, shadowsocks = true, socks = true, http = true}
assert(supported[server.v2ray_protocol], "Kcptun requires a supported stream proxy protocol")
assert(server.tls ~= "1" and server.reality ~= "1" and server.xtls ~= "1", "Kcptun cannot be combined with stream TLS or REALITY")
assert(server.kcp_enable ~= "1", "Native Kcptun cannot be combined with the external Kcptun client")
assert(not server.tls_flow or server.tls_flow == "", "Kcptun cannot be combined with XTLS flow")
local options = {}
if server.xray_kcptun_options and server.xray_kcptun_options:match("%S") then
assert(server.xray_kcptun_options:match("^%s*{"), "Kcptun options must be a JSON object")
options = json.parse(server.xray_kcptun_options)
assert(type(options) == "table", "Kcptun options must be a JSON object")
end
options.key = server.xray_kcptun_key
options.crypt = server.xray_kcptun_crypt or "aes"
options.mode = server.xray_kcptun_mode or "fast"
options.smuxver = tonumber(server.xray_kcptun_smuxver) or 1
options.nocomp = server.xray_kcptun_nocomp == "1"
options.conn = tonumber(server.xray_kcptun_conn) or 1
Xray.outbounds[1].streamSettings.kcptunSettings = options
local supported = {vmess = true, vless = true, trojan = true, shadowsocks = true, socks = true, http = true}
assert(supported[server.v2ray_protocol], "Kcptun requires a supported stream proxy protocol")
assert(server.tls ~= "1" and server.reality ~= "1" and server.xtls ~= "1", "Kcptun cannot be combined with stream TLS or REALITY")
assert(server.kcp_enable ~= "1", "Native Kcptun cannot be combined with the external Kcptun client")
assert(not server.tls_flow or server.tls_flow == "", "Kcptun cannot be combined with XTLS flow")
local options = {}
if server.xray_kcptun_options and server.xray_kcptun_options:match("%S") then
assert(server.xray_kcptun_options:match("^%s*{"), "Kcptun options must be a JSON object")
options = json.parse(server.xray_kcptun_options)
assert(type(options) == "table", "Kcptun options must be a JSON object")
end
options.key = server.xray_kcptun_key
options.crypt = server.xray_kcptun_crypt or "aes"
options.mode = server.xray_kcptun_mode or "fast"
options.smuxver = tonumber(server.xray_kcptun_smuxver) or 1
options.nocomp = server.xray_kcptun_nocomp == "1"
options.conn = tonumber(server.xray_kcptun_conn) or 1
Xray.outbounds[1].streamSettings.kcptunSettings = options
end
if server.type == "v2ray" and server.xray_shadowtls == "1" then
local supported = {vmess = true, vless = true, trojan = true, shadowsocks = true}
assert(supported[server.v2ray_protocol], "ShadowTLS requires a supported TCP proxy protocol")
assert((server.transport or "raw") == "raw" or server.transport == "tcp", "ShadowTLS requires RAW/TCP")
assert(server.tls ~= "1" and server.reality ~= "1", "ShadowTLS cannot be combined with TLS or REALITY")
assert(not server.tls_flow or server.tls_flow == "", "ShadowTLS cannot be combined with XTLS flow")
local stream = Xray.outbounds[1].streamSettings
stream.security = "shadowtls"
stream.shadowtlsSettings = {
version = tonumber(server.xray_shadowtls_version) or 3,
password = server.xray_shadowtls_password,
serverName = server.xray_shadowtls_sni,
fingerprint = server.xray_shadowtls_fingerprint or "chrome",
strictMode = server.xray_shadowtls_strict ~= "0",
allowInsecure = server.xray_shadowtls_insecure == "1"
}
local supported = {vmess = true, vless = true, trojan = true, shadowsocks = true}
assert(supported[server.v2ray_protocol], "ShadowTLS requires a supported TCP proxy protocol")
assert((server.transport or "raw") == "raw" or server.transport == "tcp", "ShadowTLS requires RAW/TCP")
assert(server.tls ~= "1" and server.reality ~= "1", "ShadowTLS cannot be combined with TLS or REALITY")
assert(not server.tls_flow or server.tls_flow == "", "ShadowTLS cannot be combined with XTLS flow")
local stream = Xray.outbounds[1].streamSettings
stream.security = "shadowtls"
stream.shadowtlsSettings = {
version = tonumber(server.xray_shadowtls_version) or 3,
password = server.xray_shadowtls_password,
serverName = server.xray_shadowtls_sni,
fingerprint = server.xray_shadowtls_fingerprint or "chrome",
strictMode = server.xray_shadowtls_strict ~= "0",
allowInsecure = server.xray_shadowtls_insecure == "1"
}
end
if xray_builtin_dns then
@@ -1390,13 +1390,13 @@ function config:handleIndex(index)
end
end,
snell = function()
outbound_settings = {
address = server.server, port = tonumber(server.server_port),
psk = server.snell_psk, version = tonumber(server.snell_version) or 4,
obfs = server.snell_obfs or "", obfsHost = server.snell_obfs_host,
reuse = server.snell_reuse == "1"
}
end,
outbound_settings = {
address = server.server, port = tonumber(server.server_port),
psk = server.snell_psk, version = tonumber(server.snell_version) or 4,
obfs = server.snell_obfs or "", obfsHost = server.snell_obfs_host,
reuse = server.snell_reuse == "1"
}
end,
tuic = function()
print(json.stringify(tuic, 1))
end
+6 -3
View File
@@ -7,11 +7,12 @@
include $(TOPDIR)/rules.mk
LUCI_TITLE:=Argon Theme
LUCI_DEPENDS:=+luci-base +USE_APK:wget-any +!USE_APK:wget +jsonfilter +ucode-mod-math +flock +coreutils-timeout
# Older SDKs require the coreutils parent menu to enable coreutils-timeout.
LUCI_DEPENDS:=+luci-base +USE_APK:wget-any +!USE_APK:wget +jsonfilter +ucode-mod-math +flock +coreutils +coreutils-timeout
# Keep existing translation package names and the argon-config message domain.
LUCI_BASENAME:=argon-config
PKG_VERSION:=3.0.0
PKG_RELEASE:=31
PKG_VERSION:=3.1.0
PKG_RELEASE:=32
PKG_LICENSE:=Apache-2.0 MIT
# LuCI derives translations independently of the theme version. Keep release
@@ -27,6 +28,8 @@ endif
CONFIG_LUCI_CSSTIDY:=
# Ship template source across stable and snapshot runtimes. Precompiled
# bytecode would require the SDK's ucode format (see issue #715).
# Disable this package's build step as well, avoiding LuCI's opt-out warning.
CONFIG_LUCI_UTMIN:=
LUCI_MINIFY_UT:=0
define Package/luci-theme-argon/conffiles
+12 -2
View File
@@ -35,7 +35,15 @@ It also supports automatic and manual switching between light and dark modes.
</div>
## What's new in 3.0
## What's new in 3.1
- **Online theme updates.** Check stable releases and install with the firmware's native APK or OPKG, preserving Argon settings and verifying package SHA256 and size.
- **Layout fixes.** Improve dashboard actions, overview layouts, dynamic lists and custom IP/MAC inputs across narrow screens, light/dark modes and RTL layouts.
- **Compatibility improvements.** Improve compatibility with stable OpenWrt firmware.
Users on v3.0.0 or earlier must install v3.1.0 manually once to get online updates. See the [release notes](RELEASE.md).
## 3.0 highlights
- **Built-in Argon Config.** Manage the theme without a separate plugin.
- **Broad third-party app support.** Refined layouts, forms and tables for most third-party LuCI apps, with desktop/mobile and light/dark adaptations.
@@ -89,10 +97,12 @@ 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.
Under **Theme updates**, check the latest stable release, read its release notes and download the package matching your firmware's package manager.
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.
When building firmware, stop including the old standalone `luci-app-argon-config` plugin alongside the theme: its files conflict with the integrated settings. See [Build with OpenWrt](docs/DEVELOPMENT.md#build-with-openwrt) for existing build scripts.
## Screenshots
Light and dark views of the overview and both login layouts, on desktop and mobile.
+12 -2
View File
@@ -35,7 +35,15 @@ Argon 是**一款干净整洁的 OpenWrt LuCI 主题**,
</div>
## 3.0 新特性
## 3.1 新特性
- **在线更新主题**:检查稳定版,通过固件原生 APK 或 OPKG 安装,保留 Argon 设置,校验安装包 SHA256 和大小。
- **布局修复**:优化 Dashboard 操作区、概览布局、动态列表和自定义 IP/MAC 输入框,兼顾窄屏、亮暗色和 RTL 布局。
- **兼容性改进**:改善稳定版 OpenWrt 固件上的兼容性。
v3.0.0 及更早版本用户需先手动安装一次 v3.1.0,之后即可使用在线更新。详见[更新日志](RELEASE_ZH.md)。
## 3.0 主要特性
- **内置 Argon Config**:主题设置随主题安装,无需独立插件。
- **广泛适配第三方应用**:针对大多数第三方 LuCI 应用优化布局、表单和表格,兼顾桌面、手机与亮暗模式。
@@ -89,10 +97,12 @@ 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 校验值,不执行降级。此功能更新主题主包,独立语言包仍由系统包管理器管理。
自行编译固件时,不要再同时引入旧版独立 `luci-app-argon-config` 插件;它会与主题内置文件冲突。已有自动编译脚本的调整方式见[源码构建说明](docs/DEVELOPMENT_ZH.md#源码构建)。
## 效果展示
亮暗两色,展示桌面与手机端的首页和两套登录界面。
+60
View File
@@ -1,5 +1,65 @@
# Update log for master branch
## v3.1.0 [ 2026.10.22 ]
### Added / 新功能
- Add stable release checks and online theme installation under **System → Argon Config → Theme updates**, using the firmware's native APK or OPKG package manager and preserving Argon settings.
- Verify package SHA256 and size before installation, reject downgrades, and show installation progress and logs with monitoring that resumes after a page refresh.
- 新增稳定版检查与在线安装,可在**系统 → Argon 配置 → 主题更新**中通过固件原生 APK 或 OPKG 包管理器升级,并保留 Argon 设置。
- 新增安装包校验、降级保护、安装进度和日志,刷新页面后可继续跟踪安装状态。
### Changed / 改进
- Improve compatibility with stable OpenWrt firmware.
- 改善稳定版 OpenWrt 固件上的兼容性。
### Fixed / 修复
- Fix dashboard action spacing and overview layouts.
- Fix dynamic list controls and custom IP/MAC input borders across narrow screens, light/dark modes and RTL layouts.
- 修复 Dashboard 操作区间距和概览布局。
- 修复动态列表控件及自定义 IP/MAC 输入框边框,兼顾窄屏、亮暗色和 RTL 布局。
### Upgrade notes / 升级说明
**First upgrade:** users on v3.0.0 or earlier must install v3.1.0 manually once. Later releases can be installed through Theme updates. Online installation updates the theme package; install separate translation packages in the usual way.
**首次升级:** v3.0.0 及更早版本用户需先手动安装一次 v3.1.0,之后可使用主题更新功能在线升级。在线安装仅更新主题主包,独立语言包仍按原方式安装。
### Installation / 安装说明
| Firmware / 固件 | Package / 安装包 |
| --- | --- |
| Native `opkg`, including OpenWrt 23.05 / 24.10 and GL.iNet firmware based on them / 原生使用 `opkg` 的固件 | `.ipk` → `opkg install` |
| Native APK v3 with `apk-tools 3.x` / 原生使用 APK v3 的固件 | `.apk` → `apk add --allow-untrusted` |
APK assets use **APK v3** and cannot be read by `apk-tools 2.x`, including `2.14.0`. Having an `apk` command installed on an opkg-based firmware does not make it APK v3 compatible. `--allow-untrusted` does not change format compatibility, and `apk` cannot install IPK files.
APK 附件采用 **APK v3 格式**,`apk-tools 2.x`(包括 `2.14.0`)无法读取。在原生使用 opkg 的固件上额外安装 `apk`,并不会让固件兼容 APK v3;`--allow-untrusted` 不能解决格式不兼容,`apk` 也不能安装 IPK。
APK builds use the OpenWrt **25.12.5 stable SDK**. Theme templates are shipped as source to avoid snapshot-specific ucode bytecode requirements. If an older APK reports `ucode>=2026.02.27`, use a package rebuilt with the [#715 fix](https://github.com/jerrykuku/luci-theme-argon/issues/715); bypassing dependency checks does not make that bytecode compatible.
APK 使用 OpenWrt **25.12.5 稳定版 SDK** 构建,主题模板保留源码,避免 snapshot 的 ucode 字节码版本限制。若旧 APK 提示需要 `ucode>=2026.02.27`,请使用包含 [#715 修复](https://github.com/jerrykuku/luci-theme-argon/issues/715) 的重新构建包;绕过依赖检查不能解决字节码不兼容。
Download the theme and required language packages in the **same format**. Use the exact asset filenames below. For GL.iNet / OpenWrt 23.05, use IPK files with the firmware's existing `opkg`.
主题和需要的语言包应选择**相同格式**,以本页附件实际文件名为准。GL.iNet / OpenWrt 23.05 请下载 IPK 并使用固件原有的 `opkg` 安装。
#### Argon 3.0 settings integration / 设置集成
Settings are included in `luci-theme-argon`. Fresh installations need only the theme and desired `luci-i18n-argon-config-*` translations.
设置已内置主题,新安装无需配置插件。已有旧插件时,先单独安装本次发行的 `luci-app-argon-config` 空兼容包,再安装主题;该顺序会保留旧配置并完成文件归属交接。
For an existing configuration plugin, install this release's empty `luci-app-argon-config` compatibility package first, then install the theme in a separate command. Do not install both in one transaction or force overwrites.
**Full Changelog**: https://github.com/jerrykuku/luci-theme-argon/compare/v3.0.0...v3.1.0
## v3.0.0 [ 2026.10.16 ]
### Argon 3.0
+22
View File
@@ -1,5 +1,27 @@
# Master 分支的更新日志
## v3.1.0 [ 2026.10.22 ]
### 新功能
- 新增稳定版检查与在线安装,可通过固件原生 APK 或 OPKG 包管理器升级,并保留 Argon 设置。
- 新增安装包校验、降级保护、安装进度和日志,刷新页面后可继续跟踪安装状态。
### 改进
- 改善稳定版 OpenWrt 固件上的兼容性。
### 修复
- 修复 Dashboard 操作区间距和概览布局。
- 修复动态列表控件及自定义 IP/MAC 输入框边框,兼顾窄屏、亮暗色和 RTL 布局。
### 升级说明
v3.0.0 及更早版本用户需先手动安装一次 v3.1.0,之后可使用在线升级。在线安装仅更新主题主包,独立语言包仍按原方式安装。
[完整发布说明](https://github.com/jerrykuku/luci-theme-argon/releases/tag/v3.1.0)
## v3.0.0 [ 2026.10.16 ]
- GitHub Release: https://github.com/jerrykuku/luci-theme-argon/releases/tag/v3.0.0
@@ -1,8 +1,8 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=luci-app-argon-config
PKG_VERSION:=3.0.0
PKG_RELEASE:=20261016
PKG_VERSION:=3.1.0
PKG_RELEASE:=20261022
PKG_LICENSE:=Apache-2.0
LUCI_TITLE:=Argon configuration compatibility package
+44
View File
@@ -17,6 +17,10 @@ make package/luci-theme-argon/compile V=s
Theme settings are included. Select the nested `compat/luci-app-argon-config` package under LuCI applications only when building the migration package. Existing translation names remain `luci-i18n-argon-config-*`.
Firmware and GitHub Actions build scripts should stop cloning the old standalone `luci-app-argon-config` repository and deselect that plugin. The old `1.0-r20261008` plugin duplicates the configuration, RPC services, settings page and icons now owned by the theme, causing APK's `trying to overwrite ... owned by luci-theme-argon` errors. New firmware only needs the theme. If the old package name is required, use this repository's empty migration package and keep exactly one definition of that package in the build tree. After updating an existing build tree, run `make defconfig` and clean the old plugin's build outputs before rebuilding.
The older `does not support ucode template precompilation` log line is LuCI's skip message, separate from the file conflict. This package disables precompilation and ships `.ut` source to avoid SDK/target ucode bytecode incompatibilities; other LuCI packages can retain precompilation.
Release CI builds IPK with the OpenWrt 23.05.5 SDK and APK v3 with the 25.12.5 SDK. Ucode templates ship as source to avoid tying packages to one runtime's bytecode format.
Translations use `PKG_PO_VERSION` to follow the theme release, including `-r<revision>` for APK. IPK translations retain a `v` prefix (for example, `v3.0.1`) so ordinary installation upgrades the broken v3.0.0 `unknown` version. Keep that prefix in future IPK releases. CI reads each translation's internal package metadata and blocks artifact upload and publication if the version is wrong.
@@ -87,6 +91,46 @@ Top-level menu nodes resolve `htdocs/luci-static/argon/icon/<node-name>.svg`, in
Use monochrome SVGs with a `viewBox` and transparent background. CSS masks supply theme and interaction colors. Shared chevrons use the same 24×24 grid and 2px round strokes. See the [icon index](../htdocs/luci-static/argon/icon/README.md) for available assets. This mechanism is separate from uploaded browser icons and login logos.
## Static update feed deployment
The router reads a static `/updates/stable.json` manifest without calling the GitHub API. After publication, CI uses its own `GITHUB_TOKEN` to retrieve the official release, verifies the theme package SHA256 digests and sizes, and generates one artifact. GitHub Pages publishes that artifact directly; Cloudflare Pages deploys the same files from a dedicated `updates` Git branch. Packages continue to download from the pinned GitHub Release, and translation packages remain separate.
Initial maintainer setup:
1. Set **Settings → Pages → Build and deployment → Source** to **GitHub Actions**. Allow the default branch and release tags in the `github-pages` environment. The workflow needs `contents: write` to publish the `updates` branch.
2. Once this code is on the default branch, manually run **Publish update feeds**. This initializes GitHub Pages and creates the `updates` branch from the latest stable release, without publishing a new version or requiring CF setup first.
3. Create a Cloudflare Pages **Git integration** project connected to this GitHub repository. Set production branch to `updates`, framework to **None**, build command to `exit 0`, output directory to `.`, and preview branches to **None**. Use the assigned `pages.dev` hostname or your own domain. Existing Direct Upload projects need to be replaced with a new Git integration project.
4. Set these repository **Variables** under **Settings → Secrets and variables → Actions**:
| Variable | Value |
| --- | --- |
| `ARGON_UPDATE_PRIMARY_URL` | Complete URL, e.g. `https://<assigned-hostname>/updates/stable.json` |
| `ARGON_UPDATES_ENABLED` | `true` to synchronize after stable releases |
| `ARGON_UPDATE_FALLBACK_URL` | Optional; defaults to `https://jerrykuku.github.io/luci-theme-argon/updates/stable.json`. Override for a custom fallback domain. |
5. Choose how CF is triggered. By default, keep automatic production branch deployments enabled: pushing `updates` triggers CF without a CF secret in GitHub. For Deploy Hooks, create a hook bound to `updates` under CF **Settings → Builds → Add deploy hook**. Save the complete URL as the GitHub repository Actions **Secret** `CF_PAGES_DEPLOY_HOOK`, then disable **Enable automatic production branch deployments** to avoid building each publication twice.
6. Compare `/updates/stable.json` on both hosts byte for byte. Verify primary access, fallback access and actual package downloads from the target router's network. New release packages embed the configured source URLs; changing repository variables does not change themes already installed on devices.
`CLOUDFLARE_API_TOKEN`, `CLOUDFLARE_ACCOUNT_ID` and `CLOUDFLARE_PAGES_PROJECT` are no longer used. The Hook URL contains its own trigger credential and belongs in a Secret. A successful Hook response means CF accepted the build request; check Pages for the actual deployment result.
Only successful stable publications update the feed. Previews are excluded, and a delayed old-release job skips publication when its tag is no longer Latest. The `updates` branch contains generated static files, preserves commit history and rejects conflicting pushes. The publisher refuses to overwrite an existing unrelated branch with that name.
Run **Publish update feeds** again to republish GitHub Pages. Identical artifacts do not create another branch commit. With a Hook configured, reruns still trigger CF when the branch is unchanged, allowing failed deployments to be retried. With Git auto-deployment only, retry the build in CF or publish changed feed content. Both publication jobs are independent, so either side can publish if the other fails.
The manifest contains `schema`, `repository`, `tag`, `published_at`, `notes`, and the `apk`/`ipk` filenames with `_sha256`/`_size` fields. Metadata comes from the published package bytes rather than master's Makefile. Both formats must be complete and match the tag. Malformed feeds trigger fallback and never overwrite the previous successful cache. Checks are manual, with a five-minute success cache, a one-minute failure cooldown and a lock that coalesces concurrent requests.
Source builds default to an empty CF primary. Configure one before packaging:
```sh
python3 .github/scripts/generate_update_site.py sources \
--primary 'https://YOUR_DOMAIN/updates/stable.json' \
--output root/usr/share/argon/update-sources.json
```
Sources must be complete HTTPS URLs without credentials, ports, query strings or fragments. Runtime sources live in `/usr/share/argon/update-sources.json`, which is updated by theme packages separately from `/etc/config/argon`. The installer constructs fixed official release download URLs; manifests cannot supply arbitrary download URLs.
References: [Cloudflare GitHub integration](https://developers.cloudflare.com/pages/configuration/git-integration/github-integration/), [Deploy Hooks](https://developers.cloudflare.com/pages/configuration/deploy-hooks/), [branch deployment controls](https://developers.cloudflare.com/pages/configuration/branch-build-controls/), [custom GitHub Pages workflows](https://docs.github.com/en/pages/getting-started-with-github-pages/using-custom-workflows-with-github-pages).
## Checks
Use Node.js 22+, Python 3, LESS 4.1.3 and a Ucode build matching the supported OpenWrt runtime:
+44
View File
@@ -17,6 +17,10 @@ make package/luci-theme-argon/compile V=s
主题设置已内置。仅在需要构建旧插件迁移包时,在 LuCI 应用中额外选择嵌套的 `compat/luci-app-argon-config` 包。语言包继续使用 `luci-i18n-argon-config-*` 名称。
固件或 GitHub Actions 构建脚本应移除旧版独立 `luci-app-argon-config` 仓库的克隆步骤,并取消旧插件选项。旧版 `1.0-r20261008` 插件会重复安装主题已内置的配置、RPC、设置页及图标,导致 APK 报 `trying to overwrite ... owned by luci-theme-argon`。新固件只需选择主题;需要保留旧包名时,使用本仓库的空迁移包,整个构建树中只保留一份该包定义。已有构建缓存时,更新包定义后重新运行 `make defconfig`,并清理旧插件的编译产物再编译。
旧构建日志中的 `does not support ucode template precompilation` 是 LuCI 的跳过提示,不是上述文件冲突的原因。本包关闭模板预编译并保留 `.ut` 源码,避免 SDK 与目标设备的 ucode 字节码格式不一致;无需关闭其他 LuCI 包的预编译。
发行 CI 使用 OpenWrt 23.05.5 SDK 构建 IPK、25.12.5 SDK 构建 APK v3。Ucode 模板保留源码,避免绑定某个运行时的字节码格式。
语言包通过 `PKG_PO_VERSION` 跟随主题发行版本,APK 包含 `-r<修订号>`。IPK 语言包固定使用 `v` 前缀(如 `v3.0.1`),使已安装的 v3.0.0 `unknown` 语言包可以直接正常升级;后续版本须保留该前缀。发布前会逐个读取语言包内部元数据,版本不符时阻止上传和发布。
@@ -87,6 +91,46 @@ lessc less/cascade.less htdocs/luci-static/argon/css/cascade.css
使用透明背景、带 `viewBox` 的单色 SVG,CSS mask 负责主题与交互颜色。共享箭头使用 24×24 网格、2px 圆角描边。资源见 [SVG 图标索引](../htdocs/luci-static/argon/icon/README.md),与用户上传的网站图标 / 登录 Logo 独立。
## 静态更新源部署
更新检查读取 `/updates/stable.json` 静态清单。路由器不调用 GitHub API;发布工作流使用自身的 `GITHUB_TOKEN` 读取正式 Release,核验主题包的 SHA256/大小后生成一份产物。GitHub Pages 直接发布该产物,Cloudflare Pages 从专用 `updates` 分支部署同一份文件。安装包继续从固定的 GitHub Release 版本下载,独立语言包仍单独安装。
首次启用需要仓库维护者完成以下配置:
1. 在仓库 **Settings → Pages → Build and deployment → Source** 选择 **GitHub Actions**。`github-pages` 环境的部署规则需允许默认分支和正式发布标签;工作流需要 `contents: write` 权限来更新 `updates` 分支。
2. 本次代码进入默认分支后,在 Actions 手动运行 **Publish update feeds**。它会用当前最新正式版初始化 GitHub Pages,并创建 `updates` 分支,无需发布新版本,也无需先配置 CF。
3. 在 Cloudflare 创建 **Git 集成**类型的 Pages 项目,连接本 GitHub 仓库。生产分支选 `updates`,框架选 **None**,构建命令填 `exit 0`,输出目录填 `.`,预览分支选 **None**。记录实际分配的 `pages.dev` 地址,或绑定自己控制的域名。如果之前创建了 Direct Upload 项目,需要新建 Git 集成项目。
4. 在仓库 **Settings → Secrets and variables → Actions → Variables** 设置:
| 仓库变量 | 值 |
| --- | --- |
| `ARGON_UPDATE_PRIMARY_URL` | 完整主源地址,例如 `https://<实际项目地址>/updates/stable.json` |
| `ARGON_UPDATES_ENABLED` | `true`,启用正式发布后的自动同步 |
| `ARGON_UPDATE_FALLBACK_URL` | 可选;默认 `https://jerrykuku.github.io/luci-theme-argon/updates/stable.json`。备用源绑定自有域名时设置。 |
5. 选择 CF 的触发方式。默认保留生产分支自动部署,发布工作流推送 `updates` 后 CF 自动构建,GitHub 无需 CF Secret。若要使用 Deploy Hook,在 CF 的 **Settings → Builds → Add deploy hook** 创建绑定 `updates` 分支的 Hook,将完整 URL 保存为 GitHub 仓库 Actions **Secret** `CF_PAGES_DEPLOY_HOOK`,并关闭 CF 的 **Enable automatic production branch deployments**,避免同一次发布构建两次。
6. 读取两端 `/updates/stable.json`,核对内容完全相同;在目标路由器网络验证主源读取、主源失败后的备用读取,以及真实包下载。配置生效后构建的新安装包会带上主源地址;设置仓库变量不会改变已经安装在设备上的主题。
此方案不再使用 `CLOUDFLARE_API_TOKEN`、`CLOUDFLARE_ACCOUNT_ID` 或 `CLOUDFLARE_PAGES_PROJECT`。Hook URL 本身包含触发凭据,只存入 Secret。Hook 返回成功表示 CF 已接受构建请求,实际部署结果需在 CF Pages 查看。
发布工作流仅在正式 Release 成功后自动同步。预发布版本不进入稳定清单;延迟执行的旧版本任务发现自己已不是 Latest 时跳过。`updates` 分支只保存生成的静态文件,保留提交历史并拒绝冲突推送;如果同名分支已用于其他用途,脚本会停止而不覆盖。
重新运行 **Publish update feeds** 可再次发布 GitHub Pages;清单未变化时不重复创建分支提交。若配置了 Hook,即使分支内容未变化也会重新触发 CF,便于重试失败的部署;仅使用 Git 自动部署时,需要在 CF 中重试构建或新增清单提交。两端发布任务互相独立,一端失败不会阻止另一端发布。
清单字段包括 `schema`、`repository`、`tag`、`published_at`、`notes`,以及 `apk`/`ipk` 文件名和对应的 `_sha256`/`_size`。由最终发布包计算元数据,不从 master 的 Makefile 推断最新版。两种格式均须完整且属于同一版本;客户端拒绝损坏清单,并保留上一次成功记录。请求只在手动检查时发起,成功缓存五分钟,双源均失败后冷却一分钟。
源码构建默认不包含 CF 地址。需要自行指定时,在打包前执行:
```sh
python3 .github/scripts/generate_update_site.py sources \
--primary 'https://YOUR_DOMAIN/updates/stable.json' \
--output root/usr/share/argon/update-sources.json
```
主备地址须为完整 HTTPS URL,不含凭据、端口、查询参数或片段。路由器端配置位于 `/usr/share/argon/update-sources.json`;下载地址由安装器固定构造,清单不能指定任意包下载 URL。此目录的配置不属于 `/etc/config/argon` 用户设置,后续主题安装包会更新它。
参考:[Cloudflare GitHub 集成](https://developers.cloudflare.com/pages/configuration/git-integration/github-integration/)、[Deploy Hooks](https://developers.cloudflare.com/pages/configuration/deploy-hooks/)、[分支部署控制](https://developers.cloudflare.com/pages/configuration/branch-build-controls/)、[GitHub Pages 自定义工作流](https://docs.github.com/en/pages/getting-started-with-github-pages/using-custom-workflows-with-github-pages)。
## 检查
准备 Node.js 22+、Python 3、LESS 4.1.3,以及与目标 OpenWrt 运行时匹配的 Ucode:
@@ -2455,6 +2455,7 @@ body:not([data-page="admin-dashboard"]) #cbi-wireless > #wifi_assoclist_table >
.cbi-section-table-row:last-child {
margin-bottom: 0;
}
.cbi-section-table-row > .cbi-value-field .cbi-dynlist,
.cbi-section-table-row > .cbi-value-field .cbi-dropdown,
.cbi-section-table-row > .cbi-value-field .cbi-input-select,
.cbi-section-table-row > .cbi-value-field .cbi-input-text,
@@ -3182,6 +3183,9 @@ header .header-actions {
max-width: 100%;
min-width: min(100%, var(--form-control-min-width));
}
.cbi-value-field .cbi-dynlist {
width: var(--form-control-min-width);
}
@container (max-width: 40rem) {
.cbi-value {
flex-direction: column;
@@ -3435,10 +3439,10 @@ body:not(.Interfaces) .cbi-rowstyle-2:first-child {
align-items: center;
width: 100%;
min-width: 0;
max-width: min(18rem, 100%);
max-width: 100%;
flex-wrap: nowrap;
}
.cbi-dynlist > .add-item input {
.cbi-dynlist > .add-item > input {
flex: 1 1 15.5rem;
display: block;
padding: 0.5rem 0.75rem;
@@ -3458,7 +3462,7 @@ body:not(.Interfaces) .cbi-rowstyle-2:first-child {
background-image: none;
box-shadow: none;
}
[dir="rtl"] .cbi-dynlist > .add-item input:first-child {
[dir="rtl"] .cbi-dynlist > .add-item > input:first-child {
border-radius: 0 var(--radius-control) var(--radius-control) 0;
border-left-width: 0;
border-right-width: 1px;
@@ -3519,11 +3523,11 @@ body:not(.Interfaces) .cbi-rowstyle-2:first-child {
.cbi-dynlist,
.cbi-dropdown {
position: relative;
display: inline-flex;
padding-right: 0.25rem;
min-height: 2.1875rem;
}
.cbi-dropdown {
display: inline-flex;
padding-inline-end: 0.25rem;
align-items: center;
}
.cbi-dropdown.btn > ul:not(.dropdown),
@@ -3770,6 +3774,7 @@ body:not(.Interfaces) .cbi-rowstyle-2:first-child {
text-align: start;
}
.cbi-dropdown[open] > ul.dropdown > li {
display: block;
min-width: 0;
min-height: 2.5rem;
padding: 0.5rem 0.75rem;
@@ -3782,12 +3787,14 @@ body:not(.Interfaces) .cbi-rowstyle-2:first-child {
cursor: pointer;
}
.cbi-dropdown[open] > ul.dropdown > li > label {
display: block;
flex: 1 1 auto;
min-width: 0;
margin-inline-start: 0.5rem;
}
.cbi-dropdown[open] > ul.dropdown > li:has(> img),
.cbi-dropdown[open] > ul.dropdown > li > label:has(> img) {
display: flex;
align-items: flex-start;
}
.cbi-dropdown[open] > ul.dropdown > li:has(> img) > img,
@@ -6403,6 +6410,64 @@ pre.command-output {
[data-page="admin-status-routes"] #view > h3 {
border-radius: var(--radius-card) var(--radius-card) 0 0;
}
#view > .Dashboard {
--dashboard-surface-alt: var(--surface-muted);
--dashboard-text: var(--text-strong);
--dashboard-text-muted: var(--muted-text);
--dashboard-border: var(--border-color);
--dashboard-primary: var(--primary);
--dashboard-success: var(--success);
--dashboard-warn: var(--warning);
}
#view > .Dashboard .dashboard-kpi-row > .cbi-section {
min-width: min(100%, 16rem);
padding: var(--field-gap) var(--section-inset);
gap: var(--field-gap);
}
#view > .Dashboard .dashboard-kpi-text {
overflow-wrap: anywhere;
}
#view > .Dashboard .dashboard-charts > .cbi-section {
min-width: min(100%, 18rem);
padding-block-end: var(--field-gap);
}
#view > .Dashboard .dashboard-charts > .cbi-section > :not(h3:first-child) {
margin-inline: var(--section-inset);
}
#view > .Dashboard .dashboard-charts > .cbi-section > .cbi-section-descr {
padding: 0;
margin-block-end: var(--field-gap);
overflow-wrap: anywhere;
}
#view > .Dashboard .dashboard-charts > .cbi-section > em {
padding: 0;
}
#view > .Dashboard .dashboard-charts > .cbi-section > .dashboard-legend-inline {
margin-block-start: var(--field-gap);
}
#view > .Dashboard .dashboard-bars {
direction: ltr;
}
#view > .Dashboard .dashboard-net-grid {
grid-template-columns: repeat(auto-fill, minmax(min(100%, 16.25rem), 1fr));
}
#view > .Dashboard .dashboard-net-fields {
grid-template-columns: repeat(2, minmax(0, 1fr));
}
#view > .Dashboard .ifacebox {
min-width: 0;
max-width: 100%;
}
#view > .Dashboard .ifacebox-body {
text-align: start;
}
#view > .Dashboard [data-tab="internet"] > div > div > em {
display: block;
padding: var(--field-gap) var(--section-inset);
}
#view > .Dashboard [data-tab="layout"] .cbi-page-actions {
padding: var(--field-gap) var(--section-inset);
}
[data-page="admin-status-processes"] .th:nth-child(3),
[data-page="admin-status-processes"] .td:nth-child(3) {
text-align: start;
@@ -105,6 +105,13 @@ return baseclass.extend({
statusIcon.hidden = kind !== 'current' && kind !== 'complete';
}
function checkError(retryAt) {
var message = _('Unable to check for updates. Check the router\'s network connection and try again.');
if (Number.isSafeInteger(retryAt) && retryAt > Date.now() / 1000)
message += ' ' + _('Try again after %s.').format(new Date(retryAt * 1000).toLocaleTimeString());
return message;
}
function mayInstall() {
var remote = release(state);
var local = version(state && state.current_version);
@@ -154,7 +161,7 @@ return baseclass.extend({
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');
showStatus(checkError(state && state.retry_at), 'error');
else if (!remote)
showStatus(_('Not checked yet.'));
else if (!local || !remote.parsed)
@@ -295,8 +302,13 @@ return baseclass.extend({
busy = true;
refresh();
return callCheck().then(function(result) {
if (result.result !== 0 || !release(result))
throw new Error('update check failed');
if (result.result !== 0 || !release(result)) {
if (state)
state.can_upgrade = false;
var error = new Error('update check failed');
error.retry_at = result.retry_at;
throw error;
}
state = result;
busy = false;
refresh();
@@ -305,10 +317,10 @@ return baseclass.extend({
details.open = !!(remote && remote.parsed && local && compare(local, remote.parsed) < 0 && !needsReload());
if (state.upgrade && state.upgrade.active)
monitor();
}).catch(function() {
}).catch(function(error) {
busy = false;
refresh();
showStatus(_('Unable to check for updates. Check the router\'s connection to GitHub and try again.'), 'error');
showStatus(checkError(error.retry_at), 'error');
});
}
if (state && state.upgrade && state.upgrade.active)
@@ -88,6 +88,9 @@
text-align: start;
> li {
// IP/MAC choices contain text, a strong hostname and punctuation. Keep
// those fragments in one text flow instead of separate anonymous flex items.
display: block;
min-width: 0;
min-height: 2.5rem;
padding: .5rem .75rem;
@@ -100,6 +103,7 @@
cursor: pointer;
> label {
display: block;
flex: 1 1 auto;
min-width: 0;
margin-inline-start: .5rem;
@@ -108,6 +112,7 @@
// Keep wrapped descriptions in one text column, with the icon on its first line.
&:has(> img),
> label:has(> img) {
display: flex;
align-items: flex-start;
> img {
@@ -174,6 +174,12 @@
min-width: ~"min(100%, var(--form-control-min-width))";
}
// A DynamicList's percentage-sized add row needs a definite containing width.
// Match ordinary fields before its combobox measures the placeholder or value.
.cbi-value-field .cbi-dynlist {
width: var(--form-control-min-width);
}
// The map has a definite width, so size containment cannot collapse a flex item.
@container (max-width: 40rem) {
.cbi-value {
+5 -4
View File
@@ -86,10 +86,11 @@
align-items: center;
width: 100%;
min-width: 0;
max-width: min(18rem, 100%);
max-width: 100%;
flex-wrap: nowrap;
input {
// Only the plain add field joins its button; menu custom inputs stand alone.
> input {
flex: 1 1 15.5rem;
display: block;
padding: 0.5rem 0.75rem;
@@ -190,12 +191,12 @@
.cbi-dynlist,
.cbi-dropdown {
position: relative;
display: inline-flex;
padding-right: 0.25rem;
min-height: 2.1875rem;
}
.cbi-dropdown {
display: inline-flex;
padding-inline-end: .25rem;
align-items: center;
}
@@ -231,6 +231,7 @@ body:not([data-page="admin-dashboard"]) {
margin-bottom: 0;
}
.cbi-section-table-row>.cbi-value-field .cbi-dynlist,
.cbi-section-table-row>.cbi-value-field .cbi-dropdown,
.cbi-section-table-row>.cbi-value-field .cbi-input-select,
.cbi-section-table-row>.cbi-value-field .cbi-input-text,
+1
View File
@@ -35,6 +35,7 @@
@import "pages/rule-editors.less";
// Status and monitoring
@import "pages/dashboard.less";
@import "pages/processes.less";
@import "pages/overview.less";
@import "pages/realtime.less";
@@ -0,0 +1,80 @@
// out: false
// luci-mod-dashboard supplies chart layout; the theme owns its card surfaces.
// The module loads CSS after the theme, so keep these overrides view-scoped.
#view > .Dashboard {
--dashboard-surface-alt: var(--surface-muted);
--dashboard-text: var(--text-strong);
--dashboard-text-muted: var(--muted-text);
--dashboard-border: var(--border-color);
--dashboard-primary: var(--primary);
--dashboard-success: var(--success);
--dashboard-warn: var(--warning);
.dashboard-kpi-row > .cbi-section {
min-width: ~"min(100%, 16rem)";
padding: var(--field-gap) var(--section-inset);
gap: var(--field-gap);
}
.dashboard-kpi-text {
overflow-wrap: anywhere;
}
.dashboard-charts > .cbi-section {
min-width: ~"min(100%, 18rem)";
padding-block-end: var(--field-gap);
// Keep the native full-width heading; inset its chart and legend.
> :not(h3:first-child) {
margin-inline: var(--section-inset);
}
> .cbi-section-descr {
padding: 0;
margin-block-end: var(--field-gap);
overflow-wrap: anywhere;
}
> em {
padding: 0;
}
> .dashboard-legend-inline {
margin-block-start: var(--field-gap);
}
}
// Keep numeric chart axes in their native direction within RTL pages.
.dashboard-bars {
direction: ltr;
}
.dashboard-net-grid {
grid-template-columns: repeat(auto-fill, minmax(~"min(100%, 16.25rem)", 1fr));
}
.dashboard-net-fields {
grid-template-columns: repeat(2, minmax(0, 1fr));
}
.ifacebox {
min-width: 0;
max-width: 100%;
}
.ifacebox-body {
text-align: start;
}
// Each Internet column wraps its empty hint below the tab's root div.
[data-tab="internet"] > div > div > em {
display: block;
padding: var(--field-gap) var(--section-inset);
}
// The layout editor keeps its actions inside the card, unlike normal pages.
[data-tab="layout"] .cbi-page-actions {
padding: var(--field-gap) var(--section-inset);
}
}
+6 -2
View File
@@ -426,8 +426,8 @@ 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 وحاول مجددًا."
msgid "Unable to check for updates. Check the router's network connection and try again."
msgstr "تعذر التحقق من وجود تحديثات. تحقق من اتصال الموجّه بالشبكة وحاول مجددًا."
#: htdocs/luci-static/resources/argon/updates.js
msgid "Unable to compare this version. View the release for details."
@@ -532,3 +532,7 @@ msgstr "سيُحدَّث المظهر باستخدام مدير حزم النظ
#: htdocs/luci-static/resources/argon/updates.js
msgid "Cancel"
msgstr "إلغاء"
#: htdocs/luci-static/resources/argon/updates.js
msgid "Try again after %s."
msgstr "حاول مجددًا بعد %s."
+6 -2
View File
@@ -426,8 +426,8 @@ 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."
msgid "Unable to check for updates. Check the router's network connection and try again."
msgstr "Suche nach Updates fehlgeschlagen. Prüfen Sie die Netzwerkverbindung des Routers und versuchen Sie es erneut."
#: htdocs/luci-static/resources/argon/updates.js
msgid "Unable to compare this version. View the release for details."
@@ -532,3 +532,7 @@ msgstr "Das Theme wird mit der Paketverwaltung des Systems aktualisiert. Ihre Ar
#: htdocs/luci-static/resources/argon/updates.js
msgid "Cancel"
msgstr "Abbrechen"
#: htdocs/luci-static/resources/argon/updates.js
msgid "Try again after %s."
msgstr "Versuchen Sie es nach %s erneut."
+6 -2
View File
@@ -428,8 +428,8 @@ 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."
msgid "Unable to check for updates. Check the router's network connection and try again."
msgstr "No se pudo buscar actualizaciones. Compruebe la conexión de red del router e inténtelo de nuevo."
#: htdocs/luci-static/resources/argon/updates.js
msgid "Unable to compare this version. View the release for details."
@@ -534,3 +534,7 @@ msgstr "El tema se actualizará con el gestor de paquetes del sistema. Se conser
#: htdocs/luci-static/resources/argon/updates.js
msgid "Cancel"
msgstr "Cancelar"
#: htdocs/luci-static/resources/argon/updates.js
msgid "Try again after %s."
msgstr "Vuelva a intentarlo después de las %s."
+6 -2
View File
@@ -426,8 +426,8 @@ 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."
msgid "Unable to check for updates. Check the router's network connection and try again."
msgstr "Impossible de rechercher les mises à jour. Vérifiez la connexion réseau du routeur et réessayez."
#: htdocs/luci-static/resources/argon/updates.js
msgid "Unable to compare this version. View the release for details."
@@ -532,3 +532,7 @@ msgstr "Le thème sera mis à jour avec le gestionnaire de paquets du système.
#: htdocs/luci-static/resources/argon/updates.js
msgid "Cancel"
msgstr "Annuler"
#: htdocs/luci-static/resources/argon/updates.js
msgid "Try again after %s."
msgstr "Réessayez après %s."
+6 -2
View File
@@ -426,8 +426,8 @@ 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."
msgid "Unable to check for updates. Check the router's network connection and try again."
msgstr "Impossibile cercare aggiornamenti. Controllare la connessione di rete del router e riprovare."
#: htdocs/luci-static/resources/argon/updates.js
msgid "Unable to compare this version. View the release for details."
@@ -532,3 +532,7 @@ msgstr "Il tema verrà aggiornato con il gestore di pacchetti del sistema. Le im
#: htdocs/luci-static/resources/argon/updates.js
msgid "Cancel"
msgstr "Annulla"
#: htdocs/luci-static/resources/argon/updates.js
msgid "Try again after %s."
msgstr "Riprovare dopo le %s."
+6 -2
View File
@@ -426,8 +426,8 @@ 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 の接続を確認して、もう一度お試しください。"
msgid "Unable to check for updates. Check the router's network connection and try again."
msgstr "更新を確認できません。ルーターのネットワーク接続を確認して、もう一度お試しください。"
#: htdocs/luci-static/resources/argon/updates.js
msgid "Unable to compare this version. View the release for details."
@@ -532,3 +532,7 @@ msgstr "システムのパッケージマネージャーでテーマを更新し
#: htdocs/luci-static/resources/argon/updates.js
msgid "Cancel"
msgstr "キャンセル"
#: htdocs/luci-static/resources/argon/updates.js
msgid "Try again after %s."
msgstr "%s 以降にもう一度お試しください。"
+6 -2
View File
@@ -426,8 +426,8 @@ 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 연결을 확인한 후 다시 시도하세요."
msgid "Unable to check for updates. Check the router's network connection and try again."
msgstr "업데이트를 확인할 수 없습니다. 라우터의 네트워크 연결을 확인하고 다시 시도하세요."
#: htdocs/luci-static/resources/argon/updates.js
msgid "Unable to compare this version. View the release for details."
@@ -532,3 +532,7 @@ msgstr "시스템 패키지 관리자로 테마를 업데이트합니다. 현재
#: htdocs/luci-static/resources/argon/updates.js
msgid "Cancel"
msgstr "취소"
#: htdocs/luci-static/resources/argon/updates.js
msgid "Try again after %s."
msgstr "%s 이후에 다시 시도하세요."
+6 -2
View File
@@ -426,8 +426,8 @@ 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."
msgid "Unable to check for updates. Check the router's network connection and try again."
msgstr "Kan niet op updates controleren. Controleer de netwerkverbinding van de router en probeer het opnieuw."
#: htdocs/luci-static/resources/argon/updates.js
msgid "Unable to compare this version. View the release for details."
@@ -532,3 +532,7 @@ msgstr "Het thema wordt bijgewerkt met de pakketbeheerder van het systeem. Uw Ar
#: htdocs/luci-static/resources/argon/updates.js
msgid "Cancel"
msgstr "Annuleren"
#: htdocs/luci-static/resources/argon/updates.js
msgid "Try again after %s."
msgstr "Probeer het na %s opnieuw."
+6 -2
View File
@@ -426,8 +426,8 @@ 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."
msgid "Unable to check for updates. Check the router's network connection and try again."
msgstr "Nie można sprawdzić aktualizacji. Sprawdź połączenie sieciowe routera i spróbuj ponownie."
#: htdocs/luci-static/resources/argon/updates.js
msgid "Unable to compare this version. View the release for details."
@@ -532,3 +532,7 @@ msgstr "Motyw zostanie zaktualizowany przy użyciu systemowego menedżera pakiet
#: htdocs/luci-static/resources/argon/updates.js
msgid "Cancel"
msgstr "Anuluj"
#: htdocs/luci-static/resources/argon/updates.js
msgid "Try again after %s."
msgstr "Spróbuj ponownie po %s."
+6 -2
View File
@@ -428,8 +428,8 @@ 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."
msgid "Unable to check for updates. Check the router's network connection and try again."
msgstr "Não foi possível verificar atualizações. Verifique a conexão de rede do roteador e tente novamente."
#: htdocs/luci-static/resources/argon/updates.js
msgid "Unable to compare this version. View the release for details."
@@ -534,3 +534,7 @@ msgstr "O tema será atualizado com o gerenciador de pacotes do sistema. Suas co
#: htdocs/luci-static/resources/argon/updates.js
msgid "Cancel"
msgstr "Cancelar"
#: htdocs/luci-static/resources/argon/updates.js
msgid "Try again after %s."
msgstr "Tente novamente após %s."
+6 -2
View File
@@ -426,8 +426,8 @@ 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 и повторите попытку."
msgid "Unable to check for updates. Check the router's network connection and try again."
msgstr "Не удалось проверить обновления. Проверьте сетевое подключение маршрутизатора и повторите попытку."
#: htdocs/luci-static/resources/argon/updates.js
msgid "Unable to compare this version. View the release for details."
@@ -532,3 +532,7 @@ msgstr "Тема будет обновлена системным менедже
#: htdocs/luci-static/resources/argon/updates.js
msgid "Cancel"
msgstr "Отмена"
#: htdocs/luci-static/resources/argon/updates.js
msgid "Try again after %s."
msgstr "Повторите попытку после %s."
@@ -433,7 +433,7 @@ 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."
msgid "Unable to check for updates. Check the router's network connection and try again."
msgstr ""
#: htdocs/luci-static/resources/argon/updates.js
@@ -539,3 +539,7 @@ msgstr ""
#: htdocs/luci-static/resources/argon/updates.js
msgid "Cancel"
msgstr ""
#: htdocs/luci-static/resources/argon/updates.js
msgid "Try again after %s."
msgstr ""
+6 -2
View File
@@ -426,8 +426,8 @@ 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."
msgid "Unable to check for updates. Check the router's network connection and try again."
msgstr "Güncellemeler denetlenemedi. Yönlendiricinin ağ 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."
@@ -532,3 +532,7 @@ msgstr "Tema, sistemin paket yöneticisiyle güncellenecek. Argon ayarlarınız
#: htdocs/luci-static/resources/argon/updates.js
msgid "Cancel"
msgstr "İptal"
#: htdocs/luci-static/resources/argon/updates.js
msgid "Try again after %s."
msgstr "%s sonrasında yeniden deneyin."
+6 -2
View File
@@ -426,8 +426,8 @@ 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 і повторіть спробу."
msgid "Unable to check for updates. Check the router's network connection and try again."
msgstr "Не вдалося перевірити оновлення. Перевірте мережеве підключення маршрутизатора та спробуйте ще раз."
#: htdocs/luci-static/resources/argon/updates.js
msgid "Unable to compare this version. View the release for details."
@@ -532,3 +532,7 @@ msgstr "Тему буде оновлено системним менеджеро
#: htdocs/luci-static/resources/argon/updates.js
msgid "Cancel"
msgstr "Скасувати"
#: htdocs/luci-static/resources/argon/updates.js
msgid "Try again after %s."
msgstr "Спробуйте ще раз після %s."
+6 -2
View File
@@ -426,8 +426,8 @@ 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."
msgid "Unable to check for updates. Check the router's network connection and try again."
msgstr "Không thể kiểm tra bản cập nhật. Hãy kiểm tra kết nối mạng của bộ định tuyến rồi thử lại."
#: htdocs/luci-static/resources/argon/updates.js
msgid "Unable to compare this version. View the release for details."
@@ -532,3 +532,7 @@ msgstr "Giao diện sẽ được cập nhật bằng trình quản lý gói h
#: htdocs/luci-static/resources/argon/updates.js
msgid "Cancel"
msgstr "Hủy"
#: htdocs/luci-static/resources/argon/updates.js
msgid "Try again after %s."
msgstr "Thử lại sau %s."
Loaded 100 of 112 files, more files were not shown because too many files have changed in this diff. Show more