🍕 Sync 2026-09-14 23:30:37

This commit is contained in:
github-actions[bot] committed 2026-09-14 23:30:37 +08:00
1 parent d6d7df32a5
commit 8a76697528
214 files changed
+10806 -2630

No files matched your search

+3 -3
View File
@@ -10,12 +10,12 @@ AGENTFLOW_ARCH_x86_64:=amd64
AGENTFLOW_ARCH_aarch64:=arm64
AGENTFLOW_ARCH:=$(AGENTFLOW_ARCH_$(ARCH))
AGENTFLOW_HASH_x86_64:=454857022d555b23979bd7b9116ef926ce7117e9e6034116f3223bb72cae07db
AGENTFLOW_HASH_aarch64:=34dfe07fd2a1bcb7de8eadb41dd0a67b46d5db78f4ca14d1835fe94608c0579a
AGENTFLOW_HASH_x86_64:=ccf06c24eee59f9638bc0ba42d2ea420723317dccef980a42a51499844fbde2c
AGENTFLOW_HASH_aarch64:=369017b7e7ea359018875cde2ee9260f0eb92d6fda329e82a219b98516bb6350
PKG_NAME:=agentflow
PKG_VERSION:=0.3.1
PKG_RELEASE:=9
PKG_RELEASE:=10
AGENTFLOW_URL_FILE:=agentflow-linux-$(AGENTFLOW_ARCH)
AGENTFLOW_DOWNLOAD:=$(AGENTFLOW_URL_FILE)-$(AGENTFLOW_HASH_$(ARCH))
+2 -2
View File
@@ -5,8 +5,8 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=brook
PKG_VERSION:=20260101.0
PKG_RELEASE:=4
PKG_VERSION:=20270101
PKG_RELEASE:=5
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
PKG_SOURCE_URL:=https://codeload.github.com/txthinking/brook/tar.gz/v$(PKG_VERSION)?
+2 -2
View File
@@ -6,11 +6,11 @@ include $(TOPDIR)/rules.mk
PKG_NAME:=cloudreve
PKG_VERSION:=4.18.0
PKG_RELEASE:=16
PKG_RELEASE:=17
PKG_SOURCE_PROTO:=git
PKG_SOURCE_URL:=https://github.com/cloudreve/Cloudreve.git
PKG_SOURCE_VERSION:=1c3fe4da3c4073e73a11ed93518b545bb8b8d5ce
PKG_SOURCE_VERSION:=ade1866be54a3614bc643ab5f513e93a1e0dc82f
PKG_MIRROR_HASH:=skip
PKG_LICENSE:=GPL-3.0-only
+3 -3
View File
@@ -5,10 +5,10 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=dae
PKG_VERSION:=2026.09.06
PKG_RELEASE:=43
PKG_VERSION:=2026.09.12
PKG_RELEASE:=44
PKG_SOURCE:=dae-src-2026.09.06-80525dabf966.tar.gz
PKG_SOURCE:=dae-src-2026.09.12-187058462a1f.tar.gz
PKG_SOURCE_URL:=https://github.com/kenzok8/openwrt-daede/releases/download/dae-src
PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
PKG_HASH:=skip
+3 -3
View File
@@ -5,10 +5,10 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=daed
PKG_VERSION:=2026.09.06
PKG_RELEASE:=54
PKG_VERSION:=2026.09.12
PKG_RELEASE:=55
PKG_SOURCE:=daed-src-2026.09.06-62f2e24ac52a.tar.gz
PKG_SOURCE:=daed-src-2026.09.12-a0181f729855.tar.gz
PKG_SOURCE_URL:=https://github.com/kenzok8/openwrt-daede/releases/download/daed-src
PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
PKG_HASH:=skip
+83 -4
View File
@@ -1,8 +1,65 @@
#!/bin/sh
# daed-cleanup.sh — reaper for stale daed kernel state.
#
# Removes:
# 1. Processes inside the `daens` netns (SIGTERM, then SIGKILL after 1s)
# 2. The `daens` network namespace itself (ip netns del, with
# umount+rm as fallback for zombie nsfs mounts)
# 3. The `dae0` veth pair in the host netns
#
# daed itself owns TC clsact detach. This opkg-side helper only
# reaps stale daens/dae0 state and never removes /sys/fs/bpf/daed.
# The pin directory is created during normal startup, so it is not
# a reliable leak indicator and must not block service lifecycle.
#
# The function stays sourceable by both init.d/daed and daed-guard.
daed_process_probe() {
if command -v pgrep >/dev/null 2>&1; then
pgrep -f '^/usr/bin/daed([[:space:]]|$)' >/dev/null 2>&1
case "$?" in
0) return 0 ;;
1) return 1 ;;
esac
fi
if command -v pidof >/dev/null 2>&1; then
pidof daed >/dev/null 2>&1
case "$?" in
0) return 0 ;;
1) return 1 ;;
esac
fi
return 2
}
daed_cleanup_runtime() {
local pid
local pid rc=0 probe_rc
# If daed userspace is currently running, do not touch the
# netns, the veth, or the eBPF dataplane. They are in active
# use; removing them would make every connection through dae
# hang.
daed_process_probe
probe_rc=$?
case "$probe_rc" in
0)
if [ "${DAED_GUARD_CLEANUP:-start}" = "start" ]; then
logger -t daed-init "cleanup: pre-start skipped because /usr/bin/daed is still running; refusing a second instance"
return 1
fi
logger -t daed-init "cleanup: post-exit skipped because another /usr/bin/daed instance is still running"
return 0
;;
1) ;;
*)
logger -t daed-init "cleanup: cannot determine whether daed is running; refusing to remove netns/veth"
return 1
;;
esac
# 1. Kill processes inside daens.
for pid in $(ip netns pids daens 2>/dev/null); do
kill "$pid" 2>/dev/null
done
@@ -14,14 +71,36 @@ daed_cleanup_runtime() {
done
fi
# 2. Remove the daens netns. ip netns del can fail if a
# process still references it via /proc/<pid>/ns/net or
# because the umount has already happened. Try the
# umount/rm fallback.
if ! ip netns del daens 2>/dev/null; then
umount -l /run/netns/daens 2>/dev/null
rm -f /run/netns/daens
if [ -e /run/netns/daens ] && ! rm -f /run/netns/daens 2>/dev/null; then
logger -t daed-init "cleanup: failed to remove /run/netns/daens (resource busy); a reboot may be required"
rc=1
fi
fi
ip link del dae0 2>/dev/null || true
# 3. Remove the dae0 veth pair.
if ip link show dae0 >/dev/null 2>&1; then
if ! ip link del dae0 2>/dev/null; then
logger -t daed-init "cleanup: failed to remove dae0 veth pair"
rc=1
fi
fi
# 4. The pin root is normal persistent state. Never remove it or
# make its existence change the cleanup result.
if [ -e /sys/fs/bpf/daed ]; then
logger -t daed-init "cleanup: /sys/fs/bpf/daed exists; leaving normal pin root unchanged"
fi
# Final verification covers only netns and veth state.
[ ! -e /run/netns/daens ] || return 1
! ip netns list 2>/dev/null | awk '$1 == "daens" { found=1 } END { exit !found }' || return 1
! ip netns list 2>/dev/null | grep -Eq '^daens([[:space:]]|$)' || return 1
! ip link show dae0 >/dev/null 2>&1 || return 1
return $rc
}
+118 -16
View File
@@ -1,29 +1,131 @@
#!/bin/sh
# Keep daed as a child so signals can be forwarded and stale netns/veth
# state can be cleaned before start and after exit. daed owns TC detach;
# /sys/fs/bpf/daed is normal persistent state and is never removed here.
. /usr/share/daed/cleanup.sh
# Pre-start cleanup refuses to remove runtime state while another
# daed instance is active, and fails closed if that probe is broken.
DAED_GUARD_CLEANUP=start
if ! daed_cleanup_runtime; then
echo "daed: stale network state could not be removed" >&2
echo "daed: stale /usr/bin/daed or netns state could not be verified or removed; refusing to start. Check process and netns state." >&2
logger -t daed-init "pre-start cleanup failed: refusing to start daed"
exit 1
fi
# Keep daed as a child so a panic or unexpected exit is followed by an
# immediate teardown of all kernel/runtime state before procd can respawn us.
# Keep daed as a child so post-exit cleanup runs before procd can
# respawn it.
child_pid=
cleanup_child() {
[ -n "$child_pid" ] && kill "$child_pid" 2>/dev/null
pending_signal=
shutdown_signal=
shutdown_elapsed=0
forced_kill=0
child_term_timeout=20
forward_signal() {
local sig="$1"
if [ -z "$child_pid" ]; then
pending_signal="$sig"
logger -t daed-init "signal $sig received before daed child started; launch cancelled"
return 0
fi
case "$sig" in
TERM|INT|QUIT)
if [ -z "$shutdown_signal" ]; then
shutdown_signal="$sig"
shutdown_elapsed=0
fi
;;
esac
kill -"$sig" "$child_pid" 2>/dev/null
}
trap cleanup_child TERM INT
/usr/bin/daed "$@" &
child_pid=$!
wait "$child_pid"
status=$?
child_pid=
trap - TERM INT
exit_with_signal() {
local sig="$1"
trap - TERM INT HUP QUIT
kill -"$sig" "$$" 2>/dev/null
exit 1
}
if ! daed_cleanup_runtime; then
echo "daed: runtime cleanup after exit failed" >&2
status=1
child_is_running() {
local state
kill -0 "$child_pid" 2>/dev/null || return 1
state=$(awk '{ print $3 }' "/proc/$child_pid/stat" 2>/dev/null)
[ "$state" != "Z" ]
}
trap 'forward_signal TERM' TERM
trap 'forward_signal INT' INT
trap 'forward_signal HUP' HUP
trap 'forward_signal QUIT' QUIT
start_child() {
local sig
# Keep this check inside the function as well as at the call site:
# it closes the ordinary pre-start window, while the pending-signal
# path below handles a signal arriving during the background fork.
[ -z "$pending_signal" ] || return 125
/usr/bin/daed "$@" &
child_pid=$!
if [ -n "$pending_signal" ]; then
sig="$pending_signal"
pending_signal=
forward_signal "$sig"
fi
}
if [ -n "$pending_signal" ]; then
logger -t daed-init "refusing to start daed after pending signal $pending_signal"
exit_with_signal "$pending_signal"
fi
exit "$status"
# Best-effort OOM preference; failure must not block startup.
if ! echo -16 > /proc/self/oom_score_adj 2>/dev/null; then
logger -t daed-init "warn: failed to set /proc/self/oom_score_adj; continuing without OOM preference"
fi
if ! start_child "$@"; then
logger -t daed-init "refusing to start daed after pending signal $pending_signal"
if [ -n "$pending_signal" ]; then
exit_with_signal "$pending_signal"
fi
exit 1
fi
status=0
reaped=0
while [ "$reaped" -eq 0 ]; do
if [ -n "$shutdown_signal" ] && child_is_running; then
if [ "$shutdown_elapsed" -ge "$child_term_timeout" ]; then
if [ "$forced_kill" -eq 0 ]; then
logger -t daed-init "daed did not exit within ${child_term_timeout}s after $shutdown_signal; sending KILL"
kill -KILL "$child_pid" 2>/dev/null
forced_kill=1
fi
else
sleep 1
shutdown_elapsed=$((shutdown_elapsed + 1))
continue
fi
sleep 1
continue
fi
wait "$child_pid" 2>/dev/null
status=$?
if ! child_is_running; then
reaped=1
fi
done
child_pid=
trap - TERM INT HUP QUIT
# Post-exit cleanup runs after the child is reaped.
DAED_GUARD_CLEANUP=post-exit
cleanup_status=0
daed_cleanup_runtime || cleanup_status=$?
if [ "$cleanup_status" -ne 0 ]; then
echo "daed: runtime cleanup after exit failed" >&2
logger -t daed-init "post-exit cleanup failed; check ip netns / ip link show"
fi
if [ "$status" -ne 0 ]; then
exit "$status"
fi
exit "$cleanup_status"
+37 -13
View File
@@ -1,5 +1,7 @@
#!/bin/sh /etc/rc.common
# Copyright (C) 2023 Tianling Shen <cnsztl@immortalwrt.org>
# daed-guard handles bounded child shutdown and post-exit netns/veth cleanup.
# Keep the log file and a pre-stop state snapshot for diagnostics.
USE_PROCD=1
START=99
@@ -10,18 +12,28 @@ LOG="/var/log/daed/daed.log"
. /usr/share/daed/cleanup.sh
log() {
logger -t daed-init "$@"
}
start_service() {
log "start: begin"
config_load "$CONF"
local enabled
config_get_bool enabled "config" "enabled" "0"
[ "$enabled" -eq "1" ] || return 1
if [ "$enabled" -ne "1" ]; then
log "start: config disabled, exit"
return 1
fi
local listen_addr log_maxbackups log_maxsize
config_get listen_addr "config" "listen_addr" "0.0.0.0:2023"
config_get log_maxbackups "config" "log_maxbackups" "1"
config_get log_maxsize "config" "log_maxsize" "5"
log "start: listen=$listen_addr log_maxbackups=$log_maxbackups log_maxsize=$log_maxsize"
procd_open_instance "$CONF"
procd_set_param env DAE_LOCATION_ASSET="/usr/share/v2ray" TZ="$(uci -q get system.@system[0].zonename)"
procd_set_param command "$PROG" run
@@ -33,25 +45,37 @@ start_service() {
procd_set_param limits core="unlimited"
procd_set_param limits nofile="1000000 1000000"
# Avoid an endless crash/respawn loop which can repeatedly reattach dae's
# data-plane hooks and make the router management plane unreachable.
procd_set_param respawn 3600 5 5
# daed-guard escalates its child after 20 seconds. Leave time for
# reap and post-exit cleanup before procd kills the wrapper.
procd_set_param term_timeout 30
# procd_set_param respawn: arguments are (threshold, timeout, retry).
# threshold = runtime that resets the short-lived exit counter
# timeout = seconds to wait between retries
# retry = maximum short-lived exits before procd gives up
# Reset the counter after one hour of stable runtime; otherwise retry
# after 5 seconds and stop after 10 failures.
procd_set_param respawn 3600 5 10
# daed-guard sets oom_score_adj before forking; procd has no
# oom_adj/oom_score_adj parameter.
# procd_set_param stdout 1
procd_set_param stderr 1
procd_close_instance
log "start: procd_open_instance done"
}
stop_service() {
rm -f "$LOG"
daed_cleanup_runtime
}
restart() {
stop
sleep 1
daed_cleanup_runtime
start
log "stop: begin"
# Cleanup runs in daed-guard after its child exits. Record only a
# pre-stop snapshot here; pin entries do not prove TC attachment.
local pinned="" ns_left=""
if [ -d /sys/fs/bpf/daed ]; then
pinned=$(ls /sys/fs/bpf/daed 2>/dev/null | tr '\n' ' ')
fi
if ip netns list 2>/dev/null | grep -q '^daens'; then
ns_left="daens"
fi
log "stop: pre-stop state — bpf_pin_entries=[${pinned:-none}] netns_left=[${ns_left:-none}]"
}
service_triggers() {
+27
View File
@@ -0,0 +1,27 @@
include $(TOPDIR)/rules.mk
LUCI_TITLE:=LuCI support for EasyTier Next
LUCI_URL:=https://github.com/EasyTier/EasyTier
PKG_DESCRIPTION:=Provides a modern LuCI Web management interface for EasyTier decentralized mesh VPN.
PKG_MAINTAINER:=Dante <dante@seckv.com>
LUCI_DEPENDS:=+easytier-next +luci-base
LUCI_PKGARCH:=all
define Package/luci-app-easytier-next/conffiles
/etc/config/easytier
/etc/easytier/
endef
define Package/luci-app-easytier-next/postinst
#!/bin/sh
[ -n "$${IPKG_INSTROOT}" ] || {
rm -f /tmp/luci-indexcache.* /tmp/luci-modulecache/* 2>/dev/null
chmod 0755 /etc/init.d/easytier /etc/hotplug.d/iface/99-easytier-routes 2>/dev/null || true
/etc/init.d/rpcd restart 2>/dev/null || true
}
exit 0
endef
include $(TOPDIR)/feeds/luci/luci.mk
# call BuildPackage - OpenWrt buildroot signature
File diff suppressed because it is too large. Load diff
@@ -0,0 +1,383 @@
msgid "(Drag to pan, scroll to zoom)"
msgstr ""
msgid "50 ~ 150ms (Good)"
msgstr ""
msgid "< 50ms (Optimal)"
msgstr ""
msgid "> 150ms (Fair)"
msgstr ""
msgid "Absolute path to the TOML configuration file (Corresponding flag: -c, --config-file). Ensure the file exists with valid EasyTier configuration."
msgstr ""
msgid "Action"
msgstr ""
msgid "Additional command-line parameters appended to easytier-core."
msgstr ""
msgid "Advanced Options"
msgstr ""
msgid "Allow WAN Access"
msgstr ""
msgid "Allow other peers in the network to route their Internet traffic through this node (Corresponding flag: --enable-exit-node)."
msgstr ""
msgid "Allow resolving peer node domain names (such as hostname.et.net) without memorizing virtual IP addresses (Corresponding flag: --accept-dns). Automatically forwards DNS queries via dnsmasq. Note: If third-party DNS tools (e.g. MosDNS, AdGuard Home, SmartDNS) are active, ensure this domain zone is excluded from hijacking."
msgstr ""
msgid "Automatically determine and assign a virtual IP address (Corresponding flag: -d, --dhcp)."
msgstr ""
msgid "Automatically open and manage firewall traffic rules on WAN zone to allow incoming connections for external peers."
msgstr ""
msgid "Clear Logs"
msgstr ""
msgid "Client Version"
msgstr ""
msgid "Cloud Web Config"
msgstr ""
msgid "Collecting data ..."
msgstr ""
msgid "Collecting logs..."
msgstr ""
msgid "Command-line"
msgstr ""
msgid "Configuration File"
msgstr ""
msgid "Configuration File Path"
msgstr ""
msgid "Connected Peer Nodes"
msgstr ""
msgid "Core Service Status"
msgstr ""
msgid "Core Settings"
msgstr ""
msgid "Cost"
msgstr ""
msgid "Custom Command Parameters"
msgstr ""
msgid "Directory to store SQLite database for easytier-web."
msgstr ""
msgid "EasyTier"
msgstr ""
msgid "EasyTier is a simple, secure, decentralized mesh VPN for intranet penetration, implemented in Rust."
msgstr ""
msgid "Enable Core Service"
msgstr ""
msgid "Enable DHCP IP Allocation"
msgstr ""
msgid "Enable Exit Node"
msgstr ""
msgid "Enable Magic DNS"
msgstr ""
msgid "Enable Tunnel Traffic SNAT"
msgstr ""
msgid "Enable Web Console Service"
msgstr ""
msgid "Enable multi-threaded packet processing for higher throughput (Corresponding flag: --multi-thread)."
msgstr ""
msgid "Encryption Algorithm"
msgstr ""
msgid "Failed to load logs: %s"
msgstr ""
msgid "Failed to load peers: %s"
msgstr ""
msgid "Failed to load topology: %s"
msgstr ""
msgid "HTTP listen port for easytier-web embedded web dashboard."
msgstr ""
msgid "Hostname"
msgstr ""
msgid "Initial connection peer node URLs (Corresponding flag: -p, --peers)."
msgstr ""
msgid "Interface IPv4 Address"
msgstr ""
msgid "Interface IPv6 Address"
msgstr ""
msgid "Invalid URL format, must start with tcp://, udp://, ws://, wss://, wg://, or quic://"
msgstr ""
msgid "Invalid UUID format (e.g. %s)"
msgstr ""
msgid "Invalid username format, only letters, digits, and _ - . @ are allowed."
msgstr ""
msgid "Latency"
msgstr ""
msgid "Local Node Information"
msgstr ""
msgid "Local service is not running."
msgstr ""
msgid "Log Actions"
msgstr ""
msgid "Logs"
msgstr ""
msgid "Logs cleared."
msgstr ""
msgid "Loss Rate"
msgstr ""
msgid "Machine ID (UUID)"
msgstr ""
msgid "Magic DNS Domain Zone"
msgstr ""
msgid "Multi-threaded Mode"
msgstr ""
msgid "NAT Type"
msgstr ""
msgid "Network Name"
msgstr ""
msgid "Network Secret"
msgstr ""
msgid "Network Topology"
msgstr ""
msgid "No connected remote peers found."
msgstr ""
msgid "No logs available."
msgstr ""
msgid "No topology data available."
msgstr ""
msgid "None"
msgstr ""
msgid "Not Installed"
msgstr ""
msgid "Open Console"
msgstr ""
msgid "Peer Nodes"
msgstr ""
msgid "Port for local CLI and RPC management portal (Corresponding flag: --rpc-portal)."
msgstr ""
msgid "Proxy Network"
msgstr ""
msgid "Proxy Networks"
msgstr ""
msgid "Public Discovery Node"
msgstr ""
msgid "Public discovery node URL (Corresponding flag: -e, --external-node)."
msgstr ""
msgid "RPC Management Port"
msgstr ""
msgid "RX"
msgstr ""
msgid "Refresh"
msgstr ""
msgid "Refresh Logs"
msgstr ""
msgid "Refresh Topology"
msgstr ""
msgid "Remote web configuration server address or username (Corresponding flag: -w, --web-config). Supports complete URL (e.g. udp://127.0.0.1:22020/admin) or username only (e.g. admin, connecting to official cloud server)."
msgstr ""
msgid "Reset View"
msgstr ""
msgid "Restart"
msgstr ""
msgid "Restarting service..."
msgstr ""
msgid "Running"
msgstr ""
msgid "Running (Unmanaged)"
msgstr ""
msgid "Service Status"
msgstr ""
msgid "Settings"
msgstr ""
msgid "Specify the top-level domain zone for Magic DNS (Corresponding flag: --tld-dns-zone). Default is et.net. (FQDN ending with dot)."
msgstr ""
msgid "Startup Method"
msgstr ""
msgid "Stopped"
msgstr ""
msgid "Subnet CIDRs to proxy and announce through this node (Corresponding flag: -n, --proxy-networks). Select from the detected local subnets below or enter custom CIDRs."
msgstr ""
msgid "TUN Device Name"
msgstr ""
msgid "TX"
msgstr ""
msgid "The VPN network name to identify this virtual network (Corresponding flag: --network-name)."
msgstr ""
msgid "The secret phrase used to authorize and encrypt traffic (Corresponding flag: --network-secret)."
msgstr ""
msgid "The static IPv4 address of this node (Corresponding flag: -i, --ipv4). Ignored when DHCP is enabled."
msgstr ""
msgid "The static IPv6 address of this node (Corresponding flag: --ipv6)."
msgstr ""
msgid "The web console may consume significant memory, please enable as needed."
msgstr ""
msgid "Topology Actions"
msgstr ""
msgid "Tunnel"
msgstr ""
msgid "Unique device identifier UUID in the cloud management console (Corresponding flag: --machine-id). Automatically generated on initial install. Changing UUID will automatically clear local cloud cache."
msgstr ""
msgid "Use OpenWrt system firewall to manage NAT for EasyTier tunnel and subnet traffic. Disabling this option disables source address masquerading to preserve real source IPs of remote peers and subnets in the local network."
msgstr ""
msgid "Version"
msgstr ""
msgid "Virtual IP"
msgstr ""
msgid "Virtual Interface"
msgstr ""
msgid "Virtual TUN network interface name (Corresponding flag: --dev-name)."
msgstr ""
msgid "Web Config Server URL"
msgstr ""
msgid "Web Config Server URL cannot be empty."
msgstr ""
msgid "Web Console"
msgstr ""
msgid "Web Console Port"
msgstr ""
msgid "Web Console Status"
msgstr ""
msgid "Web Data Directory"
msgstr ""
msgid "Zoom In"
msgstr ""
msgid "Zoom Out"
msgstr ""
msgid "Reset Layout"
msgstr ""
msgid "(Hover to highlight link, drag nodes/canvas to adjust)"
msgstr ""
msgid "All Links"
msgstr ""
msgid "Local Only"
msgstr ""
msgid "Show All Peer Links"
msgstr ""
msgid "Show Local Links Only"
msgstr ""
msgid "Next Hop: %s (%s)"
msgstr ""
msgid "Next Hop: %s"
msgstr ""
msgid "Latency / Loss"
msgstr ""
msgid "RX / TX"
msgstr ""
msgid "(Hover/click node to trace path, drag to adjust)"
msgstr ""
msgid "Clear selection"
msgstr ""
msgid "Local Node: %s"
msgstr ""
msgid "Path"
msgstr ""
+1
View File
@@ -0,0 +1 @@
zh_Hans
@@ -0,0 +1,383 @@
msgid "(Drag to pan, scroll to zoom)"
msgstr "(支持拖拽画布平移,滚轮缩放视图)"
msgid "50 ~ 150ms (Good)"
msgstr "50 ~ 150ms (良)"
msgid "< 50ms (Optimal)"
msgstr "< 50ms (优)"
msgid "> 150ms (Fair)"
msgstr "> 150ms (一般)"
msgid "Absolute path to the TOML configuration file (Corresponding flag: -c, --config-file). Ensure the file exists with valid EasyTier configuration."
msgstr "TOML 格式配置文件的绝对路径 (对应参数:-c, --config-file)。请确保该文件已存在并包含有效的 EasyTier 配置。"
msgid "Action"
msgstr "操作"
msgid "Additional command-line parameters appended to easytier-core."
msgstr "附加到 easytier-core 进程末尾的自定义参数。"
msgid "Advanced Options"
msgstr "高级设置"
msgid "Allow WAN Access"
msgstr "允许从 WAN 访问"
msgid "Allow other peers in the network to route their Internet traffic through this node (Corresponding flag: --enable-exit-node)."
msgstr "允许网络中的其他对等节点通过本节点路由外网流量 (对应参数:--enable-exit-node)。"
msgid "Allow resolving peer node domain names (such as hostname.et.net) without memorizing virtual IP addresses (Corresponding flag: --accept-dns). Automatically forwards DNS queries via dnsmasq. Note: If third-party DNS tools (e.g. MosDNS, AdGuard Home, SmartDNS) are active, ensure this domain zone is excluded from hijacking."
msgstr "允许直接通过主机名解析节点 (对应参数:--accept-dns)。自动通过 dnsmasq 转发解析请求至内置 DNS 服务器 (100.100.100.101)。注意:若启用了第三方 DNS 代理工具(如 MosDNS、AdGuard Home、SmartDNS 或分流插件),请确保将该域名区域加入直连/放行名单以防止被劫持导致解析失败。"
msgid "Automatically determine and assign a virtual IP address (Corresponding flag: -d, --dhcp)."
msgstr "自动协商并分配虚拟网卡 IP 地址 (对应参数:-d, --dhcp)。"
msgid "Automatically open and manage firewall traffic rules on WAN zone to allow incoming connections for external peers."
msgstr "自动在 WAN 防火墙区域创建并管理通信规则,放行外部节点连接本节点的入站流量。"
msgid "Clear Logs"
msgstr "清空日志"
msgid "Client Version"
msgstr "客户端版本"
msgid "Cloud Web Config"
msgstr "云端集中配置"
msgid "Collecting data ..."
msgstr "正在收集数据..."
msgid "Collecting logs..."
msgstr "正在收集日志..."
msgid "Command-line"
msgstr "命令行参数"
msgid "Configuration File"
msgstr "配置文件"
msgid "Configuration File Path"
msgstr "配置文件路径"
msgid "Connected Peer Nodes"
msgstr "已连接对等节点"
msgid "Core Service Status"
msgstr "核心服务状态"
msgid "Core Settings"
msgstr "基本设置"
msgid "Cost"
msgstr "开销"
msgid "Custom Command Parameters"
msgstr "自定义启动参数"
msgid "Directory to store SQLite database for easytier-web."
msgstr "用于存放 easytier-web SQLite 数据库文件的目录。"
msgid "EasyTier"
msgstr "EasyTier"
msgid "EasyTier is a simple, secure, decentralized mesh VPN for intranet penetration, implemented in Rust."
msgstr "EasyTier 是一款基于 Rust 实现的简单、安全、去中心化的网状异地组网工具。"
msgid "Enable Core Service"
msgstr "启用核心服务"
msgid "Enable DHCP IP Allocation"
msgstr "启用 DHCP 分配"
msgid "Enable Exit Node"
msgstr "作为出口节点"
msgid "Enable Magic DNS"
msgstr "启用魔法 DNS"
msgid "Enable Tunnel Traffic SNAT"
msgstr "开启隧道流量 SNAT"
msgid "Enable Web Console Service"
msgstr "启用 Web 控制台服务"
msgid "Enable multi-threaded packet processing for higher throughput (Corresponding flag: --multi-thread)."
msgstr "启用多线程数据包处理以提升高吞吐性能 (对应参数:--multi-thread)。"
msgid "Encryption Algorithm"
msgstr "加密算法"
msgid "Failed to load logs: %s"
msgstr "加载日志失败:%s"
msgid "Failed to load peers: %s"
msgstr "加载对等节点失败:%s"
msgid "Failed to load topology: %s"
msgstr "加载拓扑失败:%s"
msgid "HTTP listen port for easytier-web embedded web dashboard."
msgstr "easytier-web 内置 Web 控制台的 HTTP 监听端口。"
msgid "Hostname"
msgstr "主机名"
msgid "Initial connection peer node URLs (Corresponding flag: -p, --peers)."
msgstr "初始连接的对等节点地址 (对应参数:-p, --peers)。"
msgid "Interface IPv4 Address"
msgstr "虚拟 IPv4 地址"
msgid "Interface IPv6 Address"
msgstr "虚拟 IPv6 地址"
msgid "Invalid URL format, must start with tcp://, udp://, ws://, wss://, wg://, or quic://"
msgstr "URL 格式无效,必须以 tcp://、udp://、ws://、wss://、wg:// 或 quic:// 开头"
msgid "Invalid UUID format (e.g. %s)"
msgstr "UUID 格式无效(示例:%s)"
msgid "Invalid username format, only letters, digits, and _ - . @ are allowed."
msgstr "用户名格式无效,仅支持字母、数字及 _ - . @"
msgid "Latency"
msgstr "延迟"
msgid "Local Node Information"
msgstr "本地节点信息"
msgid "Local service is not running."
msgstr "本地服务未运行。"
msgid "Log Actions"
msgstr "日志操作"
msgid "Logs"
msgstr "运行日志"
msgid "Logs cleared."
msgstr "日志已清空。"
msgid "Loss Rate"
msgstr "丢包率"
msgid "Machine ID (UUID)"
msgstr "设备唯一标识 (UUID)"
msgid "Magic DNS Domain Zone"
msgstr "魔法 DNS 域名区域"
msgid "Multi-threaded Mode"
msgstr "多线程模式"
msgid "NAT Type"
msgstr "NAT 类型"
msgid "Network Name"
msgstr "网络名称"
msgid "Network Secret"
msgstr "网络密钥"
msgid "Network Topology"
msgstr "网络拓扑"
msgid "No connected remote peers found."
msgstr "未找到已连接的远程对等节点。"
msgid "No logs available."
msgstr "暂无可用的日志记录。"
msgid "No topology data available."
msgstr "暂无拓扑数据。"
msgid "None"
msgstr "无"
msgid "Not Installed"
msgstr "未安装"
msgid "Open Console"
msgstr "打开控制台"
msgid "Peer Nodes"
msgstr "对等节点"
msgid "Port for local CLI and RPC management portal (Corresponding flag: --rpc-portal)."
msgstr "本地 CLI 与 RPC 交互端口 (对应参数:--rpc-portal)。"
msgid "Proxy Network"
msgstr "子网代理"
msgid "Proxy Networks"
msgstr "子网代理"
msgid "Public Discovery Node"
msgstr "公共发现节点"
msgid "Public discovery node URL (Corresponding flag: -e, --external-node)."
msgstr "公共发现节点 URL (对应参数:-e, --external-node)。"
msgid "RPC Management Port"
msgstr "RPC 管理端口"
msgid "RX"
msgstr "RX"
msgid "Refresh"
msgstr "刷新"
msgid "Refresh Logs"
msgstr "刷新日志"
msgid "Refresh Topology"
msgstr "刷新拓扑"
msgid "Remote web configuration server address or username (Corresponding flag: -w, --web-config). Supports complete URL (e.g. udp://127.0.0.1:22020/admin) or username only (e.g. admin, connecting to official cloud server)."
msgstr "远程 Web 配置服务器地址或用户名 (对应参数:-w, --web-config)。支持完整 URL(如 udp://127.0.0.1:22020/admin)或仅填用户名/网络名(如 admin,自动连接官方云端服务器)。"
msgid "Reset View"
msgstr "重置视图"
msgid "Restart"
msgstr "重启"
msgid "Restarting service..."
msgstr "正在重启服务..."
msgid "Running"
msgstr "运行中"
msgid "Running (Unmanaged)"
msgstr "运行中 (非托管)"
msgid "Service Status"
msgstr "服务运行状态"
msgid "Settings"
msgstr "配置"
msgid "Specify the top-level domain zone for Magic DNS (Corresponding flag: --tld-dns-zone). Default is et.net. (FQDN ending with dot)."
msgstr "指定魔法 DNS 的顶级域名区域 (对应参数:--tld-dns-zone)。默认值为 et.net.(以点结尾的 FQDN 根域)。"
msgid "Startup Method"
msgstr "启动方式"
msgid "Stopped"
msgstr "已停止"
msgid "Subnet CIDRs to proxy and announce through this node (Corresponding flag: -n, --proxy-networks). Select from the detected local subnets below or enter custom CIDRs."
msgstr "通过此节点代理并通告的子网网段 (对应参数:-n, --proxy-networks)。可直接下拉选择探测到的本地网段或手动输入。"
msgid "TUN Device Name"
msgstr "虚拟网卡名称"
msgid "TX"
msgstr "TX"
msgid "The VPN network name to identify this virtual network (Corresponding flag: --network-name)."
msgstr "VPN 虚拟网络名称 (对应参数:--network-name)。"
msgid "The secret phrase used to authorize and encrypt traffic (Corresponding flag: --network-secret)."
msgstr "用于节点认证与加密的密钥短语 (对应参数:--network-secret)。"
msgid "The static IPv4 address of this node (Corresponding flag: -i, --ipv4). Ignored when DHCP is enabled."
msgstr "本节点的静态 IPv4 地址 (对应参数:-i, --ipv4)。启用 DHCP 时自动忽略。"
msgid "The static IPv6 address of this node (Corresponding flag: --ipv6)."
msgstr "本节点的静态 IPv6 地址 (对应参数:--ipv6)。"
msgid "The web console may consume significant memory, please enable as needed."
msgstr "Web 控制台可能会消耗较多内存,请按需启用。"
msgid "Topology Actions"
msgstr "拓扑操作"
msgid "Tunnel"
msgstr "连接方式"
msgid "Unique device identifier UUID in the cloud management console (Corresponding flag: --machine-id). Automatically generated on initial install. Changing UUID will automatically clear local cloud cache."
msgstr "用于在云端控制台中标识当前设备的唯一 UUID 标识符 (对应参数:--machine-id)。初始化安装时自动生成,修改更换 UUID 时将自动重置并清理云端缓存。"
msgid "Use OpenWrt system firewall to manage NAT for EasyTier tunnel and subnet traffic. Disabling this option disables source address masquerading to preserve real source IPs of remote peers and subnets in the local network."
msgstr "使用 OpenWrt 系统防火墙接管 EasyTier 虚拟网卡与子网转发流量的 NAT。关闭此选项将禁用源地址伪装,保留远程对等节点及子网在本地局域网中的真实源 IP。"
msgid "Version"
msgstr "版本"
msgid "Virtual IP"
msgstr "虚拟 IP"
msgid "Virtual Interface"
msgstr "虚拟网卡"
msgid "Virtual TUN network interface name (Corresponding flag: --dev-name)."
msgstr "创建的虚拟 TUN 网卡接口名称 (对应参数:--dev-name)。"
msgid "Web Config Server URL"
msgstr "云端配置服务器地址"
msgid "Web Config Server URL cannot be empty."
msgstr "云端配置服务器地址不能为空。"
msgid "Web Console"
msgstr "Web 控制台"
msgid "Web Console Port"
msgstr "控制台监听端口"
msgid "Web Console Status"
msgstr "控制台服务状态"
msgid "Web Data Directory"
msgstr "控制台数据目录"
msgid "Zoom In"
msgstr "放大"
msgid "Zoom Out"
msgstr "缩小"
msgid "Reset Layout"
msgstr "重置布局"
msgid "(Hover to highlight link, drag nodes/canvas to adjust)"
msgstr "(悬停高亮链路,拖拽节点/画布以调整)"
msgid "All Links"
msgstr "全部链路"
msgid "Local Only"
msgstr "仅本端"
msgid "Show All Peer Links"
msgstr "显示所有对端连接线"
msgid "Show Local Links Only"
msgstr "仅聚焦本端连接线"
msgid "Next Hop: %s (%s)"
msgstr "下一跳中继: %s (%s)"
msgid "Next Hop: %s"
msgstr "下一跳中继: %s"
msgid "Latency / Loss"
msgstr "延迟 / 丢包"
msgid "RX / TX"
msgstr "接收 / 发送"
msgid "(Hover/click node to trace path, drag to adjust)"
msgstr "(悬停/点击节点追踪路径,支持拖拽调整)"
msgid "Clear selection"
msgstr "清除选中"
msgid "Local Node: %s"
msgstr "本地节点: %s"
msgid "Path"
msgstr "路径"
@@ -0,0 +1,383 @@
msgid "(Drag to pan, scroll to zoom)"
msgstr "(支援拖拽畫布平移,滾輪縮放視圖)"
msgid "50 ~ 150ms (Good)"
msgstr "50 ~ 150ms (良)"
msgid "< 50ms (Optimal)"
msgstr "< 50ms (優)"
msgid "> 150ms (Fair)"
msgstr "> 150ms (一般)"
msgid "Absolute path to the TOML configuration file (Corresponding flag: -c, --config-file). Ensure the file exists with valid EasyTier configuration."
msgstr "TOML 格式配置檔案的絕對路徑 (對應參數:-c, --config-file)。請確保該檔案已存在並包含有效的 EasyTier 配置。"
msgid "Action"
msgstr "操作"
msgid "Additional command-line parameters appended to easytier-core."
msgstr "附加到 easytier-core 進程末尾的自定義參數。"
msgid "Advanced Options"
msgstr "進階設定"
msgid "Allow WAN Access"
msgstr "允許從 WAN 訪問"
msgid "Allow other peers in the network to route their Internet traffic through this node (Corresponding flag: --enable-exit-node)."
msgstr "允許網路中的其他對等節點透過本節點路由外網流量 (對應參數:--enable-exit-node)。"
msgid "Allow resolving peer node domain names (such as hostname.et.net) without memorizing virtual IP addresses (Corresponding flag: --accept-dns). Automatically forwards DNS queries via dnsmasq. Note: If third-party DNS tools (e.g. MosDNS, AdGuard Home, SmartDNS) are active, ensure this domain zone is excluded from hijacking."
msgstr "允許直接透過主機名解析節點 (對應參數:--accept-dns)。自動透過 dnsmasq 轉發解析請求至內置 DNS 伺服器 (100.100.100.101)。注意:若啟用了第三方 DNS 代理工具(如 MosDNS、AdGuard Home、SmartDNS 或分流插件),請確保將該網域區域加入直連/放行名單以防止被劫持導致解析失敗。"
msgid "Automatically determine and assign a virtual IP address (Corresponding flag: -d, --dhcp)."
msgstr "自動協商並分配虛擬網卡 IP 位址 (對應參數:-d, --dhcp)。"
msgid "Automatically open and manage firewall traffic rules on WAN zone to allow incoming connections for external peers."
msgstr "自動在 WAN 防火牆區域創建並管理通信規則,放行外部節點連接本節點的入站流量。"
msgid "Clear Logs"
msgstr "清空日誌"
msgid "Client Version"
msgstr "客戶端版本"
msgid "Cloud Web Config"
msgstr "雲端集中配置"
msgid "Collecting data ..."
msgstr "正在收集數據..."
msgid "Collecting logs..."
msgstr "正在收集日誌..."
msgid "Command-line"
msgstr "命令行參數"
msgid "Configuration File"
msgstr "配置檔案"
msgid "Configuration File Path"
msgstr "配置檔案路徑"
msgid "Connected Peer Nodes"
msgstr "已連線對等節點"
msgid "Core Service Status"
msgstr "核心服務狀態"
msgid "Core Settings"
msgstr "基本設定"
msgid "Cost"
msgstr "開銷"
msgid "Custom Command Parameters"
msgstr "自定義啟動參數"
msgid "Directory to store SQLite database for easytier-web."
msgstr "用於存放 easytier-web SQLite 資料庫檔案的目錄。"
msgid "EasyTier"
msgstr "EasyTier"
msgid "EasyTier is a simple, secure, decentralized mesh VPN for intranet penetration, implemented in Rust."
msgstr "EasyTier 是一款基於 Rust 實現的簡單、安全、去中心化的網狀異地組網工具。"
msgid "Enable Core Service"
msgstr "啟用核心服務"
msgid "Enable DHCP IP Allocation"
msgstr "啟用 DHCP 分配"
msgid "Enable Exit Node"
msgstr "作為出口節點"
msgid "Enable Magic DNS"
msgstr "啟用魔法 DNS"
msgid "Enable Tunnel Traffic SNAT"
msgstr "開啟隧道流量 SNAT"
msgid "Enable Web Console Service"
msgstr "啟用 Web 控制台服務"
msgid "Enable multi-threaded packet processing for higher throughput (Corresponding flag: --multi-thread)."
msgstr "啟用多線程數據包處理以提升高吞吐性能 (對應參數:--multi-thread)。"
msgid "Encryption Algorithm"
msgstr "加密演算法"
msgid "Failed to load logs: %s"
msgstr "載入日誌失敗:%s"
msgid "Failed to load peers: %s"
msgstr "載入對等節點失敗:%s"
msgid "Failed to load topology: %s"
msgstr "載入拓撲失敗:%s"
msgid "HTTP listen port for easytier-web embedded web dashboard."
msgstr "easytier-web 內建 Web 控制台的 HTTP 監聽連接埠。"
msgid "Hostname"
msgstr "主機名稱"
msgid "Initial connection peer node URLs (Corresponding flag: -p, --peers)."
msgstr "初始連線的對等節點位址 (對應參數:-p, --peers)。"
msgid "Interface IPv4 Address"
msgstr "虛擬 IPv4 位址"
msgid "Interface IPv6 Address"
msgstr "虛擬 IPv6 位址"
msgid "Invalid URL format, must start with tcp://, udp://, ws://, wss://, wg://, or quic://"
msgstr "URL 格式無效,必須以 tcp://、udp://、ws://、wss://、wg:// 或 quic:// 開頭"
msgid "Invalid UUID format (e.g. %s)"
msgstr "UUID 格式無效(示例:%s)"
msgid "Invalid username format, only letters, digits, and _ - . @ are allowed."
msgstr "使用者名稱格式無效,僅支援字母、數字及 _ - . @"
msgid "Latency"
msgstr "延遲"
msgid "Local Node Information"
msgstr "本地節點資訊"
msgid "Local service is not running."
msgstr "本地服務未運行。"
msgid "Log Actions"
msgstr "日誌操作"
msgid "Logs"
msgstr "運行日誌"
msgid "Logs cleared."
msgstr "日誌已清空。"
msgid "Loss Rate"
msgstr "丟包率"
msgid "Machine ID (UUID)"
msgstr "設備唯一標識 (UUID)"
msgid "Magic DNS Domain Zone"
msgstr "魔法 DNS 網域區域"
msgid "Multi-threaded Mode"
msgstr "多線程模式"
msgid "NAT Type"
msgstr "NAT 類型"
msgid "Network Name"
msgstr "網路名稱"
msgid "Network Secret"
msgstr "網路密鑰"
msgid "Network Topology"
msgstr "網路拓撲"
msgid "No connected remote peers found."
msgstr "未找到已連線的遠端對等節點。"
msgid "No logs available."
msgstr "暫無可用的日誌記錄。"
msgid "No topology data available."
msgstr "暫無拓撲數據。"
msgid "None"
msgstr "無"
msgid "Not Installed"
msgstr "未安裝"
msgid "Open Console"
msgstr "開啟控制台"
msgid "Peer Nodes"
msgstr "對等節點"
msgid "Port for local CLI and RPC management portal (Corresponding flag: --rpc-portal)."
msgstr "本地 CLI 與 RPC 互動連接埠 (對應參數:--rpc-portal)。"
msgid "Proxy Network"
msgstr "子網代理"
msgid "Proxy Networks"
msgstr "子網代理"
msgid "Public Discovery Node"
msgstr "公共發現節點"
msgid "Public discovery node URL (Corresponding flag: -e, --external-node)."
msgstr "公共發現節點 URL (對應參數:-e, --external-node)。"
msgid "RPC Management Port"
msgstr "RPC 管理連接埠"
msgid "RX"
msgstr "RX"
msgid "Refresh"
msgstr "重新整理"
msgid "Refresh Logs"
msgstr "重新整理日誌"
msgid "Refresh Topology"
msgstr "重新整理拓撲"
msgid "Remote web configuration server address or username (Corresponding flag: -w, --web-config). Supports complete URL (e.g. udp://127.0.0.1:22020/admin) or username only (e.g. admin, connecting to official cloud server)."
msgstr "遠程 Web 配置伺服器位址或使用者名稱 (對應參數:-w, --web-config)。支援完整 URL(如 udp://127.0.0.1:22020/admin)或僅填使用者名稱/網路名稱(如 admin,自動連線官方雲端伺服器)。"
msgid "Reset View"
msgstr "重置視圖"
msgid "Restart"
msgstr "重啟"
msgid "Restarting service..."
msgstr "正在重啟服務..."
msgid "Running"
msgstr "運行中"
msgid "Running (Unmanaged)"
msgstr "運行中 (非託管)"
msgid "Service Status"
msgstr "服務運行狀態"
msgid "Settings"
msgstr "配置"
msgid "Specify the top-level domain zone for Magic DNS (Corresponding flag: --tld-dns-zone). Default is et.net. (FQDN ending with dot)."
msgstr "指定魔法 DNS 的頂級網域區域 (對應參數:--tld-dns-zone)。預設值為 et.net.(以點結尾的 FQDN 根域)。"
msgid "Startup Method"
msgstr "啟動方式"
msgid "Stopped"
msgstr "已停止"
msgid "Subnet CIDRs to proxy and announce through this node (Corresponding flag: -n, --proxy-networks). Select from the detected local subnets below or enter custom CIDRs."
msgstr "透過此節點代理並通告的子網網段 (對應參數:-n, --proxy-networks)。可直接下拉選擇探測到的本地網段或手動輸入。"
msgid "TUN Device Name"
msgstr "虛擬網卡名稱"
msgid "TX"
msgstr "TX"
msgid "The VPN network name to identify this virtual network (Corresponding flag: --network-name)."
msgstr "VPN 虛擬網路名稱 (對應參數:--network-name)。"
msgid "The secret phrase used to authorize and encrypt traffic (Corresponding flag: --network-secret)."
msgstr "用於節點認證與加密的密鑰短語 (對應參數:--network-secret)。"
msgid "The static IPv4 address of this node (Corresponding flag: -i, --ipv4). Ignored when DHCP is enabled."
msgstr "本節點的靜態 IPv4 位址 (對應參數:-i, --ipv4)。啟用 DHCP 時自動忽略。"
msgid "The static IPv6 address of this node (Corresponding flag: --ipv6)."
msgstr "本節點的靜態 IPv6 位址 (對應參數:--ipv6)。"
msgid "The web console may consume significant memory, please enable as needed."
msgstr "Web 控制台可能會消耗較多記憶體,請按需啟用。"
msgid "Topology Actions"
msgstr "拓撲操作"
msgid "Tunnel"
msgstr "連線方式"
msgid "Unique device identifier UUID in the cloud management console (Corresponding flag: --machine-id). Automatically generated on initial install. Changing UUID will automatically clear local cloud cache."
msgstr "用於在雲端控制台中識別當前設備的唯一 UUID 識別碼 (對應參數:--machine-id)。初始化安裝時自動生成,修改更換 UUID 時將自動重置並清理雲端快取。"
msgid "Use OpenWrt system firewall to manage NAT for EasyTier tunnel and subnet traffic. Disabling this option disables source address masquerading to preserve real source IPs of remote peers and subnets in the local network."
msgstr "使用 OpenWrt 系統防火牆接管 EasyTier 虛擬網卡與子網轉發流量的 NAT。關閉此選項將禁用源位址偽裝,保留遠端對等節點及子網在本地局域網中的真實源 IP。"
msgid "Version"
msgstr "版本"
msgid "Virtual IP"
msgstr "虛擬 IP"
msgid "Virtual Interface"
msgstr "虛擬網卡"
msgid "Virtual TUN network interface name (Corresponding flag: --dev-name)."
msgstr "創建的虛擬 TUN 網卡介面名稱 (對應參數:--dev-name)。"
msgid "Web Config Server URL"
msgstr "雲端配置伺服器位址"
msgid "Web Config Server URL cannot be empty."
msgstr "雲端配置伺服器位址不能為空。"
msgid "Web Console"
msgstr "Web 控制台"
msgid "Web Console Port"
msgstr "控制台監聽連接埠"
msgid "Web Console Status"
msgstr "控制台服務狀態"
msgid "Web Data Directory"
msgstr "控制台數據目錄"
msgid "Zoom In"
msgstr "放大"
msgid "Zoom Out"
msgstr "縮小"
msgid "Reset Layout"
msgstr "重設佈局"
msgid "(Hover to highlight link, drag nodes/canvas to adjust)"
msgstr "(懸停高亮鏈路,拖曳節點/畫布以調整)"
msgid "All Links"
msgstr "全部鏈路"
msgid "Local Only"
msgstr "僅本端"
msgid "Show All Peer Links"
msgstr "顯示所有對端連接線"
msgid "Show Local Links Only"
msgstr "僅聚焦本端連接線"
msgid "Next Hop: %s (%s)"
msgstr "下一跳中繼: %s (%s)"
msgid "Next Hop: %s"
msgstr "下一跳中繼: %s"
msgid "Latency / Loss"
msgstr "延遲 / 丟包"
msgid "RX / TX"
msgstr "接收 / 發送"
msgid "(Hover/click node to trace path, drag to adjust)"
msgstr "(懸停/點擊節點追蹤路徑,支援拖曳調整)"
msgid "Clear selection"
msgstr "清除選取"
msgid "Local Node: %s"
msgstr "本地節點: %s"
msgid "Path"
msgstr "路徑"
@@ -0,0 +1,21 @@
config easytier 'settings'
option enabled '0'
option etcmd 'etcmd'
option network_name 'easytier'
option network_secret ''
option ip_dhcp '1'
option ipaddr '10.144.144.1'
option ip6addr ''
option external_node 'tcp://public.easytier.top:11010'
option rpc_port '15888'
option dev_name 'easytier0'
option encryption_algorithm 'aes-gcm'
option multi_thread '0'
option tunnel_snat '0'
option allow_wan '0'
option web_config 'udp://127.0.0.1:22020/admin'
option machine_id ''
option web_enabled '0'
option web_html_port '22020'
option web_dir '/etc/easytier'
list peeradd 'tcp://public.easytier.top:11010'
@@ -0,0 +1,15 @@
instance_name = "default"
instance_id = "f9f05421-7c6b-47d6-a67d-4d58d49f51d8"
dhcp = true
listeners = []
exit_nodes = []
rpc_portal = "0.0.0.0:15888"
[network_identity]
network_name = "mynetwork"
network_secret = "mysecret"
[[peer]]
uri = "tcp://public.easytier.top:11010"
@@ -0,0 +1,24 @@
#!/bin/sh
dev_name=$(uci -q get easytier.settings.dev_name)
[ -z "$dev_name" ] && dev_name="easytier0"
[ "$DEVICE" = "$dev_name" ] || exit 0
[ "$ACTION" = "ifup" ] || exit 0
LOCK=/tmp/easytier_hotplug.lock
# Timestamp-based lock: bail out if another check fired within 10 s.
if [ -f "$LOCK" ]; then
ts=$(cat "$LOCK" 2>/dev/null)
[ -n "$ts" ] && [ $(( $(date +%s) - ts )) -lt 10 ] && exit 0
fi
# Skip if easytier is not configured or enabled
[ "$(uci -q get easytier.settings.enabled)" = "1" ] || exit 0
date +%s > "$LOCK"
logger -t easytier-hotplug "${DEVICE} ifup detected: updating firewall rules"
/etc/init.d/easytier update_firewall >/dev/null 2>&1 &
+557
View File
@@ -0,0 +1,557 @@
#!/bin/sh /etc/rc.common
START=90
USE_PROCD=1
EXTRA_COMMANDS="update_firewall"
EXTRA_HELP=" update_firewall Update WAN firewall inbound rule from live easytier-cli listeners"
NAME="easytier"
PROG="/usr/bin/easytier-core"
WEB_PROG="/usr/bin/easytier-web"
CONF_DIR="/etc/easytier"
LOG_FILE="/tmp/easytier.log"
WEB_LOG_FILE="/tmp/easytier-web.log"
setup_firewall_and_network() {
local dev_name="$1"
[ -z "$dev_name" ] && dev_name="easytier0"
local changed_net=0
local changed_fw=0
# 1. Ensure network interface exists and is exactly synchronized with dev_name
local cur_dev cur_ifname
cur_dev=$(uci -q get network.easytier.device)
cur_ifname=$(uci -q get network.easytier.device)
if ! uci -q get network.easytier >/dev/null; then
uci -q set network.easytier=interface
uci -q set network.easytier.proto='none'
uci -q set network.easytier.device="$dev_name"
uci -q set network.easytier.device="$dev_name"
changed_net=1
else
if [ "$cur_dev" != "$dev_name" ] || [ "$cur_ifname" != "$dev_name" ]; then
uci -q set network.easytier.proto='none'
uci -q set network.easytier.device="$dev_name"
uci -q set network.easytier.device="$dev_name"
changed_net=1
fi
fi
# 2. Zone MASQUERADE (controlled by tunnel_snat)
local tunnel_snat target_masq="0"
tunnel_snat=$(uci -q get easytier.settings.tunnel_snat)
[ "$tunnel_snat" = "1" ] && target_masq="1"
# Ensure firewall zone exists
if ! uci -q get firewall.easytier >/dev/null; then
uci -q set firewall.easytier=zone
uci -q set firewall.easytier.name='easytier'
uci -q set firewall.easytier.input='ACCEPT'
uci -q set firewall.easytier.output='ACCEPT'
uci -q set firewall.easytier.forward='ACCEPT'
uci -q set firewall.easytier.masq="$target_masq"
uci -q set firewall.easytier.mtu_fix='1'
uci -q add_list firewall.easytier.network='easytier'
uci -q add_list firewall.easytier.device="$dev_name"
# Allow forwarding from LAN to EasyTier
uci -q set firewall.easytier_fwd_lan=forwarding
uci -q set firewall.easytier_fwd_lan.src='lan'
uci -q set firewall.easytier_fwd_lan.dest='easytier'
# Allow forwarding from EasyTier to LAN
uci -q set firewall.easytier_fwd_et=forwarding
uci -q set firewall.easytier_fwd_et.src='easytier'
uci -q set firewall.easytier_fwd_et.dest='lan'
# Allow forwarding from EasyTier to WAN
uci -q set firewall.easytier_fwd_wan=forwarding
uci -q set firewall.easytier_fwd_wan.src='easytier'
uci -q set firewall.easytier_fwd_wan.dest='wan'
changed_fw=1
else
local cur_masq
cur_masq=$(uci -q get firewall.easytier.masq)
if [ "$cur_masq" != "$target_masq" ]; then
uci -q set firewall.easytier.masq="$target_masq"
changed_fw=1
fi
# Cleanly synchronize device list (remove stale devices, enforce single current dev_name)
local cur_devices
cur_devices=$(uci -q get firewall.easytier.device)
if [ "$cur_devices" != "$dev_name" ]; then
for d in $cur_devices; do
uci -q del_list firewall.easytier.device="$d"
done
uci -q add_list firewall.easytier.device="$dev_name"
changed_fw=1
fi
local has_net=0
for n in $(uci -q get firewall.easytier.network); do
[ "$n" = "easytier" ] && has_net=1
done
if [ "$has_net" = "0" ]; then
uci -q add_list firewall.easytier.network='easytier'
changed_fw=1
fi
fi
if [ "$changed_net" = "1" ]; then
uci -q commit network
/etc/init.d/network reload 2>/dev/null
fi
if [ "$changed_fw" = "1" ]; then
uci -q commit firewall
/etc/init.d/firewall reload 2>/dev/null
fi
# 3. Kernel forwarding
sysctl -w net.ipv4.ip_forward=1 >/dev/null 2>&1
sysctl -w net.ipv6.conf.all.forwarding=1 >/dev/null 2>&1
}
apply_wan_firewall() {
local allow_wan
allow_wan=$(uci -q get easytier.settings.allow_wan)
if [ "$allow_wan" != "1" ]; then
if uci -q get firewall.easytier_wan_inbound >/dev/null; then
uci -q delete firewall.easytier_wan_inbound
uci -q commit firewall
/etc/init.d/firewall reload 2>/dev/null
fi
return 0
fi
local rpc_port="$1"
[ -z "$rpc_port" ] && rpc_port=$(uci -q get easytier.settings.rpc_port)
[ -z "$rpc_port" ] && rpc_port="15888"
local rpc_arg="-p 127.0.0.1:${rpc_port}"
# 纯净原子化探测:从运行态 easytier-core 查询实际生效的 listeners 端口
local wan_ports=""
if [ -x /usr/bin/easytier-cli ]; then
local i=0 json_out=""
while [ $i -lt 10 ]; do
json_out=$(/usr/bin/easytier-cli $rpc_arg -o json node 2>/dev/null)
if [ -n "$json_out" ]; then
local extracted_ports=""
if command -v jsonfilter >/dev/null 2>&1; then
extracted_ports=$(echo "$json_out" | jsonfilter -e '@.listeners[*]' 2>/dev/null | grep -oE ':[0-9]{2,5}/?$' | tr -d ':/' | sort -n -u)
else
extracted_ports=$(echo "$json_out" | sed -n '/"listeners": \[/,/\]/p' | grep -oE ':[0-9]{2,5}/?$' | tr -d ':/' | sort -n -u)
fi
if [ -n "$extracted_ports" ]; then
set -- $extracted_ports
wan_ports="$*"
break
fi
fi
i=$((i + 1))
sleep 1
done
fi
# 严格原子化:仅当核心成功运行且实际处于监听状态时才下发放行规则;未启动或无端口绝不下发
if [ -n "$wan_ports" ]; then
local cur_rule_ports cur_rule_enabled
cur_rule_ports=$(uci -q get firewall.easytier_wan_inbound.dest_port)
cur_rule_enabled=$(uci -q get firewall.easytier_wan_inbound.enabled)
if ! uci -q get firewall.easytier_wan_inbound >/dev/null || [ "$cur_rule_ports" != "$wan_ports" ] || [ "$cur_rule_enabled" != "1" ]; then
uci -q set firewall.easytier_wan_inbound=rule
uci -q set firewall.easytier_wan_inbound.name='Allow-EasyTier-WAN-Inbound'
uci -q set firewall.easytier_wan_inbound.src='wan'
uci -q set firewall.easytier_wan_inbound.proto='tcp udp'
uci -q set firewall.easytier_wan_inbound.dest_port="$wan_ports"
uci -q set firewall.easytier_wan_inbound.target='ACCEPT'
uci -q set firewall.easytier_wan_inbound.enabled='1'
uci -q commit firewall
/etc/init.d/firewall reload 2>/dev/null
logger -t "$NAME" "WAN firewall inbound rule applied for active listeners: $wan_ports"
fi
else
logger -t "$NAME" "Warning: No active EasyTier listeners detected, keeping WAN firewall closed"
if uci -q get firewall.easytier_wan_inbound >/dev/null; then
uci -q delete firewall.easytier_wan_inbound
uci -q commit firewall
/etc/init.d/firewall reload 2>/dev/null
fi
fi
}
setup_dnsmasq() {
local magic_dns tld_dns_zone
config_get_bool magic_dns settings magic_dns 0
config_get tld_dns_zone settings tld_dns_zone 'et.net.'
[ -z "$tld_dns_zone" ] && tld_dns_zone='et.net.'
# 防呆机制:无论用户输入是否带点,核心规范为以点结尾的 FQDN
case "$tld_dns_zone" in
*.) ;;
*) tld_dns_zone="${tld_dns_zone}." ;;
esac
local tld_clean
tld_clean=$(echo "$tld_dns_zone" | sed 's/\.$//')
local changed_dhcp=0
# 1. Dynamically inspect all server rules pointing to 100.100.100.101, extract old zones, and clean corresponding rebind_domain
local cur_servers
cur_servers=$(uci -q get dhcp.@dnsmasq[0].server)
if [ -n "$cur_servers" ]; then
local s
for s in $cur_servers; do
case "$s" in
*100.100.100.101*)
local old_zone
old_zone=$(echo "$s" | sed -n 's|^/\([^/]*\)/100\.100\.100\.101.*|\1|p')
if [ -n "$old_zone" ]; then
uci -q del_list dhcp.@dnsmasq[0].rebind_domain="$old_zone"
uci -q del_list dhcp.@dnsmasq[0].rebind_domain="${old_zone}."
fi
uci -q del_list dhcp.@dnsmasq[0].server="$s"
changed_dhcp=1
;;
esac
done
fi
# 2. Clean fallback domains
uci -q del_list dhcp.@dnsmasq[0].rebind_domain="$tld_dns_zone"
uci -q del_list dhcp.@dnsmasq[0].rebind_domain="$tld_clean"
uci -q del_list dhcp.@dnsmasq[0].rebind_domain="et.net"
uci -q del_list dhcp.@dnsmasq[0].rebind_domain="et.net."
# 3. Add new Magic DNS forwarding and rebind whitelist if enabled
if [ "$magic_dns" -eq 1 ]; then
uci -q add_list dhcp.@dnsmasq[0].server="/${tld_clean}/100.100.100.101"
uci -q add_list dhcp.@dnsmasq[0].rebind_domain="${tld_clean}"
changed_dhcp=1
fi
if [ "$changed_dhcp" -eq 1 ]; then
uci -q commit dhcp
/etc/init.d/dnsmasq reload 2>/dev/null
fi
}
cleanup_dnsmasq() {
local tld_dns_zone
config_get tld_dns_zone settings tld_dns_zone 'et.net.'
[ -z "$tld_dns_zone" ] && tld_dns_zone='et.net.'
case "$tld_dns_zone" in
*.) ;;
*) tld_dns_zone="${tld_dns_zone}." ;;
esac
local tld_clean
tld_clean=$(echo "$tld_dns_zone" | sed 's/\.$//')
local changed_dhcp=0
# 1. Dynamically inspect all server rules pointing to 100.100.100.101, extract old zones, and clean corresponding rebind_domain
local cur_servers
cur_servers=$(uci -q get dhcp.@dnsmasq[0].server)
if [ -n "$cur_servers" ]; then
local s
for s in $cur_servers; do
case "$s" in
*100.100.100.101*)
local old_zone
old_zone=$(echo "$s" | sed -n 's|^/\([^/]*\)/100\.100\.100\.101.*|\1|p')
if [ -n "$old_zone" ]; then
uci -q del_list dhcp.@dnsmasq[0].rebind_domain="$old_zone"
uci -q del_list dhcp.@dnsmasq[0].rebind_domain="${old_zone}."
fi
uci -q del_list dhcp.@dnsmasq[0].server="$s"
changed_dhcp=1
;;
esac
done
fi
# 2. Clean fallback domains
uci -q del_list dhcp.@dnsmasq[0].rebind_domain="$tld_dns_zone"
uci -q del_list dhcp.@dnsmasq[0].rebind_domain="$tld_clean"
if [ "$changed_dhcp" -eq 1 ]; then
uci -q commit dhcp
/etc/init.d/dnsmasq reload 2>/dev/null
fi
}
atomic_clean_cloud_dir() {
local target_dir="$1"
local new_mid="$2"
# Security boundary guard: strictly disallow root /etc/easytier to protect config.toml and easytier.db
case "$target_dir" in
/etc/easytier|/etc/easytier/|/etc|/etc/|/tmp|/tmp/)
logger -t "$NAME" "Security warning: Cannot clean root directory $target_dir"
return 1
;;
/etc/easytier/*|/tmp/easytier/*) ;;
*)
logger -t "$NAME" "Security warning: Refusing to clean unsafe path: $target_dir"
return 1
;;
esac
local pid="$$"
local new_tmp="${target_dir}.new.${pid}"
local trash_tmp="${target_dir}.trash.${pid}"
mkdir -p "$new_tmp"
[ -n "$new_mid" ] && echo "$new_mid" > "$new_tmp/.machine_id"
if [ -d "$target_dir" ]; then
mv "$target_dir" "$trash_tmp" 2>/dev/null
fi
mv "$new_tmp" "$target_dir" 2>/dev/null
rm -rf "${target_dir}.trash."* 2>/dev/null
return 0
}
start_core() {
local enabled etcmd network_name network_secret ip_dhcp ipaddr ip6addr
local external_node rpc_port encryption_algorithm dev_name proxy_cidrs
local custom_params custom_config_file web_config multi_thread
local magic_dns tld_dns_zone
local machine_id config_dir
config_get_bool enabled settings enabled 0
[ "$enabled" -eq 1 ] || return 0
[ -x "$PROG" ] || {
logger -t "$NAME" "Core executable $PROG not found"
return 1
}
config_get etcmd settings etcmd 'etcmd'
config_get network_name settings network_name ''
config_get network_secret settings network_secret ''
config_get_bool ip_dhcp settings ip_dhcp 1
config_get ipaddr settings ipaddr ''
config_get ip6addr settings ip6addr ''
config_get external_node settings external_node ''
config_get rpc_port settings rpc_port '15888'
config_get encryption_algorithm settings encryption_algorithm ''
config_get dev_name settings dev_name 'easytier0'
config_get custom_config_file settings custom_config_file '/etc/easytier/config.toml'
config_get web_config settings web_config ''
config_get machine_id settings machine_id ''
config_get custom_params settings custom_params ''
config_get_bool multi_thread settings multi_thread 0
config_get_bool magic_dns settings magic_dns 0
config_get tld_dns_zone settings tld_dns_zone 'et.net.'
[ -z "$tld_dns_zone" ] && tld_dns_zone='et.net.'
case "$tld_dns_zone" in
*.) ;;
*) tld_dns_zone="${tld_dns_zone}." ;;
esac
config_get_bool enable_exit_node settings enable_exit_node 0
mkdir -p "$CONF_DIR"
procd_open_instance "core"
procd_set_param command "$PROG"
if [ "$etcmd" = "config" ]; then
[ -f "$custom_config_file" ] || {
logger -t "$NAME" "Custom config file $custom_config_file not found"
return 1
}
procd_append_param command -c "$custom_config_file"
elif [ "$etcmd" = "web" ]; then
[ -n "$web_config" ] || {
logger -t "$NAME" "Web config URL is not configured"
return 1
}
procd_append_param command -w "$web_config"
# Machine ID (ensure unique UUID exists)
if [ -z "$machine_id" ]; then
if [ -f /proc/sys/kernel/random/uuid ]; then
machine_id=$(cat /proc/sys/kernel/random/uuid 2>/dev/null)
fi
if [ -z "$machine_id" ]; then
machine_id=$(tr -dc 'a-f0-9' < /dev/urandom 2>/dev/null | head -c 32 | sed -r 's/(.{8})(.{4})(.{4})(.{4})(.{12})/\1-\2-\3-\4-\5/')
fi
if [ -n "$machine_id" ]; then
uci -q set easytier.settings.machine_id="$machine_id"
uci -q commit easytier
fi
fi
[ -n "$machine_id" ] && procd_append_param command --machine-id "$machine_id"
# Internal cloud config directory (isolated storage)
local config_dir='/etc/easytier/cloud'
# Atomic check & clean for Machine ID change
local last_mid_file="$config_dir/.machine_id"
local last_mid=""
[ -f "$last_mid_file" ] && last_mid=$(cat "$last_mid_file" 2>/dev/null)
if [ -d "$config_dir" ] && [ -n "$last_mid" ] && [ "$last_mid" != "$machine_id" ]; then
logger -t "$NAME" "Machine ID changed from $last_mid to $machine_id, atomically cleaning cloud config cache in $config_dir"
atomic_clean_cloud_dir "$config_dir" "$machine_id"
else
mkdir -p "$config_dir"
[ -n "$machine_id" ] && [ ! -f "$last_mid_file" ] && echo "$machine_id" > "$last_mid_file" 2>/dev/null
fi
procd_append_param command --config-dir "$config_dir"
# System proxy forward & device name
procd_append_param command --proxy-forward-by-system
[ -n "$dev_name" ] && procd_append_param command --dev-name "$dev_name"
# Additional custom arguments
if [ -n "$custom_params" ]; then
for arg in $custom_params; do
procd_append_param command "$arg"
done
fi
else
# Default command-line configuration
[ -n "$network_name" ] && procd_append_param command --network-name "$network_name"
[ -n "$network_secret" ] && procd_append_param command --network-secret "$network_secret"
if [ "$ip_dhcp" -eq 1 ]; then
procd_append_param command -d
elif [ -n "$ipaddr" ]; then
procd_append_param command -i "$ipaddr"
fi
[ -n "$ip6addr" ] && procd_append_param command --ipv6 "$ip6addr"
[ -n "$external_node" ] && procd_append_param command -e "$external_node"
[ -n "$rpc_port" ] && procd_append_param command --rpc-portal "0.0.0.0:${rpc_port}"
[ -n "$encryption_algorithm" ] && procd_append_param command --encryption-algorithm "$encryption_algorithm"
[ -n "$dev_name" ] && procd_append_param command --dev-name "$dev_name"
[ "$multi_thread" -eq 1 ] && procd_append_param command --multi-thread
# Always disable user-space built-in NAT and delegate forwarding to Linux kernel
procd_append_param command --proxy-forward-by-system
# Exit Node
[ "$enable_exit_node" -eq 1 ] && procd_append_param command --enable-exit-node
# Magic DNS
if [ "$magic_dns" -eq 1 ]; then
procd_append_param command --accept-dns true
[ -n "$tld_dns_zone" ] && procd_append_param command --tld-dns-zone "$tld_dns_zone"
fi
# Peer nodes
append_peer() {
[ -n "$1" ] && procd_append_param command -p "$1"
}
config_list_foreach settings peeradd append_peer
# Proxy networks / Subnet routes
append_proxy() {
[ -n "$1" ] && procd_append_param command -n "$1"
}
config_list_foreach settings proxy_networks append_proxy
# Additional custom arguments
if [ -n "$custom_params" ]; then
for arg in $custom_params; do
procd_append_param command "$arg"
done
fi
fi
procd_set_param respawn 3600 5 0
procd_set_param stdout 1
procd_set_param stderr 1
procd_set_param user root
procd_close_instance
setup_firewall_and_network "$dev_name" "$rpc_port"
setup_dnsmasq
logger -t "$NAME" "EasyTier core service started"
# 异步触发 WAN 放行策略更新(让 procd 优先 fork 启动核心进程,随后子进程原子联动查询 listeners 并下发规则)
local allow_wan
config_get_bool allow_wan settings allow_wan 0
if [ "$allow_wan" -eq 1 ]; then
(
apply_wan_firewall "$rpc_port"
) >/dev/null 2>&1 &
else
if uci -q get firewall.easytier_wan_inbound >/dev/null; then
uci -q delete firewall.easytier_wan_inbound
uci -q commit firewall
/etc/init.d/firewall reload 2>/dev/null
fi
fi
}
update_firewall() {
config_load easytier
local dev_name rpc_port
config_get dev_name settings dev_name 'easytier0'
config_get rpc_port settings rpc_port '15888'
setup_firewall_and_network "$dev_name" "$rpc_port"
apply_wan_firewall "$rpc_port"
}
start_web() {
local web_enabled web_port web_dir
config_get_bool web_enabled settings web_enabled 0
[ "$web_enabled" -eq 1 ] || return 0
[ -x "$WEB_PROG" ] || {
logger -t "$NAME" "Web console executable $WEB_PROG not found"
return 1
}
config_get web_port settings web_html_port '22020'
config_get web_dir settings web_dir '/etc/easytier'
mkdir -p "$web_dir"
procd_open_instance "web"
procd_set_param command "$WEB_PROG" --db "$web_dir/easytier.db" --web-server-port "$web_port" --api-server-port "$web_port" --file-log-dir "$web_dir"
procd_set_param respawn 3600 5 0
procd_set_param stdout 1
procd_set_param stderr 1
procd_set_param user root
procd_close_instance
logger -t "$NAME" "EasyTier web console started on port $web_port"
}
start_service() {
config_load easytier
start_core
start_web
}
stop_service() {
cleanup_dnsmasq
# 停止服务联动清理 WAN 防火墙放行,防止离线后端口空置暴露
if uci -q get firewall.easytier_wan_inbound >/dev/null; then
uci -q delete firewall.easytier_wan_inbound
uci -q commit firewall
/etc/init.d/firewall reload 2>/dev/null
fi
logger -t "$NAME" "EasyTier services stopped"
}
service_triggers() {
procd_add_reload_trigger "easytier"
}
reload_service() {
restart
}
@@ -0,0 +1,20 @@
#!/bin/sh
[ -z "$(uci -q get easytier.settings.machine_id)" ] && {
new_uuid=""
if [ -f /proc/sys/kernel/random/uuid ]; then
new_uuid=$(cat /proc/sys/kernel/random/uuid 2>/dev/null)
fi
if [ -z "$new_uuid" ]; then
new_uuid=$(tr -dc 'a-f0-9' < /dev/urandom 2>/dev/null | head -c 32 | sed -r 's/(.{8})(.{4})(.{4})(.{4})(.{12})/\1-\2-\3-\4-\5/')
fi
if [ -n "$new_uuid" ]; then
uci -q set easytier.settings.machine_id="$new_uuid"
uci -q commit easytier
fi
}
rm -f /tmp/luci-indexcache* 2>/dev/null
rm -f /tmp/luci-modulecache/* 2>/dev/null
exit 0
+471
View File
@@ -0,0 +1,471 @@
#!/usr/bin/env lua
local json = require "luci.jsonc"
local nixio = require "nixio"
local fs = require "nixio.fs"
local function trim(s)
if type(s) ~= 'string' then return '' end
return s:gsub("^%s+", ""):gsub("%s+$", "")
end
local function exec_cmd(cmd)
local f = io.popen(cmd)
if not f then
return { code = -1, stdout = {}, raw = "" }
end
local content = f:read("*a") or ""
local success, msg, code = f:close()
content = trim(content)
local lines = {}
for line in string.gmatch(content .. "\n", "(.-)\r?\n") do
if line ~= "" then
table.insert(lines, line)
end
end
return {
code = (type(success) == "number" and success) or (code or 0),
stdout = lines,
raw = content
}
end
local function get_procd_status(instance_name)
local ubus_res = exec_cmd("ubus call service list '{\"name\":\"easytier\"}' 2>/dev/null")
if ubus_res.raw and #ubus_res.raw > 0 then
local parsed = json.parse(ubus_res.raw)
if parsed and parsed.easytier and parsed.easytier.instances then
local inst = parsed.easytier.instances[instance_name or 'core']
if inst and inst.running then
return { running = true, pid = inst.pid }
end
end
end
return { running = false }
end
local function get_rogue_pid(bin_name, managed_pid)
local res = exec_cmd("pidof " .. bin_name .. " 2>/dev/null")
if res.raw and #res.raw > 0 then
for pid in string.gmatch(res.raw, "%d+") do
local num_pid = tonumber(pid)
if num_pid and (managed_pid == nil or num_pid ~= managed_pid) then
return num_pid
end
end
end
return nil
end
local function get_service_state(bin_name, instance_name)
local procd_st = get_procd_status(instance_name)
local rogue_pid = get_rogue_pid(bin_name, procd_st.pid)
local state = "stopped"
if procd_st.running then
state = "managed"
elseif rogue_pid then
state = "unmanaged"
end
return {
state = state,
running = (state ~= "stopped"),
pid = procd_st.pid or rogue_pid
}
end
local function get_cached_version()
local cache_file = '/tmp/easytier_version.cache'
local bin_path = '/usr/bin/easytier-core'
if not fs.access(bin_path) then return 'Unknown' end
local bin_st = fs.stat(bin_path)
local cache_st = fs.stat(cache_file)
if cache_st and (cache_st.size or 0) > 0 and bin_st and (cache_st.mtime or 0) >= (bin_st.mtime or 0) then
local cached = trim(fs.readfile(cache_file) or '')
if cached ~= '' then return cached end
end
local ver_res = exec_cmd(bin_path .. ' --version 2>/dev/null')
if ver_res.stdout and #ver_res.stdout > 0 then
local ver_line = trim(ver_res.stdout[1])
if ver_line ~= '' then
fs.writefile(cache_file, ver_line .. '\n')
return ver_line
end
end
return 'Unknown'
end
local function get_route_info_map()
local route_map = {}
if not fs.access('/usr/bin/easytier-cli') then return route_map end
local r_res = exec_cmd('/usr/bin/easytier-cli -o json route 2>/dev/null')
if r_res.code == 0 and r_res.raw and #r_res.raw > 0 then
local r_data = json.parse(r_res.raw)
if r_data and type(r_data) == 'table' and #r_data > 0 then
for _, item in ipairs(r_data) do
local cidrs = trim(item.proxy_cidrs or '')
local ip = trim(item.ipv4 or '')
local host = trim(item.hostname or '')
local next_hop_host = trim(item.next_hop_hostname_lat_first or item.next_hop_hostname or '')
local next_hop_ip = trim(item.next_hop_ipv4_lat_first or item.next_hop_ipv4 or '')
local path_len = item.path_len_lat_first ~= nil and item.path_len_lat_first or item.path_len
local path_lat = item.path_latency_lat_first ~= nil and item.path_latency_lat_first or item.path_latency
local entry = {
proxy_cidrs = cidrs,
next_hop_hostname = next_hop_host,
next_hop_ipv4 = next_hop_ip,
path_len = path_len,
path_latency = path_lat
}
if ip ~= '' then
route_map[ip] = entry
local ip_clean = ip:match("^([^/]+)") or ip
route_map[ip_clean] = entry
end
if host ~= '' then
route_map[host] = entry
end
end
end
end
return route_map
end
local methods = {
get_status = {
args = {},
call = function(args)
local core_st = get_service_state('/usr/bin/easytier-core', 'core')
local web_st = get_service_state('/usr/bin/easytier-web', 'web')
local data = {
installed = fs.access('/usr/bin/easytier-core') and true or false,
web_installed = fs.access('/usr/bin/easytier-web') and true or false,
version = get_cached_version(),
core = core_st,
web = web_st,
node_info = nil
}
if core_st.running and fs.access('/usr/bin/easytier-cli') then
local node_res = exec_cmd('/usr/bin/easytier-cli node 2>/dev/null')
if node_res.raw and #node_res.raw > 0 then
data.node_info = node_res.raw
end
end
return data
end
},
get_peers = {
args = {},
call = function(args)
if not fs.access('/usr/bin/easytier-cli') then
return { peers = {}, raw = '' }
end
local route_map = get_route_info_map()
local json_res = exec_cmd('/usr/bin/easytier-cli -o json peer 2>/dev/null')
if json_res.code == 0 and json_res.raw and #json_res.raw > 0 then
local j_data = json.parse(json_res.raw)
if j_data and type(j_data) == 'table' and #j_data > 0 then
local peers = {}
for _, item in ipairs(j_data) do
local p_ip = trim(item.cidr or item.ipv4 or '')
local p_host = trim(item.hostname or '')
local p_ip_clean = p_ip:match("^([^/]+)") or p_ip
local r_entry = route_map[p_ip] or route_map[p_ip_clean] or route_map[p_host] or {}
local proxy_cidrs = r_entry.proxy_cidrs or ''
local next_hop_hostname = r_entry.next_hop_hostname or ''
local next_hop_ipv4 = r_entry.next_hop_ipv4 or ''
local path_latency = r_entry.path_latency ~= nil and r_entry.path_latency or ''
table.insert(peers, {
ipv4 = p_ip,
hostname = p_host,
proxy_cidrs = proxy_cidrs,
next_hop_hostname = next_hop_hostname,
next_hop_ipv4 = next_hop_ipv4,
path_latency = path_latency,
cost = trim(item.cost or ''),
latency = (item.lat_ms ~= nil and item.lat_ms ~= '-') and tostring(item.lat_ms) or '-',
loss_rate = trim(item.loss_rate or '-'),
rx = trim(item.rx_bytes or '-'),
tx = trim(item.tx_bytes or '-'),
tunnel = trim(item.tunnel_proto or '-'),
nat = trim(item.nat_type or '-'),
version = trim(item.version or '-')
})
end
return { peers = peers, raw = '' }
end
end
local peer_res = exec_cmd('/usr/bin/easytier-cli peer 2>/dev/null')
local raw_output = peer_res.raw or ''
local peers = {}
if peer_res.stdout and #peer_res.stdout > 0 then
for _, line in ipairs(peer_res.stdout) do
local trimmed = trim(line)
if trimmed ~= '' and not (trimmed:match("[Ii]pv4") and trimmed:match("|")) and not trimmed:match("^[%-%+─━%=| ]+$") then
local cols = {}
for part in string.gmatch(trimmed, "[^|]+") do
table.insert(cols, trim(part))
end
if #cols >= 2 then
local peer_ip = trim(cols[1] or '')
local peer_host = trim(cols[2] or '')
local peer_ip_clean = peer_ip:match("^([^/]+)") or peer_ip
local r_entry = route_map[peer_ip] or route_map[peer_ip_clean] or route_map[peer_host] or {}
local proxy_cidrs = r_entry.proxy_cidrs or ''
local next_hop_hostname = r_entry.next_hop_hostname or ''
local next_hop_ipv4 = r_entry.next_hop_ipv4 or ''
local path_latency = r_entry.path_latency ~= nil and r_entry.path_latency or ''
table.insert(peers, {
ipv4 = peer_ip,
hostname = peer_host,
proxy_cidrs = proxy_cidrs,
next_hop_hostname = next_hop_hostname,
next_hop_ipv4 = next_hop_ipv4,
path_latency = path_latency,
cost = cols[3] or '-',
latency = cols[4] or '-',
loss_rate = cols[5] or '-',
rx = cols[6] or '-',
tx = cols[7] or '-',
tunnel = cols[8] or '-',
nat = cols[9] or '-',
version = cols[10] or '-'
})
end
end
end
end
return { peers = peers, raw = raw_output }
end
},
get_topology = {
args = {},
call = function(args)
if not fs.access('/usr/bin/easytier-cli') then
return { nodes = {} }
end
local route_map = get_route_info_map()
local res = exec_cmd('/usr/bin/easytier-cli -o json peer-center 2>/dev/null')
if res.code == 0 and res.raw and #res.raw > 0 then
local data = json.parse(res.raw)
if data and type(data) == 'table' and #data > 0 then
local valid_nodes = {}
for _, n in ipairs(data) do
local n_ip = trim(n.ipv4 or '')
local n_host = trim(n.hostname or '')
if n_host ~= '' and not n_host:lower():match("^unknown$") and n_ip ~= '' and n_ip ~= '-' then
local n_ip_clean = n_ip:match("^([^/]+)") or n_ip
local r_entry = route_map[n_ip] or route_map[n_ip_clean] or route_map[n_host] or {}
n.proxy_cidrs = r_entry.proxy_cidrs or ''
table.insert(valid_nodes, n)
end
end
return { nodes = valid_nodes }
end
end
return { nodes = {} }
end
},
get_subroutes = {
args = {},
call = function(args)
local subnets = {}
local seen = {}
local res = exec_cmd("ip -j route 2>/dev/null")
if res.code == 0 and res.raw and #res.raw > 0 then
local routes_json = json.parse(res.raw)
if routes_json and type(routes_json) == 'table' then
for _, r in ipairs(routes_json) do
if r.dst and r.dst ~= 'default' and r.scope == 'link' and r.dst:find("%.") and r.dev ~= 'easytier0' and r.dev ~= 'lo' then
if not seen[r.dst] then
seen[r.dst] = true
table.insert(subnets, r.dst)
end
end
end
end
end
if #subnets == 0 then
local txt_res = exec_cmd("ip route 2>/dev/null")
if txt_res.stdout and #txt_res.stdout > 0 then
for _, line in ipairs(txt_res.stdout) do
line = trim(line)
if line ~= '' and not line:lower():match("^default") and not line:find("easytier0") and not line:find("lo") then
local subnet, dev = line:match("^(%d+%.%d+%.%d+%.%d+/%d+)%s+dev%s+([^%s]+)")
if subnet and dev and dev ~= 'easytier0' and dev ~= 'lo' and not seen[subnet] then
seen[subnet] = true
table.insert(subnets, subnet)
end
end
end
end
end
if #subnets == 0 then
local net_res = exec_cmd("ubus call network.interface dump 2>/dev/null")
if net_res.raw and #net_res.raw > 0 then
local net_data = json.parse(net_res.raw)
if net_data and net_data.interface then
for _, iface in ipairs(net_data.interface) do
if iface.interface ~= 'loopback' and iface.interface ~= 'easytier' and iface['ipv4-address'] then
for _, addr in ipairs(iface['ipv4-address']) do
local ip_str = addr.address
local mask = addr.mask
if ip_str and mask then
local p1, p2, p3, p4 = ip_str:match("^(%d+)%.(%d+)%.(%d+)%.(%d+)$")
if p1 and p2 and p3 and p4 then
local subnet = ''
if mask == 24 then
subnet = string.format("%s.%s.%s.0/24", p1, p2, p3)
elseif mask == 16 then
subnet = string.format("%s.%s.0.0/16", p1, p2)
elseif mask == 8 then
subnet = string.format("%s.0.0.0/8", p1)
else
subnet = string.format("%s/%s", ip_str, mask)
end
if subnet ~= '' and not seen[subnet] then
seen[subnet] = true
table.insert(subnets, subnet)
end
end
end
end
end
end
end
end
end
return { routes = subnets }
end
},
get_logs = {
args = {},
call = function(args)
local logs = {}
local res = exec_cmd("logread -e easytier 2>/dev/null | tail -n 80")
if res.stdout and #res.stdout > 0 then
logs = res.stdout
elseif fs.access('/tmp/easytier.log') then
local f_res = exec_cmd("tail -n 80 /tmp/easytier.log 2>/dev/null")
if f_res.stdout then logs = f_res.stdout end
end
return { logs = logs }
end
},
clear_logs = {
args = {},
call = function(args)
fs.writefile('/tmp/easytier.log', '')
fs.writefile('/tmp/easytier-web.log', '')
return { success = true }
end
},
service_action = {
args = { action = "action" },
call = function(args)
local action = args and args.action
if not action then return { success = false, error = "Missing action" } end
if action == "restart" or action == "stop" then
os.execute("killall -9 easytier-core easytier-web 2>/dev/null")
end
if action == "start" or action == "restart" then
os.execute("/etc/init.d/easytier restart >/dev/null 2>&1")
elseif action == "stop" then
os.execute("/etc/init.d/easytier stop >/dev/null 2>&1")
end
return { success = true }
end
}
}
local function parseInput()
local parse = json.new()
local done, err
while true do
local chunk = io.read(4096)
if not chunk or #chunk == 0 then
break
end
done, err = parse:parse(chunk)
if done then
break
end
end
if not done then
print(json.stringify({ error = err or "Incomplete input" }))
os.exit(1)
end
return parse:get()
end
local function validateArgs(func, uargs)
local method = methods[func]
if not method then
print(json.stringify({ error = "Method not found" }))
os.exit(1)
end
if type(uargs) ~= "table" then
print(json.stringify({ error = "Invalid arguments" }))
os.exit(1)
end
uargs.ubus_rpc_session = nil
local margs = method.args or {}
for k, _ in pairs(uargs) do
if margs[k] == nil then
print(json.stringify({ error = "Invalid argument: " .. tostring(k) }))
os.exit(1)
end
end
return method
end
if arg[1] == "list" then
local rv = {}
for name, method in pairs(methods) do
rv[name] = method.args or {}
end
print((json.stringify(rv):gsub(":%[%]", ":{}")))
elseif arg[1] == "call" then
local args = parseInput()
local method = validateArgs(arg[2], args)
local result, code = method.call(args)
print((json.stringify(result):gsub("^%[%]$", "{}")))
os.exit(code or 0)
end
@@ -0,0 +1,13 @@
{
"admin/vpn/easytier": {
"title": "EasyTier",
"order": 92,
"action": {
"type": "view",
"path": "easytier/main"
},
"depends": {
"acl": [ "luci-app-easytier" ]
}
}
}
@@ -0,0 +1,38 @@
{
"luci-app-easytier": {
"description": "Allow user access to EasyTier",
"read": {
"ubus": {
"easytier": [
"get_status",
"get_peers",
"get_topology",
"get_config",
"get_logs",
"get_subroutes",
"get_web_status",
"get_version_info"
]
},
"uci": [ "easytier" ],
"file": {
"/etc/easytier/config.toml": [ "read" ]
}
},
"write": {
"ubus": {
"easytier": [
"set_config",
"clear_logs",
"service_action",
"toggle_service",
"reset_web_db"
]
},
"uci": [ "easytier" ],
"file": {
"/etc/easytier/config.toml": [ "write" ]
}
}
}
}
@@ -1,5 +1,7 @@
'use strict';
'require view';
'require fs';
'require poll';
'require rpc';
'require uci';
'require form';
@@ -15,10 +17,16 @@ return view.extend({
expect: { result: [] }
}),
getRuntimeStatus() {
return L.resolveDefault(
fs.exec_direct('/usr/libexec/luci-firewall-status', [], 'json'), {});
},
load() {
return Promise.all([
this.callConntrackHelpers(),
firewall.getDefaults()
firewall.getDefaults(),
this.getRuntimeStatus()
]);
},
@@ -29,9 +37,24 @@ return view.extend({
return this.renderZones(data);
},
renderZones([ctHelpers, fwDefaults]) {
renderZones([ctHelpers, fwDefaults, runtimeStatus]) {
let m, s, o, out;
const fw4 = L.hasSystemFeature('firewall4');
const runtimeStatusText = E('span', {}, [ '-' ]);
const updateRuntimeStatus = (status) => {
const natModes = {
fullcone: 'FULLCONENAT',
nat1: _('Broadcom Fullcone NAT1'),
disabled: _('Disabled')
};
const natMode = natModes[status?.nat_mode] || _('Unknown');
const tcpcca = status?.tcp_cca
? status.tcp_cca.toUpperCase()
: _('Unknown');
runtimeStatusText.textContent =
_('Running status: %s, TCP congestion control algorithm is %s').format(natMode, tcpcca);
};
const addTCPCCAOption = () => {
const tcpcca = s.option(form.ListValue, 'tcpcca', _('TCP CCA'),
_('TCP congestion control algorithm.'));
@@ -42,6 +65,8 @@ return view.extend({
tcpcca.rmempty = false;
};
updateRuntimeStatus(runtimeStatus);
m = new form.Map('firewall', _('Firewall - Zone Settings'),
_('The firewall creates zones over your network interfaces to control network traffic flow.'));
@@ -462,6 +487,24 @@ return view.extend({
o.filter = out.filter;
o.cfgvalue = out.cfgvalue;
return m.render();
return m.render().then(L.bind(function(mapEl) {
const firstSection = mapEl.querySelector('.cbi-section');
const statusSection = E('div', {
'class': 'cbi-section firewall-runtime-status',
'style': 'overflow-x:auto'
}, [
E('div', {
'style': 'padding:.75em 1.5em;color:#008000;font-size:1em;font-weight:600;white-space:nowrap'
}, [ runtimeStatusText ])
]);
firstSection.parentNode.insertBefore(statusSection, firstSection);
poll.add(L.bind(function() {
return this.getRuntimeStatus().then(updateRuntimeStatus);
}, this), 5);
return mapEl;
}, this));
}
});
@@ -260,6 +260,22 @@ msgstr ""
msgid "Destination zone"
msgstr ""
#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:49
msgid "Disabled"
msgstr ""
#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:48
msgid "Broadcom Fullcone NAT1"
msgstr ""
#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:56
msgid "Running status: %s, TCP congestion control algorithm is %s"
msgstr ""
#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:54
msgid "Unknown"
msgstr ""
#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:263
msgid "Device name"
msgstr ""
+12
View File
@@ -344,6 +344,18 @@ msgstr "TCP 拥塞控制算法"
msgid "TCP congestion control algorithm."
msgstr "TCP 拥塞控制算法。"
msgid "Running status: %s, TCP congestion control algorithm is %s"
msgstr "当前运行状态:%s,TCP 拥塞控制算法为 %s"
msgid "Broadcom Fullcone NAT1"
msgstr "Broadcom Fullcone NAT1"
msgid "Disabled"
msgstr "已禁用"
msgid "Unknown"
msgstr "未知"
#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:346
#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:463
#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:339
+12
View File
@@ -328,6 +328,18 @@ msgstr "啟用"
msgid "Enable NAT Loopback"
msgstr "啟用 NAT 回送"
msgid "Running status: %s, TCP congestion control algorithm is %s"
msgstr "目前執行狀態:%s,TCP 壅塞控制演算法為 %s"
msgid "Broadcom Fullcone NAT1"
msgstr "Broadcom Fullcone NAT1"
msgid "Disabled"
msgstr "已停用"
msgid "Unknown"
msgstr "未知"
#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:43
msgid "Enable SYN-flood protection"
msgstr "啟用 SYN 洪水保護"
+22
View File
@@ -0,0 +1,22 @@
#!/bin/sh
tcp_cca="$(cat /proc/sys/net/ipv4/tcp_congestion_control 2>/dev/null)"
nat_mode="disabled"
rules="$(iptables-save -t nat 2>/dev/null)"
if printf '%s\n' "$rules" | grep -q -- '--mode fullcone'; then
nat_mode="nat1"
elif printf '%s\n' "$rules" | grep -q -- '-j FULLCONENAT'; then
nat_mode="fullcone"
else
rules="$(nft list ruleset 2>/dev/null)"
if printf '%s\n' "$rules" | grep -Eq 'masquerade[[:space:]]+fullcone'; then
nat_mode="nat1"
elif printf '%s\n' "$rules" | grep -Eq '(^|[[:space:]])fullcone([[:space:]]|$)'; then
nat_mode="fullcone"
fi
fi
printf '{"nat_mode":"%s","tcp_cca":"%s"}\n' "$nat_mode" "$tcp_cca"
@@ -2,8 +2,10 @@
"luci-app-firewall": {
"description": "Grant access to firewall configuration",
"read": {
"cgi-io": [ "exec" ],
"file": {
"/etc/firewall.user": [ "read" ]
"/etc/firewall.user": [ "read" ],
"/usr/libexec/luci-firewall-status": [ "exec" ]
},
"ubus": {
"file": [ "read" ],
File diff suppressed because it is too large. Load diff
+1 -1
View File
@@ -345,7 +345,7 @@ msgstr "启用 pprof"
#: applications/luci-app-frpc/htdocs/luci-static/resources/view/frpc.js:132
msgid "Enable service"
msgstr ""
msgstr "启用服务"
#: applications/luci-app-frpc/htdocs/luci-static/resources/view/frpc.js:427
msgid "Enable web HTTPS"
+1 -1
View File
@@ -344,7 +344,7 @@ msgstr "啟用 pprof"
#: applications/luci-app-frpc/htdocs/luci-static/resources/view/frpc.js:132
msgid "Enable service"
msgstr ""
msgstr "啟用服務"
#: applications/luci-app-frpc/htdocs/luci-static/resources/view/frpc.js:427
msgid "Enable web HTTPS"
+161 -150
View File
@@ -1,14 +1,14 @@
msgid ""
msgstr ""
"PO-Revision-Date: 2026-09-01 13:11+0000\n"
"Last-Translator: Martin Olmer <m_iv@seznam.cz>\n"
"PO-Revision-Date: 2026-09-11 21:27+0000\n"
"Last-Translator: Daniel Nylander <yeagersthlm@gmail.com>\n"
"Language-Team: Swedish <https://hosted.weblate.org/projects/openwrt/"
"luciapplicationsfrps/sv/>\n"
"Language: sv\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 2026.9.dev0\n"
"X-Generator: Weblate 2026.10.dev0\n"
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:1000
msgid "Access Control"
@@ -16,11 +16,11 @@ msgstr "Åtkomstkontroll"
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:1026
msgid "Add new HTTP plugin..."
msgstr ""
msgstr "Lägg till nytt HTTP-insticksprogram …"
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:266
msgid "Additional auth scopes"
msgstr ""
msgstr "Ytterligare autentiseringsomfattningar"
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:154
msgid "Additional configs"
@@ -28,15 +28,15 @@ msgstr "Ytterligare konfigurationer"
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:267
msgid "Additional scopes to include authentication information."
msgstr ""
msgstr "Ytterligare omfattningar som ska inkludera autentiseringsinformation."
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:164
msgid "Address that frps binds to."
msgstr ""
msgstr "Adress som frps binder till."
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:210
msgid "Address that proxy listeners bind to."
msgstr ""
msgstr "Adress som proxymottagare binder till."
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:569
msgid "Allow ports"
@@ -44,11 +44,11 @@ msgstr "Tillåt portar"
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:459
msgid "Assets dir"
msgstr ""
msgstr "Resurskatalog"
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:360
msgid "Audience OIDC tokens should contain."
msgstr ""
msgstr "Målgrupp som OIDC-token ska innehålla."
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:996
msgid "Authentication"
@@ -56,15 +56,15 @@ msgstr "Autentisering"
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:247
msgid "Authentication method"
msgstr ""
msgstr "Autentiseringsmetod"
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:248
msgid "Authentication method used to authenticate frpc."
msgstr ""
msgstr "Autentiseringsmetod som används för att autentisera frpc."
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:601
msgid "Authorized keys file for SSH tunnel gateway."
msgstr ""
msgstr "Fil med auktoriserade nycklar för SSH-tunnelgatewayen."
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:163
msgid "Bind address"
@@ -76,21 +76,19 @@ msgstr "Bindningsport"
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:987
msgid "Collecting data ..."
msgstr "Samlar in data ..."
msgstr "Samlar in data …"
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:333
msgid "Command arguments passed to token source exec."
msgstr ""
"BindAddr anger adressen som servern binds till.<br />Som standard är värdet ”"
"0.0.0.0”."
msgstr "Kommandoargument som skickas till tokenkällans exec."
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:310
msgid ""
"Command used to obtain the token. The init script adds --allow-"
"unsafe=TokenSourceExec when this source type is used."
msgstr ""
"BindKcpPort anger KCP-porten som servern lyssnar på. Om värdet är 0 lyssnar "
"servern inte efter KCP-anslutningar.<br />Som standard är värdet 0."
"Kommando som används för att hämta token. Init-skriptet lägger till --allow-"
"unsafe=TokenSourceExec när den här källtypen används."
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:995
msgid "Common Settings"
@@ -98,34 +96,27 @@ msgstr "Vanliga inställningar"
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:378
msgid "Configuration key: log.level."
msgstr ""
"BindPort anger porten som servern lyssnar på.<br />Som standard är värdet "
"7000."
msgstr "Konfigurationsnyckel: log.level."
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:556
msgid "Configuration key: transport.quic.keepalivePeriod."
msgstr ""
"BindQuicPort anger QUIC-porten som servern lyssnar på. Om värdet är 0 "
"lyssnar servern inte efter QUIC-anslutningar.<br />Som standard är värdet 0."
msgstr "Konfigurationsnyckel: transport.quic.keepalivePeriod."
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:560
msgid "Configuration key: transport.quic.maxIdleTimeout."
msgstr ""
"BindUdpPort anger UDP-porten som servern lyssnar på. Om värdet är 0 lyssnar "
"servern inte efter UDP-anslutningar.<br />Som standard är värdet 0."
msgstr "Konfigurationsnyckel: transport.quic.maxIdleTimeout."
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:564
msgid "Configuration key: transport.quic.maxIncomingStreams."
msgstr ""
"Konfigurationsfiler som inkluderas i den tillfälliga konfigurationsfilen"
msgstr "Konfigurationsnyckel: transport.quic.maxIncomingStreams."
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:237
msgid "Custom 404 page"
msgstr ""
msgstr "Anpassad 404-sida"
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:517
msgid "Detailed errors to client"
msgstr ""
msgstr "Detaljerade fel till klienten"
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:385
msgid "Disable log color"
@@ -133,7 +124,7 @@ msgstr "Inaktivera logg-färg"
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:386
msgid "Disable log colors when log output is console."
msgstr ""
msgstr "Inaktivera loggfärger när loggutdata går till konsolen."
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:274
msgid "Disabled"
@@ -147,31 +138,37 @@ msgstr ""
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:234
msgid "Domain suffix for subdomain-based HTTP/HTTPS proxies."
msgstr ""
msgstr "Domänsuffix för HTTP/HTTPS-proxyer baserade på underdomäner."
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:464
msgid ""
"Enable Go pprof debug/profiling endpoints on the web server. It only takes "
"effect when web server port is set."
msgstr ""
"Aktivera Go pprof-slutpunkter för felsökning/profilering på webbservern. Det "
"får endast effekt när webbserverporten är angiven."
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:413
msgid ""
"Enable HTTPS for the frps web server. This switch controls whether "
"webServer.tls.certFile and webServer.tls.keyFile are emitted."
msgstr ""
"Aktivera HTTPS för frps-webbservern. Den här växeln styr om "
"webServer.tls.certFile och webServer.tls.keyFile genereras."
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:473
msgid "Enable Prometheus"
msgstr ""
msgstr "Aktivera Prometheus"
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:490
msgid "Enable TCP stream multiplexing. This setting must match frpc."
msgstr ""
"Aktivera TCP-strömmultiplexering. Den här inställningen måste stämma överens "
"med frpc."
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:463
msgid "Enable pprof"
msgstr ""
msgstr "Aktivera pprof"
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:102
msgid "Enable service"
@@ -179,7 +176,7 @@ msgstr ""
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:412
msgid "Enable web HTTPS"
msgstr ""
msgstr "Aktivera HTTPS för webben"
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:145
msgid "Environment variable"
@@ -187,15 +184,11 @@ msgstr "Miljövariabel"
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:773
msgid "Environment variable must use KEY=value format."
msgstr ""
"DashboardPort anger porten som instrumentpanelen lyssnar på. Om värdet är 0 "
"startas inte instrumentpanelen.<br />Som standard är värdet 0."
msgstr "Miljövariabeln måste använda formatet NYCKEL=värde."
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:343
msgid "Environment variables passed to token source exec. Use KEY=value."
msgstr ""
"DashboardPwd anger lösenordet som instrumentpanelen använder för "
"inloggning.<br />Som standard är värdet ”admin”."
msgstr "Miljövariabler som skickas till tokenkällans exec. Använd NYCKEL=värde."
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:474
msgid ""
@@ -215,23 +208,23 @@ msgstr ""
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:531
msgid "Force TLS"
msgstr ""
msgstr "Tvinga TLS"
#: applications/luci-app-frps/root/usr/share/rpcd/acl.d/luci-app-frps.json:3
msgid "Grant access to LuCI app frps"
msgstr ""
msgstr "Ge åtkomst till LuCI-appen frps"
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:1021
msgid "HTTP Plugin Settings"
msgstr ""
msgstr "Inställningar för HTTP-insticksprogram"
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:799
msgid "HTTP plugin URL must include a host."
msgstr ""
msgstr "URL:en för HTTP-insticksprogrammet måste innehålla en värd."
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:795
msgid "HTTP plugin address must be a single address."
msgstr ""
msgstr "Adressen till HTTP-insticksprogrammet måste vara en enda adress."
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:807
msgid "HTTP plugin address must be host:port or an http:// or https:// URL."
@@ -239,29 +232,31 @@ msgstr ""
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:611
msgid "HTTP plugin backend address."
msgstr ""
msgstr "Serverdelsadress för HTTP-insticksprogrammet."
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:815
msgid ""
"HTTP plugin operation must be a frps operation name, for example Login or "
"NewProxy."
msgstr ""
"Åtgärden för HTTP-insticksprogrammet måste vara ett frps-åtgärdsnamn, till "
"exempel Login eller NewProxy."
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:783
msgid "HTTP plugin path must start with /."
msgstr ""
msgstr "Sökvägen för HTTP-insticksprogrammet måste börja med /."
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:622
msgid "HTTP plugin request path."
msgstr ""
msgstr "Sökväg för HTTP-insticksprogrammets begäran."
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:509
msgid "Heartbeat timeout"
msgstr ""
msgstr "Tidsgräns för hjärtslag"
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:510
msgid "Heartbeat timeout in seconds."
msgstr ""
msgstr "Tidsgräns för hjärtslag i sekunder."
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:171
msgid "KCP bind port"
@@ -270,11 +265,11 @@ msgstr "KCP-bindningsport"
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:184
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:203
msgid "KCP bind port and QUIC bind port must be different."
msgstr ""
msgstr "KCP-bindningsporten och QUIC-bindningsporten måste vara olika."
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:502
msgid "Keepalive interval for TCP mux."
msgstr ""
msgstr "Keepalive-intervall för TCP-multiplexering."
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:271
msgid ""
@@ -282,10 +277,13 @@ msgid ""
"exec runs a command and requires frp unsafe permission. Mutually exclusive "
"with auth.token."
msgstr ""
"Läs in token från en extern källa. File läser token från en lokal fil; exec "
"kör ett kommando och kräver frp:s osäkra behörighet. Kan inte användas "
"tillsammans med auth.token."
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:1002
msgid "Log Settings"
msgstr ""
msgstr "Logginställningar"
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:377
msgid "Log level"
@@ -293,15 +291,15 @@ msgstr "Loggnivå"
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:381
msgid "Log max days"
msgstr ""
msgstr "Maximalt antal loggdagar"
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:373
msgid "Log output"
msgstr ""
msgstr "Loggutdata"
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:374
msgid "Log output path or console."
msgstr ""
msgstr "Sökväg för loggutdata eller konsol."
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:122
msgid "Log stderr"
@@ -313,19 +311,19 @@ msgstr "Logga stdout"
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:485
msgid "Max pool count"
msgstr ""
msgstr "Maximalt antal pooler"
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:578
msgid "Max ports per client"
msgstr ""
msgstr "Maximalt antal portar per klient"
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:382
msgid "Maximum number of days to keep logs."
msgstr ""
msgstr "Maximalt antal dagar som loggar ska behållas."
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:486
msgid "Maximum pool count for each proxy."
msgstr ""
msgstr "Maximalt antal pooler för varje proxy."
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:579
msgid "Maximum ports each client can use. 0 means no limit."
@@ -336,7 +334,7 @@ msgstr ""
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:514
msgid "Maximum time to wait for a work connection."
msgstr ""
msgstr "Längsta väntetid för en arbetsanslutning."
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:582
msgid "NAT hole analysis reserve hours"
@@ -351,141 +349,145 @@ msgstr "KÖRS INTE"
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:359
msgid "OIDC audience"
msgstr ""
msgstr "OIDC-målgrupp"
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:355
msgid "OIDC issuer"
msgstr ""
msgstr "OIDC-utfärdare"
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:356
msgid "OIDC issuer used to verify tokens."
msgstr ""
msgstr "OIDC-utfärdare som används för att verifiera token."
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:363
msgid "OIDC skip expiry check"
msgstr ""
msgstr "Hoppa över kontroll av OIDC-utgångstid"
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:367
msgid "OIDC skip issuer check"
msgstr ""
msgstr "Hoppa över kontroll av OIDC-utfärdare"
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:146
msgid "OS environments passed to frp for config file template, see %s."
msgstr ""
msgstr "OS-miljöer som skickas till frp för konfigurationsfilsmallen, se %s."
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:532
msgid "Only accept TLS-encrypted frpc connections."
msgstr ""
msgstr "Acceptera endast TLS-krypterade frpc-anslutningar."
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:597
msgid "Path for auto-generated private key."
msgstr ""
msgstr "Sökväg för automatiskt genererad privat nyckel."
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:287
msgid "Path of token file."
msgstr ""
msgstr "Sökväg till tokenfilen."
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:238
msgid "Path to custom 404 page for HTTP requests."
msgstr ""
msgstr "Sökväg till anpassad 404-sida för HTTP-begäranden."
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:544
msgid "Path to the TLS certificate file."
msgstr ""
msgstr "Sökväg till TLS-certifikatfilen."
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:548
msgid "Path to the TLS private key file."
msgstr ""
msgstr "Sökväg till TLS-filen med privat nyckel."
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:424
msgid "Path to the certificate file used by the HTTPS web server."
msgstr ""
msgstr "Sökväg till certifikatfilen som används av HTTPS-webbservern."
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:442
msgid "Path to the private key file used by the HTTPS web server."
msgstr ""
msgstr "Sökväg till filen med privat nyckel som används av HTTPS-webbservern."
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:552
msgid "Path to the trusted CA certificate file."
msgstr ""
msgstr "Sökväg till filen med betrott CA-certifikat."
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:610
msgid "Plugin address"
msgstr ""
msgstr "Insticksprogramadress"
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:606
msgid "Plugin name"
msgstr ""
msgstr "Insticksprogramnamn"
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:632
msgid "Plugin operations"
msgstr ""
msgstr "Insticksprogramåtgärder"
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:621
msgid "Plugin path"
msgstr ""
msgstr "Insticksprogramsökväg"
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:214
msgid "Port for HTTP virtual host requests. Empty or 0 disables it."
msgstr ""
"Port för HTTP-begäranden till virtuella värdar. Tom eller 0 inaktiverar den."
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:218
msgid "Port for HTTPS virtual host requests. Empty or 0 disables it."
msgstr ""
"Port för HTTPS-begäranden till virtuella värdar. Tom eller 0 inaktiverar den."
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:226
msgid "Port for TCPMUX HTTP CONNECT requests. Empty or 0 disables it."
msgstr ""
msgstr "Port för TCPMUX HTTP CONNECT-begäranden. Tom eller 0 inaktiverar den."
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:737
msgid "Port must be a number between 0 and 65535."
msgstr ""
msgstr "Porten måste vara ett tal mellan 0 och 65535."
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:741
msgid "Port must be between 0 and 65535."
msgstr ""
msgstr "Porten måste vara mellan 0 och 65535."
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:760
msgid "Port must be between 1 and 65535."
msgstr ""
msgstr "Porten måste vara mellan 1 och 65535."
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:763
msgid "Port range start must not be greater than end."
msgstr ""
msgstr "Starten för portintervallet får inte vara större än slutet."
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:168
msgid "Port that frps listens on."
msgstr ""
msgstr "Port som frps lyssnar på."
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:570
msgid ""
"Ports clients are allowed to bind. Use single port like 3001 or range like "
"2000-3000."
msgstr ""
"Portar som klienter får binda till. Använd en enskild port, till exempel "
"3001, eller ett intervall som 2000–3000."
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:593
msgid "Private key file for SSH tunnel gateway."
msgstr ""
msgstr "Fil med privat nyckel för SSH-tunnelgatewayen."
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:209
msgid "Proxy bind address"
msgstr ""
msgstr "Bindningsadress för proxy"
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:190
msgid "QUIC bind port"
msgstr ""
msgstr "QUIC-bindningsport"
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:555
msgid "QUIC keepalive period"
msgstr ""
msgstr "QUIC-keepalive-period"
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:559
msgid "QUIC max idle timeout"
msgstr ""
msgstr "Högsta inaktivitetstid för QUIC"
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:563
msgid "QUIC max incoming streams"
msgstr ""
msgstr "Maximalt antal inkommande QUIC-strömmar"
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:960
msgid "RUNNING"
@@ -493,15 +495,15 @@ msgstr "KÖRS"
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:135
msgid "Respawn when crashed"
msgstr ""
msgstr "Starta om efter krasch"
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:222
msgid "Response header timeout for vhost HTTP server, in seconds."
msgstr ""
msgstr "Tidsgräns i sekunder för svarshuvud från HTTP-server för virtuell värd."
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:583
msgid "Retention time for NAT hole punching strategy data."
msgstr ""
msgstr "Lagringstid för data om strategi för NAT-håltagning."
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:133
msgid "Run daemon as group"
@@ -513,31 +515,31 @@ msgstr "Kör demonen som användare"
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:1001
msgid "SSH Tunnel"
msgstr ""
msgstr "SSH-tunnel"
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:600
msgid "SSH tunnel authorized keys file"
msgstr ""
msgstr "Fil med auktoriserade SSH-tunnelnycklar"
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:596
msgid "SSH tunnel auto-generated private key path"
msgstr ""
msgstr "Sökväg till automatiskt genererad privat nyckel för SSH-tunnel"
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:588
msgid "SSH tunnel bind port"
msgstr ""
msgstr "Bindningsport för SSH-tunnel"
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:589
msgid "SSH tunnel gateway bind port. Empty disables this feature."
msgstr ""
msgstr "Bindningsport för SSH-tunnelgateway. Tomt värde inaktiverar funktionen."
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:592
msgid "SSH tunnel private key file"
msgstr ""
msgstr "Fil med privat SSH-tunnelnyckel"
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:518
msgid "Send specific error details to frpc."
msgstr ""
msgstr "Skicka specifika feldetaljer till frpc."
#: applications/luci-app-frps/root/usr/share/luci/menu.d/luci-app-frps.json:11
msgid "Server"
@@ -546,10 +548,12 @@ msgstr "Server"
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:368
msgid "Skip checking whether OIDC token issuer matches configured issuer."
msgstr ""
"Hoppa över kontrollen av att OIDC-tokenutfärdaren motsvarar den "
"konfigurerade utfärdaren."
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:364
msgid "Skip checking whether the OIDC token is expired."
msgstr ""
msgstr "Hoppa över kontrollen av om OIDC-token har löpt ut."
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:1003
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:1014
@@ -558,57 +562,57 @@ msgstr "Inställningar för uppstart"
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:233
msgid "Subdomain host"
msgstr ""
msgstr "Värd för underdomäner"
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:505
msgid "TCP keepalive"
msgstr ""
msgstr "TCP-keepalive"
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:506
msgid "TCP keepalive interval. Negative value disables keepalive."
msgstr ""
msgstr "TCP-keepalive-intervall. Negativt värde inaktiverar keepalive."
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:489
msgid "TCP mux"
msgstr ""
msgstr "TCP-multiplexering"
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:501
msgid "TCP mux keepalive interval"
msgstr ""
msgstr "Keepalive-intervall för TCP-multiplexering"
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:225
msgid "TCPMUX HTTP CONNECT port"
msgstr ""
msgstr "TCPMUX HTTP CONNECT-port"
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:229
msgid "TCPMUX passthrough"
msgstr ""
msgstr "TCPMUX-genomsläpp"
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:998
msgid "TLS / QUIC"
msgstr ""
msgstr "TLS / QUIC"
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:423
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:543
msgid "TLS certificate path"
msgstr ""
msgstr "Sökväg till TLS-certifikat"
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:435
msgid "TLS certificate path is required when web HTTPS is enabled."
msgstr ""
msgstr "Sökväg till TLS-certifikat krävs när HTTPS för webben är aktiverat."
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:441
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:547
msgid "TLS private key path"
msgstr ""
msgstr "Sökväg till TLS-privatnyckel"
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:453
msgid "TLS private key path is required when web HTTPS is enabled."
msgstr ""
msgstr "Sökväg till TLS-privatnyckel krävs när HTTPS för webben är aktiverat."
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:551
msgid "TLS trusted CA path"
msgstr ""
msgstr "Sökväg till betrott TLS-CA"
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:251
msgid "Token"
@@ -617,149 +621,156 @@ msgstr "Tecken"
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:260
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:280
msgid "Token and token source are mutually exclusive."
msgstr ""
msgstr "Token och tokenkälla kan inte användas tillsammans."
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:309
msgid "Token source command"
msgstr ""
msgstr "Kommando för tokenkälla"
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:332
msgid "Token source command arguments"
msgstr ""
msgstr "Kommandoargument för tokenkälla"
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:326
msgid "Token source command is required when token source type is exec."
msgstr ""
msgstr "Kommandot för tokenkälla krävs när tokenkälltypen är exec."
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:342
msgid "Token source environment"
msgstr ""
msgstr "Miljö för tokenkälla"
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:286
msgid "Token source file"
msgstr ""
msgstr "Fil för tokenkälla"
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:303
msgid "Token source file path is required when token source type is file."
msgstr ""
msgstr "Sökväg till fil för tokenkälla krävs när tokenkälltypen är file."
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:270
msgid "Token source type"
msgstr ""
msgstr "Typ av tokenkälla"
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:252
msgid "Token used for authentication."
msgstr ""
msgstr "Token som används för autentisering."
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:997
msgid "Transport Settings"
msgstr ""
msgstr "Transportinställningar"
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:241
msgid "UDP packet size"
msgstr ""
msgstr "UDP-paketstorlek"
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:242
msgid "UDP packet size in bytes. Should match frpc."
msgstr ""
msgstr "UDP-paketstorlek i byte. Måste stämma överens med frpc."
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:172
msgid ""
"UDP port used for KCP. Empty disables KCP. Do not reuse the same UDP port as "
"QUIC."
msgstr ""
"UDP-port som används för KCP. Tomt värde inaktiverar KCP. Återanvänd inte "
"samma UDP-port som QUIC."
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:191
msgid ""
"UDP port used for QUIC. Empty disables QUIC. Do not reuse the same UDP port "
"as KCP."
msgstr ""
"UDP-port som används för QUIC. Tomt värde inaktiverar QUIC. Återanvänd inte "
"samma UDP-port som KCP."
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:607
msgid "Unique HTTP plugin name."
msgstr ""
msgstr "Unikt namn för HTTP-insticksprogram."
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:754
msgid "Use a single port like 3001 or a range like 2000-3000."
msgstr ""
"Använd en enskild port, till exempel 3001, eller ett intervall som 2000–3000."
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:513
msgid "User connection timeout"
msgstr ""
msgstr "Tidsgräns för användaranslutning"
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:644
msgid "Verify plugin TLS"
msgstr ""
msgstr "Verifiera TLS för insticksprogram"
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:645
msgid ""
"Verify the HTTP plugin TLS certificate when the plugin address uses HTTPS."
msgstr ""
"Verifiera HTTP-insticksprogrammets TLS-certifikat när "
"insticksprogramadressen använder HTTPS."
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:213
msgid "Vhost HTTP port"
msgstr ""
msgstr "HTTP-port för virtuell värd"
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:221
msgid "Vhost HTTP timeout"
msgstr ""
msgstr "HTTP-tidsgräns för virtuell värd"
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:217
msgid "Vhost HTTPS port"
msgstr ""
msgstr "HTTPS-port för virtuell värd"
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:999
msgid "Web Server"
msgstr ""
msgstr "Webbserver"
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:391
msgid "Web server address"
msgstr ""
msgstr "Webbserveradress"
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:460
msgid "Web server assets directory."
msgstr ""
msgstr "Resurskatalog för webbservern."
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:392
msgid "Web server bind address."
msgstr ""
msgstr "Webbserverns bindningsadress."
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:405
msgid "Web server password"
msgstr ""
msgstr "Webbserverlösenord"
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:406
msgid "Web server password."
msgstr ""
msgstr "Webbserverlösenord."
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:395
msgid "Web server port"
msgstr ""
msgstr "Webbserverport"
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:396
msgid "Web server port. Leave empty or set to 0 to disable the web server."
msgstr ""
msgstr "Webbserverport. Lämna tomt eller ange 0 för att inaktivera webbservern."
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:399
msgid "Web server user"
msgstr ""
msgstr "Webbserveranvändare"
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:400
msgid "Web server username."
msgstr ""
msgstr "Webbserveranvändarnamn."
#: applications/luci-app-frps/root/usr/share/luci/menu.d/luci-app-frps.json:4
msgid "frp"
msgstr ""
msgstr "frp"
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:963
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:970
msgid "frp Server"
msgstr ""
msgstr "frp-server"
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:633
msgid "frps operations handled by this HTTP plugin."
msgstr ""
msgstr "frps-åtgärder som hanteras av detta HTTP-insticksprogram."
#~ msgid "Advanced"
#~ msgstr "Avancerat"
+1 -1
View File
@@ -171,7 +171,7 @@ msgstr "启用 pprof"
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:102
msgid "Enable service"
msgstr ""
msgstr "启用服务"
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:412
msgid "Enable web HTTPS"
+1 -1
View File
@@ -170,7 +170,7 @@ msgstr "啟用 pprof"
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:102
msgid "Enable service"
msgstr ""
msgstr "啟用服務"
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:412
msgid "Enable web HTTPS"
+1 -1
View File
@@ -12,7 +12,7 @@ LUCI_DEPENDS:=+luci-base +logd +jsonfilter
LUCI_PKGARCH:=all
PKG_VERSION:=0.1.41
PKG_RELEASE:=14
PKG_RELEASE:=15
# Reproducible build: honor SOURCE_DATE_EPOCH from the build environment (set by docker-sdk.sh / CI).
ifdef SOURCE_DATE_EPOCH
@@ -18,6 +18,13 @@ return baseclass.extend({
FETCH_LINES_MAX: 2000 /* ubus poll / logd ring cap (~2000 lines ≈ typical ring) */,
/* DOM budget: ~250 new/updated rows painted per second on typical LuCI routers */
RENDER_CAP_PER_SEC: 250,
/* #306 Layer 2 — measured client RTT → poll cadence (seconds). */
POLL_CADENCE_FAST_S: 1,
POLL_CADENCE_MID_S: 2,
POLL_CADENCE_SLOW_S: 5,
POLL_RTT_FAST_MS: 300,
POLL_RTT_SLOW_MS: 1500,
POLL_RTT_STREAK: 3,
VIEW_MODES: ['simple', 'detailed'],
COLUMN_SETS: {
simple: ['action', 'time', 'iface', 'flow', 'proto', 'rule'],
@@ -11,5 +11,5 @@
* GENERATED — do not edit. Edit fwlive.css and run: node scripts/embed-fwlive-css.js
*/
return baseclass.extend({
styleText: "\n.fwlive-map {\n\tmax-width: none;\n\twidth: 100%;\n\t--fwlive-pass-color: var(--success-color-high, var(--success-color, #46a546));\n\t--fwlive-deny-color: var(--error-color-high, var(--error-color, #ca3c3c));\n\t--fwlive-bg-medium: var(--background-color-medium, var(--white-color-low, #f9f9f9));\n\t--fwlive-paused-color: #b45309;\n}\n/* Wide page in Detail only — Simple keeps LuCI’s 940px column. */\n#maincontent.container:has(.fwlive-map[data-view=\"detailed\"]) {\n\tmax-width: none;\n\tpadding-left: 16px;\n\tpadding-right: 16px;\n}\n.fwlive-map[data-row-tint=\"accessible\"] {\n\t--fwlive-pass-color: #0d9488;\n\t--fwlive-deny-color: #c2410c;\n}\n.fwlive-map.fwlive-watch-paused .fwlive-title-row,\n.fwlive-map.fwlive-watch-paused .fwlive-watch-strip {\n\tbackground: rgba(180, 83, 9, 0.08);\n\tbackground: color-mix(in srgb, var(--fwlive-paused-color) 8%, transparent);\n}\n.fwlive-map.fwlive-watch-paused .fwlive-title-row {\n\tmargin: 0 -8px;\n\tpadding: 6px 8px 0;\n\tborder-radius: 3px 3px 0 0;\n}\n.fwlive-map.fwlive-watch-paused .fwlive-watch-strip {\n\tmargin: 0 -8px 10px;\n\tpadding: 8px;\n\tborder-radius: 0 0 3px 3px;\n\tborder-bottom-color: transparent;\n}\n.fwlive-title-row {\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\talign-items: baseline;\n\tjustify-content: space-between;\n\tgap: 8px 16px;\n\tmargin: 0 0 4px;\n}\n.fwlive-title-row h2 {\n\tmargin: 0;\n\tflex: 0 1 auto;\n}\n.fwlive-title-status {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tgap: 8px;\n\tflex-wrap: wrap;\n\tmin-width: 0;\n\tmargin-left: auto;\n}\n.fwlive-watch-strip {\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\talign-items: stretch;\n\tjustify-content: flex-start;\n\tgap: 0;\n\tmin-height: 40px;\n\tpadding: 8px 0 10px;\n\tborder-bottom: 1px solid var(--border-color-medium);\n\tmargin-bottom: 10px;\n}\n.fwlive-watch-group {\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 6px;\n\tmin-height: 28px;\n\tpadding: 0 10px;\n\tborder-left: 1px solid var(--border-color-medium);\n\tflex-wrap: wrap;\n}\n.fwlive-watch-group:last-child {\n\tpadding-right: 0;\n}\n.fwlive-watch-group-label {\n\tmargin-right: 2px;\n\tcolor: var(--text-color-medium);\n\tfont-size: 0.72em;\n\tfont-weight: 700;\n\tletter-spacing: 0.08em;\n\ttext-transform: uppercase;\n\twhite-space: nowrap;\n}\n.fwlive-watch-seg {\n\tdisplay: inline-flex;\n\talign-items: stretch;\n\tborder: 1px solid var(--border-color-medium);\n\tborder-radius: 3px;\n\toverflow: hidden;\n}\n.fwlive-watch-seg .fwlive-seg-btn {\n\tmargin: 0;\n\tborder: 0;\n\tborder-radius: 0;\n\tborder-right: 1px solid var(--border-color-medium);\n\tbackground: transparent;\n\tpadding: 4px 10px;\n\tfont-size: 0.88em;\n\tline-height: 1.25;\n\tmin-height: 28px;\n}\n.fwlive-watch-seg .fwlive-seg-btn:last-child {\n\tborder-right: 0;\n}\n.fwlive-watch-seg .fwlive-seg-btn[aria-pressed=\"true\"] {\n\tbackground: rgba(26, 111, 156, 0.12);\n\tbackground: color-mix(in srgb, var(--primary-color-high) 12%, transparent);\n\tcolor: var(--primary-color-high);\n\tfont-weight: 600;\n}\n.fwlive-watch-label { font-weight: 600; }\n.fwlive-watch-paused .fwlive-watch-label { color: var(--fwlive-paused-color); }\n.fwlive-map.fwlive-watch-paused .fwlive-title-status .fwlive-watch-label { color: var(--fwlive-paused-color); }\n.fwlive-dot {\n\twidth: 8px;\n\theight: 8px;\n\tborder-radius: 50%;\n\tbackground: var(--text-color-low, var(--border-color-high));\n\tdisplay: inline-block;\n\tflex-shrink: 0;\n}\n.fwlive-dot.fwlive-dot-on {\n\tbackground: var(--fwlive-pass-color);\n\tbox-shadow: 0 0 0 3px color-mix(in srgb, var(--fwlive-pass-color) 22%, transparent);\n}\n.fwlive-btn-ghost {\n\tbackground: transparent;\n\tborder-color: var(--border-color-medium);\n}\n.fwlive-btn-quiet {\n\tbackground: transparent;\n\tborder-color: var(--border-color-medium);\n\tcolor: var(--text-color-medium);\n\tfont-weight: 500;\n}\n.fwlive-log-merged {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tgap: 6px;\n\tpadding: 4px 10px;\n\tborder: 1px solid var(--border-color-medium);\n\tborder-radius: 3px;\n\tbackground: var(--background-color-medium, var(--white-color-low, var(--background-color-high)));\n\tcolor: var(--text-color-high);\n\tfont-weight: 500;\n\tfont-size: 0.88em;\n\tline-height: 1.25;\n\tmin-height: 28px;\n\tcursor: pointer;\n}\n.fwlive-log-merged:hover {\n\tbackground: var(--background-color-low, var(--background-color-medium));\n}\n.fwlive-log-merged:disabled {\n\topacity: 0.65;\n\tcursor: default;\n}\n.fwlive-log-on-dot {\n\twidth: 6px;\n\theight: 6px;\n\tborder-radius: 50%;\n\tbackground: var(--fwlive-pass-color);\n\tflex-shrink: 0;\n}\n.fwlive-log-rate {\n\tcolor: var(--text-color-medium);\n\tfont-weight: 400;\n}\n.fwlive-display-bar {\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\talign-items: center;\n\tgap: 8px 14px;\n\tmargin: 0 0 12px;\n\tpadding: 8px 12px;\n\tborder: 1px solid var(--border-color-medium);\n\tborder-radius: 3px;\n\tbackground: var(--background-color-high);\n}\n.fwlive-display-bar-label {\n\tflex: 0 0 auto;\n\tfoLine truncated
styleText: "\n.fwlive-map {\n\tmax-width: none;\n\twidth: 100%;\n\t--fwlive-pass-color: var(--success-color-high, var(--success-color, #46a546));\n\t--fwlive-deny-color: var(--error-color-high, var(--error-color, #ca3c3c));\n\t--fwlive-bg-medium: var(--background-color-medium, var(--white-color-low, #f9f9f9));\n\t--fwlive-paused-color: #b45309;\n}\n/* Wide page in Detail only — Simple keeps LuCI’s 940px column. */\n#maincontent.container:has(.fwlive-map[data-view=\"detailed\"]) {\n\tmax-width: none;\n\tpadding-left: 16px;\n\tpadding-right: 16px;\n}\n.fwlive-map[data-row-tint=\"accessible\"] {\n\t--fwlive-pass-color: #0d9488;\n\t--fwlive-deny-color: #c2410c;\n}\n.fwlive-map.fwlive-watch-paused .fwlive-title-row,\n.fwlive-map.fwlive-watch-paused .fwlive-watch-strip {\n\tbackground: rgba(180, 83, 9, 0.08);\n\tbackground: color-mix(in srgb, var(--fwlive-paused-color) 8%, transparent);\n}\n.fwlive-map.fwlive-watch-paused .fwlive-title-row {\n\tmargin: 0 -8px;\n\tpadding: 6px 8px 0;\n\tborder-radius: 3px 3px 0 0;\n}\n.fwlive-map.fwlive-watch-paused .fwlive-watch-strip {\n\tmargin: 0 -8px 10px;\n\tpadding: 8px;\n\tborder-radius: 0 0 3px 3px;\n\tborder-bottom-color: transparent;\n}\n.fwlive-title-row {\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\talign-items: baseline;\n\tjustify-content: space-between;\n\tgap: 8px 16px;\n\tmargin: 0 0 4px;\n}\n.fwlive-title-row h2 {\n\tmargin: 0;\n\tflex: 0 1 auto;\n}\n.fwlive-title-status {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tgap: 8px;\n\tflex-wrap: wrap;\n\tmin-width: 0;\n\tmargin-left: auto;\n}\n.fwlive-watch-strip {\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\talign-items: stretch;\n\tjustify-content: flex-start;\n\tgap: 0;\n\tmin-height: 40px;\n\tpadding: 8px 0 10px;\n\tborder-bottom: 1px solid var(--border-color-medium);\n\tmargin-bottom: 10px;\n}\n.fwlive-watch-group {\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 6px;\n\tmin-height: 28px;\n\tpadding: 0 10px;\n\tborder-left: 1px solid var(--border-color-medium);\n\tflex-wrap: wrap;\n}\n.fwlive-watch-group:last-child {\n\tpadding-right: 0;\n}\n.fwlive-watch-group-label {\n\tmargin-right: 2px;\n\tcolor: var(--text-color-medium);\n\tfont-size: 0.72em;\n\tfont-weight: 700;\n\tletter-spacing: 0.08em;\n\ttext-transform: uppercase;\n\twhite-space: nowrap;\n}\n.fwlive-watch-seg {\n\tdisplay: inline-flex;\n\talign-items: stretch;\n\tborder: 1px solid var(--border-color-medium);\n\tborder-radius: 3px;\n\toverflow: hidden;\n}\n.fwlive-watch-seg .fwlive-seg-btn {\n\tmargin: 0;\n\tborder: 0;\n\tborder-radius: 0;\n\tborder-right: 1px solid var(--border-color-medium);\n\tbackground: transparent;\n\tpadding: 4px 10px;\n\tfont-size: 0.88em;\n\tline-height: 1.25;\n\tmin-height: 28px;\n}\n.fwlive-watch-seg .fwlive-seg-btn:last-child {\n\tborder-right: 0;\n}\n.fwlive-watch-seg .fwlive-seg-btn[aria-pressed=\"true\"] {\n\tbackground: rgba(26, 111, 156, 0.12);\n\tbackground: color-mix(in srgb, var(--primary-color-high) 12%, transparent);\n\tcolor: var(--primary-color-high);\n\tfont-weight: 600;\n}\n.fwlive-watch-label { font-weight: 600; }\n.fwlive-watch-paused .fwlive-watch-label { color: var(--fwlive-paused-color); }\n.fwlive-map.fwlive-watch-paused .fwlive-title-status .fwlive-watch-label { color: var(--fwlive-paused-color); }\n.fwlive-dot {\n\twidth: 8px;\n\theight: 8px;\n\tborder-radius: 50%;\n\tbackground: var(--text-color-low, var(--border-color-high));\n\tdisplay: inline-block;\n\tflex-shrink: 0;\n}\n.fwlive-dot.fwlive-dot-on {\n\tbackground: var(--fwlive-pass-color);\n\tbox-shadow: 0 0 0 3px color-mix(in srgb, var(--fwlive-pass-color) 22%, transparent);\n}\n.fwlive-btn-ghost {\n\tbackground: transparent;\n\tborder-color: var(--border-color-medium);\n}\n.fwlive-btn-quiet {\n\tbackground: transparent;\n\tborder-color: var(--border-color-medium);\n\tcolor: var(--text-color-medium);\n\tfont-weight: 500;\n}\n.fwlive-log-merged {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tgap: 6px;\n\tpadding: 4px 10px;\n\tborder: 1px solid var(--border-color-medium);\n\tborder-radius: 3px;\n\tbackground: var(--background-color-medium, var(--white-color-low, var(--background-color-high)));\n\tcolor: var(--text-color-high);\n\tfont-weight: 500;\n\tfont-size: 0.88em;\n\tline-height: 1.25;\n\tmin-height: 28px;\n\tcursor: pointer;\n}\n.fwlive-log-merged:hover {\n\tbackground: var(--background-color-low, var(--background-color-medium));\n}\n.fwlive-log-merged:disabled {\n\topacity: 0.65;\n\tcursor: default;\n}\n.fwlive-log-on-dot {\n\twidth: 6px;\n\theight: 6px;\n\tborder-radius: 50%;\n\tbackground: var(--fwlive-pass-color);\n\tflex-shrink: 0;\n}\n.fwlive-log-rate {\n\tcolor: var(--text-color-medium);\n\tfont-weight: 400;\n}\n.fwlive-display-bar {\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\talign-items: center;\n\tgap: 8px 14px;\n\tmargin: 0 0 12px;\n\tpadding: 8px 12px;\n\tborder: 1px solid var(--border-color-medium);\n\tborder-radius: 3px;\n\tbackground: var(--background-color-high);\n}\n.fwlive-display-bar-label {\n\tflex: 0 0 auto;\n\tfoLine truncated
});
@@ -660,6 +660,16 @@
color: var(--text-color-high);
font-size: 0.92em;
}
.fwlive-adaptive {
display: none;
margin: 0 0 10px;
padding: 8px 12px;
background: var(--background-color-low);
border: 1px solid var(--border-color-medium);
border-radius: 3px;
color: var(--text-color-high);
font-size: 0.92em;
}
.fwlive-tint-warn {
display: none;
color: var(--warn-color-high);
@@ -35,8 +35,8 @@ const callFwliveRules = rpc.declare({
const callFwliveResolve = rpc.declare({
object: 'fwlive',
method: 'resolve',
params: ['addresses'],
expect: { names: {} }
params: ['addresses']
/* Full reply kept so disabled:"load" reaches the view (#306 Layer 2). */
});
const callFwliveLoggingStatus = rpc.declare({
@@ -102,12 +102,25 @@ return view.extend({
resumeMerge: false,
pollFn: null,
pollDataInFlight: false,
/* #306 Layer 2 — visibility / RTT cadence / shed surfacing. */
pollEpoch: 0,
pollCadenceSec: 1,
rttStreakKind: null,
rttStreakCount: 0,
serverAdaptive: 1,
serverTruncated: 0,
serverShed: null,
degradedSampling: false,
resolveLoadShed: false,
visibilityBound: false,
renderRaf: 0,
filterInputTimer: null,
messageLayout: 'wrap',
renderBucket: constants.RENDER_CAP_PER_SEC,
renderBucketMs: 0,
floodSuppressed: false,
pendingForceRender: false,
pendingRenderEpoch: null,
lastPollNewEvents: 0,
showHostnames: false,
rowTint: constants.DEFAULT_ROW_TINT,
@@ -702,7 +715,11 @@ return view.extend({
async fetchEntries() {
if (!this.sessionSeen) this.sessionSeen = new Set();
const epoch = this.pollEpoch;
const resumeMerge = !!this.resumeMerge;
const t0 = this.nowMs();
let reply;
let errored = false;
try {
/* Raw logd lines, not post-filter rows. Fetch a multiple of the
* display limit so mixed syslog still fills the table; pause
@@ -714,25 +731,44 @@ return view.extend({
addresses: [String(fetchLines)]
});
} catch (e) {
this.lastPollError = true;
return;
errored = true;
reply = null;
}
/* Full poll object (no rpc expect strip). error → banner; log → rows. */
if (epoch !== this.pollEpoch) return;
const rtt = this.nowMs() - t0;
if (!reply || typeof reply !== 'object' || Array.isArray(reply)) {
this.lastPollError = true;
this.notePollRtt(rtt, true);
this.updateAdaptiveBanner();
return;
}
if (reply.error) {
this.lastPollError = true;
this.notePollRtt(rtt, true);
this.updateAdaptiveBanner();
return;
}
const raw = reply.log;
if (!Array.isArray(raw)) {
this.lastPollError = true;
this.notePollRtt(rtt, true);
this.updateAdaptiveBanner();
return;
}
this.lastPollError = false;
this.serverAdaptive = reply.adaptive === 0 || reply.adaptive === false ? 0 : 1;
this.serverTruncated = reply.truncated ? 1 : 0;
this.serverShed =
reply.shed && typeof reply.shed === 'object' && !Array.isArray(reply.shed)
? reply.shed
: null;
this.notePollRtt(rtt, errored);
this.updateAdaptiveBanner();
const batch = this.normalizePollBatch(raw);
this.lastPollNewEvents = batch.pollNew;
@@ -740,10 +776,13 @@ return view.extend({
/* Oldest-first ring buffer; filteredRows() reverses for newest-first display. */
this.entries = buffer.applyFetchedEntries(this.entries, batch.rows, {
paused: this.paused,
resumeMerge: this.resumeMerge,
resumeMerge: resumeMerge,
rowLimit: this.rowLimit,
fetchLinesMax: constants.FETCH_LINES_MAX
});
/* A stale request returns above. Keep this obligation until a current
* request has actually applied the merged batch. */
if (resumeMerge) this.resumeMerge = false;
},
rememberSessionId(id) {
@@ -772,11 +811,217 @@ return view.extend({
const cap = this.ingestCap();
if (this.entries.length >= cap && cap > 0) bits.push(_('buffer full'));
if (this.floodSuppressed) bits.push(_('render paused (high rate)'));
if (this.degradedSampling && this.serverAdaptive !== 0) bits.push(_('Degraded — sampling'));
if (this.serverTruncated && this.serverAdaptive !== 0) bits.push(_('truncated'));
if (this.resolveLoadShed && this.serverAdaptive !== 0)
bits.push(_('resolve paused (load)'));
if (!this.paused && !this.followLive)
bits.push(_('scroll frozen — scroll to top to follow live'));
return bits.length ? ' — ' + bits.join(', ') : '';
},
nowMs() {
if (typeof performance !== 'undefined' && performance.now) return performance.now();
return Date.now();
},
isTabHidden() {
return typeof document !== 'undefined' && !!document.hidden;
},
/* Classify one RTT sample into hysteresis buckets (#306).
* error and >1.5s share the slow/degraded streak so mixed failures still trip N=3. */
rttKindFromMs(ms, errored) {
if (errored) return 'slow';
if (!(ms >= 0)) return 'slow';
if (ms < constants.POLL_RTT_FAST_MS) return 'fast';
if (ms <= constants.POLL_RTT_SLOW_MS) return 'mid';
return 'slow';
},
cadenceForKind(kind) {
if (kind === 'fast') return constants.POLL_CADENCE_FAST_S;
if (kind === 'mid') return constants.POLL_CADENCE_MID_S;
return constants.POLL_CADENCE_SLOW_S;
},
resetRttHistory() {
this.rttStreakKind = null;
this.rttStreakCount = 0;
},
bumpPollEpoch() {
this.pollEpoch = (this.pollEpoch || 0) + 1;
return this.pollEpoch;
},
clientBackoffEnabled() {
return this.serverAdaptive !== 0;
},
setPollCadence(sec) {
const next = sec > 0 ? sec : constants.POLL_CADENCE_FAST_S;
if (!this.pollFn) {
this.pollCadenceSec = next;
return;
}
if (this.isTabHidden()) {
this.pollCadenceSec = next;
return;
}
try {
poll.remove(this.pollFn);
} catch (e) {
/* poll gone */
}
this.pollCadenceSec = next;
try {
poll.add(this.pollFn, next);
} catch (e) {
/* poll gone */
}
},
notePollRtt(ms, errored) {
if (!this.clientBackoffEnabled()) {
this.degradedSampling = false;
/* Drop any partial streak so a slow sample from before the
* adaptive:0 window cannot trip degraded on re-enable. */
this.resetRttHistory();
if (this.pollCadenceSec !== constants.POLL_CADENCE_FAST_S)
this.setPollCadence(constants.POLL_CADENCE_FAST_S);
return;
}
const kind = this.rttKindFromMs(ms, errored);
if (kind === this.rttStreakKind) this.rttStreakCount++;
else {
this.rttStreakKind = kind;
this.rttStreakCount = 1;
}
if (this.rttStreakCount < constants.POLL_RTT_STREAK) return;
const cadence = this.cadenceForKind(kind);
this.degradedSampling = cadence === constants.POLL_CADENCE_SLOW_S;
if (cadence !== this.pollCadenceSec) this.setPollCadence(cadence);
},
stopPollingForHidden() {
if (!this.pollFn) return;
try {
poll.remove(this.pollFn);
} catch (e) {
/* poll gone */
}
},
resumePollingAfterVisible() {
this.bumpPollEpoch();
this.resetRttHistory();
/* In-flight poll from the hidden epoch must not apply after catch-up. */
this.pollDataInFlight = false;
if (!this.pollFn) this.pollFn = this.pollData.bind(this);
this.setPollCadence(this.pollCadenceSec || constants.POLL_CADENCE_FAST_S);
this.pollData();
},
onVisibilityChange() {
if (this.isTabHidden()) {
this.stopPollingForHidden();
this.bumpPollEpoch();
return;
}
this.resumePollingAfterVisible();
},
bindVisibility() {
if (this.visibilityBound) return;
if (typeof document === 'undefined' || !document.addEventListener) return;
this.visibilityBound = true;
this.visibilityHandler = function () {
this.onVisibilityChange();
}.bind(this);
document.addEventListener('visibilitychange', this.visibilityHandler);
},
unbindVisibility() {
if (
typeof document !== 'undefined' &&
document.removeEventListener &&
this.visibilityHandler
) {
try {
document.removeEventListener('visibilitychange', this.visibilityHandler);
} catch (e) {
/* document gone */
}
}
this.visibilityHandler = null;
this.visibilityBound = false;
},
updateAdaptiveBanner() {
const el = document.getElementById('fwlive-adaptive');
if (!el) return;
if (!el.style) el.style = { display: '' };
if (!this.clientBackoffEnabled()) {
el.style.display = 'none';
el.textContent = '';
return;
}
const parts = [];
if (this.degradedSampling)
parts.push(_('Degraded — sampling (slow poll RTT; cadence reduced).'));
if (this.serverShed && this.serverShed.limit)
parts.push(
_('Server shedding — at most %d log lines per poll.').format(this.serverShed.limit)
);
else if (this.serverTruncated) parts.push(_('Server truncated this poll (adaptive cap).'));
if (this.resolveLoadShed)
parts.push(_('Hostname resolve paused while the router is under load.'));
if (parts.length) {
el.style.display = 'block';
el.textContent = parts.join(' ');
} else {
el.style.display = 'none';
el.textContent = '';
}
},
scheduleRenderRows(force) {
const doForce = !!force;
const epoch = this.pollEpoch;
if (typeof requestAnimationFrame !== 'function') {
this.renderRows(doForce);
return;
}
if (this.renderRaf) {
this.pendingForceRender = this.pendingForceRender || doForce;
this.pendingRenderEpoch = epoch;
return;
}
this.renderRaf = requestAnimationFrame(
function () {
this.renderRaf = 0;
const f = doForce || !!this.pendingForceRender;
const pendingEpoch = this.pendingRenderEpoch;
this.pendingForceRender = false;
this.pendingRenderEpoch = null;
if (epoch !== this.pollEpoch) {
/* A newer epoch may have requested a render while this frame was
* queued. Drop stale paint and requeue only that current request. */
if (pendingEpoch === this.pollEpoch) this.scheduleRenderRows(f);
return;
}
this.renderRows(f);
}.bind(this)
);
},
refillRenderBucket() {
const now = Date.now();
if (!this.renderBucketMs) this.renderBucketMs = now;
@@ -828,6 +1073,7 @@ return view.extend({
updateFloodBanner() {
const el = document.getElementById('fwlive-flood');
if (!el) return;
if (!el.style) el.style = { display: '' };
if (this.floodSuppressed) {
el.style.display = 'block';
@@ -879,11 +1125,13 @@ return view.extend({
if (this.lastPollError) {
status.className = 'fwlive-status fwlive-status-error';
status.textContent = _('Connection lost — retrying…') + suffix;
this.updateAdaptiveBanner();
return;
}
status.className = this.paused ? 'fwlive-status fwlive-status-paused' : 'fwlive-status';
status.textContent = this.compactCountText(matchCount);
this.updateAdaptiveBanner();
},
readRowLimit() {
@@ -960,13 +1208,13 @@ return view.extend({
this.followLive = true;
/* Merge pause buffer with the first live poll — do not replace (#43). */
this.resumeMerge = true;
const epoch = this.pollEpoch;
this.fetchEntries()
.then(() => this.renderRows(true))
.finally(
function () {
this.resumeMerge = false;
}.bind(this)
);
.then(() => {
/* A hide/show bump abandons this epoch; the catch-up poll paints. */
if (epoch === this.pollEpoch) this.renderRows(true);
})
.catch(function () {});
}
},
@@ -983,8 +1231,11 @@ return view.extend({
this.pendingForceRender = true;
if (!this.paused) this.renderRows(true);
else this.updateStatus();
const epoch = this.pollEpoch;
this.fetchEntries()
.then(() => {
/* A hide/show bump abandons this epoch; the catch-up poll paints. */
if (epoch !== this.pollEpoch) return;
if (this.paused) this.updateStatus();
else this.renderRows(true);
})
@@ -1063,6 +1314,9 @@ return view.extend({
const ips = this.collectIpsFromEntries(entries);
const need = [];
const now = Date.now();
/* While the router sheds resolve load, hold the paused banner without
* re-asking every poll — retry after the cooldown expires. */
if (this.resolveLoadShed && now < (this.resolveShedUntil || 0)) return;
for (let i = 0; i < ips.length && need.length < 32; i++) {
const ip = ips[i];
@@ -1081,8 +1335,28 @@ return view.extend({
const res = await callFwliveResolve({ addresses: need });
if (gen !== this.resolveGeneration) return;
/* rpc.declare expect: { names: {} } already unwraps — res IS the map (#243). */
const names = res || {};
if (res && typeof res === 'object' && res.disabled === 'load') {
this.resolveLoadShed = true;
this.resolveShedUntil = Date.now() + 60000;
this.updateAdaptiveBanner();
return;
}
this.resolveLoadShed = false;
this.resolveShedUntil = 0;
/* RPC-level failure (no_resolver, jshn_missing, invalid_input): the
* reply carries no per-address signal, so return without failMark —
* otherwise every address looks like "no PTR" and retries stall
* for the failure TTL. */
if (res && typeof res === 'object' && typeof res.error === 'string' && res.error)
return;
/* Full reply: names map under .names; legacy expect-unwrap was the map. */
const names =
res && typeof res === 'object' && res.names && typeof res.names === 'object'
? res.names
: res && typeof res === 'object' && !Array.isArray(res)
? res
: {};
let updated = false;
for (let i = 0; i < need.length; i++) {
@@ -1096,7 +1370,8 @@ return view.extend({
}
}
if (updated) this.renderRows(true);
this.updateAdaptiveBanner();
if (updated) this.scheduleRenderRows(true);
} catch (e) {
/* resolve unavailable — show IPs */
} finally {
@@ -1221,7 +1496,7 @@ return view.extend({
renderRows(force) {
const el = document.getElementById('fwlive-table');
if (!el) return;
if (!el || typeof el.querySelector !== 'function') return;
const body = el.querySelector('tbody');
const empty = document.getElementById('fwlive-empty');
@@ -1369,18 +1644,25 @@ return view.extend({
},
async pollData() {
if (this.isTabHidden()) return;
if (this.pollDataInFlight) return;
const epoch = this.pollEpoch;
this.pollDataInFlight = true;
try {
try {
await this.fetchEntries();
} catch (e) {
/* fetchEntries already accounts the poll RTT for every rpc
* outcome; a throw here is a local normalize/buffer bug, not
* network slowness, so count nothing further. */
this.lastPollError = true;
}
if (epoch !== this.pollEpoch) return;
if (this.paused) this.updateStatus();
else this.renderRows(!!this.pendingForceRender);
else this.scheduleRenderRows(!!this.pendingForceRender);
try {
await this.resolveHostnamesForEntries(this.filteredRows());
@@ -1388,19 +1670,25 @@ return view.extend({
/* resolve unavailable — show IPs */
}
} finally {
this.pollDataInFlight = false;
/* Only the owning epoch clears — a stale hidden-era poll must not
* drop the catch-up guard after resume (Grok #331). Resume clears
* explicitly before starting the catch-up poll. */
if (epoch === this.pollEpoch) this.pollDataInFlight = false;
}
},
load() {
this.bindVisibility();
if (!this.pollFn) {
this.pollFn = this.pollData.bind(this);
poll.add(this.pollFn, 1);
this.pollCadenceSec = constants.POLL_CADENCE_FAST_S;
if (!this.isTabHidden()) poll.add(this.pollFn, this.pollCadenceSec);
/* Best-effort teardown when leaving the page (LuCI SPA may full-reload). */
if (typeof window !== 'undefined' && window.addEventListener) {
window.addEventListener(
'pagehide',
function () {
this.unbindVisibility();
if (this.pollFn) {
try {
poll.remove(this.pollFn);
@@ -1553,6 +1841,7 @@ return view.extend({
)
]),
E('div', { 'id': 'fwlive-flood', 'class': 'fwlive-flood' }, ['']),
E('div', { 'id': 'fwlive-adaptive', 'class': 'fwlive-adaptive' }, ['']),
E('div', { 'id': 'fwlive-display-drawer', 'class': 'fwlive-display-bar' }, [
E('span', { 'class': 'fwlive-display-bar-label' }, [_('Display options')]),
E('div', { 'class': 'fwlive-display-controls' }, [
+195 -165
View File
@@ -12,78 +12,78 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:926
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:926
msgid "%d matching · %d/%d stored"
msgstr "%d matching · %d/%d stored"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:929
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:929
msgid "0 matching · %d/%d stored"
msgstr "0 matching · %d/%d stored"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:251
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:251
msgid "Accessible (teal/orange)"
msgstr "Barrierefrei (teal/orange)"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:32
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:32
msgid "Action"
msgstr "Aktion"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:618
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:618
msgid "Administrator access is required to disable logging."
msgstr ""
"Zum Deaktivieren der Protokollierung sind Administratorrechte erforderlich."
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:586
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:586
msgid "Administrator access is required to enable logging."
msgstr ""
"Zum Aktivieren der Protokollierung sind Administratorrechte erforderlich."
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1092
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1092
msgid "Also seen"
msgstr "Weitere"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:571
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:607
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:571
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:607
msgid "Another change is staged for the firewall; apply or revert it first."
msgstr ""
"Eine andere Änderung an der Firewall ist vorgemerkt; zuerst anwenden oder "
"verwerfen."
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1658
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1658
msgid "Any action"
msgstr "Beliebige Aktion"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1085
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1085
msgid "Any protocol"
msgstr "Beliebiges Protokoll"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:113
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:113
msgid "Before you enable logging"
msgstr "Before you enable logging"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:569
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:569
msgid "Cannot enable logging until kernel log modules are installed."
msgstr ""
"Protokollierung kann erst aktiviert werden, wenn die Kernel-Log-Module "
"installiert sind."
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:116
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:116
msgid "Changes:"
msgstr "Changes:"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:250
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:250
msgid "Classic (green/red)"
msgstr "Klassisch (grün/rot)"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1642
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1642
msgid "Classic uses green/red; Accessible uses teal/orange"
msgstr "Klassisch verwendet grün/rot; Barrierefrei verwendet teal/orange"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/chips.js:116
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/chips.js:116
msgid "Clear all"
msgstr "Alle löschen"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1698
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1698
msgid ""
"Click a cell to filter · ≠ on a chip to exclude · Ctrl+click a rule for "
"firewall settings · in Simple view, click a row for the full message"
@@ -92,7 +92,7 @@ msgstr ""
"auf eine Regel für Firewall-Einstellungen · in der Einfachen Ansicht Zeile "
"anklicken für die vollständige Meldung"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1719
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1719
msgid ""
"Click a row (Time or other non-link cells) to see the full log line (Simple "
"view)."
@@ -100,11 +100,11 @@ msgstr ""
"Klicken Sie auf eine Zeile (Zeit oder andere Nicht-Link-Zellen), um die "
"vollständige Log-Zeile zu sehen (Einfache Ansicht)."
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:113
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:113
msgid "Click a row for the full message"
msgstr "Zeile anklicken für die vollständige Meldung"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1720
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1720
msgid ""
"Click an IP, action, or protocol to filter; use the Protocol menu (or ≠ on a "
"chip) to exclude."
@@ -112,87 +112,97 @@ msgstr ""
"Click an IP, action, or protocol to filter; use the Protocol menu (or ≠ on a "
"chip) to exclude."
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1086
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1086
msgid "Common"
msgstr "Häufig"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:944
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:944
msgid "Connection lost — retrying…"
msgstr "Connection lost — retrying…"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:609
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:609
msgid "Could not disable logging."
msgstr "Protokollierung konnte nicht deaktiviert werden."
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:573
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:573
msgid "Could not enable logging."
msgstr "Protokollierung konnte nicht aktiviert werden."
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1680
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1680
msgid "Custom protocol (prefix ! to exclude). Overrides the menu when set."
msgstr ""
"Eigenes Protokoll (! zum Ausschließen). Überschreibt das Menü, wenn gesetzt."
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:42
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:42
msgid "DPort"
msgstr "Ziel-Port"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:40
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:814
msgid "Degraded — sampling"
msgstr "Eingeschränkt — Stichproben"
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:977
msgid "Degraded — sampling (slow poll RTT; cadence reduced)."
msgstr ""
"Eingeschränkt — Stichproben (langsame Poll-Roundtrip-Zeit; Frequenz "
"reduziert)."
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:40
msgid "Destination"
msgstr "Ziel"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1691
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1691
msgid "Destination IP contains (! to exclude)"
msgstr "Ziel-IP enthält (! zum Ausschließen)"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1692
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1692
msgid "Destination port (! to exclude)"
msgstr "Ziel-Port (! zum Ausschließen)"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1583
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1583
msgid "Detail"
msgstr "Detail"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:37
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:37
msgid "Dir"
msgstr "Richtung"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:85
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:85
msgid "Disabling…"
msgstr "Disabling…"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1616
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1616
msgid "Display options"
msgstr "Anzeigeoptionen"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1716
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1716
msgid "Display options on the bar set Limit, row tint, palette, and hostnames."
msgstr ""
"Anzeigeoptionen in der Leiste setzen Limit, Zeilenfärbung, Palette und "
"Hostnamen."
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:121
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:121
msgid "Does not change:"
msgstr "Does not change:"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:138
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:138
msgid "Don’t show this again"
msgstr "Don’t show this again"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:150
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:230
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:150
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:230
msgid "Enable WAN drop/reject logging"
msgstr "Enable WAN drop/reject logging"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:104
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:104
msgid "Enable WAN zone drop/reject logging (same as Network → Firewall)."
msgstr "Enable WAN zone drop/reject logging (same as Network → Firewall)."
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:107
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:107
msgid "Enable logging"
msgstr "Protokollierung aktivieren"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1715
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1715
msgid ""
"Enable logging turns on WAN zone drop/reject logging only (same as Network → "
"Firewall). It does not add rules or log normal LAN browsing."
@@ -200,57 +210,57 @@ msgstr ""
"Enable logging turns on WAN zone drop/reject logging only (same as Network → "
"Firewall). It does not add rules or log normal LAN browsing."
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:107
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:150
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:230
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:107
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:150
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:230
msgid "Enabling…"
msgstr "Enabling…"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1099
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1099
msgid "Exclude"
msgstr "Ausschließen"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/chips.js:80
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/chips.js:80
msgid "Exclude instead"
msgstr "Stattdessen ausschließen"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/links.js:53
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/links.js:71
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/links.js:53
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/links.js:71
msgid "Filter by %s"
msgstr "Filtern nach %s"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/links.js:136
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/links.js:136
msgid "Filter by interface"
msgstr "Nach Schnittstelle filtern"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/links.js:112
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/links.js:112
msgid "Filter logs by rule (hint: %s). Ctrl+click to open firewall settings."
msgstr ""
"Logs nach Regel filtern (Hinweis: %s). Strg+Klick öffnet die Firewall-"
"Einstellungen."
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1540
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/root/usr/share/luci/menu.d/luci-app-fwlive.json:3
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1540
#: openwrt-feed/luci-app-fwlive/root/usr/share/luci/menu.d/luci-app-fwlive.json:3
msgid "Firewall Live View"
msgstr "Firewall-Live-Ansicht"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:43
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:43
msgid "Flags"
msgstr "Flags"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:45
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:45
msgid "Flow"
msgstr "Fluss"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/root/usr/share/rpcd/acl.d/luci-app-fwlive.json:3
#: openwrt-feed/luci-app-fwlive/root/usr/share/rpcd/acl.d/luci-app-fwlive.json:3
msgid "Grant access to firewall live log view"
msgstr "Zugriff auf die Live-Ansicht der Firewall-Protokolle gewähren"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1712
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1712
msgid "Help"
msgstr "Hilfe"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:895
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:895
msgid ""
"High event rate — table refresh is throttled to protect the browser. The "
"buffer still updates; refresh will resume automatically."
@@ -258,15 +268,19 @@ msgstr ""
"High event rate — table refresh is throttled to protect the browser. The "
"buffer still updates; refresh will resume automatically."
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1090
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:984
msgid "Hostname resolve paused while the router is under load."
msgstr "Hostnamenauflösung pausiert, solange der Router ausgelastet ist."
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1090
msgid "ICMPv6"
msgstr "ICMPv6"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:35
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:35
msgid "IN"
msgstr "EINGANG"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1723
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1723
msgid ""
"If Row tint looks missing, the active LuCI theme may omit success/error or "
"info/warn CSS variables; fwlive falls back to local colors (air-gapped, no "
@@ -276,7 +290,7 @@ msgstr ""
"möglicherweise keine Erfolgs/Fehler-CSS-Variablen; fwlive fällt auf lokale "
"Farben zurück (air-gapped, keine Daten verlassen das Gerät)."
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:205
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:205
msgid ""
"If the WAN is quiet, wait for probes or use the optional ping check in "
"Help / the enabling-logs guide."
@@ -284,28 +298,28 @@ msgstr ""
"If the WAN is quiet, wait for probes or use the optional ping check in "
"Help / the enabling-logs guide."
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/chips.js:80
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/chips.js:80
msgid "Include instead"
msgstr "Stattdessen einschließen"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:34
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:34
msgid "Interface"
msgstr "Schnittstelle"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1688
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1688
msgid "Interface (prefix ! to exclude)"
msgstr "Schnittstelle (! voranstellen zum Ausschließen)"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:165
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:232
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:165
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:232
msgid "I’ll configure this under Network → Firewall"
msgstr "I’ll configure this under Network → Firewall"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:194
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:194
msgid "Kernel log modules missing"
msgstr "Kernel log modules missing"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:195
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:195
msgid ""
"Kernel netfilter log modules are missing. Install kmod-nf-log-ipv4 and kmod-"
"nf-log-ipv6 (or kmod-nf-log / kmod-nf-log6), then reload the firewall."
@@ -314,74 +328,74 @@ msgstr ""
"kmod-nf-log-ipv6 (oder kmod-nf-log / kmod-nf-log6) und laden Sie dann die "
"Firewall neu."
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:44
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:44
msgid "Len"
msgstr "Länge"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1619
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1619
msgid "Limit"
msgstr "Limit"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:536
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:536
msgid "Limited diagnostics — timeout command missing"
msgstr "Eingeschränkte Diagnose — timeout-Befehl fehlt"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:210
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:210
msgid "Logging is off on this router"
msgstr "Logging is off on this router"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:252
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:256
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:252
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:256
msgid "Manual test (System → Terminal):"
msgstr "Manueller Test (System → Terminal):"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:46
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:221
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1590
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1595
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:46
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:221
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1590
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1595
msgid "Message"
msgstr "Nachricht"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1686
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1686
msgid "More filters"
msgstr "Weitere Filter"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/links.js:37
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/links.js:37
msgid "Network → Firewall"
msgstr "Network → Firewall"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:187
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:187
msgid ""
"No WAN firewall zone found in /etc/config/firewall. Configure zones under"
msgstr ""
"Keine WAN-Firewall-Zone in /etc/config/firewall gefunden. Konfigurieren Sie "
"Zonen unter"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:185
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:185
msgid "No WAN zone found"
msgstr "No WAN zone found"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:163
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:163
msgid "Not now"
msgstr "Not now"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:220
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:220
msgid "Nothing changes until you click Enable."
msgstr "Nothing changes until you click Enable."
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:36
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:36
msgid "OUT"
msgstr "AUSGANG"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1610
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1610
msgid "One line"
msgstr "Einzeilig"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:206
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:206
msgid "Open firewall zone settings"
msgstr "Firewall-Zonen-Einstellungen öffnen"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:211
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:211
msgid ""
"OpenWrt does not write firewall events to the log until you turn logging on. "
"Live View only shows what the firewall already logs — it does not add allow/"
@@ -391,44 +405,44 @@ msgstr ""
"Live View only shows what the firewall already logs — it does not add allow/"
"deny rules."
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1638
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1638
msgid "Palette"
msgstr "Palette"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:995
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1560
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:995
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1560
msgid "Pause"
msgstr "Pause"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:993
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:993
msgid "Paused"
msgstr "Pausiert"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:38
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:38
msgid "Proto"
msgstr "Protokoll"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1674
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1674
msgid "Protocol — common values"
msgstr "Protokoll — häufige Werte"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1656
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1656
msgid "Quick search"
msgstr "Schnellsuche"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/chips.js:91
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/chips.js:91
msgid "Remove filter"
msgstr "Filter entfernen"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:995
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:995
msgid "Resume"
msgstr "Fortsetzen"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1631
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1631
msgid "Row tint"
msgstr "Zeileneinfärbung"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1721
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1721
msgid ""
"Row tint shows pass/deny row backgrounds when checked. Choose Classic (green/"
"red, default) or Accessible (teal/orange). Action text stays colored either "
@@ -438,7 +452,7 @@ msgstr ""
"Klassisch (grün/rot, Standard) oder Barrierefrei (teal/orange). Aktionstext "
"bleibt in beiden Fällen farbig."
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1550
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1550
msgid ""
"Row tint used a local color fallback because the active LuCI theme did not "
"apply pass/deny backgrounds."
@@ -446,51 +460,59 @@ msgstr ""
"Die Zeileneinfärbung verwendete einen lokalen Farbfallback, da das aktive "
"LuCI-Theme keine Erlauben/Verweigern-Hintergründe anwendet."
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:33
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:33
msgid "Rule"
msgstr "Regel"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:527
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:527
msgid "Rule labels incomplete — map truncated"
msgstr "Rule labels incomplete — map truncated"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:531
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:531
msgid "Rule labels unavailable"
msgstr "Rule labels unavailable"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:529
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:529
msgid "Rule labels unavailable — temp file failed"
msgstr "Rule labels unavailable — temp file failed"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:41
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:980
msgid "Server shedding — at most %d log lines per poll."
msgstr "Server reduziert — höchstens %d Protokollzeilen pro Abfrage."
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:982
msgid "Server truncated this poll (adaptive cap)."
msgstr "Server hat diese Abfrage gekürzt (adaptives Limit)."
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:41
msgid "SPort"
msgstr "Quell-Port"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1650
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1650
msgid "Show hostnames"
msgstr "Hostnamen anzeigen"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1629
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1629
msgid "Show pass/deny row background colors"
msgstr "Pass/Deny-Zeilenhintergrundfarben anzeigen"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1576
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1576
msgid "Simple"
msgstr "Einfach"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:39
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:39
msgid "Source"
msgstr "Quelle"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1689
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1689
msgid "Source IP contains (! to exclude)"
msgstr "Quell-IP enthält (! zum Ausschließen)"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1690
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1690
msgid "Source port (! to exclude)"
msgstr "Quell-Port (! zum Ausschließen)"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1717
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1717
msgid ""
"The rate shown for WAN logging is the firewall zone log_limit. OpenWrt "
"defaults to 10/minute when no explicit limit is configured; fwlive does not "
@@ -500,7 +522,7 @@ msgstr ""
"OpenWrt-Standard ist 10/Minute ohne explizites Limit; fwlive setzt diese "
"Grenze nicht."
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1714
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1714
msgid ""
"The table updates automatically when your firewall logs traffic. Use Pause "
"if it moves too fast."
@@ -508,15 +530,15 @@ msgstr ""
"Die Tabelle aktualisiert sich automatisch, wenn Ihre Firewall Verkehr "
"protokolliert. Pause nutzen, wenn es zu schnell wird."
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1551
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1551
msgid "Theme tint fallback"
msgstr "Theme-Farb-Fallback"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:31
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:31
msgid "Time"
msgstr "Zeit"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:219
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:219
msgid ""
"Turns on WAN zone drop/reject logging (same as Network → Firewall → wan → "
"Log). Rate-limited by the zone log_limit (OpenWrt default 10/minute). Normal "
@@ -526,25 +548,25 @@ msgstr ""
"Log). Rate-limited by the zone log_limit (OpenWrt default 10/minute). Normal "
"LAN browsing is not logged."
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:126
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:126
msgid "Undo:"
msgstr "Undo:"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1722
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1722
msgid "Use Detail for all columns (flags, length, raw message)."
msgstr ""
"Verwenden Sie „Detail“ für alle Spalten (Flags, Länge, rohe Nachricht)."
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1564
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1568
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1564
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1568
msgid "View"
msgstr "Ansicht"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:615
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:615
msgid "WAN drop/reject logging is off."
msgstr "WAN drop/reject logging is off."
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:204
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:204
msgid ""
"WAN drop/reject logging is on. Blocked inbound WAN traffic will show up "
"here. Normal LAN browsing will not."
@@ -552,7 +574,7 @@ msgstr ""
"WAN drop/reject logging is on. Blocked inbound WAN traffic will show up "
"here. Normal LAN browsing will not."
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:579
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:579
msgid ""
"WAN drop/reject logging is on. Blocked inbound traffic should appear here as "
"it happens — not normal LAN browsing."
@@ -560,157 +582,165 @@ msgstr ""
"WAN drop/reject logging is on. Blocked inbound traffic should appear here as "
"it happens — not normal LAN browsing."
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:581
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:581
msgid "WAN logging is already enabled."
msgstr "WAN-Protokollierung ist bereits aktiviert."
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:88
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:88
msgid "WAN logging on"
msgstr "WAN-Protokollierung: EIN"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:94
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:94
msgid "WAN logging on (%s). Click to disable."
msgstr "WAN-Protokollierung: EIN (%s). Klicken zum Deaktivieren."
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:77
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:77
msgid "WAN logging unavailable: missing kernel log modules"
msgstr "WAN-Protokollierung nicht verfügbar: fehlende Kernel-Log-Module"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:70
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:70
msgid "WAN logging unavailable: no WAN zone"
msgstr "WAN-Protokollierung nicht verfügbar: keine WAN-Zone"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:203
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:203
msgid "Waiting for firewall events"
msgstr "Waiting for firewall events"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:993
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1545
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:993
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1545
msgid "Watching"
msgstr "Beobachtet"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1603
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1603
msgid "Wrap"
msgstr "Umbrechen"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:123
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:123
msgid "allow/deny rules, LAN logging, or anything else."
msgstr "allow/deny rules, LAN logging, or anything else."
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:828
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:828
msgid "buffer full"
msgstr "Puffer voll"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:81
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:81
msgid "default 10/minute"
msgstr "Standard 10/Minute"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/chips.js:28
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/chips.js:28
msgid "is"
msgstr "ist"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:823
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:823
msgid "loading buffer"
msgstr "Lade Puffer"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:923
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:923
msgid "loading…"
msgstr "loading…"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/chips.js:37
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/chips.js:44
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/chips.js:37
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/chips.js:44
msgid "not"
msgstr "nicht"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1107
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1107
msgid "not AH"
msgstr "nicht AH"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1106
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1106
msgid "not ESP"
msgstr "nicht ESP"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1105
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1105
msgid "not GRE"
msgstr "nicht GRE"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1102
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1102
msgid "not ICMP"
msgstr "nicht ICMP"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1103
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1103
msgid "not ICMPv6"
msgstr "nicht ICMPv6"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1104
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1104
msgid "not IGMP"
msgstr "nicht IGMP"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1108
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1108
msgid "not SCTP"
msgstr "nicht SCTP"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1100
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1100
msgid "not TCP"
msgstr "nicht TCP"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1101
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1101
msgid "not UDP"
msgstr "nicht UDP"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1666
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1666
msgid "not block"
msgstr "nicht blockieren"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1665
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1665
msgid "not drop"
msgstr "nicht verwerfen"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1664
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1664
msgid "not pass"
msgstr "nicht erlauben"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1667
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1667
msgid "not reject"
msgstr "nicht zurückweisen"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1668
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1668
msgid "not unknown"
msgstr "nicht unbekannt"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1679
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1679
msgid "or type…"
msgstr "oder tippen…"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:830
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:830
msgid "render paused (high rate)"
msgstr "Rendering pausiert (hohe Rate)"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:832
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:817
msgid "resolve paused (load)"
msgstr "Auflösung pausiert (Last)"
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:832
msgid "scroll frozen — scroll to top to follow live"
msgstr "scroll frozen — scroll to top to follow live"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:118
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:118
msgid "sets log on the WAN firewall zone and reloads the firewall."
msgstr "sets log on the WAN firewall zone and reloads the firewall."
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:254
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:258
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:254
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:258
msgid "then ping the router."
msgstr "dann den Router anpingen."
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:128
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:815
msgid "truncated"
msgstr "gekürzt"
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:128
msgid "turn it back off with the WAN logging on control on the watch strip."
msgstr "turn it back off with the WAN logging on control on the watch strip."
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:512
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:512
msgid "using fw4"
msgstr "mit fw4"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:510
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:510
msgid "using iptables"
msgstr "mit iptables"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:89
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:89
msgid "· %s"
msgstr "· %s"
+193 -165
View File
@@ -13,82 +13,82 @@ msgstr ""
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:926
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:926
msgid "%d matching · %d/%d stored"
msgstr "%d matching · %d/%d stored"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:929
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:929
msgid "0 matching · %d/%d stored"
msgstr "0 matching · %d/%d stored"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:251
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:251
msgid "Accessible (teal/orange)"
msgstr "Доступный (бирюзовый/оранжевый)"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:32
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:32
msgid "Action"
msgstr "Действие"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:618
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:618
msgid "Administrator access is required to disable logging."
msgstr ""
"Для отключения журналирования требуются права аÐ"
"´Ð¼Ð¸Ð½Ð¸ÑÑ‚ратора."
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:586
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:586
msgid "Administrator access is required to enable logging."
msgstr ""
"Для включения журналирования требуются права аÐ"
"´Ð¼Ð¸Ð½Ð¸ÑÑ‚ратора."
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1092
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1092
msgid "Also seen"
msgstr "Также встречаются"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:571
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:607
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:571
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:607
msgid "Another change is staged for the firewall; apply or revert it first."
msgstr ""
"В брандмауэре уже есть другое незафиксированное изменение; сначала примените "
"или отмените его."
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1658
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1658
msgid "Any action"
msgstr "Любое действие"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1085
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1085
msgid "Any protocol"
msgstr "Любой протокол"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:113
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:113
msgid "Before you enable logging"
msgstr "Before you enable logging"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:569
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:569
msgid "Cannot enable logging until kernel log modules are installed."
msgstr ""
"Невозможно включить журналирование, пока не "
"установлены модули журнала ядра."
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:116
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:116
msgid "Changes:"
msgstr "Changes:"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:250
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:250
msgid "Classic (green/red)"
msgstr "Классический (зелёный/красный)"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1642
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1642
msgid "Classic uses green/red; Accessible uses teal/orange"
msgstr ""
"Классический — зелёный/красный; доступный — "
"бирюзовый/оранжевый"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/chips.js:116
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/chips.js:116
msgid "Clear all"
msgstr "Очистить всё"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1698
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1698
msgid ""
"Click a cell to filter · ≠ on a chip to exclude · Ctrl+click a rule for "
"firewall settings · in Simple view, click a row for the full message"
@@ -97,7 +97,7 @@ msgstr ""
"правилу для настроек МЭ · в Простом виде щёлкните строку для полного "
"сообщения"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1719
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1719
msgid ""
"Click a row (Time or other non-link cells) to see the full log line (Simple "
"view)."
@@ -105,11 +105,11 @@ msgstr ""
"Щёлкните строку (Время или другие ячейки без ссылки), чтобы увидеть полную "
"строку журнала (Простой вид)."
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:113
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:113
msgid "Click a row for the full message"
msgstr "Щёлкните строку для полного сообщения"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1720
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1720
msgid ""
"Click an IP, action, or protocol to filter; use the Protocol menu (or ≠ on a "
"chip) to exclude."
@@ -117,86 +117,94 @@ msgstr ""
"Click an IP, action, or protocol to filter; use the Protocol menu (or ≠ on a "
"chip) to exclude."
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1086
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1086
msgid "Common"
msgstr "Частые"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:944
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:944
msgid "Connection lost — retrying…"
msgstr "Connection lost — retrying…"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:609
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:609
msgid "Could not disable logging."
msgstr "Не удалось отключить журналирование."
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:573
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:573
msgid "Could not enable logging."
msgstr "Не удалось включить журналирование."
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1680
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1680
msgid "Custom protocol (prefix ! to exclude). Overrides the menu when set."
msgstr "Свой протокол (! для исключения). Переопределяет меню, если задан."
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:42
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:42
msgid "DPort"
msgstr "Порт назн."
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:40
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:814
msgid "Degraded — sampling"
msgstr "Упрощённый режим — выборка"
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:977
msgid "Degraded — sampling (slow poll RTT; cadence reduced)."
msgstr "Упрощённый режим — выборка (медленный RTT опроса; интервал увеличен)."
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:40
msgid "Destination"
msgstr "Назначение"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1691
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1691
msgid "Destination IP contains (! to exclude)"
msgstr "IP назначения содержит (! для исключения)"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1692
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1692
msgid "Destination port (! to exclude)"
msgstr "Порт назначения (! для исключения)"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1583
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1583
msgid "Detail"
msgstr "Подробно"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:37
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:37
msgid "Dir"
msgstr "Напр."
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:85
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:85
msgid "Disabling…"
msgstr "Disabling…"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1616
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1616
msgid "Display options"
msgstr "Параметры отображения"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1716
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1716
msgid "Display options on the bar set Limit, row tint, palette, and hostnames."
msgstr ""
"Параметры отображения на панели задают лимит, окраску строк, палитру и имена "
"узлов."
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:121
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:121
msgid "Does not change:"
msgstr "Does not change:"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:138
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:138
msgid "Don’t show this again"
msgstr "Don’t show this again"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:150
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:230
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:150
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:230
msgid "Enable WAN drop/reject logging"
msgstr "Enable WAN drop/reject logging"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:104
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:104
msgid "Enable WAN zone drop/reject logging (same as Network → Firewall)."
msgstr "Enable WAN zone drop/reject logging (same as Network → Firewall)."
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:107
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:107
msgid "Enable logging"
msgstr "Включить журнал"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1715
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1715
msgid ""
"Enable logging turns on WAN zone drop/reject logging only (same as Network → "
"Firewall). It does not add rules or log normal LAN browsing."
@@ -204,57 +212,57 @@ msgstr ""
"Enable logging turns on WAN zone drop/reject logging only (same as Network → "
"Firewall). It does not add rules or log normal LAN browsing."
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:107
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:150
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:230
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:107
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:150
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:230
msgid "Enabling…"
msgstr "Enabling…"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1099
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1099
msgid "Exclude"
msgstr "Исключить"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/chips.js:80
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/chips.js:80
msgid "Exclude instead"
msgstr "Исключить вместо этого"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/links.js:53
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/links.js:71
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/links.js:53
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/links.js:71
msgid "Filter by %s"
msgstr "Фильтр по %s"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/links.js:136
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/links.js:136
msgid "Filter by interface"
msgstr "Фильтр по интерфейсу"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/links.js:112
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/links.js:112
msgid "Filter logs by rule (hint: %s). Ctrl+click to open firewall settings."
msgstr ""
"Фильтр журналов по правилу (подсказка: %s). "
"Ctrl+клик открывает настройки файрвола."
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1540
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/root/usr/share/luci/menu.d/luci-app-fwlive.json:3
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1540
#: openwrt-feed/luci-app-fwlive/root/usr/share/luci/menu.d/luci-app-fwlive.json:3
msgid "Firewall Live View"
msgstr "Просмотр файрвола в реальном времени"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:43
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:43
msgid "Flags"
msgstr "Флаги"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:45
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:45
msgid "Flow"
msgstr "Поток"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/root/usr/share/rpcd/acl.d/luci-app-fwlive.json:3
#: openwrt-feed/luci-app-fwlive/root/usr/share/rpcd/acl.d/luci-app-fwlive.json:3
msgid "Grant access to firewall live log view"
msgstr "Предоставить доступ к живому просмотру журнала межсетевого экрана"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1712
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1712
msgid "Help"
msgstr "Справка"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:895
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:895
msgid ""
"High event rate — table refresh is throttled to protect the browser. The "
"buffer still updates; refresh will resume automatically."
@@ -262,15 +270,19 @@ msgstr ""
"High event rate — table refresh is throttled to protect the browser. The "
"buffer still updates; refresh will resume automatically."
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1090
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:984
msgid "Hostname resolve paused while the router is under load."
msgstr "Разрешение имён приостановлено из-за нагрузки на маршрутизатор."
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1090
msgid "ICMPv6"
msgstr "ICMPv6"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:35
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:35
msgid "IN"
msgstr "ВХОД"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1723
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1723
msgid ""
"If Row tint looks missing, the active LuCI theme may omit success/error or "
"info/warn CSS variables; fwlive falls back to local colors (air-gapped, no "
@@ -280,7 +292,7 @@ msgstr ""
"активная тема LuCI может не содержать CSS-"
"переменные успе"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:205
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:205
msgid ""
"If the WAN is quiet, wait for probes or use the optional ping check in "
"Help / the enabling-logs guide."
@@ -288,28 +300,28 @@ msgstr ""
"If the WAN is quiet, wait for probes or use the optional ping check in "
"Help / the enabling-logs guide."
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/chips.js:80
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/chips.js:80
msgid "Include instead"
msgstr "Включить вместо этого"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:34
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:34
msgid "Interface"
msgstr "Интерфейс"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1688
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1688
msgid "Interface (prefix ! to exclude)"
msgstr "Интерфейс (! в начале для исключения)"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:165
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:232
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:165
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:232
msgid "I’ll configure this under Network → Firewall"
msgstr "I’ll configure this under Network → Firewall"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:194
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:194
msgid "Kernel log modules missing"
msgstr "Kernel log modules missing"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:195
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:195
msgid ""
"Kernel netfilter log modules are missing. Install kmod-nf-log-ipv4 and kmod-"
"nf-log-ipv6 (or kmod-nf-log / kmod-nf-log6), then reload the firewall."
@@ -318,73 +330,73 @@ msgstr ""
"kmod-nf-log-ipv4 и kmod-nf-log-ipv6 (или kmod-nf-log / kmod-nf-log6), "
"затем перезагрузите файрвол."
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:44
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:44
msgid "Len"
msgstr "Длина"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1619
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1619
msgid "Limit"
msgstr "Лимит"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:536
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:536
msgid "Limited diagnostics — timeout command missing"
msgstr "Ограниченная диагностика — отсутствует команда timeout"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:210
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:210
msgid "Logging is off on this router"
msgstr "Logging is off on this router"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:252
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:256
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:252
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:256
msgid "Manual test (System → Terminal):"
msgstr "Ручной тест (Система → Терминал):"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:46
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:221
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1590
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1595
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:46
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:221
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1590
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1595
msgid "Message"
msgstr "Сообщение"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1686
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1686
msgid "More filters"
msgstr "Больше фильтров"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/links.js:37
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/links.js:37
msgid "Network → Firewall"
msgstr "Network → Firewall"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:187
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:187
msgid ""
"No WAN firewall zone found in /etc/config/firewall. Configure zones under"
msgstr ""
"Зона WAN брандмауэра не найдена в /etc/config/firewall. Настройте зоны в"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:185
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:185
msgid "No WAN zone found"
msgstr "No WAN zone found"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:163
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:163
msgid "Not now"
msgstr "Not now"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:220
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:220
msgid "Nothing changes until you click Enable."
msgstr "Nothing changes until you click Enable."
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:36
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:36
msgid "OUT"
msgstr "ВЫХОД"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1610
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1610
msgid "One line"
msgstr "Одна строка"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:206
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:206
msgid "Open firewall zone settings"
msgstr "Открыть настройки зон файрвола"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:211
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:211
msgid ""
"OpenWrt does not write firewall events to the log until you turn logging on. "
"Live View only shows what the firewall already logs — it does not add allow/"
@@ -394,44 +406,44 @@ msgstr ""
"Live View only shows what the firewall already logs — it does not add allow/"
"deny rules."
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1638
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1638
msgid "Palette"
msgstr "Палитра"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:995
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1560
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:995
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1560
msgid "Pause"
msgstr "Пауза"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:993
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:993
msgid "Paused"
msgstr "Пауза"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:38
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:38
msgid "Proto"
msgstr "Протокол"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1674
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1674
msgid "Protocol — common values"
msgstr "Протокол — частые значения"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1656
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1656
msgid "Quick search"
msgstr "Быстрый поиск"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/chips.js:91
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/chips.js:91
msgid "Remove filter"
msgstr "Удалить фильтр"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:995
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:995
msgid "Resume"
msgstr "Продолжить"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1631
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1631
msgid "Row tint"
msgstr "Цвет строк"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1721
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1721
msgid ""
"Row tint shows pass/deny row backgrounds when checked. Choose Classic (green/"
"red, default) or Accessible (teal/orange). Action text stays colored either "
@@ -441,7 +453,7 @@ msgstr ""
"классический (зелёный/красный, по умолчанию) или доступный (бирюзовый/"
"оранжевый). Цвет текста действия сохраняется в любом случае."
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1550
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1550
msgid ""
"Row tint used a local color fallback because the active LuCI theme did not "
"apply pass/deny backgrounds."
@@ -450,51 +462,59 @@ msgstr ""
"локальный запасной цвет, так как активная тема "
"LuCI не применяет фон пропуска/отказа."
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:33
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:33
msgid "Rule"
msgstr "Правило"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:527
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:527
msgid "Rule labels incomplete — map truncated"
msgstr "Rule labels incomplete — map truncated"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:531
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:531
msgid "Rule labels unavailable"
msgstr "Rule labels unavailable"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:529
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:529
msgid "Rule labels unavailable — temp file failed"
msgstr "Rule labels unavailable — temp file failed"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:41
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:980
msgid "Server shedding — at most %d log lines per poll."
msgstr "Сервер ограничивает выдачу — не более %d строк журнала за опрос."
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:982
msgid "Server truncated this poll (adaptive cap)."
msgstr "Сервер сократил этот опрос (адаптивный предел)."
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:41
msgid "SPort"
msgstr "Порт ист."
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1650
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1650
msgid "Show hostnames"
msgstr "Показывать имена "
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1629
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1629
msgid "Show pass/deny row background colors"
msgstr "Показывать цвета фона строк pass/deny"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1576
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1576
msgid "Simple"
msgstr "Простой"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:39
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:39
msgid "Source"
msgstr "Источник"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1689
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1689
msgid "Source IP contains (! to exclude)"
msgstr "IP источника содержит (! для исключения)"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1690
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1690
msgid "Source port (! to exclude)"
msgstr "Порт источника (! для исключения)"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1717
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1717
msgid ""
"The rate shown for WAN logging is the firewall zone log_limit. OpenWrt "
"defaults to 10/minute when no explicit limit is configured; fwlive does not "
@@ -504,7 +524,7 @@ msgstr ""
"умолчанию OpenWrt: 10/мин без явного лимита; fwlive "
"сам лимит не задаёт."
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1714
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1714
msgid ""
"The table updates automatically when your firewall logs traffic. Use Pause "
"if it moves too fast."
@@ -513,15 +533,15 @@ msgstr ""
"файрвол пишет в журнал. Используйте Паузу, если "
"слишком быстро."
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1551
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1551
msgid "Theme tint fallback"
msgstr "Запасной цвет темы"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:31
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:31
msgid "Time"
msgstr "Время"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:219
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:219
msgid ""
"Turns on WAN zone drop/reject logging (same as Network → Firewall → wan → "
"Log). Rate-limited by the zone log_limit (OpenWrt default 10/minute). Normal "
@@ -531,25 +551,25 @@ msgstr ""
"Log). Rate-limited by the zone log_limit (OpenWrt default 10/minute). Normal "
"LAN browsing is not logged."
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:126
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:126
msgid "Undo:"
msgstr "Undo:"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1722
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1722
msgid "Use Detail for all columns (flags, length, raw message)."
msgstr ""
"Используйте «Подробно» для всех столбцов (флаги, длина, исходное сообщение)."
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1564
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1568
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1564
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1568
msgid "View"
msgstr "Вид"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:615
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:615
msgid "WAN drop/reject logging is off."
msgstr "WAN drop/reject logging is off."
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:204
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:204
msgid ""
"WAN drop/reject logging is on. Blocked inbound WAN traffic will show up "
"here. Normal LAN browsing will not."
@@ -557,7 +577,7 @@ msgstr ""
"WAN drop/reject logging is on. Blocked inbound WAN traffic will show up "
"here. Normal LAN browsing will not."
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:579
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:579
msgid ""
"WAN drop/reject logging is on. Blocked inbound traffic should appear here as "
"it happens — not normal LAN browsing."
@@ -565,159 +585,167 @@ msgstr ""
"WAN drop/reject logging is on. Blocked inbound traffic should appear here as "
"it happens — not normal LAN browsing."
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:581
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:581
msgid "WAN logging is already enabled."
msgstr "WAN-журналирование уже включено."
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:88
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:88
msgid "WAN logging on"
msgstr "WAN-журнал: ВКЛ"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:94
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:94
msgid "WAN logging on (%s). Click to disable."
msgstr "WAN-журнал: ВКЛ (%s). Нажмите, чтобы отключить."
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:77
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:77
msgid "WAN logging unavailable: missing kernel log modules"
msgstr ""
"WAN-журналирование недоступно: отсутствуют модули "
"журнала ядра"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:70
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:70
msgid "WAN logging unavailable: no WAN zone"
msgstr "WAN-журналирование недоступно: нет зоны WAN"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:203
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:203
msgid "Waiting for firewall events"
msgstr "Waiting for firewall events"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:993
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1545
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:993
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1545
msgid "Watching"
msgstr "Наблюдение"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1603
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1603
msgid "Wrap"
msgstr "Перенос"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:123
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:123
msgid "allow/deny rules, LAN logging, or anything else."
msgstr "allow/deny rules, LAN logging, or anything else."
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:828
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:828
msgid "buffer full"
msgstr "буфер заполнен"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:81
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:81
msgid "default 10/minute"
msgstr "по умолчанию 10/мин"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/chips.js:28
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/chips.js:28
msgid "is"
msgstr "есть"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:823
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:823
msgid "loading buffer"
msgstr "загрузка буфера"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:923
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:923
msgid "loading…"
msgstr "loading…"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/chips.js:37
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/chips.js:44
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/chips.js:37
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/chips.js:44
msgid "not"
msgstr "не"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1107
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1107
msgid "not AH"
msgstr "не AH"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1106
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1106
msgid "not ESP"
msgstr "не ESP"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1105
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1105
msgid "not GRE"
msgstr "не GRE"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1102
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1102
msgid "not ICMP"
msgstr "не ICMP"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1103
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1103
msgid "not ICMPv6"
msgstr "не ICMPv6"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1104
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1104
msgid "not IGMP"
msgstr "не IGMP"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1108
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1108
msgid "not SCTP"
msgstr "не SCTP"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1100
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1100
msgid "not TCP"
msgstr "не TCP"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1101
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1101
msgid "not UDP"
msgstr "не UDP"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1666
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1666
msgid "not block"
msgstr "не блокировать"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1665
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1665
msgid "not drop"
msgstr "не отбрасывать"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1664
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1664
msgid "not pass"
msgstr "не пропускать"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1667
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1667
msgid "not reject"
msgstr "не отклонять"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1668
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1668
msgid "not unknown"
msgstr "не неизвестно"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1679
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1679
msgid "or type…"
msgstr "или введите…"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:830
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:830
msgid "render paused (high rate)"
msgstr "рендеринг приостановлен (высокая частота)"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:832
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:817
msgid "resolve paused (load)"
msgstr "Разрешение приостановлено (нагрузка)"
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:832
msgid "scroll frozen — scroll to top to follow live"
msgstr "scroll frozen — scroll to top to follow live"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:118
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:118
msgid "sets log on the WAN firewall zone and reloads the firewall."
msgstr "sets log on the WAN firewall zone and reloads the firewall."
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:254
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:258
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:254
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:258
msgid "then ping the router."
msgstr "затем выполните ping маршрутизатора."
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:128
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:815
msgid "truncated"
msgstr "обрезано"
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:128
msgid "turn it back off with the WAN logging on control on the watch strip."
msgstr "turn it back off with the WAN logging on control on the watch strip."
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:512
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:512
msgid "using fw4"
msgstr "используется fw4"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:510
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:510
msgid "using iptables"
msgstr "используется iptables"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:89
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:89
msgid "· %s"
msgstr "· %s"
@@ -112,6 +112,14 @@ msgstr ""
msgid "DPort"
msgstr ""
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:814
msgid "Degraded — sampling"
msgstr ""
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:977
msgid "Degraded — sampling (slow poll RTT; cadence reduced)."
msgstr ""
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:40
msgid "Destination"
msgstr ""
@@ -225,6 +233,10 @@ msgid ""
"buffer still updates; refresh will resume automatically."
msgstr ""
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:984
msgid "Hostname resolve paused while the router is under load."
msgstr ""
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1090
msgid "ICMPv6"
msgstr ""
@@ -411,6 +423,14 @@ msgstr ""
msgid "Rule labels unavailable — temp file failed"
msgstr ""
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:980
msgid "Server shedding — at most %d log lines per poll."
msgstr ""
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:982
msgid "Server truncated this poll (adaptive cap)."
msgstr ""
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:41
msgid "SPort"
msgstr ""
@@ -622,6 +642,10 @@ msgstr ""
msgid "render paused (high rate)"
msgstr ""
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:817
msgid "resolve paused (load)"
msgstr ""
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:832
msgid "scroll frozen — scroll to top to follow live"
msgstr ""
@@ -635,6 +659,10 @@ msgstr ""
msgid "then ping the router."
msgstr ""
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:815
msgid "truncated"
msgstr ""
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:128
msgid "turn it back off with the WAN logging on control on the watch strip."
msgstr ""
+193 -165
View File
@@ -12,72 +12,72 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:926
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:926
msgid "%d matching · %d/%d stored"
msgstr "%d matching · %d/%d stored"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:929
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:929
msgid "0 matching · %d/%d stored"
msgstr "0 matching · %d/%d stored"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:251
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:251
msgid "Accessible (teal/orange)"
msgstr "可访问(青绿/橙色)"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:32
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:32
msgid "Action"
msgstr "动作"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:618
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:618
msgid "Administrator access is required to disable logging."
msgstr "需要管理员权限才能"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:586
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:586
msgid "Administrator access is required to enable logging."
msgstr "需要管理员权限才能开启日志记录。"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1092
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1092
msgid "Also seen"
msgstr "其他常见"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:571
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:607
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:571
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:607
msgid "Another change is staged for the firewall; apply or revert it first."
msgstr "防火墙另有未提交的更改;请先应用或还原。"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1658
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1658
msgid "Any action"
msgstr "所有动作"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1085
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1085
msgid "Any protocol"
msgstr "任意协议"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:113
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:113
msgid "Before you enable logging"
msgstr "Before you enable logging"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:569
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:569
msgid "Cannot enable logging until kernel log modules are installed."
msgstr "无法启用日志记录,直到内核日志模块已安装。"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:116
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:116
msgid "Changes:"
msgstr "Changes:"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:250
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:250
msgid "Classic (green/red)"
msgstr "经"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1642
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1642
msgid "Classic uses green/red; Accessible uses teal/orange"
msgstr "经"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/chips.js:116
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/chips.js:116
msgid "Clear all"
msgstr "æ"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1698
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1698
msgid ""
"Click a cell to filter · ≠ on a chip to exclude · Ctrl+click a rule for "
"firewall settings · in Simple view, click a row for the full message"
@@ -85,17 +85,17 @@ msgstr ""
"点击单元格筛选 · 芯片上的 ≠ 排除 · Ctrl+点击规则打开防火墙设置 · 在简单视图中"
"点击行查看完整消息"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1719
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1719
msgid ""
"Click a row (Time or other non-link cells) to see the full log line (Simple "
"view)."
msgstr "点击一行(时间或其他非链接单元格)可查看完整日志行(简单视图)。"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:113
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:113
msgid "Click a row for the full message"
msgstr "点击行可查看完整消息"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1720
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1720
msgid ""
"Click an IP, action, or protocol to filter; use the Protocol menu (or ≠ on a "
"chip) to exclude."
@@ -103,84 +103,92 @@ msgstr ""
"Click an IP, action, or protocol to filter; use the Protocol menu (or ≠ on a "
"chip) to exclude."
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1086
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1086
msgid "Common"
msgstr "常用"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:944
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:944
msgid "Connection lost — retrying…"
msgstr "Connection lost — retrying…"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:609
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:609
msgid "Could not disable logging."
msgstr "无法"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:573
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:573
msgid "Could not enable logging."
msgstr "无法开启日志记录。"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1680
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1680
msgid "Custom protocol (prefix ! to exclude). Overrides the menu when set."
msgstr "自定义协议(! 排除)。有内容时覆盖菜单。"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:42
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:42
msgid "DPort"
msgstr "目标端口"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:40
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:814
msgid "Degraded — sampling"
msgstr "降级 — 抽样"
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:977
msgid "Degraded — sampling (slow poll RTT; cadence reduced)."
msgstr "降级 — 抽样(轮询 RTT 较慢;已降低频率)。"
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:40
msgid "Destination"
msgstr "目标地址"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1691
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1691
msgid "Destination IP contains (! to exclude)"
msgstr "目标 IP å"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1692
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1692
msgid "Destination port (! to exclude)"
msgstr "目标端口(! 表示排除)"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1583
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1583
msgid "Detail"
msgstr "详细"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:37
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:37
msgid "Dir"
msgstr "方向"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:85
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:85
msgid "Disabling…"
msgstr "Disabling…"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1616
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1616
msgid "Display options"
msgstr "显示选项"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1716
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1716
msgid "Display options on the bar set Limit, row tint, palette, and hostnames."
msgstr "栏上的显示选项可设置行数限制、行着色、调色板和主机名。"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:121
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:121
msgid "Does not change:"
msgstr "Does not change:"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:138
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:138
msgid "Don’t show this again"
msgstr "Don’t show this again"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:150
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:230
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:150
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:230
msgid "Enable WAN drop/reject logging"
msgstr "Enable WAN drop/reject logging"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:104
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:104
msgid "Enable WAN zone drop/reject logging (same as Network → Firewall)."
msgstr "Enable WAN zone drop/reject logging (same as Network → Firewall)."
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:107
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:107
msgid "Enable logging"
msgstr "开启日志"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1715
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1715
msgid ""
"Enable logging turns on WAN zone drop/reject logging only (same as Network → "
"Firewall). It does not add rules or log normal LAN browsing."
@@ -188,55 +196,55 @@ msgstr ""
"Enable logging turns on WAN zone drop/reject logging only (same as Network → "
"Firewall). It does not add rules or log normal LAN browsing."
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:107
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:150
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:230
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:107
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:150
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:230
msgid "Enabling…"
msgstr "Enabling…"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1099
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1099
msgid "Exclude"
msgstr "排除"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/chips.js:80
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/chips.js:80
msgid "Exclude instead"
msgstr "改为排除"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/links.js:53
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/links.js:71
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/links.js:53
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/links.js:71
msgid "Filter by %s"
msgstr "按 %s 筛选"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/links.js:136
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/links.js:136
msgid "Filter by interface"
msgstr "按接口筛选"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/links.js:112
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/links.js:112
msgid "Filter logs by rule (hint: %s). Ctrl+click to open firewall settings."
msgstr "按规则筛选日志(提示:%s)。Ctrl+点击可打开防火墙设置。"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1540
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/root/usr/share/luci/menu.d/luci-app-fwlive.json:3
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1540
#: openwrt-feed/luci-app-fwlive/root/usr/share/luci/menu.d/luci-app-fwlive.json:3
msgid "Firewall Live View"
msgstr "防火墙实时视图"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:43
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:43
msgid "Flags"
msgstr "标志"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:45
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:45
msgid "Flow"
msgstr "流"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/root/usr/share/rpcd/acl.d/luci-app-fwlive.json:3
#: openwrt-feed/luci-app-fwlive/root/usr/share/rpcd/acl.d/luci-app-fwlive.json:3
msgid "Grant access to firewall live log view"
msgstr "授予防火墙实时日志视图的访问权限"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1712
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1712
msgid "Help"
msgstr "帮助"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:895
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:895
msgid ""
"High event rate — table refresh is throttled to protect the browser. The "
"buffer still updates; refresh will resume automatically."
@@ -244,15 +252,19 @@ msgstr ""
"High event rate — table refresh is throttled to protect the browser. The "
"buffer still updates; refresh will resume automatically."
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1090
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:984
msgid "Hostname resolve paused while the router is under load."
msgstr "路由器负载较高,已暂停主机名解析。"
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1090
msgid "ICMPv6"
msgstr "ICMPv6"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:35
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:35
msgid "IN"
msgstr "IN"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1723
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1723
msgid ""
"If Row tint looks missing, the active LuCI theme may omit success/error or "
"info/warn CSS variables; fwlive falls back to local colors (air-gapped, no "
@@ -261,7 +273,7 @@ msgstr ""
"如果行染色看起来缺失,当前 LuCI 主题可能未提供成功/错误 CSS 变量;fwlive "
"会回退到本地颜色(隔离运行,数据不会离开本机)。"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:205
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:205
msgid ""
"If the WAN is quiet, wait for probes or use the optional ping check in "
"Help / the enabling-logs guide."
@@ -269,99 +281,99 @@ msgstr ""
"If the WAN is quiet, wait for probes or use the optional ping check in "
"Help / the enabling-logs guide."
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/chips.js:80
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/chips.js:80
msgid "Include instead"
msgstr "改为å"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:34
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:34
msgid "Interface"
msgstr "接口"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1688
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1688
msgid "Interface (prefix ! to exclude)"
msgstr "接口(! 前缀表示排除)"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:165
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:232
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:165
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:232
msgid "I’ll configure this under Network → Firewall"
msgstr "I’ll configure this under Network → Firewall"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:194
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:194
msgid "Kernel log modules missing"
msgstr "Kernel log modules missing"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:195
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:195
msgid ""
"Kernel netfilter log modules are missing. Install kmod-nf-log-ipv4 and kmod-"
"nf-log-ipv6 (or kmod-nf-log / kmod-nf-log6), then reload the firewall."
msgstr "缺少å"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:44
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:44
msgid "Len"
msgstr "长度"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1619
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1619
msgid "Limit"
msgstr "限制"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:536
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:536
msgid "Limited diagnostics — timeout command missing"
msgstr "诊断功能受限 — 缺少 timeout 命令"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:210
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:210
msgid "Logging is off on this router"
msgstr "Logging is off on this router"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:252
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:256
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:252
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:256
msgid "Manual test (System → Terminal):"
msgstr "手动测试(系统 → 终端):"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:46
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:221
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1590
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1595
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:46
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:221
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1590
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1595
msgid "Message"
msgstr "消息"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1686
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1686
msgid "More filters"
msgstr "更多筛选"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/links.js:37
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/links.js:37
msgid "Network → Firewall"
msgstr "Network → Firewall"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:187
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:187
msgid ""
"No WAN firewall zone found in /etc/config/firewall. Configure zones under"
msgstr "在 /etc/config/firewall 中未找到 WAN 防火墙区域。请在以下位置配置区域"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:185
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:185
msgid "No WAN zone found"
msgstr "No WAN zone found"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:163
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:163
msgid "Not now"
msgstr "Not now"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:220
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:220
msgid "Nothing changes until you click Enable."
msgstr "Nothing changes until you click Enable."
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:36
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:36
msgid "OUT"
msgstr "出接口"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1610
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1610
msgid "One line"
msgstr "单行"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:206
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:206
msgid "Open firewall zone settings"
msgstr "打开防火墙区域设置"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:211
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:211
msgid ""
"OpenWrt does not write firewall events to the log until you turn logging on. "
"Live View only shows what the firewall already logs — it does not add allow/"
@@ -371,44 +383,44 @@ msgstr ""
"Live View only shows what the firewall already logs — it does not add allow/"
"deny rules."
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1638
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1638
msgid "Palette"
msgstr "Palette"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:995
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1560
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:995
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1560
msgid "Pause"
msgstr "暂停"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:993
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:993
msgid "Paused"
msgstr "已暂停"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:38
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:38
msgid "Proto"
msgstr "协议"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1674
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1674
msgid "Protocol — common values"
msgstr "协议 — 常用值"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1656
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1656
msgid "Quick search"
msgstr "快速搜索"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/chips.js:91
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/chips.js:91
msgid "Remove filter"
msgstr "移除筛选"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:995
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:995
msgid "Resume"
msgstr "ç»§ç»­"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1631
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1631
msgid "Row tint"
msgstr "行染色"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1721
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1721
msgid ""
"Row tint shows pass/deny row backgrounds when checked. Choose Classic (green/"
"red, default) or Accessible (teal/orange). Action text stays colored either "
@@ -417,78 +429,86 @@ msgstr ""
"勾选后行着色显示放行/拒绝行背景。可选经典(绿/红,默认)或无障碍(青绿/橙)。"
"操作文本在两种模式下均保持着色。"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1550
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1550
msgid ""
"Row tint used a local color fallback because the active LuCI theme did not "
"apply pass/deny backgrounds."
msgstr "行染色使用了本地颜色回退,因为当前 LuCI 主题未应用放行/拒绝背景色。"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:33
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:33
msgid "Rule"
msgstr "规则"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:527
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:527
msgid "Rule labels incomplete — map truncated"
msgstr "Rule labels incomplete — map truncated"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:531
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:531
msgid "Rule labels unavailable"
msgstr "Rule labels unavailable"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:529
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:529
msgid "Rule labels unavailable — temp file failed"
msgstr "Rule labels unavailable — temp file failed"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:41
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:980
msgid "Server shedding — at most %d log lines per poll."
msgstr "服务器正在削减 — 每次轮询最多 %d 行日志。"
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:982
msgid "Server truncated this poll (adaptive cap)."
msgstr "服务器已截断本次轮询(自适应上限)。"
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:41
msgid "SPort"
msgstr "源端口"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1650
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1650
msgid "Show hostnames"
msgstr "显示主机名"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1629
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1629
msgid "Show pass/deny row background colors"
msgstr "显示放行/拒绝行背景色"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1576
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1576
msgid "Simple"
msgstr "简洁"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:39
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:39
msgid "Source"
msgstr "源地址"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1689
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1689
msgid "Source IP contains (! to exclude)"
msgstr "源 IP å"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1690
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1690
msgid "Source port (! to exclude)"
msgstr "源端口(! 表示排除)"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1717
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1717
msgid ""
"The rate shown for WAN logging is the firewall zone log_limit. OpenWrt "
"defaults to 10/minute when no explicit limit is configured; fwlive does not "
"impose this cap."
msgstr "WAN 日志显示的速率是防火墙区域的 log_limit。未"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1714
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1714
msgid ""
"The table updates automatically when your firewall logs traffic. Use Pause "
"if it moves too fast."
msgstr "防火墙写"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1551
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1551
msgid "Theme tint fallback"
msgstr "主题着色回退"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:31
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:31
msgid "Time"
msgstr "时间"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:219
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:219
msgid ""
"Turns on WAN zone drop/reject logging (same as Network → Firewall → wan → "
"Log). Rate-limited by the zone log_limit (OpenWrt default 10/minute). Normal "
@@ -498,24 +518,24 @@ msgstr ""
"Log). Rate-limited by the zone log_limit (OpenWrt default 10/minute). Normal "
"LAN browsing is not logged."
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:126
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:126
msgid "Undo:"
msgstr "Undo:"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1722
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1722
msgid "Use Detail for all columns (flags, length, raw message)."
msgstr "使用「详细」可查看全部列(标志、长度、原始消息)。"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1564
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1568
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1564
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1568
msgid "View"
msgstr "视图"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:615
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:615
msgid "WAN drop/reject logging is off."
msgstr "WAN drop/reject logging is off."
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:204
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:204
msgid ""
"WAN drop/reject logging is on. Blocked inbound WAN traffic will show up "
"here. Normal LAN browsing will not."
@@ -523,7 +543,7 @@ msgstr ""
"WAN drop/reject logging is on. Blocked inbound WAN traffic will show up "
"here. Normal LAN browsing will not."
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:579
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:579
msgid ""
"WAN drop/reject logging is on. Blocked inbound traffic should appear here as "
"it happens — not normal LAN browsing."
@@ -531,157 +551,165 @@ msgstr ""
"WAN drop/reject logging is on. Blocked inbound traffic should appear here as "
"it happens — not normal LAN browsing."
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:581
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:581
msgid "WAN logging is already enabled."
msgstr "WAN 日志已处于开启状态。"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:88
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:88
msgid "WAN logging on"
msgstr "WAN 日志:开"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:94
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:94
msgid "WAN logging on (%s). Click to disable."
msgstr "WAN 日志:开(%s)。点击可"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:77
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:77
msgid "WAN logging unavailable: missing kernel log modules"
msgstr "WAN 日志不可用:缺少å"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:70
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:70
msgid "WAN logging unavailable: no WAN zone"
msgstr "WAN 日志不可用:无 WAN 区域"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:203
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:203
msgid "Waiting for firewall events"
msgstr "Waiting for firewall events"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:993
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1545
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:993
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1545
msgid "Watching"
msgstr "监视中"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1603
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1603
msgid "Wrap"
msgstr "自动换行"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:123
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:123
msgid "allow/deny rules, LAN logging, or anything else."
msgstr "allow/deny rules, LAN logging, or anything else."
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:828
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:828
msgid "buffer full"
msgstr "缓冲区已满"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:81
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:81
msgid "default 10/minute"
msgstr "默认 10 条/分钟"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/chips.js:28
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/chips.js:28
msgid "is"
msgstr "是"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:823
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:823
msgid "loading buffer"
msgstr "正在加载缓冲区"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:923
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:923
msgid "loading…"
msgstr "loading…"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/chips.js:37
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/chips.js:44
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/chips.js:37
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/chips.js:44
msgid "not"
msgstr "非"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1107
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1107
msgid "not AH"
msgstr "非 AH"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1106
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1106
msgid "not ESP"
msgstr "非 ESP"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1105
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1105
msgid "not GRE"
msgstr "非 GRE"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1102
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1102
msgid "not ICMP"
msgstr "非 ICMP"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1103
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1103
msgid "not ICMPv6"
msgstr "非 ICMPv6"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1104
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1104
msgid "not IGMP"
msgstr "非 IGMP"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1108
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1108
msgid "not SCTP"
msgstr "非 SCTP"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1100
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1100
msgid "not TCP"
msgstr "非 TCP"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1101
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1101
msgid "not UDP"
msgstr "非 UDP"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1666
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1666
msgid "not block"
msgstr "非阻止"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1665
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1665
msgid "not drop"
msgstr "非丢弃"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1664
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1664
msgid "not pass"
msgstr "非放行"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1667
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1667
msgid "not reject"
msgstr "非拒绝"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1668
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1668
msgid "not unknown"
msgstr "非未知"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1679
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1679
msgid "or type…"
msgstr "或输入…"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:830
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:830
msgid "render paused (high rate)"
msgstr "渲染暂停(速率过高)"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:832
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:817
msgid "resolve paused (load)"
msgstr "解析已暂停(负载)"
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:832
msgid "scroll frozen — scroll to top to follow live"
msgstr "scroll frozen — scroll to top to follow live"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:118
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:118
msgid "sets log on the WAN firewall zone and reloads the firewall."
msgstr "sets log on the WAN firewall zone and reloads the firewall."
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:254
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:258
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:254
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:258
msgid "then ping the router."
msgstr "然后 ping 路由器。"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:128
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:815
msgid "truncated"
msgstr "已截断"
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:128
msgid "turn it back off with the WAN logging on control on the watch strip."
msgstr "turn it back off with the WAN logging on control on the watch strip."
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:512
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:512
msgid "using fw4"
msgstr "使用 fw4"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:510
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:510
msgid "using iptables"
msgstr "使用 iptables"
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:89
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:89
msgid "· %s"
msgstr "· %s"
+1 -1
View File
@@ -2,7 +2,7 @@ include $(TOPDIR)/rules.mk
PKG_NAME:=luci-app-mosdns
PKG_VERSION:=1.7.14
PKG_RELEASE:=24
PKG_RELEASE:=25
LUCI_TITLE:=LuCI Support for mosdns
LUCI_PKGARCH:=all
@@ -72,7 +72,7 @@ function get_adlist() {
let adblock = uci_cursor.get('mosdns', 'config', 'adblock');
if (adblock !== '1') {
mkdir('/etc/mosdns/rule', 0755);
mkdir('/var/mosdns', 0755);
exec_sys('rm -rf /etc/mosdns/rule/adlist /etc/mosdns/rule/.ad_source');
writefile('/var/mosdns/disable-ads.txt', '');
print("/var/mosdns/disable-ads.txt\n");
+3 -3
View File
@@ -7,11 +7,11 @@ include $(TOPDIR)/rules.mk
PKG_NAME:=luci-app-openlist2
PKG_VERSION:=1.0.4
PKG_RELEASE:=6
PKG_RELEASE:=7
LUCI_TITLE:=LuCI support for openlist
# The virtual provide forces installation of a core package with the helper.
LUCI_DEPENDS:=+openlist2 +openlist2-helper
# Require a core package with both the restricted helper and automatic TLS.
LUCI_DEPENDS:=+openlist2 +openlist2-helper +openlist2-tls
include $(TOPDIR)/feeds/luci/luci.mk
@@ -545,7 +545,7 @@ return view.extend({
};
o = addOption('scheme', form.Value, 'listen_https_port', _('HTTPS listen port'),
_('The upstream default is -1 (disabled). Set a valid port number to enable HTTPS.'));
_('Set to -1 to disable HTTPS, or 1-65535 to enable it. Leave both certificate paths empty to use an automatically generated self-signed certificate.'));
o.datatype = 'integer';
o.default = '-1';
o.rmempty = false;
@@ -554,14 +554,15 @@ return view.extend({
return validateListenPort(value);
};
o = addOption('scheme', form.Flag, 'force_https', _('Force HTTPS'));
o = addOption('scheme', form.Flag, 'force_https', _('Force HTTPS'),
_('Redirect HTTP requests to HTTPS. The HTTPS listen port enables HTTPS independently of this option.'));
o.rmempty = false;
o = addOption('scheme', form.Value, 'ssl_cert', _('SSL cert'),
_('SSL certificate file path'));
_('Leave both paths empty to manage a self-signed certificate in the TLS subdirectory of the data directory. It is reused and renewed at startup when fewer than 30 days remain. Browsers do not trust self-signed certificates automatically.'));
o = addOption('scheme', form.Value, 'ssl_key', _('SSL key'),
_('SSL key file path'));
_('For custom TLS, specify both certificate and private key paths. The certificate must be currently valid and match its private key. Custom files are never overwritten automatically.'));
o = addOption('scheme', form.Value, 'listen_unix_file', _('Unix socket file'));
@@ -572,7 +573,7 @@ return view.extend({
o.rmempty = false;
o = addOption('scheme', form.Flag, 'listen_enable_h3', _('Enable HTTP/3/QUIC'),
_('Enable HTTP/3 over QUIC on the HTTPS listen port. HTTPS must be enabled and certificate files must be configured.'));
_('Enable HTTP/3 over QUIC on the HTTPS listen port. HTTPS must be enabled. Certificate settings are shared with HTTPS.'));
o.rmempty = false;
// tasks
@@ -698,7 +699,8 @@ return view.extend({
o.default = 5246;
o.rmempty = false;
o = addOption('s3', form.Flag, 's3_ssl', _('Enable SSL'));
o = addOption('s3', form.Flag, 's3_ssl', _('Enable SSL'),
_('Use the same custom or automatically generated certificate as HTTPS. Configure certificate paths on the Web Protocol tab.'));
o.rmempty = false;
// ftp
@@ -708,7 +710,8 @@ return view.extend({
_('Ports or ranges to allow from WAN, for example 50000-50100. They must match the listening ports in OpenList passive port mapping. Empty means passive ports must be allowed manually.'));
o.placeholder = '50000-50100';
o.depends({ ftp: '1', allow_wan: '1' });
o = addOption('ftp', form.Flag, 'ftp', _('Enabled FTP'));
o = addOption('ftp', form.Flag, 'ftp', _('Enabled FTP'),
_('Enable FTP/SFTP access for the OpenList account in Management > Users. Also grant FTP/SFTP management permission to allow uploads and changes.'));
o.rmempty = false;
o = addOption('ftp', form.Value, 'ftp_port', _('FTP Port'));
@@ -749,7 +752,8 @@ return view.extend({
o.rmempty = false;
// sftp
o = addOption('sftp', form.Flag, 'sftp', _('Enabled SFTP'));
o = addOption('sftp', form.Flag, 'sftp', _('Enabled SFTP'),
_('Enable FTP/SFTP access for the OpenList account in Management > Users. Also grant FTP/SFTP management permission to allow uploads and changes.'));
o.rmempty = false;
o = addOption('sftp', form.Value, 'sftp_port', _('SFTP Port'));
@@ -764,7 +768,7 @@ return view.extend({
o = addOption('mcp', form.DummyValue, '_mcp_endpoint', _('MCP endpoint'),
_('Use Streamable HTTP with Authorization: TOKEN, without a Bearer prefix. Use an OpenList user login token; retain MCP-Session-Id for subsequent requests.'));
_('Use Streamable HTTP with Authorization: TOKEN, without a Bearer prefix. Use an OpenList administrator login token; retain MCP-Session-Id for subsequent requests.'));
o.depends('mcp', '1');
o.renderWidget = () => E('div', {}, [
E('code', {}, backendUrl('mcp') || _('Configure a web port or Site URL.')),
@@ -793,26 +797,48 @@ return view.extend({
if (dist && (containsPath(dist, data) || containsPath(dist, cache) ||
containsPath(cache, dist) || containsPath(dist, index) || containsPath(index, dist)))
return _('Frontend files must be separate from private data, cache and index files.');
if (tlsRequired(section_id) && !fieldValue(section_id, 'ssl_cert') && !fieldValue(section_id, 'ssl_key')) {
const tls = data + '/tls';
for (const directory of [cache, index, dist].filter(Boolean))
if (containsPath(tls, directory) || containsPath(directory, tls))
return _('Automatic TLS directory must be separate from cache, index and public frontend directories.');
}
return true;
};
for (const name of ['data_dir', 'temp_dir', 'bleve_dir', 'dist_dir'])
fields[name].validate = (section_id, value) => validateDirectories(section_id, name, value);
const tlsRequired = section_id => isEnabledPort(fieldValue(section_id, 'listen_https_port', '-1')) ||
(fieldValue(section_id, 's3') === '1' && fieldValue(section_id, 's3_ssl') === '1');
for (const name of ['ssl_cert', 'ssl_key']) {
fields[name].validate = (section_id, value) => {
if (tlsRequired(section_id) && !String(value || '').trim())
return _('Certificate and key paths are required for HTTPS or S3 SSL.');
return validateAbsolutePath(value, false);
};
}
const tlsRequired = section_id => {
const httpsPort = fieldValue(section_id, 'listen_https_port', '-1');
const s3Enabled = fieldValue(section_id, 's3') === '1';
const s3Ssl = fieldValue(section_id, 's3_ssl') === '1';
return isEnabledPort(httpsPort) || (s3Enabled && s3Ssl);
};
const validateCertificatePaths = (section_id, changed, value) => {
if (!tlsRequired(section_id))
return true;
const cert = changed === 'ssl_cert' ? value : fieldValue(section_id, 'ssl_cert');
const key = changed === 'ssl_key' ? value : fieldValue(section_id, 'ssl_key');
if (!cert && !key)
return true;
if (!cert || !key)
return _('Leave both certificate paths empty for automatic TLS, or provide both custom certificate and key paths.');
for (const path of [cert, key]) {
const valid = validateAbsolutePath(path, true);
if (valid !== true)
return valid;
}
return true;
};
for (const name of ['ssl_cert', 'ssl_key'])
fields[name].validate = (section_id, value) => validateCertificatePaths(section_id, name, value);
// LuCI passes input.value (always "1") for checkbox validation.
// Read formvalue() to distinguish checked and unchecked flags.
for (const name of ['force_https', 'listen_enable_h3'])
fields[name].validate = (section_id, value) => value !== '1' || isEnabledPort(fieldValue(section_id, 'listen_https_port', '-1'))
fields[name].validate = section_id => fieldValue(section_id, name) !== '1' || isEnabledPort(fieldValue(section_id, 'listen_https_port', '-1'))
? true : _('Force HTTPS and HTTP/3 require an enabled HTTPS port.');
fields.s3_ssl.validate = (section_id, value) => value !== '1' || fieldValue(section_id, 's3') !== '1' ||
(fieldValue(section_id, 'ssl_cert').trim() && fieldValue(section_id, 'ssl_key').trim())
? true : _('Certificate and key paths are required for HTTPS or S3 SSL.');
fields.s3_ssl.validate = section_id => fieldValue(section_id, 's3') !== '1' || fieldValue(section_id, 's3_ssl') !== '1'
? true : validateCertificatePaths(section_id);
fields.listen_unix_file.validate = (section_id, value) => validateAbsolutePath(value, false);
fields.listen_unix_file_perm.validate = (section_id, value) => !value || /^[0-7]{3,4}$/.test(value)
? true : _('Use 3 or 4 octal digits, for example 660 or 0660.');
@@ -857,6 +883,17 @@ return view.extend({
};
for (const name of ['listen_http_port', 'listen_https_port', 's3_port', 'ftp_port', 'sftp_port', 'ftp_pasv_ports'])
fields[name].validate = (section_id, value) => validatePorts(section_id, name, value);
const protocolFields = ['listen_http_port', 'listen_https_port', 'force_https', 'listen_enable_h3',
'ssl_cert', 'ssl_key', 's3', 's3_ssl', 's3_port', 'ftp', 'ftp_port', 'sftp', 'sftp_port',
'ftp_pasv_ports', 'allow_wan', 'data_dir', 'temp_dir', 'bleve_dir', 'dist_dir'];
const revalidateProtocolFields = (event, section_id) => {
for (const name of protocolFields)
if (fields[name].isActive(section_id))
fields[name].triggerValidation(section_id);
ui.tabs.updateTabs(event, m.root);
};
for (const name of protocolFields)
fields[name].onchange = revalidateProtocolFields;
for (const name of ['ftp_pasv_ports', 'log_path', 'log_max_size', 'log_max_backups', 'log_max_age',
'log_compress', 'log_filter', 'log_filter_cidr', 'log_filter_path', 'log_filter_method'])
fields[name].retain = true;
@@ -54,7 +54,7 @@ return view.extend({
const clearButton = E('button', {
'class': 'btn cbi-button-action',
'type': 'button',
'disabled': !L.hasViewPermission(),
'disabled': !L.hasViewPermission() || null,
'click': ui.createHandlerFn(this, 'handleCleanLogs')
}, _('Clear current log'));
+22 -6
View File
@@ -439,19 +439,23 @@ msgid "HTTPS listen port"
msgstr ""
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:548
msgid "The upstream default is -1 (disabled). Set a valid port number to enable HTTPS."
msgid "Set to -1 to disable HTTPS, or 1-65535 to enable it. Leave both certificate paths empty to use an automatically generated self-signed certificate."
msgstr ""
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:557
msgid "Force HTTPS"
msgstr ""
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js
msgid "Redirect HTTP requests to HTTPS. The HTTPS listen port enables HTTPS independently of this option."
msgstr ""
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:560
msgid "SSL cert"
msgstr ""
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:561
msgid "SSL certificate file path"
msgid "Leave both paths empty to manage a self-signed certificate in the TLS subdirectory of the data directory. It is reused and renewed at startup when fewer than 30 days remain. Browsers do not trust self-signed certificates automatically."
msgstr ""
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:563
@@ -459,7 +463,7 @@ msgid "SSL key"
msgstr ""
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:564
msgid "SSL key file path"
msgid "For custom TLS, specify both certificate and private key paths. The certificate must be currently valid and match its private key. Custom files are never overwritten automatically."
msgstr ""
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:566
@@ -483,7 +487,7 @@ msgid "Enable HTTP/3/QUIC"
msgstr ""
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:575
msgid "Enable HTTP/3 over QUIC on the HTTPS listen port. HTTPS must be enabled and certificate files must be configured."
msgid "Enable HTTP/3 over QUIC on the HTTPS listen port. HTTPS must be enabled. Certificate settings are shared with HTTPS."
msgstr ""
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:579
@@ -632,6 +636,10 @@ msgstr ""
msgid "Enabled FTP"
msgstr ""
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js
msgid "Enable FTP/SFTP access for the OpenList account in Management > Users. Also grant FTP/SFTP management permission to allow uploads and changes."
msgstr ""
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:714
msgid "FTP Port"
msgstr ""
@@ -689,7 +697,7 @@ msgid "MCP endpoint"
msgstr ""
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:767
msgid "Use Streamable HTTP with Authorization: TOKEN, without a Bearer prefix. Use an OpenList user login token; retain MCP-Session-Id for subsequent requests."
msgid "Use Streamable HTTP with Authorization: TOKEN, without a Bearer prefix. Use an OpenList administrator login token; retain MCP-Session-Id for subsequent requests."
msgstr ""
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:770
@@ -718,7 +726,15 @@ msgstr ""
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:806
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:815
msgid "Certificate and key paths are required for HTTPS or S3 SSL."
msgid "Leave both certificate paths empty for automatic TLS, or provide both custom certificate and key paths."
msgstr ""
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js
msgid "Automatic TLS directory must be separate from cache, index and public frontend directories."
msgstr ""
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js
msgid "Use the same custom or automatically generated certificate as HTTPS. Configure certificate paths on the Web Protocol tab."
msgstr ""
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:812
+28 -12
View File
@@ -440,28 +440,32 @@ msgid "HTTPS listen port"
msgstr "HTTPS 监听端口"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:548
msgid "The upstream default is -1 (disabled). Set a valid port number to enable HTTPS."
msgstr "上游默认值为 -1(禁用)。设为有效端口号可启用 HTTPS。"
msgid "Set to -1 to disable HTTPS, or 1-65535 to enable it. Leave both certificate paths empty to use an automatically generated self-signed certificate."
msgstr "设为 -1 可禁用 HTTPS,设为 1–65535 可启用 HTTPS。证书和私钥路径同时留空时,使用自动生成的自签名证书。"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:557
msgid "Force HTTPS"
msgstr "强制 HTTPS"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js
msgid "Redirect HTTP requests to HTTPS. The HTTPS listen port enables HTTPS independently of this option."
msgstr "将 HTTP 请求重定向到 HTTPS。是否启用 HTTPS 由 HTTPS 监听端口决定,与此选项独立。"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:560
msgid "SSL cert"
msgstr "SSL 证书"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:561
msgid "SSL certificate file path"
msgstr "SSL 证书文件路径"
msgid "Leave both paths empty to manage a self-signed certificate in the TLS subdirectory of the data directory. It is reused and renewed at startup when fewer than 30 days remain. Browsers do not trust self-signed certificates automatically."
msgstr "两项路径同时留空时,在数据目录的 tls 子目录中自动管理自签名证书。有效证书会复用,剩余有效期不足 30 天时在启动时更新。浏览器不会自动信任自签名证书。"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:563
msgid "SSL key"
msgstr "SSL 密钥"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:564
msgid "SSL key file path"
msgstr "SSL 密钥文件路径"
msgid "For custom TLS, specify both certificate and private key paths. The certificate must be currently valid and match its private key. Custom files are never overwritten automatically."
msgstr "使用自定义证书时,请同时填写证书和私钥路径。证书必须在有效期内且与私钥匹配。自定义文件不会被自动覆盖。"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:566
msgid "Unix socket file"
@@ -484,8 +488,8 @@ msgid "Enable HTTP/3/QUIC"
msgstr "启用 HTTP/3/QUIC"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:575
msgid "Enable HTTP/3 over QUIC on the HTTPS listen port. HTTPS must be enabled and certificate files must be configured."
msgstr "在 HTTPS 监听端口上启用基于 QUIC 的 HTTP/3。必须先启用 HTTPS 并配置证书文件。"
msgid "Enable HTTP/3 over QUIC on the HTTPS listen port. HTTPS must be enabled. Certificate settings are shared with HTTPS."
msgstr "在 HTTPS 监听端口上启用基于 QUIC 的 HTTP/3。必须先启用 HTTPS,并与 HTTPS 共用证书设置。"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:579
msgid "Open traffic settings"
@@ -633,6 +637,10 @@ msgstr "允许从 WAN 访问的端口或范围,例如 50000-50100,必须与
msgid "Enabled FTP"
msgstr "启用 FTP"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js
msgid "Enable FTP/SFTP access for the OpenList account in Management > Users. Also grant FTP/SFTP management permission to allow uploads and changes."
msgstr "还需在 OpenList 管理后台的“用户”中为账号开启 FTP/SFTP 访问权限;上传和修改文件还需要 FTP/SFTP 管理权限。"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:714
msgid "FTP Port"
msgstr "FTP 端口"
@@ -690,8 +698,8 @@ msgid "MCP endpoint"
msgstr "MCP 端点"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:767
msgid "Use Streamable HTTP with Authorization: TOKEN, without a Bearer prefix. Use an OpenList user login token; retain MCP-Session-Id for subsequent requests."
msgstr "使用 Streamable HTTP,认证头为 Authorization: TOKEN,不添加 Bearer 前缀。TOKEN 为 OpenList 用户登录令牌,后续请求需保留 MCP-Session-Id。"
msgid "Use Streamable HTTP with Authorization: TOKEN, without a Bearer prefix. Use an OpenList administrator login token; retain MCP-Session-Id for subsequent requests."
msgstr "使用 Streamable HTTP,认证头为 Authorization: TOKEN,不添加 Bearer 前缀。TOKEN 必须为 OpenList 管理员登录令牌,后续请求需保留 MCP-Session-Id。"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:770
msgid "Configure a web port or Site URL."
@@ -719,8 +727,16 @@ msgstr "前端文件必须与私有数据、缓存和索引分开。"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:806
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:815
msgid "Certificate and key paths are required for HTTPS or S3 SSL."
msgstr "启用 HTTPS 或 S3 SSL 时必须填写证书和私钥路径。"
msgid "Leave both certificate paths empty for automatic TLS, or provide both custom certificate and key paths."
msgstr "请将证书和私钥路径同时留空以自动生成证书,或同时填写自定义证书和私钥路径。"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js
msgid "Automatic TLS directory must be separate from cache, index and public frontend directories."
msgstr "自动 TLS 目录必须与缓存、索引和公开前端目录分开。"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js
msgid "Use the same custom or automatically generated certificate as HTTPS. Configure certificate paths on the Web Protocol tab."
msgstr "与 HTTPS 共用自定义或自动生成的证书。请在“Web 协议”选项卡配置证书路径。"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:812
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:855
+28 -12
View File
@@ -440,28 +440,32 @@ msgid "HTTPS listen port"
msgstr "HTTPS 監聽埠"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:548
msgid "The upstream default is -1 (disabled). Set a valid port number to enable HTTPS."
msgstr "上游預設值為 -1(停用)。設為有效埠號可啟用 HTTPS。"
msgid "Set to -1 to disable HTTPS, or 1-65535 to enable it. Leave both certificate paths empty to use an automatically generated self-signed certificate."
msgstr "設為 -1 可停用 HTTPS,設為 1–65535 可啟用 HTTPS。憑證與私密金鑰路徑同時留空時,使用自動產生的自簽憑證。"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:557
msgid "Force HTTPS"
msgstr "強制 HTTPS"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js
msgid "Redirect HTTP requests to HTTPS. The HTTPS listen port enables HTTPS independently of this option."
msgstr "將 HTTP 請求重新導向至 HTTPS。是否啟用 HTTPS 由 HTTPS 監聽埠決定,與此選項獨立。"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:560
msgid "SSL cert"
msgstr "SSL 證書"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:561
msgid "SSL certificate file path"
msgstr "SSL 證書檔案路徑"
msgid "Leave both paths empty to manage a self-signed certificate in the TLS subdirectory of the data directory. It is reused and renewed at startup when fewer than 30 days remain. Browsers do not trust self-signed certificates automatically."
msgstr "兩項路徑同時留空時,在資料目錄的 tls 子目錄中自動管理自簽憑證。有效憑證會重複使用,剩餘有效期不足 30 天時於啟動時更新。瀏覽器不會自動信任自簽憑證。"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:563
msgid "SSL key"
msgstr "SSL 金鑰"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:564
msgid "SSL key file path"
msgstr "SSL 金鑰檔案路徑"
msgid "For custom TLS, specify both certificate and private key paths. The certificate must be currently valid and match its private key. Custom files are never overwritten automatically."
msgstr "使用自訂憑證時,請同時填寫憑證與私密金鑰路徑。憑證必須在有效期內且與私密金鑰相符。自訂檔案不會被自動覆寫。"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:566
msgid "Unix socket file"
@@ -484,8 +488,8 @@ msgid "Enable HTTP/3/QUIC"
msgstr "啟用 HTTP/3/QUIC"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:575
msgid "Enable HTTP/3 over QUIC on the HTTPS listen port. HTTPS must be enabled and certificate files must be configured."
msgstr "在 HTTPS 監聽連接埠上啟用基於 QUIC 的 HTTP/3。必須先啟用 HTTPS 並配置憑證檔案。"
msgid "Enable HTTP/3 over QUIC on the HTTPS listen port. HTTPS must be enabled. Certificate settings are shared with HTTPS."
msgstr "在 HTTPS 監聽埠上啟用基於 QUIC 的 HTTP/3。必須先啟用 HTTPS,並與 HTTPS 共用憑證設定。"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:579
msgid "Open traffic settings"
@@ -633,6 +637,10 @@ msgstr "允許從 WAN 存取的連接埠或範圍,例如 50000-50100,必須
msgid "Enabled FTP"
msgstr "啟用 FTP"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js
msgid "Enable FTP/SFTP access for the OpenList account in Management > Users. Also grant FTP/SFTP management permission to allow uploads and changes."
msgstr "還需在 OpenList 管理後台的「使用者」中為帳號開啟 FTP/SFTP 存取權限;上傳和修改檔案還需要 FTP/SFTP 管理權限。"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:714
msgid "FTP Port"
msgstr "FTP 埠"
@@ -690,8 +698,8 @@ msgid "MCP endpoint"
msgstr "MCP 端點"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:767
msgid "Use Streamable HTTP with Authorization: TOKEN, without a Bearer prefix. Use an OpenList user login token; retain MCP-Session-Id for subsequent requests."
msgstr "使用 Streamable HTTP,認證標頭為 Authorization: TOKEN,不加 Bearer 前綴。TOKEN 為 OpenList 使用者登入權杖,後續請求須保留 MCP-Session-Id。"
msgid "Use Streamable HTTP with Authorization: TOKEN, without a Bearer prefix. Use an OpenList administrator login token; retain MCP-Session-Id for subsequent requests."
msgstr "使用 Streamable HTTP,認證標頭為 Authorization: TOKEN,不加 Bearer 前綴。TOKEN 必須為 OpenList 管理員登入權杖,後續請求須保留 MCP-Session-Id。"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:770
msgid "Configure a web port or Site URL."
@@ -719,8 +727,16 @@ msgstr "前端檔案必須與私人資料、快取及索引分開。"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:806
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:815
msgid "Certificate and key paths are required for HTTPS or S3 SSL."
msgstr "啟用 HTTPS 或 S3 SSL 時必須填寫憑證及私密金鑰路徑。"
msgid "Leave both certificate paths empty for automatic TLS, or provide both custom certificate and key paths."
msgstr "請將憑證與私密金鑰路徑同時留空以自動產生憑證,或同時填寫自訂憑證與私密金鑰路徑。"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js
msgid "Automatic TLS directory must be separate from cache, index and public frontend directories."
msgstr "自動 TLS 目錄必須與快取、索引及公開前端目錄分開。"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js
msgid "Use the same custom or automatically generated certificate as HTTPS. Configure certificate paths on the Web Protocol tab."
msgstr "與 HTTPS 共用自訂或自動產生的憑證。請在「Web 協定」分頁設定憑證路徑。"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:812
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:855
+2
View File
@@ -0,0 +1,2 @@
# Preserve the original supplemental SVG bytes and source SHA256.
htdocs/luci-static/resources/oui/midea.svg -text whitespace=cr-at-eol
+19
View File
@@ -0,0 +1,19 @@
# SPDX-License-Identifier: GPL-2.0-only
include $(TOPDIR)/rules.mk
PKG_VERSION:=1.0.6
PKG_RELEASE:=1
PKG_LICENSE:=GPL-2.0-only AND CC0-1.0 AND MIT AND LicenseRef-Public-Domain AND LicenseRef-fnOS-Trademark
LUCI_MAINTAINER:=coolsnowwolf <coolsnowwolf@gmail.com>
LUCI_TITLE:=Local OUI vendor icons for DHCP leases
LUCI_DEPENDS:=+luci-base
LUCI_PKGARCH:=all
define Package/luci-app-oui/conffiles
/etc/config/oui
endef
include $(TOPDIR)/feeds/luci/luci.mk
# call BuildPackage - OpenWrt buildroot signature
+87
View File
@@ -0,0 +1,87 @@
# luci-app-oui
Optional local vendor SVG icons beside DHCP lease hostnames. Install together with
this tree's luci-base / luci-mod-status integration. No daemon, external lookup,
or scheduled download. Optional device overrides are available for devices using OEM network modules.
The normal LuCI feature response checks for the installed helper. Without the
package, the homepage neither loads its JavaScript nor fetches the OUI database
or icons. With it, hostnames render immediately; icons are added asynchronously.
The database is fetched once per page, including caching failures, and its hash
in the filename invalidates browser caches after data updates. SVG requests are
shared by brand and use normal HTTP caching. The resident prefix table bounds
memory usage; no per-client MAC history is stored. No MAC is sent off-router.
Data comes from [WH-2099/macdb](https://github.com/WH-2099/macdb), which combines
IEEE MA-L, MA-M and MA-S assignments. Longest-prefix matching supports 24/28/36
bits. Multicast, locally administered/randomized and malformed MACs are ignored.
Unknown vendors, absent/random MACs and brands without a bundled icon use a
small generic desktop SVG. It is an original GPL-2.0-only asset, not a brand logo.
The icon identifies the registered MAC vendor: a PC using an Intel NIC can show
Intel rather than the motherboard manufacturer. DHCP hostnames are not used to
guess brands.
Hosts with an open TCP port 5666 or 5667 in the existing LAN web-probe cache
show the fnOS logo instead of the OUI icon. The probe must be ready and match
the current IP and MAC; any active IPv4 address of a merged client can qualify.
This is a port-based display heuristic, not OS authentication. The vector logo
was traced from the supplied `fnos.PNG`; see `NOTICE.fnos`.
Most icons are an unmodified subset of
[Simple Icons 11.15.0](https://github.com/simple-icons/simple-icons/tree/11.15.0),
pinned to retain brands removed from newer releases (including Microsoft).
The included Simple Icons CC0 license and disclaimer and macdb MIT license travel
with the package. Not all hardware brands exist in this snapshot: for example,
ASRock and Realme have no bundled official Simple Icons asset. They are
not relabeled as another manufacturer. GIGABYTE uses a supplemental public-domain
wordmark; its source and attribution are recorded in `NOTICE.supplemental`.
## Updating the subset
On a development machine with Python 3, unpack Simple Icons 11.15.0 and a macdb
snapshot, then run:
```sh
python3 tools/generate.py /path/to/macdb /path/to/simple-icons-11.15.0
```
`tools/vendors.json` contains normalized manufacturer alias patterns. Normalizing
case and punctuation merges ASUSTek COMPUTER INC., ASUSTeK Computer Inc., ASUS and
ASUS COMPUTER INTERNATIONAL under ASUS; patterns are anchored to avoid accidental
matches such as Pegasus or Asustor. Ambiguous matches abort generation.
`tools/sources.json` records the input CSV SHA256, source URLs, exact observed
aliases and generated database filename. Review these with any regenerated data.
Generation also updates the helper's database URL. Bump the package version and
the homepage helper query version when changing the helper or generated data.
No source downloads or Python dependency are needed when building/installing.
Run the regression checks with `python3 tools/test_generate.py` and
`node tools/test_oui.js`.
## OEM devices and supplemental brands
Midea and TCL SVGs supplement the Simple Icons subset. Their individual sources,
authors and hashes are recorded in `tools/supplemental.json` and the packaged
`NOTICE.supplemental`. These are not claimed to be Simple Icons assets.
For a known device whose MAC belongs to a module maker, add an exact device entry
to `/etc/config/oui` (vendor is the icon slug):
```uci
config device
option mac '00:11:22:33:44:55'
option vendor 'tcl'
```
Only that full MAC is overridden, never the module maker's entire prefix. The
configuration is preserved on upgrades and read once asynchronously through the
authenticated UCI RPC. It is not published as a static file, and no device-specific
MAC is shipped in the package. Reload the homepage after changing it.
Imilab / Chuangmi manufacturer aliases are intentionally grouped under Xiaomi
for Mi Home cameras, including all matching OUI assignments. This is a product
ecosystem grouping rather than a claim that the registered companies are identical.
Hui Zhou / Huizhou Gaoshengda aliases are intentionally grouped under TCL. This
OEM heuristic applies to all registered prefixes for that module maker, including
0C:79:55. A device override can correct exceptions using the same OEM modules.
@@ -0,0 +1,54 @@
# Disclaimer
Simple Icons asks that its users read this disclaimer fully before including an icon in their project.
## Table of Contents
- [Licenses, Copyrights & Trademarks](#licenses-copyrights--trademarks)
- [Brand Guidelines](#brand-guidelines)
- [Update of Brands](#update-of-brands)
- [Removal of Brands](#removal-of-brands)
## Licenses, Copyrights & Trademarks
> [!IMPORTANT]\
> The addition of licenses to Simple Icons is an ongoing project. Hence, the absence of licence data for a particular icon does not imply that the icon is not released under a license.
> [!NOTE]\
> Simple Icons is released under CC0 - though that doesn't mean to imply that all icons within the project are also CC0. Please see individual licenses where available.
Simple Icons provides data on the license under which icons are available. We ask users to carefully consider this when using an icon. As licenses are subject to change we also ask our users to regularly check if the license of the icons they use have been changed.
The license under which an icon is available can be found in the icon's entry in the JSON data file in the NPM and Packagist packages, or through the license link on the icon's card on [the Simple Icons website].
As we rely largely on our community to help us keep Simple Icons up-to-date, the license data for an icon may be outdated. If you find that the license data provided is outdated, please [submit an issue][icon-outdated-issues] to [the Simple Icons GitHub repository].
If an icon includes a registered trademark (`®`) or trademark symbol (`™`) the recommendations outlined in [the Simple Icons Contributing Guidelines] are followed to decide whether to include the symbol or not.
Simple Icons cannot be held responsible for any legal activity raised by a brand, or users of the package. We ask that our users seek the correct permissions to use the icons relevant to their project.
## Brand Guidelines
> [!NOTE]\
> The addition of guidelines to Simple Icons is an ongoing project. In the meantime, users of Simple Icons are instead encouraged to check the `source` URL as, in some cases, the icon will have been sourced from official guidelines. The lack of a `guidelines` entry for a particular brand does not imply that the brand has no guidelines.
Simple Icons provides a link to a brand's _branding guidelines_ (or similar) if the brand provides one. We ask our users read these guidelines and ensure their usage of the brand's icon is in accordance with them. As guidelines are subject to change we also ask our users to regularly check if the brand guidelines of the icons they use have been updated.
The brand guidelines can be found in the icon's entry in the JSON data file in the NPM and Packagist packages, or through the "Brand Guidelines" link on the icon's card on [the Simple Icons website].
As we rely largely on our community to help us keep Simple Icons up-to-date, the guidelines link for a brand may be outdated. If you find that the guidelines are outdated, please [submit an issue][icon-outdated-issues] to [the Simple Icons GitHub repository].
## Update of Brands
Should a brand wish for their icon or data to be updated, please [submit an issue][icon-outdated-issues] to [the Simple Icons GitHub repository]. In the issue, please explain your affiliation with the company and reasons for the update. We generally release updates once a week, but can make exceptions for immediate updates of brands.
## Removal of Brands
Should a brand wish for their icon to be removed from the package, contact `removals at simpleicons dot org` explaining your affiliation with the company, and reasons for removal. Alternatively, it is also possible to [submit an issue][removal-issues] on [the Simple Icons GitHub repository] with the same information. We generally remove icons that no longer [meet our criteria] twice a year in our major releases - but can occasionally make exceptions for immediate removal of brands.
[meet our criteria]: https://github.com/simple-icons/simple-icons/blob/develop/CONTRIBUTING.md#requesting-an-icon
[icon-outdated-issues]: https://github.com/simple-icons/simple-icons/issues/new?assignees=&labels=update+icon%2Fdata&template=icon_update.yml&title=Update%3A+
[removal-issues]: https://github.com/simple-icons/simple-icons/issues/new?assignees=&labels=breaking+change&template=icon_removal.yml&title=Remove%3A+
[the simple icons contributing guidelines]: https://github.com/simple-icons/simple-icons/blob/develop/CONTRIBUTING.md#icon-guidelines
[the simple icons github repository]: https://github.com/simple-icons/simple-icons
[the simple icons website]: https://simpleicons.org/
@@ -0,0 +1,21 @@
MIT License
Copyright (c) 2026 WH-2099
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
@@ -0,0 +1,30 @@
# CC0 1.0 Universal
## Statement of Purpose
The laws of most jurisdictions throughout the world automatically confer exclusive Copyright and Related Rights (defined below) upon the creator and subsequent owner(s) (each and all, an “owner”) of an original work of authorship and/or a database (each, a “Work”).
Certain owners wish to permanently relinquish those rights to a Work for the purpose of contributing to a commons of creative, cultural and scientific works (“Commons”) that the public can reliably and without fear of later claims of infringement build upon, modify, incorporate in other works, reuse and redistribute as freely as possible in any form whatsoever and for any purposes, including without limitation commercial purposes. These owners may contribute to the Commons to promote the ideal of a free culture and the further production of creative, cultural and scientific works, or to gain reputation or greater distribution for their Work in part through the use and efforts of others.
For these and/or other purposes and motivations, and without any expectation of additional consideration or compensation, the person associating CC0 with a Work (the “Affirmer”), to the extent that he or she is an owner of Copyright and Related Rights in the Work, voluntarily elects to apply CC0 to the Work and publicly distribute the Work under its terms, with knowledge of his or her Copyright and Related Rights in the Work and the meaning and intended legal effect of CC0 on those rights.
1. Copyright and Related Rights. A Work made available under CC0 may be protected by copyright and related or neighboring rights (“Copyright and Related Rights”). Copyright and Related Rights include, but are not limited to, the following:
1. the right to reproduce, adapt, distribute, perform, display, communicate, and translate a Work;
2. moral rights retained by the original author(s) and/or performer(s);
3. publicity and privacy rights pertaining to a person’s image or likeness depicted in a Work;
4. rights protecting against unfair competition in regards to a Work, subject to the limitations in paragraph 4(i), below;
5. rights protecting the extraction, dissemination, use and reuse of data in a Work;
6. database rights (such as those arising under Directive 96/9/EC of the European Parliament and of the Council of 11 March 1996 on the legal protection of databases, and under any national implementation thereof, including any amended or successor version of such directive); and
7. other similar, equivalent or corresponding rights throughout the world based on applicable law or treaty, and any national implementations thereof.
2. Waiver. To the greatest extent permitted by, but not in contravention of, applicable law, Affirmer hereby overtly, fully, permanently, irrevocably and unconditionally waives, abandons, and surrenders all of Affirmer’s Copyright and Related Rights and associated claims and causes of action, whether now known or unknown (including existing as well as future claims and causes of action), in the Work (i) in all territories worldwide, (ii) for the maximum duration provided by applicable law or treaty (including future time extensions), (iii) in any current or future medium and for any number of copies, and (iv) for any purpose whatsoever, including without limitation commercial, advertising or promotional purposes (the “Waiver”). Affirmer makes the Waiver for the benefit of each member of the public at large and to the detriment of Affirmer’s heirs and successors, fully intending that such Waiver shall not be subject to revocation, rescission, cancellation, termination, or any other legal or equitable action to disrupt the quiet enjoyment of the Work by the public as contemplated by Affirmer’s express Statement of Purpose.
3. Public License Fallback. Should any part of the Waiver for any reason be judged legally invalid or ineffective under applicable law, then the Waiver shall be preserved to the maximum extent permitted taking into account Affirmer’s express Statement of Purpose. In addition, to the extent the Waiver is so judged Affirmer hereby grants to each affected person a royalty-free, non transferable, non sublicensable, non exclusive, irrevocable and unconditional license to exercise Affirmer’s Copyright and Related Rights in the Work (i) in all territories worldwide, (ii) for the maximum duration provided by applicable law or treaty (including future time extensions), (iii) in any current or future medium and for any number of copies, and (iv) for any purpose whatsoever, including without limitation commercial, advertising or promotional purposes (the “License”). The License shall be deemed effective as of the date CC0 was applied by Affirmer to the Work. Should any part of the License for any reason be judged legally invalid or ineffective under applicable law, such partial invalidity or ineffectiveness shall not invalidate the remainder of the License, and in such case Affirmer hereby affirms that he or she will not (i) exercise any of his or her remaining Copyright and Related Rights in the Work or (ii) assert any associated claims and causes of action with respect to the Work, in either case contrary to Affirmer’s express Statement of Purpose.
4. Limitations and Disclaimers.
1. No trademark or patent rights held by Affirmer are waived, abandoned, surrendered, licensed or otherwise affected by this document.
2. Affirmer offers the Work as-is and makes no representations or warranties of any kind concerning the Work, express, implied, statutory or otherwise, including without limitation warranties of title, merchantability, fitness for a particular purpose, non infringement, or the absence of latent or other defects, accuracy, or the present or absence of errors, whether or not discoverable, all to the greatest extent permissible under applicable law.
3. Affirmer disclaims responsibility for clearing rights of other persons that may apply to the Work or any use thereof, including without limitation any person’s Copyright and Related Rights in the Work. Further, Affirmer disclaims responsibility for obtaining any necessary consents, permissions or other rights required for any use of the Work.
4. Affirmer understands and acknowledges that Creative Commons is not a party to this document and has no duty or obligation with respect to this CC0 or use of the Work.
For more information, please see https://creativecommons.org/publicdomain/zero/1.0/.
@@ -0,0 +1,4 @@
fnOS (飞牛OS) logo, traced from the user-provided fnos.PNG reference.
Reference SHA256: 075d2d9505d3d53b08085dd8f06061ddb1f504b0f014c897ef944288501f1f7f
Vectorized with Potrace 1.16; original blue and transparent background retained.
The logo and trademark belong to their respective owner.
@@ -0,0 +1,22 @@
Midea, TCL and GIGABYTE are supplemental SVGs, not Simple Icons assets.
Sources and attribution:
{
"midea": {
"source": "https://commons.wikimedia.org/wiki/File:Midea.svg",
"sha256": "cd91efe06bdcb95055255d16b6a908e5dfba7530f92d7531f01b9e6f79f4fa6e",
"author": "Midea Group",
"license": "Public domain simple shape/text logo; trademark retained"
},
"tcl": {
"source": "https://commons.wikimedia.org/wiki/File:Logo_of_the_TCL_Corporation.svg",
"sha256": "949117dc99503fe4a382afed3bd7f69fbfe61a6da91236b6842d8a4991df7fa8",
"author": "TCL Electronics",
"license": "Public domain simple shape/text logo; trademark retained"
},
"gigabyte": {
"source": "https://commons.wikimedia.org/wiki/File:Gigabyte_Technology_logo_20080107.svg",
"sha256": "49693ef6522f58af4e059afe18c1fb3ddc8e6a5b15ac724d6a7493f47d84d849",
"author": "Koman90",
"license": "Public domain simple shape/text logo; trademark retained"
}
}
@@ -0,0 +1 @@
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>Acer</title><path d="M23.943 9.364c-.085-.113-.17-.198-.595-.226-.113 0-.453-.029-1.048-.029-1.56 0-2.636.482-3.175 1.417.142-.935-.765-1.417-2.749-1.417-2.324 0-3.798.935-4.393 2.834-.226.709-.226 1.276-.056 1.73h-.567c-.425.027-.992.056-1.36.056-.85 0-1.39-.142-1.588-.425-.17-.255-.17-.737.057-1.446.368-1.162 1.247-1.672 2.664-1.672.737 0 1.445.085 1.445.085.085 0 .142-.113.142-.198l-.028-.085-.057-.397c-.028-.255-.227-.397-.567-.453-.311-.029-.567-.029-.907-.029h-.028c-1.842 0-3.146.624-3.854 1.814.255-1.219-.596-1.814-2.551-1.814-1.105 0-1.9.029-2.353.085-.368.057-.595.199-.68.454l-.17.51c-.028.085.029.142.142.142.085 0 .425-.057.992-.086a24.816 24.816 0 0 1 1.672-.085c1.077 0 1.559.284 1.389.822-.029.114-.114.199-.255.227-1.02.17-1.842.284-2.438.369-1.7.226-2.692.736-2.947 1.587-.369 1.162.538 1.728 2.72 1.728 1.078 0 2.013-.056 2.75-.198.425-.085.652-.17.737-.453l.396-1.304c-.028 1.304.85 1.955 2.721 1.955.794 0 1.559-.028 1.927-.085.369-.056.567-.141.652-.425l.085-.396c.397.623 1.276.935 2.608.935 1.417 0 2.239-.029 2.465-.114a.523.523 0 0 0 .369-.311l.028-.085.17-.539c.029-.085-.028-.142-.142-.142l-.906.057c-.596.029-1.077.057-1.418.057-.651 0-1.076-.057-1.332-.142-.368-.142-.538-.397-.51-.822l2.863-.368c1.275-.17 2.154-.567 2.579-1.19l-.992 3.315c-.028.057 0 .114.028.142.029.028.085.057.199.057h1.19c.198 0 .283-.114.312-.199l1.048-3.656c.142-.481.567-.708 1.36-.708.71 0 1.22 0 1.56.028h.028c.057 0 .17-.028.255-.17l.17-.51c0-.085 0-.17-.057-.227zM4.841 13.73c-.368.057-.907.085-1.587.085-1.219 0-1.729-.255-1.587-.737.113-.34.425-.567.935-.624l2.75-.368zm12.669-2.95c-.114.369-.652.624-1.616.766l-2.295.311.056-.198c.199-.624.454-1.02.794-1.247.34-.227.907-.34 1.7-.34 1.05.028 1.503.255 1.36.708Z"/></svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

@@ -0,0 +1 @@
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>Amazon</title><path d="M.045 18.02c.072-.116.187-.124.348-.022 3.636 2.11 7.594 3.166 11.87 3.166 2.852 0 5.668-.533 8.447-1.595l.315-.14c.138-.06.234-.1.293-.13.226-.088.39-.046.525.13.12.174.09.336-.12.48-.256.19-.6.41-1.006.654-1.244.743-2.64 1.316-4.185 1.726a17.617 17.617 0 01-10.951-.577 17.88 17.88 0 01-5.43-3.35c-.1-.074-.151-.15-.151-.22 0-.047.021-.09.051-.13zm6.565-6.218c0-1.005.247-1.863.743-2.577.495-.71 1.17-1.25 2.04-1.615.796-.335 1.756-.575 2.912-.72.39-.046 1.033-.103 1.92-.174v-.37c0-.93-.105-1.558-.3-1.875-.302-.43-.78-.65-1.44-.65h-.182c-.48.046-.896.196-1.246.46-.35.27-.575.63-.675 1.096-.06.3-.206.465-.435.51l-2.52-.315c-.248-.06-.372-.18-.372-.39 0-.046.007-.09.022-.15.247-1.29.855-2.25 1.82-2.88.976-.616 2.1-.975 3.39-1.05h.54c1.65 0 2.957.434 3.888 1.29.135.15.27.3.405.48.12.165.224.314.283.45.075.134.15.33.195.57.06.254.105.42.135.51.03.104.062.3.076.615.01.313.02.493.02.553v5.28c0 .376.06.72.165 1.036.105.313.21.54.315.674l.51.674c.09.136.136.256.136.36 0 .12-.06.226-.18.314-1.2 1.05-1.86 1.62-1.963 1.71-.165.135-.375.15-.63.045a6.062 6.062 0 01-.526-.496l-.31-.347a9.391 9.391 0 01-.317-.42l-.3-.435c-.81.886-1.603 1.44-2.4 1.665-.494.15-1.093.227-1.83.227-1.11 0-2.04-.343-2.76-1.034-.72-.69-1.08-1.665-1.08-2.94l-.05-.076zm3.753-.438c0 .566.14 1.02.425 1.364.285.34.675.512 1.155.512.045 0 .106-.007.195-.02.09-.016.134-.023.166-.023.614-.16 1.08-.553 1.424-1.178.165-.28.285-.58.36-.91.09-.32.12-.59.135-.8.015-.195.015-.54.015-1.005v-.54c-.84 0-1.484.06-1.92.18-1.275.36-1.92 1.17-1.92 2.43l-.035-.02zm9.162 7.027c.03-.06.075-.11.132-.17.362-.243.714-.41 1.05-.5a8.094 8.094 0 011.612-.24c.14-.012.28 0 .41.03.65.06 1.05.168 1.172.33.063.09.099.228.099.39v.15c0 .51-.149 1.11-.424 1.8-.278.69-.664 1.248-1.156 1.68-.073.06-.14.09-.197.09-.03 0-.06 0-.09-.012-.09-.044-.107-.12-.064-.24.54-1.26.806-2.143.806-2.64 0-.15-.03-.27-.087-.344-.145-.166-.55-.257-1.224-.257-.243 0-.533.016-.87.046-.363.045-.7.09-1 .135-.09 0-.148-.014-.18-.044-.03-.03-.036-.047-.02-.077 0-.017.006-.03.02-.063v-.06z"/></svg>

After

Width:  |  Height:  |  Size: 2.1 KiB

@@ -0,0 +1 @@
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>Apple</title><path d="M12.152 6.896c-.948 0-2.415-1.078-3.96-1.04-2.04.027-3.91 1.183-4.961 3.014-2.117 3.675-.546 9.103 1.519 12.09 1.013 1.454 2.208 3.09 3.792 3.039 1.52-.065 2.09-.987 3.935-.987 1.831 0 2.35.987 3.96.948 1.637-.026 2.676-1.48 3.676-2.948 1.156-1.688 1.636-3.325 1.662-3.415-.039-.013-3.182-1.221-3.22-4.857-.026-3.04 2.48-4.494 2.597-4.559-1.429-2.09-3.623-2.324-4.39-2.376-2-.156-3.675 1.09-4.61 1.09zM15.53 3.83c.843-1.012 1.4-2.427 1.245-3.83-1.207.052-2.662.805-3.532 1.818-.78.896-1.454 2.338-1.273 3.714 1.338.104 2.715-.688 3.559-1.701"/></svg>

After

Width:  |  Height:  |  Size: 650 B

@@ -0,0 +1 @@
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>ASUS</title><path d="M23.904 10.788V9.522h-4.656c-.972 0-1.41.6-1.482 1.182v.018-1.2h-1.368v1.266h1.362zm-6.144.456l-1.368-.078v1.458c0 .456-.228.594-1.02.594H14.28c-.654 0-.93-.186-.93-.594v-1.596l-1.386-.102v1.812h-.03c-.078-.528-.276-1.14-1.596-1.23L6 11.22c0 .666.474 1.062 1.218 1.14l3.024.306c.24.018.414.09.414.288 0 .216-.18.24-.456.24H5.946V11.22l-1.386-.09v3.348h5.646c1.26 0 1.662-.654 1.722-1.2h.03c.156.864.912 1.2 2.19 1.2h1.41c1.494 0 2.202-.456 2.202-1.524zm4.398.258l-4.338-.258c0 .666.438 1.11 1.182 1.17l3.09.24c.24.018.384.078.384.276 0 .186-.168.258-.516.258h-4.212v1.29h4.302c1.356 0 1.95-.474 1.95-1.554 0-.972-.534-1.338-1.842-1.422zm-10.194-1.98h1.386v1.266h-1.386zM3.798 11.07l-1.506-.15L0 14.478h1.686zm7.914-1.548h-4.23c-.984 0-1.416.612-1.518 1.2v-1.2H3.618c-.33 0-.486.102-.642.33l-.648.936h9.384Z"/></svg>

After

Width:  |  Height:  |  Size: 914 B

@@ -0,0 +1 @@
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>Broadcom</title><path d="M12 0c6.628 0 12 5.372 12 12a12 12 0 0 1-.56 3.63 13.641 13.641 0 0 0-.867-.388c-1.372-.546-2.629-.363-3.888.4 0 0-.459.28-.597.366-.586.37-1.14.717-1.672.717-.508 0-1.007-.135-1.218-1.117-.33-1.533-1.135-5.298-1.486-7.162-.206-1.097-.319-1.688-.436-2.088-.208-.706-.586-1.09-1.124-1.15 0 0-.084-.013-.152-.013-.068 0-.162.014-.162.014-.531.064-.907.447-1.114 1.15-.117.4-.23.99-.436 2.087-.351 1.864-1.156 5.63-1.486 7.162-.21.982-.71 1.117-1.218 1.117-.531 0-1.086-.348-1.672-.717-.138-.086-.597-.366-.597-.366-1.259-.763-2.516-.946-3.888-.4-.301.12-.586.251-.867.387A11.995 11.995 0 0 1 0 12C0 5.372 5.372 0 12 0m8.375 16.976c-.453.152-.855.42-1.256.672-.756.475-1.613 1.014-2.704 1.014-1.614 0-2.749-.964-3.112-2.647C13.023 14.712 12 9.793 12 9.793a496.28 496.28 0 0 1-1.303 6.222c-.362 1.683-1.497 2.647-3.112 2.647-1.09 0-1.946-.539-2.703-1.014-.401-.252-.804-.52-1.256-.672a2.319 2.319 0 0 0-1.414-.01c-.33.097-.644.234-.951.386C3.227 21.292 7.207 24 11.91 24s8.863-2.708 10.83-6.648a5.958 5.958 0 0 0-.95-.386 2.322 2.322 0 0 0-1.415.01"/></svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="#64748b" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"><rect x="1.5" y="4" width="14" height="11" rx="1.5"/><path d="M8.5 15v4m-4 0h8M2 12h13"/><rect x="18" y="3" width="4.5" height="17" rx="1"/><path d="M19.7 6h1.1m-1.1 3h1.1m-.55 7.5h.01"/></svg>

After

Width:  |  Height:  |  Size: 349 B

@@ -0,0 +1 @@
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>Dell</title><path d="M17.963 14.6V9.324h1.222v4.204h2.14v1.07h-3.362zm-9.784-3.288l2.98-2.292c.281.228.56.458.841.687l-2.827 2.14.611.535 2.827-2.216c.281.228.56.458.841.688a295.83 295.83 0 0 1-2.827 2.216l.61.536 2.83-2.295-.001-1.986h1.223v4.204h2.216v1.07h-3.362v-1.987c-.995.763-1.987 1.529-2.981 2.292l-2.981-2.292c-.144.729-.653 1.36-1.312 1.694-.285.147-.597.24-.915.276-.183.022-.367.017-.551.017H3.516V9.325H5.69a2.544 2.544 0 0 1 1.563.557c.454.36.778.872.927 1.43m-3.516-.917v3.21l.953-.001a1.377 1.377 0 0 0 1.036-.523 1.74 1.74 0 0 0 .182-1.889 1.494 1.494 0 0 0-.976-.766c-.166-.04-.338-.03-.507-.032h-.688zM11.82 0h.337a11.94 11.94 0 0 1 5.405 1.373 12.101 12.101 0 0 1 4.126 3.557A11.93 11.93 0 0 1 24 11.82v.36a11.963 11.963 0 0 1-3.236 8.033A11.967 11.967 0 0 1 12.182 24h-.361a11.993 11.993 0 0 1-4.145-.806 12.04 12.04 0 0 1-4.274-2.836A12.057 12.057 0 0 1 .576 15.67 12.006 12.006 0 0 1 0 12.181v-.361a11.924 11.924 0 0 1 1.992-6.396 12.211 12.211 0 0 1 4.71-4.172A11.875 11.875 0 0 1 11.82 0m-.153 1.23a10.724 10.724 0 0 0-6.43 2.375 10.78 10.78 0 0 0-3.319 4.573 10.858 10.858 0 0 0 .193 8.12 10.788 10.788 0 0 0 3.546 4.421 10.698 10.698 0 0 0 4.786 1.946c1.456.209 2.955.124 4.376-.26a10.756 10.756 0 0 0 5.075-3.062 10.742 10.742 0 0 0 2.686-5.28 10.915 10.915 0 0 0-.122-4.682 10.77 10.77 0 0 0-7.098-7.626 10.78 10.78 0 0 0-3.693-.525z"/></svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="40 40 200 200"><g fill="#2568ed" transform="translate(0 280) scale(.1 -.1)"><path d="M611 2045 c-29 -30 -65 -83 -81 -118 -93 -197 -11 -377 180 -394 l56 -5 12 58 c6 33 23 75 36 95 l25 36 -66 17 c-79 19 -107 36 -133 79 -27 44 -25 124 4 212 14 39 23 71 22 73 -2 1 -26 -23 -55 -53z M2150 2034 c41 -118 36 -192 -17 -255 -51 -60 -39 -59 -544 -59 -335 0 -473 -3 -503 -12 -54 -16 -131 -93 -145 -144 -7 -25 -11 -170 -11 -390 0 -347 0 -351 23 -394 16 -30 37 -51 67 -67 39 -21 56 -23 192 -23 215 0 238 17 238 175 l0 85 103 0 c144 1 167 22 167 154 l0 75 38 6 c131 21 215 61 287 138 l40 42 -234 3 c-197 2 -238 0 -257 -13 -41 -26 -56 -62 -63 -143 l-6 -77 -101 -5 c-140 -7 -156 -23 -164 -160 l-5 -85 -65 0 -65 0 0 320 0 320 505 5 505 5 48 24 c163 80 163 323 -1 494 -20 20 -39 37 -43 37 -5 0 1 -25 11 -56z"/></g></svg>

After

Width:  |  Height:  |  Size: 852 B

@@ -0,0 +1 @@
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>Framework</title><path d="M23.186 9.07 21.41 8.019a2.78 2.78 0 0 1-1.344-2.391V3.523c0-.431-.19-.837-.516-1.108A11.965 11.965 0 0 0 16.317.493a1.356 1.356 0 0 0-1.193.091L13.347 1.64a2.622 2.622 0 0 1-2.688 0L8.882.584a1.348 1.348 0 0 0-1.194-.09 11.93 11.93 0 0 0-3.231 1.918 1.44 1.44 0 0 0-.516 1.108v2.104c0 .986-.51 1.897-1.344 2.392L.823 9.068c-.363.215-.61.588-.675 1.013A12.24 12.24 0 0 0 0 12.001c0 .651.048 1.292.145 1.916.065.425.312.801.675 1.016l1.774 1.052a2.78 2.78 0 0 1 1.344 2.392v2.104c0 .431.191.837.516 1.108.965.8 2.054 1.452 3.231 1.919.393.155.831.124 1.194-.091l1.777-1.055a2.622 2.622 0 0 1 2.688 0l1.777 1.055c.363.215.804.246 1.193.091a11.973 11.973 0 0 0 3.232-1.92 1.44 1.44 0 0 0 .516-1.107v-2.104a2.78 2.78 0 0 1 1.344-2.392l1.774-1.052c.363-.215.61-.588.675-1.016.094-.624.145-1.265.145-1.916 0-.652-.048-1.293-.145-1.917a1.41 1.41 0 0 0-.67-1.013zM12.003 19.41c-3.981 0-7.21-3.317-7.21-7.407s3.229-7.406 7.21-7.406c3.98 0 7.21 3.316 7.21 7.406s-3.23 7.407-7.21 7.407z"/></svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

@@ -0,0 +1 @@
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>Fujitsu</title><path d="M16.56 3C14.15 3 12.04 4.24 10.68 5.97L10.68 9.76C12.5 4.71 16.56 5.08 16.56 5.08C19.5 5.08 21.84 7.38 21.84 10.2C21.84 13.04 19.5 15.33 16.56 15.33A5.32 5.32 0 0 1 12.84 13.83L10.28 11.03A6.06 6.06 0 0 0 6.03 9.32C2.7 9.32 0 11.93 0 15.16C0 18.4 2.7 21 6.03 21C7.9 21 9.58 20.19 10.68 18.89L10.68 15.86C8.88 19.29 6.03 18.92 6.03 18.92C3.9 18.92 2.17 17.24 2.17 15.16C2.17 13.1 3.9 11.42 6.03 11.42C7.09 11.42 8.05 11.84 8.75 12.5L11.31 15.31A7.5 7.5 0 0 0 16.56 17.43C20.67 17.43 24 14.19 24 10.2C24 6.21 20.67 3 16.56 3Z"/></svg>

After

Width:  |  Height:  |  Size: 634 B

@@ -0,0 +1,30 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 13.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 14948) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="312.802px" height="39.851px" viewBox="0 0 312.802 39.851" enable-background="new 0 0 312.802 39.851"
xml:space="preserve">
<polygon fill="#005DAA" points="300.199,1.064 297.884,1.064 297.884,0.128 303.576,0.128 303.576,1.064 301.265,1.064
301.265,7.552 300.199,7.552 "/>
<polygon fill="#005DAA" points="304.65,0.128 306.412,0.128 308.753,6.286 311.046,0.128 312.802,0.128 312.802,7.552
311.736,7.552 311.736,1.13 311.718,1.13 309.257,7.552 308.201,7.552 305.744,1.13 305.722,1.13 305.722,7.552 304.65,7.552 "/>
<rect x="46.272" fill="#005DAA" width="10.603" height="39.625"/>
<path fill="#005DAA" d="M119.531,0.033h13.006l15.344,39.818h-11.635l-2.969-8.495h-14.945l-3.142,8.495h-10.781L119.531,0.033
M126.032,8.247h-0.111l-5.138,15.576h9.983L126.032,8.247"/>
<path fill="#005DAA" d="M153.044,0.028h18.317c7.412,0,12.949,3.249,12.949,10.094c0,5.028-2.566,7.826-7.015,9.304v0.111
c5.297,1.091,8.042,3.94,8.042,8.795c0,9.526-8.387,11.518-15.516,11.518h-16.777V0.028 M163.652,32.33h3.146
c3.877,0,7.926-0.577,7.926-4.624c0-4.342-4.164-4.735-7.811-4.735h-3.262V32.33 M163.652,15.779h2.97
c3.482,0,7.072-0.856,7.072-4.225c0-3.653-3.417-3.987-6.953-3.987h-3.089V15.779"/>
<polyline fill="#005DAA" points="199.702,24.852 184.988,0.028 197.193,0.028 205.012,16.004 212.713,0.028 224.927,0.028
210.314,24.852 210.314,39.851 199.702,39.851 199.702,24.852 "/>
<polyline fill="#005DAA" points="239.101,7.901 229.294,7.901 229.294,0.028 259.529,0.028 259.529,7.901 249.722,7.901
249.722,39.851 239.101,39.851 239.101,7.901 "/>
<polyline fill="#005DAA" points="264.58,0.028 292.65,0.028 292.65,7.567 275.187,7.567 275.187,15.779 291.675,15.779
291.675,23.308 275.187,23.308 275.187,32.33 293.273,32.33 293.273,39.851 264.58,39.851 264.58,0.028 "/>
<path fill="#005DAA" d="M22.176,8.747c-7.059,0.587-10.913,5.221-10.913,11.218c0,5.831,5.403,10.732,10.621,10.732l1.146-0.012
h1.929c0,0,1.279,0,1.288-1.247V16.923h10.896c0,7.064-0.026,22.928-0.026,22.928s-10.754-0.009-16.998-0.009
C8.377,39.842,0,30.142,0,19.965C0,8.957,9.112-0.237,20.458,0.17l16.299,0.051l-0.008,8.525H22.176"/>
<path fill="#005DAA" d="M85.229,8.747C78.167,9.333,74.32,13.967,74.32,19.965c0,5.831,5.395,10.732,10.617,10.732l1.142-0.012
h1.934c0,0,1.27,0,1.279-1.247V16.923h10.878c0,7.064-0.018,22.928-0.018,22.928s-10.745-0.009-16.985-0.009
c-11.736,0-20.104-9.7-20.104-19.877c0-11.008,9.103-20.202,20.454-19.794l16.272,0.051l-0.004,8.525H85.229"/>
</svg>

After

Width:  |  Height:  |  Size: 2.8 KiB

@@ -0,0 +1 @@
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>Google</title><path d="M12.48 10.92v3.28h7.84c-.24 1.84-.853 3.187-1.787 4.133-1.147 1.147-2.933 2.4-6.053 2.4-4.827 0-8.6-3.893-8.6-8.72s3.773-8.72 8.6-8.72c2.6 0 4.507 1.027 5.907 2.347l2.307-2.307C18.747 1.44 16.133 0 12.48 0 5.867 0 .307 5.387.307 12s5.56 12 12.173 12c3.573 0 6.267-1.173 8.373-3.36 2.16-2.16 2.84-5.213 2.84-7.667 0-.76-.053-1.467-.173-2.053H12.48z"/></svg>

After

Width:  |  Height:  |  Size: 457 B

@@ -0,0 +1 @@
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>Honor</title><path d="M2.601 9.753v1.823H.807V9.753H0v4.498h.807v-1.874h1.794v1.874h.807V9.753h-.807Zm18.671.801h.898c.369 0 .667.297.667.662a.665.665 0 0 1-.667.663h-.898v-1.325Zm-.806-.801v4.498h.806v-2.002l1.68 2.002H24l-1.376-1.64a1.462 1.462 0 0 0-.444-2.858h-1.716.002Zm-7.63-.014v2.807l-1.959-2.807h-.644v4.498h.807v-2.82l1.968 2.82h.633V9.739h-.805Zm-7.532 2.26c0-.832.68-1.506 1.517-1.506A1.51 1.51 0 0 1 8.337 12c0 .832-.679 1.506-1.516 1.506-.403 0-.789-.159-1.073-.441A1.504 1.504 0 0 1 5.304 12v-.001ZM4.497 12c0 .933.566 1.774 1.434 2.132.869.357 1.868.16 2.533-.5.664-.66.863-1.653.503-2.515a2.324 2.324 0 0 0-2.146-1.425 2.316 2.316 0 0 0-2.323 2.307L4.497 12Zm11.04-.001a1.513 1.513 0 0 1 1.518-1.506c.838 0 1.516.675 1.516 1.507a1.513 1.513 0 0 1-1.518 1.506c-.402 0-.788-.159-1.072-.441a1.5 1.5 0 0 1-.444-1.066ZM14.73 12c0 .933.566 1.774 1.434 2.132.868.357 1.868.16 2.532-.5.665-.66.864-1.653.504-2.515a2.325 2.325 0 0 0-2.147-1.425 2.316 2.316 0 0 0-2.323 2.307V12Z"/></svg>

After

Width:  |  Height:  |  Size: 1.0 KiB

@@ -0,0 +1 @@
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>HP</title><path d="M12.0069 24h-.3572l2.459-6.7453h3.3796c.5907 0 1.2364-.4533 1.4424-1.0166l2.6652-7.3085c.4396-1.1952-.2473-2.1706-1.525-2.1706h-4.6983l-3.929 10.798-2.2255 6.127C3.929 22.434 0 17.6806 0 12.007 0 6.498 3.7092 1.8546 8.7647.4396L6.4705 6.759 2.6514 17.2547h2.5415L8.4488 8.339h1.9095l-3.2558 8.9158H9.644l3.0223-8.3251c.4396-1.1952-.2473-2.1706-1.525-2.1706h-2.143l2.459-6.7453C11.636 0 11.8145 0 11.9931 0 18.6285 0 24 5.3715 24 12.007c.0137 6.6216-5.3578 11.993-11.9931 11.993zM19.2742 8.325h-1.9096l-2.6789 7.336h1.9096l2.6789-7.336z"/></svg>

After

Width:  |  Height:  |  Size: 641 B

@@ -0,0 +1 @@
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>Huawei</title><path d="M3.67 6.14S1.82 7.91 1.72 9.78v.35c.08 1.51 1.22 2.4 1.22 2.4 1.83 1.79 6.26 4.04 7.3 4.55 0 0 .06.03.1-.01l.02-.04v-.04C7.52 10.8 3.67 6.14 3.67 6.14zM9.65 18.6c-.02-.08-.1-.08-.1-.08l-7.38.26c.8 1.43 2.15 2.53 3.56 2.2.96-.25 3.16-1.78 3.88-2.3.06-.05.04-.09.04-.09zm.08-.78C6.49 15.63.21 12.28.21 12.28c-.15.46-.2.9-.21 1.3v.07c0 1.07.4 1.82.4 1.82.8 1.69 2.34 2.2 2.34 2.2.7.3 1.4.31 1.4.31.12.02 4.4 0 5.54 0 .05 0 .08-.05.08-.05v-.06c0-.03-.03-.05-.03-.05zM9.06 3.19a3.42 3.42 0 00-2.57 3.15v.41c.03.6.16 1.05.16 1.05.66 2.9 3.86 7.65 4.55 8.65.05.05.1.03.1.03a.1.1 0 00.06-.1c1.06-10.6-1.11-13.42-1.11-13.42-.32.02-1.19.23-1.19.23zm8.299 2.27s-.49-1.8-2.44-2.28c0 0-.57-.14-1.17-.22 0 0-2.18 2.81-1.12 13.43.01.07.06.08.06.08.07.03.1-.03.1-.03.72-1.03 3.9-5.76 4.55-8.64 0 0 .36-1.4.02-2.34zm-2.92 13.07s-.07 0-.09.05c0 0-.01.07.03.1.7.51 2.85 2 3.88 2.3 0 0 .16.05.43.06h.14c.69-.02 1.9-.37 3-2.26l-7.4-.25zm7.83-8.41c.14-2.06-1.94-3.97-1.94-3.98 0 0-3.85 4.66-6.67 10.8 0 0-.03.08.02.13l.04.01h.06c1.06-.53 5.46-2.77 7.28-4.54 0 0 1.15-.93 1.21-2.42zm1.52 2.14s-6.28 3.37-9.52 5.55c0 0-.05.04-.03.11 0 0 .03.06.07.06 1.16 0 5.56 0 5.67-.02 0 0 .57-.02 1.27-.29 0 0 1.56-.5 2.37-2.27 0 0 .73-1.45.17-3.14z"/></svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

@@ -0,0 +1 @@
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>Intel</title><path d="M20.42 7.345v9.18h1.651v-9.18zM0 7.475v1.737h1.737V7.474zm9.78.352v6.053c0 .513.044.945.13 1.292.087.34.235.618.44.828.203.21.475.359.803.451.334.093.754.136 1.255.136h.216v-1.533c-.24 0-.445-.012-.593-.037a.672.672 0 0 1-.39-.173.693.693 0 0 1-.173-.377 4.002 4.002 0 0 1-.037-.606v-2.182h1.193v-1.416h-1.193V7.827zm-3.505 2.312c-.396 0-.76.08-1.082.241-.327.161-.6.384-.822.668l-.087.117v-.902H2.658v6.256h1.639v-3.214c.018-.588.16-1.02.433-1.299.29-.297.642-.445 1.044-.445.476 0 .841.149 1.082.433.235.284.359.686.359 1.2v3.324h1.663V12.97c.006-.89-.229-1.595-.686-2.09-.458-.495-1.1-.742-1.917-.742zm10.065.006a3.252 3.252 0 0 0-2.306.946c-.29.29-.525.637-.692 1.033a3.145 3.145 0 0 0-.254 1.273c0 .452.08.878.241 1.274.161.395.39.742.674 1.032.284.29.637.526 1.045.693.408.173.86.26 1.342.26 1.397 0 2.262-.637 2.782-1.23l-1.187-.904c-.248.297-.841.699-1.583.699-.464 0-.847-.105-1.138-.321a1.588 1.588 0 0 1-.593-.872l-.019-.056h4.915v-.587c0-.451-.08-.872-.235-1.267a3.393 3.393 0 0 0-.661-1.033 3.013 3.013 0 0 0-1.02-.692 3.345 3.345 0 0 0-1.311-.248zm-16.297.118v6.256h1.651v-6.256zm16.278 1.286c1.132 0 1.664.797 1.664 1.255l-3.32.006c0-.458.525-1.255 1.656-1.261zm7.073 3.814a.606.606 0 0 0-.606.606.606.606 0 0 0 .606.606.606.606 0 0 0 .606-.606.606.606 0 0 0-.606-.606zm-.008.105a.5.5 0 0 1 .002 0 .5.5 0 0 1 .5.501.5.5 0 0 1-.5.5.5.5 0 0 1-.5-.5.5.5 0 0 1 .498-.5zm-.233.155v.699h.13v-.285h.093l.173.285h.136l-.18-.297a.191.191 0 0 0 .118-.056c.03-.03.05-.074.05-.136 0-.068-.02-.117-.063-.154-.037-.038-.105-.056-.185-.056zm.13.099h.154c.019 0 .037.006.056.012a.064.064 0 0 1 .037.031c.013.013.012.031.012.056a.124.124 0 0 1-.012.055.164.164 0 0 1-.037.031c-.019.006-.037.013-.056.013h-.154Z"/></svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

@@ -0,0 +1 @@
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>Lenovo</title><path d="M21.044 12.288c0 .5-.343.867-.815.867-.464 0-.827-.38-.827-.867 0-.51.343-.868.815-.868.464 0 .827.381.827.868zm-14.305-.92a.787.787 0 0 0-.651.307.991.991 0 0 0-.172.738l1.479-.614a.708.708 0 0 0-.656-.43zm6.963.052c-.472 0-.816.358-.816.868 0 .486.364.867.828.867.472 0 .815-.368.815-.867 0-.487-.363-.868-.827-.868zM24 7.997v8.006H0V7.997h24zM5.01 13.05H3.088V9.825H2.23v4.003h2.78v-.777zm1.137-.094l2.163-.897a1.667 1.667 0 0 0-.37-.86c-.284-.33-.704-.505-1.216-.505-.931 0-1.633.686-1.633 1.593 0 .93.704 1.593 1.726 1.593.572 0 1.158-.272 1.432-.589l-.535-.411c-.357.264-.56.326-.885.326-.292 0-.52-.09-.682-.25zm5.57-1.039c0-.709-.507-1.223-1.252-1.223a1.28 1.28 0 0 0-1.005.494v-.442h-.846v3.081h.846v-1.753c0-.316.245-.651.698-.651.35 0 .712.243.712.651v1.753h.847v-1.91zm3.647.37c0-.904-.725-1.593-1.65-1.593-.933 0-1.663.7-1.663 1.593 0 .903.726 1.592 1.651 1.592.932 0 1.662-.7 1.662-1.592zm2.066 1.54l1.268-3.081h-.967l-.765 2.099-.765-2.1h-.966l1.268 3.081h.927zm4.449-1.54c0-.904-.725-1.593-1.65-1.593-.932 0-1.662.7-1.662 1.593 0 .903.725 1.592 1.65 1.592.932 0 1.662-.7 1.662-1.592z"/></svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

@@ -0,0 +1 @@
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>LG</title><path d="M14.522 14.078h3.27v1.33h-4.847v-6.83h1.577v5.5zm6.74-1.274h1.284v1.195c-.236.09-.698.18-1.137.18-1.42 0-1.893-.721-1.893-2.186 0-1.398.45-2.221 1.869-2.221.791 0 1.24.248 1.612.722l.982-.903c-.6-.855-1.646-1.114-2.629-1.114-2.208 0-3.368 1.205-3.368 3.504 0 2.288 1.047 3.528 3.358 3.528 1.06 0 2.096-.27 2.66-.665V11.53h-2.739v1.274zM5.291 6.709a5.29 5.29 0 1 1 0 10.582 5.291 5.291 0 1 1 0-10.582m3.16 8.457a4.445 4.445 0 0 0 1.31-3.161v-.242l-.22.001H6.596v.494h2.662l-.001.015a3.985 3.985 0 0 1-3.965 3.708 3.95 3.95 0 0 1-2.811-1.165 3.952 3.952 0 0 1-1.164-2.811c0-1.061.414-2.059 1.164-2.81a3.951 3.951 0 0 1 2.81-1.164l.252.003v-.495l-.251-.003a4.475 4.475 0 0 0-4.47 4.469c0 1.194.465 2.316 1.309 3.161a4.444 4.444 0 0 0 3.16 1.31 4.444 4.444 0 0 0 3.162-1.31m-2.91-1.297V9.644H5.04v4.72h1.556v-.495H5.543zm-1.265-3.552a.676.676 0 1 0-.675.674.676.676 0 0 0 .675-.674"/></svg>

After

Width:  |  Height:  |  Size: 983 B

@@ -0,0 +1 @@
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>Linksys</title><path d="M19.871 0c-1.7024 0-3.082 1.38-3.082 3.082 0 1.7025 1.38 3.08 3.082 3.082 1.7026 0 3.082-1.3795 3.082-3.082 0-1.7024-1.3795-3.082-3.082-3.082ZM1.047.488V24h21.3105v-3.469H5.166V.488Zm7.156 0v17.156h14.154v-3.4707h-10.039V.488Z"/></svg>

After

Width:  |  Height:  |  Size: 337 B

@@ -0,0 +1 @@
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>MediaTek</title><path d="M3.863 8.996c-.296 0-.664.21-.815.467L.064 14.537c-.15.257-.029.467.267.467h19.805c.297 0 .665-.21.816-.467l2.983-5.074c.15-.257.03-.467-.268-.467zm3.41 1.975h1.09l-.232.402h-.776c-.238 0-.312.093-.312.338v.807h1.37l-.233.402H6.502v-1.197c0-.589.307-.752.771-.752zm1.444 0h.937c.703 0 1.002.27 1.002.959 0 .73-.301.99-.976.99h-.963zm7.832 0h1.09l-.233.402h-.775c-.239 0-.313.093-.313.338-.004.264-.002.539-.002.807h1.372l-.233.402h-1.678v-1.197c0-.589.308-.752.772-.752zm-11.567.004v.986l.569-.984.65-.002v1.941h-.547v-1.191l-.672 1.191h-.546v-1.191l-.688 1.19h-.535l1.121-1.938zm5.98 0h.546v1.941h-.545zm1.798 0h.781v1.941h-.553v-1.383l-.797 1.383h-.552zm1.256 0h1.714l-.232.404h-.504v1.537h-.533v-1.537h-.68zm3.873 0h.547v1.941h-.547zm1.345 0h.545l-.558.968-.002.004h.002l.558.969h-.545l-.56-.97zm-9.994.398v1.145h.297c.432 0 .567-.104.567-.586 0-.483-.135-.559-.567-.559zm-1.847.416h.87l-.185.318h-.86zm9.255 0h.872l-.186.318h-.86Z"/></svg>

After

Width:  |  Height:  |  Size: 1.0 KiB

@@ -0,0 +1 @@
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>Microsoft</title><path d="M0 0v11.408h11.408V0zm12.594 0v11.408H24V0zM0 12.594V24h11.408V12.594zm12.594 0V24H24V12.594z"/></svg>

After

Width:  |  Height:  |  Size: 206 B

@@ -0,0 +1,43 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Creator: CorelDRAW X6 -->
<svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" width="32.277mm" height="12.424mm" version="1.1" style="shape-rendering:geometricPrecision; text-rendering:geometricPrecision; image-rendering:optimizeQuality; fill-rule:evenodd; clip-rule:evenodd"
viewBox="0 0 3228 1242"
xmlns:xlink="http://www.w3.org/1999/xlink">
<defs>
<style type="text/css">
<![CDATA[
.fil3 {fill:#00B0F0;fill-rule:nonzero}
.fil1 {fill:url(#id0)}
.fil2 {fill:url(#id1)}
.fil0 {fill:url(#id2)}
]]>
</style>
<radialGradient id="id0" gradientUnits="userSpaceOnUse" cx="9593.85" cy="-10300.9" r="10500" fx="9593.85" fy="-10300.9">
<stop offset="0" style="stop-color:#FEFEFE"/>
<stop offset="1" style="stop-color:#A9CF48"/>
</radialGradient>
<radialGradient id="id1" gradientUnits="userSpaceOnUse" cx="9593.85" cy="-8479.56" r="10500" fx="9593.85" fy="-8479.56">
<stop offset="0" style="stop-color:#FEFEFE"/>
<stop offset="1" style="stop-color:#A9CF47"/>
</radialGradient>
<radialGradient id="id2" gradientUnits="userSpaceOnUse" cx="9593.85" cy="-9336.04" r="10500" fx="9593.85" fy="-9336.04">
<stop offset="0" style="stop-color:#FEFEFE"/>
<stop offset="1" style="stop-color:#A9D048"/>
</radialGradient>
</defs>
<symbol id="Fm113-113-0" viewBox="1614 -22527 21000 13152">
<path class="fil0" d="M22614 -18376c-4943,-1048 -9932,-2209 -14431,-3078 -2289,-442 -4452,-793 -6569,-1072l0 9624 375 94c4502,654 8761,1621 13889,3007 2217,599 4524,528 6735,39l0 -8613z"/>
</symbol>
<symbol id="Fm119-119-0" viewBox="1614 -23737 21000 13088">
<path class="fil1" d="M22614 -19550c-5098,-1073 -10263,-2282 -14907,-3179 -2118,-409 -4128,-740 -6093,-1008l0 9669c4465,654 8699,1617 13789,2992 2376,642 4856,514 7211,-74l0 -8400z"/>
</symbol>
<symbol id="Fm107-107-0" viewBox="1614 -21838 21000 13251">
<path class="fil2" d="M22614 -17753c-4689,-1003 -9396,-2090 -13662,-2914 -2567,-496 -4976,-877 -7338,-1171l0 9530 1145 287c4502,654 8761,1621 13889,3007 1961,530 3992,535 5965,191l0 -8929z"/>
</symbol>
<g id="Camada_x0020_1">
<metadata id="CorelCorpID_0Corel-Layer"/>
<path class="fil3" d="M1481 609l0 446 105 0 0 -446 -105 0zm-189 -170l-108 0c-12,0 -10,11 -10,11 2,14 5,37 5,85 0,106 -13,258 -129,403l-8 10c0,0 -70,-488 -71,-497 0,0 0,-11 -10,-11l-109 0c-10,0 -10,11 -10,11 -3,56 -34,526 -377,602 73,8 161,-15 238,-62 95,-59 159,-146 180,-246 0,0 42,262 47,322l0 4 -3 2c-96,51 -205,79 -314,79 -270,0 -509,-160 -614,-404 62,287 318,496 617,496 349,0 557,-292 593,-500 0,0 47,303 48,313l143 0c-2,-13 -97,-595 -98,-604 0,0 0,-11 -10,-11zm-1209 255c0,-320 270,-580 601,-580 205,0 396,103 507,270 -81,-228 -307,-384 -560,-384 -327,0 -593,255 -593,568 0,86 21,170 60,247 -9,-39 -15,-80 -15,-120zm2506 -21c-38,-44 -91,-67 -155,-67 -65,0 -120,21 -164,63 -43,41 -65,96 -65,164 0,67 21,121 63,161 42,40 103,60 179,60 148,0 180,-102 192,-135l-38 -12c-34,62 -110,66 -155,63 -32,-2 -61,-13 -84,-29 -23,-17 -39,-41 -46,-78l-2 -14 332 0c-1,-73 -20,-132 -57,-175zm-267 113c-5,0 -5,-5 -5,-7 4,-26 14,-46 32,-64 20,-21 51,-33 84,-33 30,0 54,9 75,26 17,15 29,36 36,65 1,3 3,12 -5,12l-217 0zm601 -182c-126,0 -171,77 -185,113 0,1 -5,13 -5,13l42 14c0,0 27,-78 134,-73 108,4 95,93 95,107 -60,-18 -145,-16 -201,9 -70,32 -81,96 -78,143 3,70 65,119 145,123 72,4 104,-12 134,-41l-1 41 95 0 0 -117 0 -144 0 -25 0 -21c2,-53 -35,-143 -175,-143zm80 346c0,7 -2,12 -8,15 -18,9 -56,21 -103,18 -49,-4 -68,-39 -71,-54 -1,-6 -12,-71 51,-91 41,-13 93,-5 121,3 8,2 10,7 10,17l0 93zm-1424 -511l-87 0c-13,0 -11,13 -11,13 0,14 0,80 0,94l107 0 0 -95c0,0 1,-11 -10,-11zm534 0l-89 0c-9,0 -9,10 -9,10l0 183 -13 -7c-14,-7 -28,-12 -43,-15 -15,-3 -33,-4 -53,-4 -70,0 -127,20 -169,61 -41,40 -63,98 -63,169 0,63 18,116 53,158 35,41 86,62 153,62 96,0 134,-58 134,-58l0 56 108 0 0 -105c0,-118 0,-499 0,-499 0,0 0,-11 -9,-11zm-104 494c-10,9 -23,16 -39,22 -17,7 -37,10 -59,10 -36,0 -65,-12 -86,-36 -21,-24 -31,-59 -31,-106 0,-46 10,-80 29,-101 20,-22 50,-33 90,-33 21,0 41,3 59,10 16,6 28,12 37,20 3,3 6,8 6,15l0 183c0,7 -3,12 -6,15z"/>
<path class="fil3" d="M3163 365c-37,0 -65,28 -65,65 0,36 28,65 65,65 37,0 65,-28 65,-65 0,-36 -28,-65 -65,-65zm0 9c31,0 55,25 55,56 0,31 -23,56 -55,56 -31,0 -55,-25 -55,-56 0,-31 23,-56 55,-56zm-14 60l16 0 21 33 11 0 -22 -33c10,-2 19,-8 19,-21 0,-13 -7,-21 -24,-21l-29 0 0 75 9 0 0 -33zm0 -8l0 -26 17 0c9,0 18,2 18,13 0,13 -11,13 -22,13l-12 0z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 4.5 KiB

@@ -0,0 +1 @@
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>Motorola</title><path d="M12 0C5.373 0 0 5.373 0 12s5.373 12 12 12 12-5.373 12-12C24.002 5.375 18.632.002 12.007 0H12zm7.327 18.065s-.581-2.627-1.528-4.197c-.514-.857-1.308-1.553-2.368-1.532-.745 0-1.399.423-2.2 1.553-.469.77-.882 1.573-1.235 2.403 0 0-.29-.675-.63-1.343a8.038 8.038 0 0 0-.605-1.049c-.804-1.13-1.455-1.539-2.2-1.553-1.049-.021-1.854.675-2.364 1.528-.948 1.574-1.528 4.197-1.528 4.197h-.864l4.606-15.12 3.56 11.804.024.021.024-.021 3.56-11.804 4.61 15.113h-.862z"/></svg>

After

Width:  |  Height:  |  Size: 566 B

@@ -0,0 +1 @@
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>MSI</title><path d="M16.362 10.042c-1.044.56-2.193 1.05-3.7 1.142a4.26 4.26 0 0 1-2.321-.556c-.155-.09-.51-.26-.503-.457.011-.242.582-.303.816-.306 5.262-.178 6.29-2.472 6.286-2.563 0-.083-.09.011-.09.011-1.38 1.777-4.937 1.973-4.937 1.973-.877.121-1.761-.08-2.215-.529a.794.794 0 0 1-.215-.39c-.102.122-.17.25-.291.379-.114.128-.458.499-.484.06-.019-.325.076-.393.2-.586a5.178 5.178 0 0 1 .193-.276c.374-.49.684-.997 1.123-1.402.037-.038.11-.075.09-.11a6.221 6.221 0 0 0-3.624 4.166 6.508 6.508 0 0 0-.23 1.72c0 .62.082 1.209.21 1.75.258 1.073.56 1.817 1.033 2.66.155-.211.219-.491.306-.752.098-.276.166-.642.302-.87.321-.528 2.079-.396 1.599-.763a3.613 3.613 0 0 1-.397-.359 7.083 7.083 0 0 1-.673-.831c-.412-.582-.756-1.285-.79-2.2.469 1.21 1.18 2.222 2.313 2.774.378.182.813.378 1.323.367-1.341-.253-2.162-1.285-2.717-2.374-.087-.17-.208-.332-.25-.476a.4.4 0 0 1-.011-.189c.076-.336.484-.17.726-.083a8.489 8.489 0 0 0 3.602.438 6.678 6.678 0 0 0 1.874-.476c.545-.227 1.04-.518 1.452-.896m-2.34 2.657a8.001 8.001 0 0 1-2.4-.189 3.969 3.969 0 0 1-1.754-.865c-.181-.166-.295-.469-.597-.397-.026.22.151.378.272.514a3.507 3.507 0 0 0 1.573.896c.835.257 2.003.283 2.906.038M11.35 10.22c-.178 0-.771-.098-.786.098-.012.121.245.212.381.25.53.136 1.255.086 1.784.037a8.515 8.515 0 0 0 2.098-.465c.99-.362 1.795-.88 2.457-1.55.181-.18.162-.234-.034-.067a6.365 6.365 0 0 1-1.769 1.032c-1.172.472-2.517.665-4.131.665m6.576-6.717c.136.034.299.027.37.068.133.08.133.273.224.431-.54.091-.718-.302-.972-.585.091.007.227.052.378.086M7.325 16.57c-.393-.613-2.39-3.19-.832-6.989 2.128-5.178 7.88-3.772 8.421-3.557.064-.434.257-.884.764-.994a1.712 1.712 0 0 1 .612 0c-.522.193-1.077.427-1.05.976.022.49.52.835.936.91 0 0 .33.072.567-.075a.019.019 0 0 0 .016-.012c.064-.037.12-.075.204-.105a.979.979 0 0 1 .529-.023c.049.011.143.09.227.087.052 0 .136-.076.211-.087.2-.038.397.072.582.147.125.053.465.099.488.273.011.12-.178.264-.28.34a1.765 1.765 0 0 1-.423.23c.56-.045 1.682-.48 1.512.246-.015.076-.057.14-.042.178.578-.197.76-.685.673-1.372-.076.022-.14.17-.2.215v-.004c0-.196.01-.491-.125-.612.068.359-.121.53-.382.654a6.176 6.176 0 0 0-.695-.975c-.027.113-.012.26-.046.37a.518.518 0 0 0-.438-.351c-.129-.02-.272.022-.427 0-.2-.034-.431-.174-.446-.325-.027-.25.423-.367.65-.428.049.163.117.295.17.45a1.693 1.693 0 0 1 .964-.43c.102 0 .329.037.363.113.079.162-.129.355-.19.427-.037.038-.098.08-.079.102.39-.102.567-.355.84-.544.143.189.196.59.173.858.31-.303.318-.824.291-1.376a1.761 1.761 0 0 1 .749.597 1.943 1.943 0 0 0-.68-.756c-.1-.064-.228-.094-.303-.166-.068-.068-.151-.303-.242-.322-.113-.022-.265.11-.397.118-.238.019-.367-.144-.416-.378-.578.158-.8-.197-.937-.632-.023-.075-.023-.18-.06-.264-.042-.106-.273-.212-.394-.257a1.092 1.092 0 0 0-.548-.068c-.17.026-.294.113-.491.12-.476.027-.971-.18-1.357-.37A8.289 8.289 0 0 1 12.896.113c-.03-.038-.053-.094-.11-.113.125.385.348.707.556 1.005.639.915 1.47 1.58 2.283 2.215a1.308 1.308 0 0 1-.805-.208 4.165 4.165 0 0 1-.65-.416c-.85.726-2.548.81-3.916 1.134.567-.019 1.417.163 1.916.246h-.015c-2.389.094-4.449.794-5.877 2.147.37-.136.706-.306 1.118-.405-.59.537-1.171 1.096-1.644 1.75-.468.647-.967 1.33-.986 2.404.287-.28.578-.642.979-.847a13.108 13.108 0 0 0-.85 2.268c-.197.718-.492 1.913-.02 2.582.03-.238.03-.51.19-.624.28.661.76 1.996 2.26 3.319m5.68-14.095c.114.102.333.273.465.265.208 0 .314-.189.458-.272-.719-.321-1.388-.786-2.034-1.168.098.151.227.28.355.435.239.272.477.506.756.74m-8.05 5.16c.075.155 0 .366.011.517.234-.635.688-1.134 1.119-1.572.023-.026.087-.08.049-.072-.227.11-.355.314-.665.34-.174-.196-.174-.793.06-.922.288.087.477-.162.446-.427-.056-.423-.578-.707-.816-.877.125.159.367.303.423.537.02.083.015.242-.075.268-.133.038-.208-.11-.34-.09-.114.018-.167.219-.19.359a2.76 2.76 0 0 0-.03.529c0 .087.034.219-.03.283-.08-.038-.098-.136-.132-.215-.125-.276-.34-.647-.254-1.013.057-.023.163.007.2-.03.02-.227-.143-.443-.29-.586a.983.983 0 0 0-.926-.227c.211.038.68.068.684.302 0 .087-.102.212-.129.28-.166.408.023.93.22 1.194.113.152.28.295.181.575-.128-.008-.246-.09-.363-.155-.166-.095-.34-.185-.423-.329-.083-.162-.09-.325-.204-.446-.284-.321-.896-.544-1.342-.272.378-.011.73.011.877.26a1.119 1.119 0 0 1 .12.454c.008.068-.01.16.023.208.057.098.235.083.34.144.14.08.227.298.382.435a1.02 1.02 0 0 0 .133.102c.242.143.816.196.937.446m3.046 10.057c-.578.306-.914.907-.986 1.67.113-.302.43-.46.767-.615.216-.099.601-.197.662-.397.053-.155.037-.405-.038-.507-.083-.113-.227-.147-.405-.15m1.406 2.683a1.708 1.708 0 0 0-.907 1.38c.117-.28.424-.398.734-.53.189-.076.517-.162.578-.317.045-.125.045-.326-.023-.416-.064-.095-.283-.167-.382-.121m1.701 1.625c-.321.287-.506.88-.476 1.444.08-.321.325-.446.605-.631.162-.102.491-.261.552-.42a.469.469 0 0 0-.118-.461c-.181-.151-.453-.026-.567.072m2.627.567c-.313.276-.415.831-.34 1.432.076-.302.238-.45.454-.635.128-.113.332-.264.374-.42.068-.256-.208-.51-.491-.377m.544-6.085c.174.022.34.113.476.158.011-.049-.05-.071-.0Line truncated

After

Width:  |  Height:  |  Size: 8.1 KiB

@@ -0,0 +1 @@
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>NETGEAR</title><path d="M11.496 12.459h.678c-.035.362-.296.545-.67.545-.566 0-.849-.496-.849-.982 0-.479.244-.991.811-.991.347 0 .598.2.716.499l.817-.324c-.285-.588-.813-.88-1.493-.88-1.068 0-1.746.672-1.746 1.691 0 .987.699 1.657 1.74 1.657.555 0 1.017-.186 1.341-.616.295-.391.329-.782.338-1.24h-1.683v.641ZM6.86 11.122h.833v2.449h.874v-2.449h.834v-.692H6.86v.692Zm-4.565 1.229h-.009L.861 10.43H0v3.141h.861v-1.924H.87l1.425 1.924h.861V10.43h-.861v1.921Zm15.414-1.921-1.157 3.141h.889l.19-.578h1.149l.189.578h.889l-1.156-3.141h-.993ZM4.174 13.571h2.098v-.691H5.036v-.543h1.185v-.69H5.036v-.525h1.236v-.692H4.174v3.141Zm9.761 0h2.099v-.691h-1.237v-.543h1.185v-.69h-1.185v-.525h1.237v-.692h-2.099v3.141Zm8.954-2.174c0-.67-.497-.967-1.15-.967h-1.34v3.141h.86v-1.208h.062l.785 1.208h1.046l-.987-1.287c.47-.079.724-.453.724-.887Zm-5.054.971.358-1.096h.024l.359 1.096h-.741Zm3.646-.53h-.222v-.782h.247c.282 0 .522.049.522.391s-.265.391-.547.391Zm2.133-1.408c-.202 0-.386.157-.386.378 0 .218.186.38.386.38.202 0 .386-.16.386-.38 0-.225-.18-.378-.386-.378Zm0 .688c-.164 0-.315-.13-.315-.31 0-.183.149-.311.316-.311.164 0 .316.132.316.311 0 .183-.15.31-.317.31Zm.184-.404c0-.104-.101-.122-.174-.122h-.161v.416h.11v-.164h.033l.075.164h.121l-.089-.182c.049-.016.085-.054.085-.112Zm-.185.061h-.04v-.111h.033c.037 0 .079.006.079.057 0 .045-.039.054-.072.054Z"/></svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

@@ -0,0 +1 @@
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>Nokia</title><path d="M16.59 9.348v5.304h.796V9.348Zm-8.497-.09c-1.55 0-2.752 1.127-2.752 2.742 0 1.687 1.202 2.742 2.752 2.742 1.55 0 2.754-1.055 2.751-2.742a2.72 2.72 0 0 0-2.751-2.742ZM10.05 12c0 1.195-.876 1.987-1.957 1.987-1.082 0-1.958-.792-1.958-1.987 0-1.174.876-1.987 1.958-1.987 1.08 0 1.957.813 1.957 1.987zM0 9.176v5.476h.812v-3.619l4.218 3.79v-1.135zM11.442 12l2.952 2.652h1.184L12.622 12l2.956-2.652h-1.184ZM24 14.652h-.875l-.64-1.175h-2.898l-.64 1.175h-.875l1.06-1.958h2.937l-1.465-2.72.432-.798Z"/></svg>

After

Width:  |  Height:  |  Size: 598 B

@@ -0,0 +1 @@
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>NVIDIA</title><path d="M8.948 8.798v-1.43a6.7 6.7 0 0 1 .424-.018c3.922-.124 6.493 3.374 6.493 3.374s-2.774 3.851-5.75 3.851c-.398 0-.787-.062-1.158-.185v-4.346c1.528.185 1.837.857 2.747 2.385l2.04-1.714s-1.492-1.952-4-1.952a6.016 6.016 0 0 0-.796.035m0-4.735v2.138l.424-.027c5.45-.185 9.01 4.47 9.01 4.47s-4.08 4.964-8.33 4.964c-.37 0-.733-.035-1.095-.097v1.325c.3.035.61.062.91.062 3.957 0 6.82-2.023 9.593-4.408.459.371 2.34 1.263 2.73 1.652-2.633 2.208-8.772 3.984-12.253 3.984-.335 0-.653-.018-.971-.053v1.864H24V4.063zm0 10.326v1.131c-3.657-.654-4.673-4.46-4.673-4.46s1.758-1.944 4.673-2.262v1.237H8.94c-1.528-.186-2.73 1.245-2.73 1.245s.68 2.412 2.739 3.11M2.456 10.9s2.164-3.197 6.5-3.533V6.201C4.153 6.59 0 10.653 0 10.653s2.35 6.802 8.948 7.42v-1.237c-4.84-.6-6.492-5.936-6.492-5.936z"/></svg>

After

Width:  |  Height:  |  Size: 881 B

@@ -0,0 +1 @@
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>OnePlus</title><path d="M0 3.74V24h20.26V12.428h-2.256v9.317H2.254V5.995h9.318V3.742zM18.004 0v3.74h-3.758v2.256h3.758v3.758h2.255V5.996H24V3.74h-3.758V0zm-6.45 18.756V8.862H9.562c0 .682-.228 1.189-.577 1.504-.367.297-.91.437-1.556.437h-.245v1.625h2.133v6.31h2.237z"/></svg>

After

Width:  |  Height:  |  Size: 352 B

@@ -0,0 +1 @@
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>OPPO</title><path d="M2.85 12.786h-.001C1.639 12.774.858 12.2.858 11.321s.781-1.452 1.99-1.465c1.21.013 1.992.588 1.992 1.465s-.782 1.453-1.99 1.465zm.034-3.638h-.073C1.156 9.175 0 10.068 0 11.32s1.156 2.147 2.811 2.174h.073c1.655-.027 2.811-.921 2.811-2.174S4.54 9.175 2.885 9.148zm18.27 3.638c-1.21-.012-1.992-.587-1.992-1.465s.782-1.452 1.991-1.465c1.21.013 1.991.588 1.991 1.465s-.781 1.453-1.99 1.465zm.035-3.638h-.073c-1.655.027-2.811.92-2.811 2.173s1.156 2.147 2.81 2.174h.074C22.844 13.468 24 12.574 24 11.32s-1.156-2.146-2.811-2.173zm-6.126 3.638c-1.21-.012-1.99-.587-1.99-1.465s.78-1.452 1.99-1.465c1.21.013 1.991.588 1.991 1.465s-.781 1.453-1.99 1.465zm.036-3.638h-.073c-.789.013-1.464.222-1.955.574v-.37h-.857v5.5h.857v-1.931c.49.351 1.166.56 1.954.574h.074c1.655-.027 2.81-.921 2.81-2.174s-1.155-2.146-2.81-2.173zm-6.144 3.638c-1.21-.012-1.99-.587-1.99-1.465s.78-1.452 1.99-1.465c1.21.013 1.991.588 1.991 1.465s-.781 1.453-1.99 1.465zm.037-3.638H8.92c-.789.013-1.464.222-1.955.574v-.37h-.856v5.5h.856v-1.931c.491.351 1.166.56 1.955.574a3.728 3.728 0 0 0 .073 0c1.655-.027 2.811-.921 2.811-2.174s-1.156-2.146-2.81-2.173z"/></svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

@@ -0,0 +1,111 @@
/* SPDX-License-Identifier: GPL-2.0-only */
(function(window, document) {
'use strict';
if (window.luciOUI)
return;
var base = document.currentScript.src.replace(/[^/]*$/, '');
var database, pending, devices = Object.create(null);
function normalize(mac) {
if (typeof mac !== 'string' || !/^(?:[\da-f]{12}|(?:[\da-f]{2}:){5}[\da-f]{2}|(?:[\da-f]{2}-){5}[\da-f]{2})$/i.test(mac))
return null;
mac = mac.replace(/[:-]/g, '').toUpperCase();
// Neither locally administered (randomized) nor multicast addresses have a reliable OUI.
return (parseInt(mac.slice(0, 2), 16) & 3) ? null : mac;
}
function load() {
if (!pending) {
// One local request per page; failed requests are cached too, so polling never retries.
pending = new Promise(function(resolve) {
var xhr = new XMLHttpRequest();
xhr.open('GET', base + 'vendors-451e5311befc.json', true);
xhr.timeout = 5000;
xhr.onload = function() {
try {
if (xhr.status === 200) {
var data = JSON.parse(xhr.responseText);
if (Array.isArray(data.vendors) && data.prefixes && typeof data.prefixes === 'object')
database = data;
}
} catch (e) { /* Leave the hostname unchanged on missing or invalid data. */ }
resolve(database);
};
xhr.onerror = xhr.ontimeout = xhr.onabort = function() { resolve(null); };
xhr.send();
});
}
return pending;
}
function lookup(mac) {
mac = normalize(mac);
if (!mac || !database)
return null;
if (devices[mac]) {
for (var v = 0; v < database.vendors.length; v++)
if (database.vendors[v][0] === devices[mac])
return database.vendors[v];
}
// The resident prefix map also caches misses without retaining every client's MAC.
for (var i = 0, lengths = [9, 7, 6]; i < lengths.length; i++) {
var prefix = mac.slice(0, lengths[i]);
if (Object.prototype.hasOwnProperty.call(database.prefixes, prefix)) {
var index = database.prefixes[prefix];
return index == null ? null : database.vendors[index];
}
}
return null;
}
function decorate(node, mac, fnos) {
if (node.querySelector('.luci-oui-icon'))
return;
var icon = document.createElement('img');
icon.className = 'luci-oui-icon';
icon.width = icon.height = 20;
icon.alt = '';
icon.style.cssText = 'display:inline-block;width:20px;height:20px;object-fit:contain;vertical-align:middle;margin-inline-end:6px;background:#fff;border-radius:3px;padding:2px;box-sizing:content-box';
function fallback() {
icon.title = 'Unknown vendor';
icon.onerror = function() { icon.remove(); };
icon.src = base + 'computer.svg';
}
fallback();
node.insertBefore(icon, node.firstChild);
if (fnos === true) {
icon.title = 'fnOS 飞牛OS';
icon.onerror = fallback;
icon.src = base + 'fnos.svg';
return;
}
// Random, malformed or absent addresses use the fallback without an OUI request.
if (!normalize(mac))
return;
function apply() {
var vendor = lookup(mac);
if (!vendor || !/^[a-z0-9]+$/.test(vendor[0]))
return;
icon.title = vendor[1];
icon.onerror = fallback;
icon.src = base + vendor[0] + '.svg';
}
if (database)
apply();
else
load().then(apply);
}
window.luciOUI = {
decorate: decorate,
setDevices: function(sections) {
devices = Object.create(null);
(sections || []).forEach(function(section) {
var mac = normalize(section.mac);
if (mac && typeof section.vendor === 'string' && /^[a-z0-9]+$/.test(section.vendor))
devices[mac] = section.vendor;
});
}
};
})(window, document);
@@ -0,0 +1 @@
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>Panasonic</title><path d="M3.157 11.4852c.0399-.6914-.4884-1.2842-1.1798-1.324H0v3.58h1.084v-1.1h.66c.166 0 .333-.02.496-.059.497-.103.87-.52.917-1.025v-.072zm-1.081.005a.35.35 0 0 1-.337.301c-.081.007-.15.007-.23.007h-.425v-.777h.632a.36.36 0 0 1 .36.326.658.658 0 0 1 0 .143zm3.6781 1.45c0-.278-.01-.511-.01-.786a1.654 1.654 0 0 0-.057-.42.666.666 0 0 0-.332-.43 1.046 1.046 0 0 0-.316-.118 2.63 2.63 0 0 0-1.065-.02c-.1.015-.197.043-.29.082a.77.77 0 0 0-.455.5.597.597 0 0 0-.024.261.124.124 0 0 0 .014.048l.86.02a.386.386 0 0 1 .025-.153.262.262 0 0 1 .162-.162.49.49 0 0 1 .342 0 .23.23 0 0 1 .156.157.15.15 0 0 1-.02.13.22.22 0 0 1-.1.078l-.074.024c-.113.03-.228.055-.343.075a6.7928 6.7928 0 0 0-.276.05 3.2483 3.2483 0 0 0-.365.095.787.787 0 0 0-.295.173.621.621 0 0 0-.205.393.792.792 0 0 0 .012.299.71.71 0 0 0 .509.54c.277.084.574.068.841-.043a.83.83 0 0 0 .344-.248c.018.059.038.117.057.176.012.032.03.061.051.087h.948a.414.414 0 0 1-.068-.207c-.0138-.2-.0225-.4004-.026-.601zm-.956-.088a.431.431 0 0 1-.067.193.406.406 0 0 1-.182.145.627.627 0 0 1-.21.054.453.453 0 0 1-.163-.013.244.244 0 0 1-.12-.074.204.204 0 0 1-.057-.106.17.17 0 0 1 .064-.174.314.314 0 0 1 .105-.063c.095-.035.19-.066.288-.093.118-.034.232-.078.342-.131a.907.907 0 0 1 0 .262zm3.262-1.712a1.038 1.038 0 0 0-.755.054 1.662 1.662 0 0 0-.393.262l-.023-.27h-.919v2.559h.982v-1.42a.413.413 0 0 1 .06-.221.383.383 0 0 1 .482-.16c.081.032.142.1.167.183.013.043.02.087.02.131v1.484h1.01v-1.652a1.205 1.205 0 0 0-.06-.394.822.822 0 0 0-.572-.558l.001.002zm5.9501 1.25a1.076 1.076 0 0 0-.42-.231l-.106-.03a4.543 4.543 0 0 0-.58-.122 1.8502 1.8502 0 0 1-.156-.03.3.3 0 0 1-.068-.024.117.117 0 0 1-.059-.152v-.008a.222.222 0 0 1 .131-.105.491.491 0 0 1 .316 0c.107.03.178.133.17.244h.902a.9.9 0 0 0-.055-.31.551.551 0 0 0-.184-.255.848.848 0 0 0-.242-.138 1.196 1.196 0 0 0-.262-.073 2.627 2.627 0 0 0-.642-.037 2.033 2.033 0 0 0-.366.054 1.082 1.082 0 0 0-.444.211.693.693 0 0 0-.28.526.72.72 0 0 0 .052.316.675.675 0 0 0 .393.393c.09.036.183.064.278.082l.554.104c.07.01.138.028.205.051.06.018.103.07.113.131a.19.19 0 0 1-.052.176.304.304 0 0 1-.17.086.492.492 0 0 1-.262-.025.368.368 0 0 1-.105-.061.263.263 0 0 1-.089-.131.41.41 0 0 1-.02-.138h-.932v.055a.773.773 0 0 0 .256.555.99.99 0 0 0 .426.24c.329.098.676.12 1.014.065.16-.023.313-.073.455-.148a.935.935 0 0 0 .176-.118.778.778 0 0 0 .246-.852.632.632 0 0 0-.193-.302v.001zm6.1982-2.226h.957v.676h-.957v-.676zm0 1.024h.957v2.558h-.957v-2.558zm2.872 1.505a1.1666 1.1666 0 0 1-.018.154.393.393 0 0 1-.096.199.299.299 0 0 1-.185.098.364.364 0 0 1-.316-.1.53.53 0 0 1-.152-.26 1.168 1.168 0 0 1 .012-.703.41.41 0 0 1 .178-.232.36.36 0 0 1 .407.017c.092.068.153.17.17.284h.874a.78.78 0 0 0-.09-.417 1.12 1.12 0 0 0-.724-.564 1.711 1.711 0 0 0-.806-.02c-.48.094-.863.456-.984.93a1.383 1.383 0 0 0-.031.621c.023.149.075.291.152.42.095.171.227.32.385.435.189.148.416.239.655.262.18.02.36.012.538-.025a1.24 1.24 0 0 0 .685-.38.928.928 0 0 0 .263-.719h-.917zm-3.704-1.553a1.038 1.038 0 0 0-.755.054 1.656 1.656 0 0 0-.393.262l-.031-.27h-.9181v2.559h.984v-1.428a.425.425 0 0 1 .06-.221.393.393 0 0 1 .484-.16c.08.033.14.1.164.183a.453.453 0 0 1 .021.14v1.483h1.016v-1.652a1.2 1.2 0 0 0-.06-.394.822.822 0 0 0-.572-.558v.002zm-7.8792 1.8c0-.278-.01-.511-.012-.786 0-.142-.018-.283-.054-.42a.675.675 0 0 0-.333-.43 1.056 1.056 0 0 0-.315-.118 2.637 2.637 0 0 0-1.067-.02c-.1.015-.196.043-.289.082a.766.766 0 0 0-.456.5.617.617 0 0 0-.025.261.149.149 0 0 0 .015.048l.86.02a.384.384 0 0 1 .024-.153.262.262 0 0 1 .163-.162.49.49 0 0 1 .342 0 .23.23 0 0 1 .156.157.15.15 0 0 1-.021.13.213.213 0 0 1-.098.078l-.075.024c-.113.03-.228.055-.343.075a6.3141 6.3141 0 0 0-.274.05 3.2042 3.2042 0 0 0-.366.095.762.762 0 0 0-.296.173.617.617 0 0 0-.21.393.753.753 0 0 0 .012.299c.056.26.252.469.508.54.277.084.575.068.842-.043a.808.808 0 0 0 .335-.245c.017.058.036.116.057.173.01.032.029.062.052.087h.948a.418.418 0 0 1-.054-.207 13.4697 13.4697 0 0 1-.026-.601zm-.97-.084a.435.435 0 0 1-.07.189.371.371 0 0 1-.167.145.656.656 0 0 1-.205.054.466.466 0 0 1-.175-.015.248.248 0 0 1-.122-.073.214.214 0 0 1-.055-.105.172.172 0 0 1 .057-.17.344.344 0 0 1 .105-.063 4.83 4.83 0 0 1 .288-.093c.118-.035.233-.079.344-.131.01.087.01.175 0 .262zm5.483-1.72a1.858 1.858 0 0 0-.577 0 1.33 1.33 0 0 0-.747.371 1.21 1.21 0 0 0-.383.798c-.02.185-.003.372.048.551.073.278.239.522.47.693.147.117.32.197.504.235.26.055.527.055.787 0 .184-.038.359-.118.507-.235.23-.17.3961-.415.4681-.693a1.42 1.42 0 0 0 .05-.55 1.208 1.208 0 0 0-.383-.799 1.33 1.33 0 0 0-.743-.37l-.001-.001zm.06 1.814a.388.388 0 0 1-.513.193.371.371 0 0 1-.194-.193.903.903 0 0 1-.072-.246 1.42 1.42 0 0 1 .012-.515.657.657 0 0 1 .1-.247.374.374 0 0 1 .622 0 .627.627 0 0 1 .105.247c.034.17.038.344.01.515a.885.885 0 0 1-.07.246z"/></svg>

After

Width:  |  Height:  |  Size: 4.8 KiB

@@ -0,0 +1 @@
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>QNAP</title><path d="M1.3164 9.955C.438 9.955 0 10.3094 0 11.0177v1.9512c0 .704.438 1.0566 1.3164 1.0566h2.5703c0-.0061.1487.0049.377-.0293-.2145-.3087-.6112-.6434-.9825-.9121l-.0683-.0488H1.6133v-2.1133H3.744v1.793c.6399.1993 1.0793.4554 1.379.6992.0507-.1283.0761-.2763.0761-.4454v-1.9511c0-.6699-.3928-1.0238-1.1758-1.0606v-.002zm4.9649.0528c-.1551 0-.274.044-.3575.1309-.1468.1535-.1164.3461-.1308.3535v3.5176h1.4453s-.0081-1.8582-.0117-2.4063c.0062-.036.0323-.088.1425-.0742 0 0 .0426.0012.0606.0332.2786.445 2.1035 2.4473 2.1035 2.4473h1.5v-4.002H9.5703v2.3281c-.022.0535-.095.044-.1308.006-.258-.399-1.2508-1.7643-1.5684-2.1993-.0202-.0243-.1248-.1348-.3555-.1348Zm6.584 0c-.3665 0-.6468.0763-.8438.2305-.202.1592-.3027.371-.3027.6387v3.1328h1.5273v-1.0664h2.1406v1.0664h1.5293V10.877c0-.2711-.0993-.4848-.2969-.6387-.197-.1542-.4793-.2305-.8457-.2305zm5.9179 0c-.366 0-.6481.0778-.8457.2324-.197.1533-.2976.361-.3027.6192v3.1504h1.5293v-1.045h2.4707c.6714 0 1.0078-.268 1.0078-.8085V10.873c0-.3081-.0845-.529-.248-.664-.2801-.2223-.743-.1877-.7032-.2012zm4.7246.0723c-.248.0126-.4473.2195-.4473.4707 0 .259.2116.4687.4707.4687A.4684.4684 0 0 0 24 10.5508c0-.2593-.2096-.4707-.4688-.4707-.008 0-.0154-.0004-.0234 0zm.002.0683c.0068-.0003.0146 0 .0215 0 .2213.0007.3998.1813.4004.4024a.3996.3996 0 0 1-.4004.3984c-.221-.0005-.4001-.1777-.4004-.3984.0003-.2142.1675-.391.379-.4024zm-.1894.1407v.5332h.0722v-.2364c.0404-.0023.081.0013.1211.002.0326.0073.0642.0456.0684.0508.0452.0579.0807.1224.121.1836h.088l-.0918-.1445a.3512.3512 0 0 0-.0586-.0703.1786.1786 0 0 0-.043-.0274c.0514-.007.0887-.023.1133-.0488.0434-.0465.05-.1157.0137-.1758-.0217-.036-.0561-.0664-.166-.0664zm.0722.0586h.168c.1513 0 .134.1407.0586.168-.0737.0188-.1513.0064-.2266.0097zm-10.1465.7011h2.1407v1.1582H13.246zm5.8965 0h1.9434v1.0371h-1.9434zm-16.3574 1.539c.4791.3043 1.3518.9071 1.6406 1.4571h1.0879c-.1858-.3314-.814-1.1293-2.7285-1.457Z"/></svg>

After

Width:  |  Height:  |  Size: 2.0 KiB

@@ -0,0 +1 @@
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>Raspberry Pi</title><path d="m19.8955 10.8961-.1726-.3028c.0068-2.1746-1.0022-3.061-2.1788-3.7348.356-.0938.7237-.1711.8245-.6182.6118-.1566.7397-.4398.8011-.7398.16-.1066.6955-.4061.6394-.9211.2998-.2069.4669-.4725.3819-.8487.3222-.3515.407-.6419.2702-.9096.3868-.4805.2152-.7295.05-.9817.2897-.5254.0341-1.0887-.7758-.9944-.3221-.4733-1.0244-.3659-1.133-.3637-.1215-.1519-.2819-.2821-.7755-.219-.3197-.2851-.6771-.2364-1.0458-.0964-.4378-.3403-.7275-.0675-1.0584.0356-.53-.1706-.6513.0631-.9117.1583-.5781-.1203-.7538.1416-1.0309.4182l-.3224-.0063c-.8719.5061-1.305 1.5366-1.4585 2.0664-.1536-.5299-.5858-1.5604-1.4575-2.0664l-.3223.0063C9.942.5014 9.7663.2394 9.1883.3597 8.9279.2646 8.807.0309 8.2766.2015c-.2172-.0677-.417-.2084-.6522-.2012l.0004.0002C7.5017.0041 7.369.049 7.2185.166c-.3688-.1401-.7262-.1887-1.0459.0964-.4936-.0631-.654.0671-.7756.219C5.2887.4791 4.5862.3717 4.264.845c-.8096-.0943-1.0655.4691-.7756.9944-.1653.2521-.3366.5013.05.9819-.1367.2677-.0519.5581.2703.9096-.085.3763.0822.6418.3819.8487-.0561.515.4795.8144.6394.9211.0614.3001.1894.5832.8011.7398.1008.4472.4685.5244.8245.6183-1.1766.6737-2.1856 1.56-2.1788 3.7348l-.1724.3028c-1.3491.8082-2.5629 3.4056-.6648 5.5167.124.6609.3319 1.1355.5171 1.6609.2769 2.117 2.0841 3.1082 2.5608 3.2255.6984.524 1.4423 1.0212 2.449 1.3696.949.964 1.977 1.3314 3.0107 1.3308.0152 0 .0306.0002.0457 0 1.0337.0006 2.0618-.3668 3.0107-1.3308 1.0067-.3483 1.7506-.8456 2.4491-1.3696.4766-.1173 2.2838-1.1085 2.5607-3.2255.1851-.5253.3931-1 .517-1.6609 1.8981-2.1113.6843-4.7089-.6649-5.517zm-1.0386-.3715c-.0704.8759-4.6354-3.0504-3.8472-3.1808 2.1391-.3558 3.9191.896 3.8472 3.1808zm-2.0155 4.3649c-1.1481.7409-2.8025.2626-3.6953-1.0681-.8928-1.3306-.6858-3.0101.4623-3.7509 1.1481-.7409 2.8025-.2627 3.6953 1.068.8927 1.3307.6858 3.0101-.4623 3.751zM13.6591 1.3721c.0396.1967.0843.321.1354.3577.2537-.272.4611-.5506.7878-.8123.0011.1537-.0776.3205.1169.4425.1752-.2356.4119-.4459.7263-.6244-.1514.2611-.026.3404.0554.4486.24-.2059.4681-.4144.9109-.5759-.121.1474-.2902.2914-.1108.4607.2473-.1544.496-.3086 1.0833-.4183-.1323.1475-.4059.295-.2401.4426.3104-.1186.6539-.2047 1.034-.2546-.182.1496-.3337.2963-.1846.4122.3323-.1022.7899-.2398 1.2372-.1212l-.2832.2849c-.0314.0382.6623.0297 1.1202.0364-.167.2321-.3375.4562-.437.8548.0454.0459.2723.0204.4862 0-.2194.4618-.6004.5783-.6893.776.134.1015.32.075.5232.006-.158.3254-.4892.5484-.7509.8123.0662.047.1818.075.4555.0425-.2418.257-.5339.492-.8802.7032.0614.0708.2722.0681.4678.0727-.3136.3069-.7173.466-1.0955.6668.1885.1288.3234.0988.4678.097-.2676.2198-.7225.3342-1.1448.4668.0803.1249.1607.1589.3324.194-.447.2473-1.0873.1343-1.2679.2607.0435.1243.1665.2053.3139.2728-.7197.0418-2.6879-.0262-3.0652-1.5156.7367-.8094 2.0813-1.7593 4.394-2.934-1.7994.6022-3.4229 1.405-4.7817 2.5096-1.5978-.7436-.4965-2.6197.283-3.3645zm-1.6126 5.3718c1.1329-.0123 2.5356.8325 2.53 1.6286-.005.7027-.9851 1.2715-2.5213 1.2607-1.5043-.0177-2.5172-.7148-2.5137-1.3957.003-.5603 1.2282-1.5263 2.505-1.4936zm-5.7646-.6006c.1717-.0351.252-.0692.3323-.194-.4223-.1327-.8772-.247-1.1448-.4668.1444.0018.2792.0318.4678-.097-.3783-.2008-.782-.3599-1.0956-.6668.1955-.0048.4064-.002.4677-.0728-.3462-.2113-.6383-.4463-.8801-.7033.2738.0325.3893.0045.4555-.0425-.2617-.264-.593-.487-.7509-.8123.2032.069.3892.0954.5232-.006-.089-.1977-.47-.3142-.6894-.776.214.0204.4409.0459.4863 0-.0994-.3985-.2698-.6226-.4369-.8547.4579-.0067 1.1516.0018 1.1202-.0364l-.2831-.2849c.4472-.1186.9049.019 1.2371.1213.1492-.1159-.0026-.2626-.1847-.4123.3801.05.7236.1361 1.034.2547.1659-.1476-.1076-.2951-.24-.4426.5872.1097.8361.2639 1.0833.4183.1794-.1694.0103-.3133-.1108-.4607.4428.1615.6709.37.911.5759.0814-.1082.2068-.1875.0554-.4486.3143.1785.5511.3888.7263.6244.1945-.122.1159-.2888.1169-.4426.3267.2618.534.5404.7879.8124.0511-.0366.0959-.161.1354-.3577.7794.7448 1.8807 2.6208.2831 3.3646-1.3589-1.1039-2.9817-1.9064-4.78-2.5086 2.3115 1.174 3.6556 2.1239 4.392 2.9328-.3773 1.4895-2.3455 1.5575-3.0651 1.5157.1473-.0676.2703-.1485.3139-.2728-.1806-.1264-.8209-.0134-1.2679-.2607zm2.8175 1.1334c.7881.1304-3.7769 4.0567-3.8472 3.1809-.0719-2.2846 1.7079-3.5367 3.8472-3.1809zm-4.847 8.7567c-1.1094-.8789-1.4668-3.4529.5901-4.6097 1.2394-.3273.4184 5.051-.5901 4.6097zm4.2656 4.5989c-.6257.3719-2.1452.2187-3.2252-1.3095-.7283-1.2823-.6345-2.5872-.123-2.9705.7648-.4589 1.9464.1609 2.8559 1.2003.7923.9405 1.1536 2.5927.4923 3.0797zm-1.2415-5.6086c-1.1481-.7409-1.3551-2.4203-.4623-3.7511.8928-1.3307 2.5472-1.8089 3.6952-1.068 1.1481.7409 1.3551 2.4203.4623 3.7509-.8926 1.3308-2.5471 1.809-3.6952 1.0682zm4.7948 8.2279c-1.3763.0584-2.7258-1.1105-2.7081-1.5157-.0206-.594 1.6758-1.0578 2.782-1.0306 1.1131-.0479 2.6068.3531 2.6097.8851.0184.5166-1.3547 1.6838-2.6836 1.6612zm2.7584-5.8578c.0081 1.3899-1.226 2.5225-2.7562 2.5299-1.5302.0073-2.7773-1.1135-2.7854-2.5033v-.0265c-.008-1.3899 1.2259-2.5226 2.7562-2.5299 1.5302-.0073 2.77Line truncated

After

Width:  |  Height:  |  Size: 5.8 KiB

@@ -0,0 +1 @@
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>Samsung</title><path d="M19.8166 10.2808l.0459 2.6934h-.023l-.7793-2.6934h-1.2837v3.3925h.8481l-.0458-2.785h.023l.8366 2.785h1.2264v-3.3925zm-16.149 0l-.6418 3.427h.9284l.4699-3.1175h.0229l.4585 3.1174h.9169l-.6304-3.4269zm5.1805 0l-.424 2.6132h-.023l-.424-2.6132H6.5788l-.0688 3.427h.8596l.023-3.0832h.0114l.573 3.0831h.8711l.5731-3.083h.023l.0228 3.083h.8596l-.0802-3.4269zm-7.2664 2.4527c.0343.0802.0229.1949.0114.2522-.0229.1146-.1031.2292-.3324.2292-.2177 0-.3438-.126-.3438-.3095v-.3323H0v.2636c0 .7679.6074.9971 1.2493.9971.6189 0 1.1346-.2178 1.2149-.7794.0458-.298.0114-.4928 0-.5616-.1605-.722-1.467-.9283-1.5588-1.3295-.0114-.0688-.0114-.1375 0-.1834.023-.1146.1032-.2292.3095-.2292.2063 0 .321.126.321.3095v.2063h.8595v-.2407c0-.745-.6762-.8596-1.1576-.8596-.6074 0-1.1117.2063-1.2034.7564-.023.149-.0344.2866.0114.4585.1376.7106 1.364.9169 1.5358 1.3524m11.152 0c.0343.0803.0228.1834.0114.2522-.023.1146-.1032.2292-.3324.2292-.2178 0-.3438-.126-.3438-.3095v-.3323h-.917v.2636c0 .7564.596.9857 1.2379.9857.6189 0 1.1232-.2063 1.2034-.7794.0459-.298.0115-.4814 0-.5616-.1375-.7106-1.4327-.9284-1.5243-1.318-.0115-.0688-.0115-.1376 0-.1835.0229-.1146.1031-.2292.3094-.2292.1948 0 .321.126.321.3095v.2063h.848v-.2407c0-.745-.6647-.8596-1.146-.8596-.6075 0-1.1004.1948-1.192.7564-.023.149-.023.2866.0114.4585.1376.7106 1.341.9054 1.513 1.3524m2.8882.4585c.2407 0 .3094-.1605.3323-.2522.0115-.0343.0115-.0917.0115-.126v-2.533h.871v2.4642c0 .0688 0 .1948-.0114.2292-.0573.6419-.5616.8482-1.192.8482-.6303 0-1.1346-.2063-1.192-.8482 0-.0344-.0114-.1604-.0114-.2292v-2.4642h.871v2.533c0 .0458 0 .0916.0115.126 0 .0917.0688.2522.3095.2522m7.1518-.0344c.2522 0 .3324-.1605.3553-.2522.0115-.0343.0115-.0917.0115-.126v-.4929h-.3553v-.5043H24v.917c0 .0687 0 .1145-.0115.2292-.0573.6303-.596.8481-1.2034.8481-.6075 0-1.1461-.2178-1.2034-.8481-.0115-.1147-.0115-.1605-.0115-.2293v-1.444c0-.0574.0115-.172.0115-.2293.0802-.6419.596-.8482 1.2034-.8482s1.1347.2063 1.2034.8482c.0115.1031.0115.2292.0115.2292v.1146h-.8596v-.1948s0-.0803-.0115-.1261c-.0114-.0802-.0802-.2521-.3438-.2521-.2521 0-.321.1604-.3438.2521-.0115.0458-.0115.1032-.0115.1605v1.5702c0 .0458 0 .0916.0115.126 0 .0917.0917.2522.3323.2522"/></svg>

After

Width:  |  Height:  |  Size: 2.2 KiB

@@ -0,0 +1 @@
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>sharp</title><path d="M14.2209.0875v5.9613l-3.7433.5012v3.5233l3.7433-.5012v3.5735l3.492-.4672V9.1047L24 8.2634l-.4631-3.4613-5.824.7794V.0875zM6.287 1.145v5.9618L0 7.9483l.4634 3.4613 5.8514-.7834 3.4644-.4637V1.145zm3.5198 9.7185l-3.492.4675v3.578l-6.183.8276.4633 3.4613 5.8239-.7796v5.4942h3.492v-5.962l3.6114-.4834V13.944l-3.7156.4973zm13.73 1.7405l-5.824.779-3.492.4673v9.0179h3.492v-5.9618L24 16.0652Z"/></svg>

After

Width:  |  Height:  |  Size: 495 B

@@ -0,0 +1 @@
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>Sony</title><path d="M8.5505 9.8881c.921 0 1.6574.2303 2.2209.7423.3848.3485.5999.8454.5939 1.3665a1.9081 1.9081 0 0 1-.5939 1.3726c-.5272.4848-1.3483.7423-2.221.7423-.8725 0-1.6785-.2575-2.2148-.7423-.3908-.3485-.609-.8484-.603-1.3726 0-.518.2182-1.015.603-1.3665.5-.4545 1.3847-.7423 2.2149-.7423zm.003 3.6692c.4606 0 .8878-.1606 1.1878-.4575.2999-.2999.4332-.6605.4332-1.1029 0-.4242-.1484-.821-.4333-1.1029-.2938-.2908-.7332-.4545-1.1877-.4545s-.8938.1637-1.1907.4545c-.2848.2818-.4333.6787-.4333 1.103-.006.409.1485.806.4333 1.1029.2969.2939.7332.4575 1.1907.4575zm-4.8418-1.9665c.1605.0424.315.094.4666.1636a1.352 1.352 0 0 1 .3787.2576c.197.206.309.4817.306.7665a.9643.9643 0 0 1-.3787.7788 2.0662 2.0662 0 0 1-.709.3485 3.7231 3.7231 0 0 1-1.1938.1697c-.352 0-.5467-.0406-.8138-.0962l-.077-.016c-.294-.0666-.5817-.1575-.8575-.2787a.0695.0695 0 0 0-.0424-.0121c-.0454 0-.0818.0394-.0818.0848v.203H.1212v-1.4786h.5242a.7559.7559 0 0 0 .1363.418c.2121.2607.4394.3607.6575.4395.3666.1212.7514.1848 1.1362.1969.5526 0 .8756-.134.9455-.163l.009-.0037.0062-.0023c.0616-.0226.3119-.1143.3119-.3916 0-.2743-.2338-.334-.387-.373l-.022-.0058c-.1708-.046-.562-.0872-.9897-.1323l-.1526-.016c-.4848-.0515-.9696-.1273-1.1968-.1758-.4977-.1097-.6942-.2917-.816-.4045l-.0082-.0076A1.0192 1.0192 0 0 1 0 11.1608c0-.497.3394-.797.7575-.9817.4454-.2.9756-.288 1.4392-.288.8211.0031 1.4877.2697 1.727.394.097.0515.1455-.0121.1455-.0606v-.1484h.5272v1.2876h-.4727a.9056.9056 0 0 0-.2939-.4909 1.289 1.289 0 0 0-.297-.1787c-.3968-.1667-.821-.2515-1.2513-.2455-.4423 0-.8665.085-1.0786.2153-.1333.0818-.2.1848-.2.306 0 .1727.1454.2424.2182.2636.1967.0597.6328.103.972.1369.0736.0073.1426.0142.2036.0206.3272.0334 1.012.1243 1.315.2zm18.1673-.9966v-.4787H24v.4696h-.4757c-.1727 0-.2424.0334-.3727.1788l-1.4271 1.63a.098.098 0 0 0-.0182.0698v.7423a1.106 1.106 0 0 0 .0121.103.1496.1496 0 0 0 .1.0909.9368.9368 0 0 0 .1303.009h.4848v.4698h-2.5724v-.4697h.4606a.9343.9343 0 0 0 .1302-.0091.1627.1627 0 0 0 .1031-.091.5626.5626 0 0 0 .009-.1v-.7422c0-.0242 0-.0242-.0333-.0636a606.7592 606.7592 0 0 0-1.4119-1.6028c-.0758-.0788-.2061-.2061-.406-.2061h-.4576v-.4696h2.5876v.4696h-.3121c-.0697 0-.1182.0697-.0576.1455 0 0 .8696 1.0392.8787 1.0513.0091.0122.0152.0122.0273.003.0121-.009.8938-1.0453.8999-1.0543a.0912.0912 0 0 0-.0182-.1273.1095.1095 0 0 0-.0606-.0182zm-6.284-.0031h.4848c.2212 0 .2606.0848.2636.2909l.0273 1.5664-2.5815-2.324H11.944v.4697h.412c.297 0 .3182.1636.3182.309v2.2138c.0004.1285.0009.295-.1818.295h-.506v.4667h2.1634v-.4697h-.5273c-.212 0-.2211-.097-.2242-.303v-1.8816l2.9724 2.6511h.7575l-.0394-2.9966c.003-.218.0182-.2908.2424-.2908h.4726v-.4697H15.595Z"/></svg>

After

Width:  |  Height:  |  Size: 2.7 KiB

@@ -0,0 +1 @@
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>Synology</title><path d="M13.44 8.927l-.889.37.056.117a.623.623 0 0 1 .212-.054c.05 0 .093.017.126.046.033.028.058.081.072.16.015.08.022.29.022.634v2.736c0 .189-.013.316-.042.381a.295.295 0 0 1-.118.142c-.053.031-.147.045-.286.045v.12h1.481v-.12c-.154 0-.261-.017-.32-.048a.29.29 0 0 1-.126-.142c-.026-.06-.04-.187-.04-.378V8.927zm-11.722.34c-.33 0-.608.05-.84.147-.233.1-.411.246-.534.436a1.083 1.083 0 0 0-.185.612c0 .338.131.627.393.864.184.167.507.309.968.422.358.091.587.153.688.191a.7.7 0 0 1 .31.183c.058.07.088.158.088.259 0 .155-.07.291-.21.41-.142.116-.35.176-.628.176-.262 0-.47-.066-.625-.197-.154-.132-.255-.339-.307-.619L0 12.23c.056.48.228.845.517 1.096.289.252.704.378 1.244.378.371 0 .68-.054.93-.156a1.263 1.263 0 0 0 .781-1.169 1.29 1.29 0 0 0-.171-.684 1.203 1.203 0 0 0-.472-.437c-.2-.107-.508-.21-.927-.31-.418-.098-.683-.193-.79-.286a.326.326 0 0 1 .009-.524c.14-.105.336-.156.586-.156.24 0 .422.049.542.145.122.097.199.256.237.471l.864-.028c-.013-.395-.154-.71-.425-.949-.271-.235-.674-.353-1.208-.353zm21.808.33a.475.475 0 1 0-.002.95.475.475 0 0 0 .002-.95zm0 .072a.4.4 0 0 1 .401.403c0 .116-.05.22-.128.294l-.086-.135a.396.396 0 0 0-.065-.078.212.212 0 0 0-.048-.03.2.2 0 0 0 .127-.057.144.144 0 0 0 .043-.109.178.178 0 0 0-.025-.091.125.125 0 0 0-.067-.055.309.309 0 0 0-.123-.02h-.266v.606h.08v-.268h.091c.02 0 .036.001.045.003.013.004.025.007.036.014.013.01.024.023.04.043.015.019.035.049.059.083l.08.125h.043a.396.396 0 0 1-.237.08.405.405 0 0 1-.404-.405c0-.224.18-.403.404-.403zm-.157.191h.191c.044 0 .077.01.097.027a.089.089 0 0 1 .03.07.09.09 0 0 1-.016.055.076.076 0 0 1-.047.035.196.196 0 0 1-.085.013h-.17zm-15.037.6c-.41 0-.752.17-1.023.514v-.455h-.754v3.105h.814v-1.401c0-.348.022-.583.063-.713a.583.583 0 0 1 .234-.306.666.666 0 0 1 .385-.118c.11 0 .208.028.287.082.08.054.135.13.17.229.037.099.054.314.054.646v1.581h.816V11.7a2.54 2.54 0 0 0-.046-.55.925.925 0 0 0-.16-.343.83.83 0 0 0-.341-.25 1.285 1.285 0 0 0-.499-.097zm2.65 0a1.7 1.7 0 0 0-.826.2 1.39 1.39 0 0 0-.571.586 1.684 1.684 0 0 0-.202.793c0 .356.068.657.202.904.134.25.33.438.588.566.259.129.53.194.814.194.46 0 .841-.156 1.144-.463.303-.31.455-.698.455-1.167 0-.465-.15-.85-.451-1.156-.3-.305-.683-.457-1.154-.457zm7.315.05c-.351 0-.64.108-.865.323a1.02 1.02 0 0 0-.336.77c0 .194.05.371.147.534.1.162.24.285.423.379-.223.187-.366.335-.429.44a.55.55 0 0 0-.092.271c0 .068.024.13.071.184.046.056.127.116.24.187a9.626 9.626 0 0 0-.329.355c-.113.145-.19.253-.226.336a.41.41 0 0 0-.034.157c0 .12.081.232.246.343.291.19.649.284 1.071.284.55 0 .996-.16 1.337-.477.232-.216.35-.45.35-.694a.613.613 0 0 0-.183-.45.838.838 0 0 0-.49-.227 8.478 8.478 0 0 0-.878-.053 4.257 4.257 0 0 1-.46-.027c-.105-.015-.177-.04-.212-.075-.038-.037-.056-.072-.056-.112a.37.37 0 0 1 .05-.159.868.868 0 0 1 .186-.221c.156.049.309.07.459.07.36 0 .648-.1.864-.301a.956.956 0 0 0 .323-.722c0-.247-.062-.45-.187-.61h.394c.097 0 .15-.002.167-.01a.056.056 0 0 0 .035-.025.289.289 0 0 0 .018-.12.214.214 0 0 0-.02-.105.083.083 0 0 0-.033-.028.83.83 0 0 0-.166-.008h-.639a1.307 1.307 0 0 0-.746-.21zm-2.752 0c-.252 0-.49.065-.714.194a1.437 1.437 0 0 0-.546.61 1.816 1.816 0 0 0-.205.825c0 .381.114.724.34 1.03a1.29 1.29 0 0 0 1.09.543c.28 0 .532-.07.76-.211.23-.14.409-.35.54-.627.13-.276.194-.55.194-.821 0-.385-.118-.725-.354-1.022a1.344 1.344 0 0 0-1.105-.522zm-12.182.009l1.174 3.113a1.193 1.193 0 0 1-.21.431c-.09.112-.23.167-.419.167-.102 0-.218-.013-.344-.04l.067.645c.152.033.307.052.464.052.155 0 .294-.019.418-.052a1.04 1.04 0 0 0 .31-.138.862.862 0 0 0 .224-.234 2.2 2.2 0 0 0 .205-.414l.199-.545 1.085-2.985h-.844l-.722 2.204-.74-2.204zm16.631.078v.122a.84.84 0 0 1 .245.091c.035.029.08.08.136.157.072.102.125.186.158.255l1.088 2.275-.213.526c-.079.194-.158.326-.236.393-.08.068-.15.104-.217.104a.878.878 0 0 1-.167-.05.924.924 0 0 0-.3-.07c-.105 0-.19.025-.25.084a.286.286 0 0 0-.092.22c0 .098.042.183.126.257a.457.457 0 0 0 .322.112c.18 0 .366-.072.56-.223.193-.15.35-.37.469-.664l1.226-3.014a1.6 1.6 0 0 1 .113-.254.55.55 0 0 1 .145-.146.473.473 0 0 1 .188-.053v-.122h-.978v.122c.093 0 .16.008.197.023a.172.172 0 0 1 .083.057.146.146 0 0 1 .023.087c0 .091-.019.18-.056.271l-.675 1.671-.737-1.53c-.074-.15-.11-.268-.11-.356a.21.21 0 0 1 .074-.16.346.346 0 0 1 .224-.063h.068v-.122zm-1.753.08c.175 0 .316.074.43.217.15.196.224.466.224.815 0 .265-.053.46-.16.584a.516.516 0 0 1-.41.188.528.528 0 0 1-.43-.216c-.149-.19-.223-.458-.223-.802 0-.268.054-.461.163-.59a.515.515 0 0 1 .406-.197zm-2.798.054c.242 0 .44.102.598.312.23.308.346.727.346 1.263 0 .429-.07.73-.209.905a.646.646 0 0 1-.528.264c-.286 0-.516-.161-.691-.477-.174-.32-.263-.695-.263-1.135 0-.272.037-.493.11-.669a.731.731 0 0 1 .285-.361.667.667 0 0 1 .352-.102zm-4.463.395c.216 0 .396.084.543.247.144.162.216.397.216.703 0 .311-.072.55-.216.712a.695.695 0 0 1-.543.248.695.695 0 0 1-.542-.248c-.147-.161-.22-.398-.22-.708 0-.308.073-.545.22-.707a.704.704 0 0 1 .542-.247zmLine truncated

After

Width:  |  Height:  |  Size: 5.1 KiB

@@ -0,0 +1,113 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="1000"
height="596.39362"
id="svg281689"
version="1.1"
inkscape:version="0.48.2 r9819"
sodipodi:docname="A.svg">
<defs
id="defs281691">
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath3055">
<path
inkscape:connector-curvature="0"
d="m 263.19,605.947 68.896,0 0,41.062 -68.896,0 0,-41.062 z"
id="path3057" />
</clipPath>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.35"
inkscape:cx="441.41717"
inkscape:cy="-117.22998"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
fit-margin-left="0.5"
fit-margin-bottom="0.5"
fit-margin-top="0.5"
fit-margin-right="0.5"
inkscape:window-width="1058"
inkscape:window-height="1039"
inkscape:window-x="855"
inkscape:window-y="-21"
inkscape:window-maximized="0" />
<metadata
id="metadata281694">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(66.41717,181.2614)">
<g
id="g3051"
transform="matrix(14.500116,0,0,-14.500116,-3882.2027,9200.934)">
<g
id="g3053"
clip-path="url(#clipPath3055)">
<g
id="g3059"
transform="translate(332.086,605.9463)">
<path
d="m 0,0 -68.896,0 0,30.878 c 0,5.599 4.584,10.184 10.185,10.184 L 0,41.062 0,0 z"
style="fill:#ed1c24;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path3061"
inkscape:connector-curvature="0" />
</g>
<g
id="g3063"
transform="translate(273.375,629.3974)">
<path
d="m 0,0 5.443,0 0,-9.75 4.868,0 0,9.75 5.437,0 0,3.936 L 0,3.936 0,0 z"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path3065"
inkscape:connector-curvature="0" />
</g>
<g
id="g3067"
transform="translate(298.6641,622.4658)">
<path
d="m 0,0 c -1.131,0 -1.98,0.327 -2.701,0.998 -0.705,0.657 -1.211,1.66 -1.211,3.026 l 0,0.205 c 0,1.359 0.506,2.378 1.211,3.03 0.721,0.676 1.576,0.988 2.701,0.988 2.658,0 3.225,-1.582 3.395,-2.613 l 4.32,0 c -0.106,2.082 -1.098,3.545 -2.5,4.519 -1.395,0.97 -3.016,1.465 -5.168,1.465 -2.645,0 -4.524,-0.589 -6.069,-1.898 C -7.578,8.384 -8.406,6.281 -8.406,4.179 l 0,-0.107 c 0,-2.298 0.721,-4.021 2.316,-5.471 1.492,-1.356 3.668,-1.976 6.086,-1.968 2.143,0 3.983,0.503 5.256,1.46 1.404,1.061 2.363,2.55 2.478,4.514 l -4.31,0 C 3.301,1.782 2.781,0 0,0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path3069"
inkscape:connector-curvature="0" />
</g>
<g
id="g3071"
transform="translate(313.6856,623.4004)">
<path
d="m 0,0 0,9.933 -4.687,0 0,-13.681 12.375,0 L 7.688,0 0,0 z"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path3073"
inkscape:connector-curvature="0" />
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 4.0 KiB

@@ -0,0 +1 @@
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>Toshiba</title><path d="M5.174 10.172c-1.065 0-1.578.187-1.65 1.148a8.92 8.92 0 00-.022.68c0 .218.004.451.021.68.073.96.586 1.148 1.65 1.148 1.065 0 1.58-.188 1.653-1.148.018-.229.022-.462.022-.68 0-.217-.005-.451-.022-.68-.073-.96-.588-1.148-1.652-1.148zm3.79 0c-.41 0-.82.04-.985.121-.322.156-.545.38-.545 1.02 0 .375.1.654.293.796.281.21.553.23 1.31.27.305.016.47.078.47.34 0 .332-.294.332-.564.332-.28 0-.366-.025-.46-.096-.084-.063-.105-.176-.106-.348h-.95c0 .487.01.884.47 1.084.41.18 1.67.18 2.048.014.328-.145.563-.337.563-.994 0-.455-.091-.735-.44-.941-.248-.147-.945-.17-1.298-.192-.258-.016-.356-.11-.356-.338 0-.297.285-.308.53-.308.202 0 .34.018.439.105.038.039.086.099.088.307h.947c0-.408-.014-.848-.455-1.051-.175-.08-.587-.121-.998-.121zm2.206.062v3.532h.996v-1.362h1.156v1.362h.996v-3.532h-.996v1.29h-1.156v-1.29h-.996zm4.023 0v3.532h1.002v-3.532h-1.002zm1.891 0v3.532h1.887c.869 0 1.162-.376 1.162-.952 0-.401-.092-.755-.643-.894.444-.114.574-.379.574-.762 0-.776-.487-.924-1.181-.924h-1.799zm4.373 0l-1.068 3.532h1.037l.187-.655h1.16l.19.655H24l-1.07-3.532h-1.473zM0 10.236v.881h1.055v2.65H2.11v-2.65h1.055v-.88H0zm5.174.762c.418 0 .633.063.66.607.004.085.01.201.01.395 0 .195-.006.31-.01.395-.027.544-.242.607-.66.607-.418 0-.633-.063-.66-.607A7.674 7.674 0 014.506 12c0-.194.003-.31.008-.395.027-.544.242-.607.66-.607zm12.906.045h.69c.18 0 .293.085.293.291 0 .176-.112.285-.293.285h-.69v-.576zm4.111.064h.006l.354 1.22h-.713l.353-1.22zm-4.11 1.207h.689c.279 0 .337.124.337.323s-.11.32-.337.32h-.69v-.643z"/></svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

@@ -0,0 +1 @@
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>TP-Link</title><path d="M15.185 0C10.218 0 6.25 3.984 6.25 8.903V10.8h4.99V8.903c0-2.135 1.736-3.863 3.946-3.863 2.187 0 3.708 1.536 3.708 3.815 0 2.257-1.64 3.912-3.827 3.912h-1.878v5.039h1.878c4.874 0 8.819-4.007 8.819-8.952C23.885 3.72 20.2 0 15.185 0zM.115 12.6v4.103c0 .624.523 1.248 1.236 1.248h4.753v4.801c0 .624.523 1.248 1.236 1.248h4.065V12.6Z"/></svg>

After

Width:  |  Height:  |  Size: 440 B

@@ -0,0 +1 @@
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>Ubiquiti</title><path d="M23.1627 0h-1.4882v1.4882h1.4882zm-5.2072 10.4226V7.4409l.0007.001h2.9755v2.9762h2.9756v.9433c0 1.0906-.0927 2.3827-.306 3.3973-.1194.5672-.3004 1.1308-.5127 1.672-.2175.5537-.468 1.0841-.7408 1.5595a11.6795 11.6795 0 0 1-1.2456 1.7762l-.0253.0294-.0417.0488c-.1148.1347-.2283.2679-.3531.398a11.7612 11.7612 0 0 1-.4494.4492c-1.9046 1.8343-4.3861 2.98-6.9808 3.243-.3122.032-.939.0652-1.2519.0652-.3139-.001-.9397-.0331-1.252-.0651-2.5946-.263-5.0761-1.4097-6.9806-3.243a11.75 11.75 0 0 1-.4495-.4494c-.131-.1356-.249-.2748-.3683-.4154l-.0006-.0004-.0512-.0603a11.6576 11.6576 0 0 1-1.2456-1.7762c-.2727-.4763-.5233-1.0058-.7408-1.5595-.2123-.5414-.3933-1.1048-.5128-1.6718C.1854 13.743.0927 12.452.0927 11.3616V.1864h5.9518v10.2362s0 .7847.0099 1.0415l.0022.0599v.0004c.0127.332.0247.6575.0594.9812.098.919.3014 1.7913.7203 2.5288.1213.213.2443.42.3915.616.8953 1.1939 2.2577 2.0901 3.9573 2.3398.2022.0294.6108.0552.8149.0552.204 0 .6125-.0258.8149-.0552 1.6996-.2497 3.062-1.146 3.9573-2.3398.148-.196.2701-.403.3914-.616.419-.7375.6224-1.6095.7204-2.5288.0346-.3243.047-.6503.0594-.9831l.0022-.0584c.0099-.2568.0099-1.0415.0099-1.0415zm.7427-8.19h2.2326v2.2319h2.9764v2.9764h-2.9764V4.4654h-2.2326V2.2328Z"/></svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

Loaded 100 of 214 files, more files were not shown because too many files have changed in this diff. Show more