mirror of
https://github.com/kiddin9/op-packages.git
synced 2026-11-02 14:13:56 +08:00
🗽 Sync 2026-10-23 00:46:23
This commit is contained in:
1 parent
6032a57538
commit
2b29b0c4e1
112 files changed
+1859
-6208
No files matched your search
+4
-4
@@ -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
@@ -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
@@ -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
@@ -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)))
|
||||
@@ -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,
|
||||
|
||||
@@ -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
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -1,5 +0,0 @@
|
||||
# Local AI planning notes
|
||||
/task_plan.md
|
||||
/progress.md
|
||||
/progess.md
|
||||
/findings.md
|
||||
@@ -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,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
|
||||
@@ -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)
|
||||
@@ -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') ])
|
||||
];
|
||||
|
||||
@@ -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 "تعذر تحميل الأيقونات المخصصة. حدّث القالب وحزمة الإعدادات."
|
||||
@@ -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."
|
||||
@@ -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."
|
||||
@@ -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."
|
||||
@@ -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."
|
||||
@@ -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 "カスタムアイコンを読み込めません。テーマと設定パッケージを更新してください。"
|
||||
@@ -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 "사용자 지정 아이콘을 불러올 수 없습니다. 테마와 설정 패키지를 업데이트하세요."
|
||||
@@ -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."
|
||||
@@ -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."
|
||||
@@ -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 ""
|
||||
@@ -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."
|
||||
@@ -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 "Не вдалося завантажити власні піктограми. Оновіть тему та пакет налаштувань."
|
||||
@@ -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."
|
||||
@@ -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 "無法載入自訂圖示。請更新主題和設定套件。"
|
||||
@@ -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 +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));
|
||||
});
|
||||
@@ -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()
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
@@ -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>
|
||||
@@ -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 "正在获取数据……"
|
||||
Symlink
+1
@@ -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()
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"})
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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#源码构建)。
|
||||
|
||||
## 效果展示
|
||||
|
||||
亮暗两色,展示桌面与手机端的首页和两套登录界面。
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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."
|
||||
@@ -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."
|
||||
@@ -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."
|
||||
@@ -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."
|
||||
@@ -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."
|
||||
@@ -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 以降にもう一度お試しください。"
|
||||
@@ -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 이후에 다시 시도하세요."
|
||||
@@ -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."
|
||||
@@ -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."
|
||||
@@ -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."
|
||||
@@ -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 ""
|
||||
@@ -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."
|
||||
@@ -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."
|
||||
@@ -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
Reference in new issue
Block a user