🍓 Sync 2026-09-15 02:13:06

This commit is contained in:
github-actions[bot] committed 2026-09-15 02:13:06 +08:00
1 parent 0e5393594c
commit 1dd96ac2bb
146 files changed
+26541 -508

No files matched your search

+4 -4
View File
@@ -10,12 +10,12 @@ AGENTFLOW_ARCH_x86_64:=amd64
AGENTFLOW_ARCH_aarch64:=arm64
AGENTFLOW_ARCH:=$(AGENTFLOW_ARCH_$(ARCH))
AGENTFLOW_HASH_x86_64:=ccf06c24eee59f9638bc0ba42d2ea420723317dccef980a42a51499844fbde2c
AGENTFLOW_HASH_aarch64:=369017b7e7ea359018875cde2ee9260f0eb92d6fda329e82a219b98516bb6350
AGENTFLOW_HASH_x86_64:=95cb43ba4e2ce5f060e3609d050caf25170dc151ba882a3a626494b7750d5fbc
AGENTFLOW_HASH_aarch64:=93e92628b26087b87d8571400e83046197167e4795593e757d4dcf7dac5f8231
PKG_NAME:=agentflow
PKG_VERSION:=0.3.1
PKG_RELEASE:=10
PKG_VERSION:=0.3.3
PKG_RELEASE:=11
AGENTFLOW_URL_FILE:=agentflow-linux-$(AGENTFLOW_ARCH)
AGENTFLOW_DOWNLOAD:=$(AGENTFLOW_URL_FILE)-$(AGENTFLOW_HASH_$(ARCH))
+89
View File
@@ -0,0 +1,89 @@
# SPDX-License-Identifier: GPL-3.0-only
#
# Copyright (C) 2021 ImmortalWrt.org
include $(TOPDIR)/rules.mk
PKG_NAME:=cloudflared-next
PKG_VERSION:=2026.9.1
PKG_RELEASE:=1
# Architecture mapping for pre-built binaries
ifeq ($(ARCH),x86_64)
CF_ARCH:=amd64
endif
ifeq ($(ARCH),aarch64)
CF_ARCH:=arm64
endif
ifeq ($(ARCH),arm64)
CF_ARCH:=arm64
endif
ifeq ($(ARCH),armv8)
CF_ARCH:=arm64
endif
ifeq ($(ARCH),arm)
CF_ARCH:=arm
endif
ifeq ($(ARCH),armv7)
CF_ARCH:=arm
endif
ifeq ($(ARCH),i386)
CF_ARCH:=386
endif
PKG_SOURCE:=cloudflared-linux-$(CF_ARCH)-$(PKG_VERSION)
PKG_SOURCE_URL:=https://github.com/cloudflare/cloudflared/releases/download/$(PKG_VERSION)/cloudflared-linux-$(CF_ARCH)?
PKG_HASH:=skip
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)
PKG_LICENSE:=Apache-2.0
PKG_LICENSE_FILES:=LICENSE
PKG_MAINTAINER:=Tianling Shen <cnsztl@immortalwrt.org>
include $(INCLUDE_DIR)/package.mk
define Package/cloudflared-next
SECTION:=net
CATEGORY:=Network
SUBMENU:=Web Servers/Proxies
TITLE:=Cloudflare Tunnel client Next - Pre-built Binary
URL:=https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/get-started/
DEPENDS:=@(x86_64||aarch64||arm||i386) +ca-bundle
PROVIDES:=cloudflared
CONFLICTS:=cloudflared
endef
define Package/cloudflared-next/description
Contains the command-line client for Cloudflare Tunnel, a tunneling
daemon that proxies traffic from the Cloudflare network to your origins.
This package contains official pre-built static binaries.
endef
define Package/cloudflared-next/conffiles
/etc/config/cloudflared
/etc/cloudflared/
endef
define Build/Prepare
mkdir -p $(PKG_BUILD_DIR)
$(CP) $(DL_DIR)/$(PKG_SOURCE) $(PKG_BUILD_DIR)/cloudflared
chmod 0755 $(PKG_BUILD_DIR)/cloudflared
endef
define Build/Compile
endef
define Package/cloudflared-next/install
$(INSTALL_DIR) $(1)/usr/bin
$(INSTALL_BIN) $(PKG_BUILD_DIR)/cloudflared $(1)/usr/bin/cloudflared
$(INSTALL_DIR) $(1)/etc/cloudflared/
$(INSTALL_CONF) $(CURDIR)/files/sample_config.yml $(1)/etc/cloudflared/config.yml
$(INSTALL_DIR) $(1)/etc/config/
$(INSTALL_CONF) $(CURDIR)/files/cloudflared.config $(1)/etc/config/cloudflared
$(INSTALL_DIR) $(1)/etc/init.d/
$(INSTALL_BIN) $(CURDIR)/files/cloudflared.init $(1)/etc/init.d/cloudflared
endef
$(eval $(call BuildPackage,cloudflared-next))
+17
View File
@@ -0,0 +1,17 @@
config cloudflared 'config'
option enabled '0'
option token ''
# option config '/etc/cloudflared/config.yml'
# option origincert '/etc/cloudflared/cert.pem'
option edge_bind_address ''
option edge_ip_version ''
option grace_period ''
option protocol 'auto'
option region ''
option retries ''
option tag ''
option metrics ''
option loglevel 'info'
option logfile '/var/log/cloudflared.log'
+64
View File
@@ -0,0 +1,64 @@
#!/bin/sh /etc/rc.common
# Copyright (C) 2021 Tianling Shen <cnsztl@immortalwrt.org>
USE_PROCD=1
START=99
CONF="cloudflared"
PROG="/usr/bin/cloudflared"
append_param_arg() {
local value
config_get value "config" "$1" $2
[ -n "$value" ] && procd_append_param command "--${1//_/-}" "$value"
}
start_service() {
config_load "$CONF"
local enabled
local token
config_get_bool enabled "config" "enabled"
[ "$enabled" -eq "1" ] || return 1
procd_open_instance "$CONF"
procd_set_param command "$PROG" "tunnel"
procd_append_param command "--no-autoupdate"
append_param_arg "edge_bind_address"
append_param_arg "edge_ip_version"
append_param_arg "grace_period"
append_param_arg "protocol"
append_param_arg "region"
append_param_arg "retries"
append_param_arg "tag"
append_param_arg "metrics"
append_param_arg "loglevel"
append_param_arg "logfile"
config_get token "config" "token"
if [ -z "$token" ]; then
# Locally-managed tunnels
append_param_arg "config" "/etc/cloudflared/config.yml"
append_param_arg "origincert" "/etc/cloudflared/cert.pem"
fi
procd_append_param command "run"
if [ -n "$token" ]; then
# Remotely-managed tunnel (recommended by Cloudflare)
procd_append_param command "--token" "$token"
fi
procd_set_param respawn
procd_set_param stderr 1
procd_close_instance
}
service_triggers() {
procd_add_reload_trigger "$CONF"
procd_add_interface_trigger "interface.*.up" "wan" /etc/init.d/cloudflared restart
}
+17
View File
@@ -0,0 +1,17 @@
# https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/do-more-with-tunnels/local-management/configuration-file/
# NOTICE
# Cloudflare recommends setting up a remotely-managed tunnel.
# Remotely-managed configurations are stored on Cloudflare,
# which allows you to manage the tunnel from any machine
# using the dashboard, API, or Terraform.
#tunnel: <Tunnel-UUID>
#credentials-file: /etc/cloudflared/<Tunnel-UUID>.json
#
#ingress:
# - hostname: luci.example.com
# service: http://localhost:80
# - hostname: ssh.example.com
# service: ssh://localhost:22
# - service: http_status:404
+3
View File
@@ -0,0 +1,3 @@
#!/bin/sh
cloudflared --version | grep "$PKG_VERSION"
+78
View File
@@ -0,0 +1,78 @@
#!/bin/bash
# 自动更新 OpenWrt cloudflared-next 包的版本和 Hash
# 依赖: curl, grep, sed, sha256sum (或 shasum)
set -e
PKG_DIR=$(cd "$(dirname "$0")"; pwd)
MAKEFILE="$PKG_DIR/Makefile"
if [ ! -f "$MAKEFILE" ]; then
echo "错误: 找不到 Makefile 文件 ($MAKEFILE)"
exit 1
fi
# 1. 获取当前本地版本
CURRENT_VERSION=$(grep 'PKG_VERSION:=' "$MAKEFILE" | cut -d'=' -f2 | tr -d ' ')
echo "当前本地版本: $CURRENT_VERSION"
# 2. 获取 GitHub 上的最新版本号
# 注意: cloudflared 的 tag 通常是 2024.x.y 这种格式,无需特殊处理
LATEST_VERSION=$(curl -s https://api.github.com/repos/cloudflare/cloudflared/releases/latest | grep '"tag_name":' | sed -E 's/.*"([^"]+)".*/\1/' | sed 's/^v//')
if [ -z "$LATEST_VERSION" ]; then
echo "错误: 无法从 GitHub 获取最新版本号。"
exit 1
fi
echo "GitHub 最新版本: $LATEST_VERSION"
# 3. 比较版本
if [ "$CURRENT_VERSION" == "$LATEST_VERSION" ]; then
echo "版本已经是最新,无需更新。"
exit 0
fi
echo "发现新版本! 正在准备更新..."
# 4. 下载新版本的源码包并计算 Hash
SOURCE_URL="https://codeload.github.com/cloudflare/cloudflared/tar.gz/$LATEST_VERSION"
echo "正在从 $SOURCE_URL 下载并计算 Hash..."
# 探测可用的哈希计算工具
if command -v sha256sum >/dev/null 2>&1; then
NEW_HASH=$(curl -sL "$SOURCE_URL" | sha256sum | cut -d' ' -f1)
elif command -v shasum >/dev/null 2>&1; then
NEW_HASH=$(curl -sL "$SOURCE_URL" | shasum -a 256 | cut -d' ' -f1)
else
echo "错误: 系统中未找到 sha256sum 或 shasum 命令。"
exit 1
fi
if [ -z "$NEW_HASH" ] || [ ${#NEW_HASH} -ne 64 ]; then
echo "错误: 计算得到的 Hash 值无效: $NEW_HASH"
exit 1
fi
echo "新 Hash 值: $NEW_HASH"
# 5. 更新 Makefile
# 使用特定的正则表达式确保精准替换
if [[ "$OSTYPE" == "darwin"* ]]; then
sed -i '' "s/PKG_VERSION:=.*/PKG_VERSION:=$LATEST_VERSION/" "$MAKEFILE"
sed -i '' "s/PKG_HASH:=.*/PKG_HASH:=$NEW_HASH/" "$MAKEFILE"
else
sed -i "s/PKG_VERSION:=.*/PKG_VERSION:=$LATEST_VERSION/" "$MAKEFILE"
sed -i "s/PKG_HASH:=.*/PKG_HASH:=$NEW_HASH/" "$MAKEFILE"
fi
echo "Makefile 更新成功: $CURRENT_VERSION -> $LATEST_VERSION"
# 6. 可选: 提交更改 (如果是在 Git 仓库中且您希望自动提交)
# cd "$PKG_DIR/.."
# if [ -d ".git" ]; then
# git add cloudflared-next/Makefile
# git commit -m "cloudflared-next: update to version $LATEST_VERSION"
# echo "已在本地 Git 仓库中提交更新。"
# fi
+96
View File
@@ -0,0 +1,96 @@
include $(TOPDIR)/rules.mk
-include $(dir $(lastword $(MAKEFILE_LIST)))../version.mk
PKG_NAME:=easytier-next
PKG_VERSION:=2.6.4
PKG_RELEASE:=1
# Architecture mapping for pre-built binaries
ifeq ($(ARCH),mipsel)
APP_ARCH:=mipsel
endif
ifeq ($(ARCH),mips)
APP_ARCH:=mips
endif
ifeq ($(ARCH),arm)
APP_ARCH:=arm
endif
ifeq ($(BOARD),kirkwood)
APP_ARCH:=arm
endif
ifeq ($(ARCH),armv7)
APP_ARCH:=armv7
endif
ifeq ($(ARCH),aarch64)
APP_ARCH:=aarch64
endif
ifeq ($(ARCH),arm64)
APP_ARCH:=aarch64
endif
ifeq ($(ARCH),armv8)
APP_ARCH:=aarch64
endif
ifeq ($(ARCH),x86_64)
APP_ARCH:=x86_64
endif
PKG_SOURCE:=easytier-linux-$(APP_ARCH)-v$(PKG_VERSION).zip
PKG_SOURCE_URL:=https://github.com/EasyTier/EasyTier/releases/download/v$(PKG_VERSION)/
PKG_HASH:=skip
PKG_LICENSE:=Apache-2.0
PKG_LICENSE_FILES:=LICENSE
PKG_MAINTAINER:=Dante <dante@seckv.com>
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)
include $(INCLUDE_DIR)/package.mk
define Package/$(PKG_NAME)
SECTION:=net
CATEGORY:=Network
SUBMENU:=VPN
TITLE:=A simple, decentralized mesh VPN with WireGuard support (Next)
URL:=https://github.com/EasyTier/EasyTier
DEPENDS:=@(x86_64||arm||aarch64||mipsel||mips) +kmod-tun
PROVIDES:=easytier
CONFLICTS:=easytier
endef
define Package/$(PKG_NAME)/description
A simple, decentralized mesh VPN with WireGuard support.
endef
define Package/$(PKG_NAME)/config
config EASYTIER_INCLUDE_WEBCONSOLE
bool "Include Web Console (easytier-web)"
depends on PACKAGE_$(PKG_NAME)
depends on !(mips || mipsel)
default y
help
Install the easytier-web web console.
endef
define Build/Prepare
mkdir -p $(PKG_BUILD_DIR)
unzip -q -o $(DL_DIR)/$(PKG_SOURCE) -d $(PKG_BUILD_DIR)
find $(PKG_BUILD_DIR) -mindepth 2 -type f -exec mv -f {} $(PKG_BUILD_DIR)/ \;
endef
define Build/Compile
endef
define Package/$(PKG_NAME)/install
$(INSTALL_DIR) $(1)/usr/bin
$(INSTALL_BIN) $(PKG_BUILD_DIR)/easytier-core $(1)/usr/bin/
$(INSTALL_BIN) $(PKG_BUILD_DIR)/easytier-cli $(1)/usr/bin/
ifdef CONFIG_EASYTIER_INCLUDE_WEBCONSOLE
if [ -f $(PKG_BUILD_DIR)/easytier-web-embed ]; then \
$(INSTALL_BIN) $(PKG_BUILD_DIR)/easytier-web-embed $(1)/usr/bin/easytier-web; \
elif [ -f $(PKG_BUILD_DIR)/easytier-web ]; then \
$(INSTALL_BIN) $(PKG_BUILD_DIR)/easytier-web $(1)/usr/bin/easytier-web; \
fi
endif
endef
$(eval $(call BuildPackage,$(PKG_NAME)))
+63
View File
@@ -0,0 +1,63 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=frpc-next
PKG_VERSION:=0.71.0
PKG_RELEASE:=1
# Architecture mapping for pre-built binaries
ifeq ($(ARCH),mipsel)
FRP_ARCH:=mipsle
endif
ifeq ($(ARCH),mips)
FRP_ARCH:=mips
endif
ifeq ($(ARCH),i386)
FRP_ARCH:=386
endif
ifeq ($(ARCH),x86_64)
FRP_ARCH:=amd64
endif
ifeq ($(ARCH),arm)
FRP_ARCH:=arm
endif
ifeq ($(ARCH),aarch64)
FRP_ARCH:=arm64
endif
PKG_SOURCE:=frp_$(PKG_VERSION)_linux_$(FRP_ARCH).tar.gz
PKG_SOURCE_URL:=https://github.com/fatedier/frp/releases/download/v$(PKG_VERSION)/
PKG_HASH:=skip
PKG_LICENSE:=Apache-2.0
PKG_LICENSE_FILES:=LICENSE
PKG_MAINTAINER:=Dante <dante@seckv.com>
PKG_BUILD_DIR:=$(BUILD_DIR)/frp_$(PKG_VERSION)_linux_$(FRP_ARCH)
include $(INCLUDE_DIR)/package.mk
define Package/frpc-next
SECTION:=net
CATEGORY:=Network
SUBMENU:=Web Servers/Proxies
TITLE:=A fast reverse proxy (Client) - Binary
URL:=https://github.com/fatedier/frp
DEPENDS:=@(i386||x86_64||arm||aarch64||mipsel||mips)
PROVIDES:=frpc
CONFLICTS:=frpc
endef
define Package/frpc-next/description
frp is a fast reverse proxy to help you expose a local server behind a
NAT or firewall to the internet. This package contains the pre-built frpc client.
endef
define Build/Compile
endef
define Package/frpc-next/install
$(INSTALL_DIR) $(1)/usr/bin
$(INSTALL_BIN) $(PKG_BUILD_DIR)/frpc $(1)/usr/bin/
endef
$(eval $(call BuildPackage,frpc-next))
+3
View File
@@ -0,0 +1,3 @@
#!/bin/sh
frpc --version | grep "$PKG_VERSION"
+45
View File
@@ -0,0 +1,45 @@
#!/bin/bash
# 自动更新 OpenWrt frpc-next 包的版本和 Hash
# 依赖: curl, grep, sed, sha256sum (或 shasum)
set -e
PKG_DIR=$(cd "$(dirname "$0")"; pwd)
MAKEFILE="$PKG_DIR/Makefile"
if [ ! -f "$MAKEFILE" ]; then
echo "错误: 找不到 Makefile 文件 ($MAKEFILE)"
exit 1
fi
# 1. 获取当前本地版本
CURRENT_VERSION=$(grep 'PKG_VERSION:=' "$MAKEFILE" | cut -d'=' -f2 | tr -d ' ')
echo "当前本地版本: $CURRENT_VERSION"
# 2. 获取 GitHub 上的最新版本号
LATEST_VERSION=$(curl -s https://api.github.com/repos/fatedier/frp/releases/latest | grep '"tag_name":' | sed -E 's/.*"([^"]+)".*/\1/' | sed 's/^v//')
if [ -z "$LATEST_VERSION" ]; then
echo "错误: 无法从 GitHub 获取最新版本号。"
exit 1
fi
echo "GitHub 最新版本: $LATEST_VERSION"
# 3. 比较版本
if [ "$CURRENT_VERSION" == "$LATEST_VERSION" ]; then
echo "版本已经是最新,无需更新。"
exit 0
fi
echo "发现新版本! 正在准备更新..."
# 4. 更新 Makefile
if [[ "$OSTYPE" == "darwin"* ]]; then
sed -i '' "s/PKG_VERSION:=.*/PKG_VERSION:=$LATEST_VERSION/" "$MAKEFILE"
else
sed -i "s/PKG_VERSION:=.*/PKG_VERSION:=$LATEST_VERSION/" "$MAKEFILE"
fi
echo "Makefile 更新成功: $CURRENT_VERSION -> $LATEST_VERSION (Binary Mode)"
+70
View File
@@ -0,0 +1,70 @@
# SPDX-License-Identifier: Apache-2.0
#
# Copyright (C) 2026 Dante <dante@seckv.com>
#
# This is free software, licensed under the Apache License, Version 2.0 .
#
include $(TOPDIR)/rules.mk
PKG_NAME:=linkback
PKG_VERSION:=1.0.0
PKG_RELEASE:=1
PKG_MAINTAINER:=Dante
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)
include $(INCLUDE_DIR)/package.mk
define Package/$(PKG_NAME)
SECTION:=net
CATEGORY:=Network
SUBMENU:=Routing and Redirection
TITLE:=LinkBack gateway switch daemon
DEPENDS:=+libuci +libubus +libubox +libblobmsg-json +ip-full
MAINTAINER:=Dante
endef
define Package/$(PKG_NAME)/description
LinkBack: A highly efficient and lightweight C-based Multi-WAN link health monitoring
and dynamic route metric failover/failback daemon. Supports Ping, DNS, and TCP probes.
endef
define Package/$(PKG_NAME)/conffiles
/etc/config/linkback
endef
define Build/Prepare
mkdir -p $(PKG_BUILD_DIR)
$(CP) ./src/* $(PKG_BUILD_DIR)/
endef
define Build/Compile
$(MAKE) -C $(PKG_BUILD_DIR) \
CC="$(TARGET_CC)" \
CFLAGS="$(TARGET_CFLAGS)" \
LDFLAGS="$(TARGET_LDFLAGS)"
endef
define Package/$(PKG_NAME)/install
# Install C daemon binary
$(INSTALL_DIR) $(1)/usr/sbin
$(INSTALL_BIN) $(PKG_BUILD_DIR)/linkbackd $(1)/usr/sbin/linkbackd
# Install config and init files
$(INSTALL_DIR) $(1)/etc/config
$(INSTALL_CONF) ./files/linkback.config $(1)/etc/config/linkback
$(INSTALL_DIR) $(1)/etc/init.d
$(INSTALL_BIN) ./files/linkback.init $(1)/etc/init.d/linkback
endef
define Package/$(PKG_NAME)/postinst
#!/sh
[ -n "$${IPKG_INSTROOT}" ] || {
/etc/init.d/linkback enable
/etc/init.d/linkback restart
}
exit 0
endef
$(eval $(call BuildPackage,$(PKG_NAME)))
+9
View File
@@ -0,0 +1,9 @@
config global
option enabled '0'
option check_interval '5'
option check_timeout '3'
option recovery_delay '3'
option failover_delay '2'
+32
View File
@@ -0,0 +1,32 @@
#!/bin/sh /etc/rc.common
START=99
USE_PROCD=1
_get_global_enabled() {
config_get_bool _GLOBAL_ENABLED "$1" "enabled" 0
}
start_service() {
config_load "linkback"
local _GLOBAL_ENABLED=0
config_foreach _get_global_enabled "global"
[ "$_GLOBAL_ENABLED" -eq 1 ] || return 0
procd_open_instance "main"
procd_set_param command /usr/sbin/linkbackd
procd_set_param respawn
procd_set_param stdout 1
procd_set_param stderr 1
procd_close_instance
}
reload_service() {
stop
start
}
service_triggers() {
procd_add_reload_trigger "linkback"
}
+18
View File
@@ -0,0 +1,18 @@
TARGET := linkbackd
OBJS := linkbackd.o
CFLAGS += -Wall -O2
LIBS := -luci
all: $(TARGET)
$(TARGET): $(OBJS)
$(CC) $(CFLAGS) $(OBJS) -o $(TARGET) $(LDFLAGS) $(LIBS)
%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
clean:
rm -f *.o $(TARGET)
.PHONY: all clean
+849
View File
@@ -0,0 +1,849 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <signal.h>
#include <syslog.h>
#include <sys/socket.h>
#include <sys/time.h>
#include <sys/types.h>
#include <sys/select.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <fcntl.h>
#include <errno.h>
#include <uci.h>
#include "linkbackd.h"
// DNS Header struct for raw check
struct dns_header {
unsigned short id;
unsigned short flags;
unsigned short qdcount;
unsigned short ancount;
unsigned short nscount;
unsigned short arcount;
};
// Global daemon state
static global_config_t global_cfg;
static link_t links[MAX_LINKS];
static int link_count = 0;
static volatile bool keep_running = true;
// Prototypes
static void restore_all_metrics(void);
static bool validate_loaded_config(void);
static void handle_signal(int sig) {
syslog(LOG_INFO, "Received signal %d, exiting...", sig);
keep_running = false;
}
// Ubus popen JSON parser
static bool get_interface_ubus_status(const char *ifname, char *device, int dev_len, char *gateway, int gw_len, bool *is_up) {
char cmd[256];
snprintf(cmd, sizeof(cmd), "ubus call network.interface.%s status 2>/dev/null", ifname);
FILE *fp = popen(cmd, "r");
if (!fp) return false;
char buf[4096] = {0};
int bytes_read = fread(buf, 1, sizeof(buf) - 1, fp);
pclose(fp);
if (bytes_read <= 0) return false;
// Check if interface is up
*is_up = false;
char *p_up = strstr(buf, "\"up\":");
if (p_up) {
char *p_true = strstr(p_up, "true");
// Ensure 'true' belongs to this property and isn't far away
if (p_true && p_true - p_up < 10) {
*is_up = true;
}
}
// Extract physical device
device[0] = '\0';
char *p_dev = strstr(buf, "\"l3_device\":");
int dev_key_len = 12;
if (!p_dev) {
p_dev = strstr(buf, "\"device\":");
dev_key_len = 9;
}
if (p_dev) {
char *p_start = strchr(p_dev + dev_key_len, '"');
if (p_start) {
char *p_end = strchr(p_start + 1, '"');
if (p_end) {
int len = p_end - p_start - 1;
if (len >= dev_len) len = dev_len - 1;
strncpy(device, p_start + 1, len);
device[len] = '\0';
}
}
}
// Extract gateway/nexthop from route list
gateway[0] = '\0';
char *p_route = strstr(buf, "\"route\":");
if (p_route) {
char *p_nexthop = strstr(p_route, "\"nexthop\":");
if (p_nexthop) {
char *p_start = strchr(p_nexthop + 10, '"');
if (p_start) {
char *p_end = strchr(p_start + 1, '"');
if (p_end) {
int len = p_end - p_start - 1;
if (len >= gw_len) len = gw_len - 1;
strncpy(gateway, p_start + 1, len);
gateway[len] = '\0';
}
}
}
}
return true;
}
// Ping check
static bool run_ping_check(const char *device, const char *target, int timeout, int *rtt_ms) {
if (device[0] == '\0' || target[0] == '\0') return false;
char cmd[256];
snprintf(cmd, sizeof(cmd), "ping -I %s -c 1 -W %d %s 2>/dev/null", device, timeout, target);
FILE *fp = popen(cmd, "r");
if (!fp) return false;
char line[128];
bool ok = false;
*rtt_ms = -1;
while (fgets(line, sizeof(line), fp)) {
char *p = strstr(line, "time=");
if (p) {
ok = true;
double rtt = atof(p + 5);
*rtt_ms = (int)rtt;
}
}
int status = pclose(fp);
return ok && (WIFEXITED(status) && WEXITSTATUS(status) == 0);
}
// DNS check
static bool run_dns_check(const char *device, const char *dns_server, const char *domain, int timeout, int *rtt_ms) {
if (device[0] == '\0' || dns_server[0] == '\0' || domain[0] == '\0') return false;
struct timeval start, end;
gettimeofday(&start, NULL);
int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if (sockfd < 0) return false;
// Set non-blocking
int flags = fcntl(sockfd, F_GETFL, 0);
fcntl(sockfd, F_SETFL, flags | O_NONBLOCK);
// Bind to device
if (setsockopt(sockfd, SOL_SOCKET, SO_BINDTODEVICE, device, strlen(device)) < 0) {
close(sockfd);
return false;
}
struct sockaddr_in servaddr;
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(53);
if (inet_pton(AF_INET, dns_server, &servaddr.sin_addr) <= 0) {
close(sockfd);
return false;
}
// Format DNS packet
unsigned char packet[512];
memset(packet, 0, sizeof(packet));
struct dns_header *dns = (struct dns_header *)packet;
dns->id = (unsigned short)htons(getpid());
dns->flags = htons(0x0100);
dns->qdcount = htons(1);
unsigned char *qname = packet + sizeof(struct dns_header);
const char *src = domain;
unsigned char *dst = qname;
while (*src) {
const char *next = strchr(src, '.');
int len = next ? (next - src) : strlen(src);
*dst++ = len;
memcpy(dst, src, len);
dst += len;
src = next ? (next + 1) : (src + len);
}
*dst++ = 0;
unsigned short *qtype = (unsigned short *)dst;
*qtype = htons(1); // A Record
dst += 2;
unsigned short *qclass = (unsigned short *)dst;
*qclass = htons(1); // IN
dst += 2;
int packet_len = dst - packet;
if (sendto(sockfd, packet, packet_len, 0, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0) {
if (errno != EAGAIN && errno != EWOULDBLOCK) {
close(sockfd);
return false;
}
}
fd_set readfds;
FD_ZERO(&readfds);
FD_SET(sockfd, &readfds);
struct timeval tv;
tv.tv_sec = timeout;
tv.tv_usec = 0;
int sel = select(sockfd + 1, &readfds, NULL, NULL, &tv);
if (sel <= 0) {
close(sockfd);
return false;
}
unsigned char response[512];
struct sockaddr_in from;
socklen_t from_len = sizeof(from);
int resp_len = recvfrom(sockfd, response, sizeof(response), 0, (struct sockaddr *)&from, &from_len);
close(sockfd);
if (resp_len < 12) return false;
struct dns_header *resp_dns = (struct dns_header *)response;
if (ntohs(resp_dns->id) != getpid()) return false;
gettimeofday(&end, NULL);
*rtt_ms = (int)((end.tv_sec - start.tv_sec) * 1000 + (end.tv_usec - start.tv_usec) / 1000);
return true;
}
// TCP check
static bool run_tcp_check(const char *device, const char *tcp_target, int port, int timeout, int *rtt_ms) {
if (device[0] == '\0' || tcp_target[0] == '\0' || port <= 0) return false;
struct timeval start, end;
gettimeofday(&start, NULL);
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0) return false;
// Set non-blocking
int flags = fcntl(sockfd, F_GETFL, 0);
fcntl(sockfd, F_SETFL, flags | O_NONBLOCK);
// Bind to device
if (setsockopt(sockfd, SOL_SOCKET, SO_BINDTODEVICE, device, strlen(device)) < 0) {
close(sockfd);
return false;
}
struct sockaddr_in addr;
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(port);
if (inet_pton(AF_INET, tcp_target, &addr.sin_addr) <= 0) {
close(sockfd);
return false;
}
int rc = connect(sockfd, (struct sockaddr *)&addr, sizeof(addr));
if (rc < 0) {
if (errno != EINPROGRESS) {
close(sockfd);
return false;
}
} else {
gettimeofday(&end, NULL);
*rtt_ms = (int)((end.tv_sec - start.tv_sec) * 1000 + (end.tv_usec - start.tv_usec) / 1000);
close(sockfd);
return true;
}
fd_set writefds;
FD_ZERO(&writefds);
FD_SET(sockfd, &writefds);
struct timeval tv;
tv.tv_sec = timeout;
tv.tv_usec = 0;
int sel = select(sockfd + 1, NULL, &writefds, NULL, &tv);
if (sel <= 0) {
close(sockfd);
return false;
}
int optval;
socklen_t optlen = sizeof(optval);
if (getsockopt(sockfd, SOL_SOCKET, SO_ERROR, &optval, &optlen) < 0 || optval != 0) {
close(sockfd);
return false;
}
gettimeofday(&end, NULL);
*rtt_ms = (int)((end.tv_sec - start.tv_sec) * 1000 + (end.tv_usec - start.tv_usec) / 1000);
close(sockfd);
return true;
}
// UCI parser helper
static bool load_config(void) {
struct uci_context *ctx = uci_alloc_context();
if (!ctx) return false;
struct uci_package *pkg = NULL;
if (uci_load(ctx, "linkback", &pkg) != UCI_OK) {
uci_free_context(ctx);
return false;
}
// Parse global config
global_cfg.enabled = false;
struct uci_section *global_sec = uci_lookup_section(ctx, pkg, "global");
if (!global_sec) {
struct uci_element *ge;
uci_foreach_element(&pkg->sections, ge) {
struct uci_section *s = uci_to_section(ge);
if (strcmp(s->type, "global") == 0) {
global_sec = s;
break;
}
}
}
if (global_sec) {
const char *enabled = uci_lookup_option_string(ctx, global_sec, "enabled");
global_cfg.enabled = (enabled && strcmp(enabled, "1") == 0);
}
// Parse links
link_count = 0;
struct uci_element *e;
uci_foreach_element(&pkg->sections, e) {
struct uci_section *s = uci_to_section(e);
if (strcmp(s->type, "link") != 0) continue;
const char *enabled = uci_lookup_option_string(ctx, s, "enabled");
if (enabled && strcmp(enabled, "0") == 0) continue;
link_t *link = &links[link_count];
memset(link, 0, sizeof(link_t));
const char *name = uci_lookup_option_string(ctx, s, "name");
if (!name) continue;
strncpy(link->name, name, MAX_NAME_LEN - 1);
link->enabled = true;
const char *priority = uci_lookup_option_string(ctx, s, "priority");
int prio_val = priority ? atoi(priority) : 1;
link->priority = (prio_val > 0) ? prio_val : 1;
link->metric = link->priority * 10;
link->current_metric = link->metric;
// Parse ping targets (split by comma or space)
const char *pings = uci_lookup_option_string(ctx, s, "ping_targets");
if (pings) {
char tmp[256];
strncpy(tmp, pings, sizeof(tmp) - 1);
tmp[sizeof(tmp) - 1] = '\0';
char *token = strtok(tmp, ", \t");
while (token && link->ping_target_count < MAX_TARGETS) {
// Trim leading whitespace
while (*token == ' ' || *token == '\t' || *token == '\r' || *token == '\n') {
token++;
}
// Trim trailing whitespace
char *end = token + strlen(token) - 1;
while (end > token && (*end == ' ' || *end == '\t' || *end == '\r' || *end == '\n')) {
*end = '\0';
end--;
}
if (*token != '\0') {
strncpy(link->ping_targets[link->ping_target_count], token, MAX_IP_LEN - 1);
link->ping_target_count++;
}
token = strtok(NULL, ",");
}
}
// Parse DNS targets
const char *dns_srv = uci_lookup_option_string(ctx, s, "dns_server");
if (dns_srv) strncpy(link->dns_server, dns_srv, MAX_IP_LEN - 1);
const char *dns_dom = uci_lookup_option_string(ctx, s, "dns_domain");
if (dns_dom) strncpy(link->dns_domain, dns_dom, MAX_DOMAIN_LEN - 1);
// Parse TCP targets
const char *tcp_tgt = uci_lookup_option_string(ctx, s, "tcp_target");
if (tcp_tgt) strncpy(link->tcp_target, tcp_tgt, MAX_IP_LEN - 1);
const char *tcp_p = uci_lookup_option_string(ctx, s, "tcp_port");
if (tcp_p) link->tcp_port = atoi(tcp_p);
const char *interval = uci_lookup_option_string(ctx, s, "check_interval");
link->check_interval = interval ? atoi(interval) : 5;
const char *timeout = uci_lookup_option_string(ctx, s, "check_timeout");
link->check_timeout = timeout ? atoi(timeout) : 3;
const char *recovery = uci_lookup_option_string(ctx, s, "recovery_delay");
link->recovery_delay = recovery ? atoi(recovery) : 3;
const char *failover = uci_lookup_option_string(ctx, s, "failover_delay");
link->failover_delay = failover ? atoi(failover) : 2;
// Default runtime states
link->healthy = true;
link->is_up = false;
link->last_checked = 0; // Force immediate check on startup
link_count++;
if (link_count >= MAX_LINKS) break;
}
uci_unload(ctx, pkg);
uci_free_context(ctx);
if (!validate_loaded_config()) {
return false;
}
return true;
}
// Startup-time defensive validation. LuCI-side checks can be bypassed by
// direct UCI edits, so daemon must refuse unsafe/incomplete configs.
static bool validate_loaded_config(void) {
if (!global_cfg.enabled) {
return true;
}
if (link_count < 2) {
syslog(LOG_ERR, "Invalid config: at least 2 enabled monitored links are required, got %d.", link_count);
return false;
}
for (int i = 0; i < link_count; i++) {
link_t *a = &links[i];
if (a->name[0] == '\0') {
syslog(LOG_ERR, "Invalid config: link[%d] has empty interface name.", i);
return false;
}
if (a->priority <= 0) {
syslog(LOG_ERR, "Invalid config: link %s has invalid priority %d (must be > 0).", a->name, a->priority);
return false;
}
if (a->metric <= 0) {
syslog(LOG_ERR, "Invalid config: link %s has invalid metric %d (must be > 0).", a->name, a->metric);
return false;
}
// No duplicate priorities
for (int j = i + 1; j < link_count; j++) {
link_t *b = &links[j];
if (a->priority == b->priority) {
syslog(LOG_ERR, "Invalid config: duplicate priority %d on links %s and %s.", a->priority, a->name, b->name);
return false;
}
}
bool has_ping = (a->ping_target_count > 0);
bool has_dns = (a->dns_server[0] != '\0' && a->dns_domain[0] != '\0');
bool has_tcp = (a->tcp_target[0] != '\0' && a->tcp_port > 0);
int check_count = 0;
if (has_ping) check_count++;
if (has_dns) check_count++;
if (has_tcp) check_count++;
if (check_count == 0) {
syslog(LOG_ERR, "Invalid config: link %s has no complete health-check probe configured.", a->name);
return false;
}
if (check_count > 1) {
syslog(LOG_ERR, "Invalid config: link %s has multiple health-check probes configured. Only one check type is allowed.", a->name);
return false;
}
if ((a->dns_server[0] != '\0') != (a->dns_domain[0] != '\0')) {
syslog(LOG_ERR, "Invalid config: link %s DNS probe is incomplete (dns_server + dns_domain required).", a->name);
return false;
}
if ((a->tcp_target[0] != '\0') != (a->tcp_port > 0)) {
syslog(LOG_ERR, "Invalid config: link %s TCP probe is incomplete (tcp_target + tcp_port required).", a->name);
return false;
}
if (a->check_interval <= 0 || a->check_timeout <= 0 ||
a->recovery_delay <= 0 || a->failover_delay <= 0) {
syslog(LOG_ERR, "Invalid config: link %s timing values must be > 0.", a->name);
return false;
}
}
return true;
}
// Retrieve the real default route metric for a device from /proc/net/route
static int get_system_route_metric(const char *device, int expected_metric) {
if (device[0] == '\0') return -1;
FILE *fp = fopen("/proc/net/route", "r");
if (!fp) return -1;
char line[256];
char iface[32];
unsigned long dest;
int metric = -1;
int first_found_metric = -1;
bool found_expected = false;
// Skip header line
if (fgets(line, sizeof(line), fp)) {
while (fgets(line, sizeof(line), fp)) {
// Destination is 2nd column, Metric is 7th column, dest is in hex.
// Use %*s for Gateway and Flags to safely skip non-numeric characters.
if (sscanf(line, "%31s %lx %*s %*s %*d %*d %d", iface, &dest, &metric) == 3) {
if (strcmp(iface, device) == 0 && dest == 0) {
if (first_found_metric == -1) {
first_found_metric = metric;
}
if (metric == expected_metric) {
found_expected = true;
break;
}
}
}
}
}
fclose(fp);
if (found_expected) {
return expected_metric;
}
return first_found_metric;
}
// Compare priority for sorting (lowest priority number is highest precedence)
static int compare_links(const void *a, const void *b) {
link_t *la = (link_t *)a;
link_t *lb = (link_t *)b;
return la->priority - lb->priority;
}
// Dynamic route update using ip route command
static void update_route_metric(link_t *link, int new_metric, int old_metric_to_delete) {
if (link->device[0] == '\0') return;
char cmd[512];
// 1. Delete the specified old metric to prevent duplicate routes
if (old_metric_to_delete != -1 && old_metric_to_delete != new_metric) {
if (link->gateway[0] != '\0') {
snprintf(cmd, sizeof(cmd), "ip route del default via %s dev %s metric %d 2>/dev/null",
link->gateway, link->device, old_metric_to_delete);
} else {
snprintf(cmd, sizeof(cmd), "ip route del default dev %s metric %d 2>/dev/null",
link->device, old_metric_to_delete);
}
system(cmd);
}
// 2. Delete the current_metric if it is different from new_metric and old_metric_to_delete
if (link->current_metric != new_metric && link->current_metric != old_metric_to_delete) {
if (link->gateway[0] != '\0') {
snprintf(cmd, sizeof(cmd), "ip route del default via %s dev %s metric %d 2>/dev/null",
link->gateway, link->device, link->current_metric);
} else {
snprintf(cmd, sizeof(cmd), "ip route del default dev %s metric %d 2>/dev/null",
link->device, link->current_metric);
}
system(cmd);
}
// 3. Add/replace with new_metric
if (link->gateway[0] != '\0') {
snprintf(cmd, sizeof(cmd), "ip route replace default via %s dev %s metric %d 2>/dev/null",
link->gateway, link->device, new_metric);
} else {
snprintf(cmd, sizeof(cmd), "ip route replace default dev %s metric %d 2>/dev/null",
link->device, new_metric);
}
syslog(LOG_INFO, "Applying route metric update on link %s (%s, priority %d): %d -> %d",
link->name, link->device, link->priority, link->current_metric, new_metric);
int rc = system(cmd);
if (rc == 0) {
link->current_metric = new_metric;
} else {
syslog(LOG_ERR, "Failed to apply route update for %s (priority %d) using cmd: %s", link->name, link->priority, cmd);
}
}
// Restore default metrics on exit
static void restore_all_metrics(void) {
syslog(LOG_INFO, "Restoring all interface metrics on exit...");
for (int i = 0; i < link_count; i++) {
link_t *link = &links[i];
if (link->enabled && link->is_up && link->device[0] != '\0') {
char cmd[512];
// Delete floated metric if it was in fault state
if (link->current_metric != link->metric) {
if (link->gateway[0] != '\0') {
snprintf(cmd, sizeof(cmd), "ip route del default via %s dev %s metric %d 2>/dev/null",
link->gateway, link->device, link->current_metric);
} else {
snprintf(cmd, sizeof(cmd), "ip route del default dev %s metric %d 2>/dev/null",
link->device, link->current_metric);
}
system(cmd);
}
if (link->gateway[0] != '\0') {
snprintf(cmd, sizeof(cmd), "ip route replace default via %s dev %s metric %d 2>/dev/null",
link->gateway, link->device, link->metric);
} else {
snprintf(cmd, sizeof(cmd), "ip route replace default dev %s metric %d 2>/dev/null",
link->device, link->metric);
}
int rc = system(cmd);
if (rc == 0) {
syslog(LOG_INFO, "Successfully restored default metric %d for interface %s (priority %d)", link->metric, link->name, link->priority);
}
}
}
}
// Write status file to /var/run/linkback.json
static void write_status_json(void) {
FILE *fp = fopen(STATUS_FILE, "w");
if (!fp) return;
fprintf(fp, "{\n");
fprintf(fp, " \"enabled\": %s,\n", global_cfg.enabled ? "true" : "false");
fprintf(fp, " \"check_interval\": 5,\n");
// Find current active gateway link (first healthy link ordered by priority)
char active_link[MAX_NAME_LEN] = "none";
for (int i = 0; i < link_count; i++) {
if (links[i].is_up && links[i].healthy) {
strncpy(active_link, links[i].name, MAX_NAME_LEN - 1);
break;
}
}
fprintf(fp, " \"active_link\": \"%s\",\n", active_link);
fprintf(fp, " \"links\": [\n");
for (int i = 0; i < link_count; i++) {
link_t *link = &links[i];
fprintf(fp, " {\n");
fprintf(fp, " \"name\": \"%s\",\n", link->name);
fprintf(fp, " \"priority\": %d,\n", link->priority);
fprintf(fp, " \"metric\": %d,\n", link->metric);
fprintf(fp, " \"current_metric\": %d,\n", link->current_metric);
fprintf(fp, " \"healthy\": %s,\n", link->healthy ? "true" : "false");
fprintf(fp, " \"is_up\": %s,\n", link->is_up ? "true" : "false");
fprintf(fp, " \"device\": \"%s\",\n", link->device);
fprintf(fp, " \"gateway\": \"%s\",\n", link->gateway);
fprintf(fp, " \"score\": %d,\n", link->current_score);
fprintf(fp, " \"threshold\": %d,\n", link->weight_threshold);
fprintf(fp, " \"check_interval\": %d,\n", link->check_interval);
fprintf(fp, " \"check_timeout\": %d,\n", link->check_timeout);
fprintf(fp, " \"recovery_delay\": %d,\n", link->recovery_delay);
fprintf(fp, " \"failover_delay\": %d,\n", link->failover_delay);
const char *type = "none";
if (link->ping_target_count > 0) type = "ping";
else if (link->dns_server[0] != '\0') type = "dns";
else if (link->tcp_target[0] != '\0') type = "tcp";
fprintf(fp, " \"check_type\": \"%s\",\n", type);
fprintf(fp, " \"ping\": {\"ok\": %s, \"rtt\": %d},\n", link->ping_ok ? "true" : "false", link->ping_rtt_ms);
fprintf(fp, " \"dns\": {\"ok\": %s, \"rtt\": %d},\n", link->dns_ok ? "true" : "false", link->dns_rtt_ms);
fprintf(fp, " \"tcp\": {\"ok\": %s, \"rtt\": %d}\n", link->tcp_ok ? "true" : "false", link->tcp_rtt_ms);
fprintf(fp, " }%s\n", (i == link_count - 1) ? "" : ",");
}
fprintf(fp, " ]\n");
fprintf(fp, "}\n");
fclose(fp);
}
int main(int argc, char **argv) {
// Setup syslog
openlog("linkbackd", LOG_PID | LOG_NDELAY, LOG_DAEMON);
syslog(LOG_INFO, "Starting LinkBack daemon...");
// Register signal handlers for clean exits and metric restoration
signal(SIGTERM, handle_signal);
signal(SIGINT, handle_signal);
// Load configuration
if (!load_config()) {
syslog(LOG_ERR, "Failed to load linkback config. Exiting.");
closelog();
return 1;
}
if (!global_cfg.enabled) {
syslog(LOG_WARNING, "LinkBack is disabled globally in configuration. Exiting.");
closelog();
return 0;
}
// Sort links by priority (lowest priority number first)
qsort(links, link_count, sizeof(link_t), compare_links);
syslog(LOG_INFO, "Loaded %d monitored interfaces. Starting health check scheduler.", link_count);
// Core check loop
while (keep_running) {
time_t now = time(NULL);
bool any_checked = false;
for (int i = 0; i < link_count; i++) {
link_t *link = &links[i];
// Check if this interface is due for checking
if (now - link->last_checked < link->check_interval) {
continue;
}
link->last_checked = now;
any_checked = true;
// 1. Fetch real-time netifd status
char dev[MAX_NAME_LEN] = {0};
char gw[MAX_IP_LEN] = {0};
bool is_up = false;
get_interface_ubus_status(link->name, dev, sizeof(dev), gw, sizeof(gw), &is_up);
link->is_up = is_up;
strncpy(link->device, dev, MAX_NAME_LEN - 1);
strncpy(link->gateway, gw, MAX_IP_LEN - 1);
if (!is_up || dev[0] == '\0') {
// Interface is down in netifd, mark unhealthy immediately
link->healthy = false;
link->current_score = 0;
link->ping_ok = false;
link->dns_ok = false;
link->tcp_ok = false;
link->consecutive_success = 0;
link->consecutive_failure = 0;
// If it still has low metric, float it
if (link->current_metric == link->metric) {
update_route_metric(link, 1000 + link->metric, -1);
}
continue;
}
// 2. Perform health checks
bool check_success = false;
if (link->ping_target_count > 0) {
link->ping_ok = false;
link->ping_rtt_ms = -1;
for (int p = 0; p < link->ping_target_count; p++) {
int rtt = -1;
if (run_ping_check(link->device, link->ping_targets[p], link->check_timeout, &rtt)) {
link->ping_ok = true;
link->ping_rtt_ms = rtt;
break;
}
}
check_success = link->ping_ok;
}
else if (link->dns_server[0] != '\0' && link->dns_domain[0] != '\0') {
link->dns_ok = false;
link->dns_rtt_ms = -1;
int rtt = -1;
if (run_dns_check(link->device, link->dns_server, link->dns_domain, link->check_timeout, &rtt)) {
link->dns_ok = true;
link->dns_rtt_ms = rtt;
}
check_success = link->dns_ok;
}
else if (link->tcp_target[0] != '\0' && link->tcp_port > 0) {
link->tcp_ok = false;
link->tcp_rtt_ms = -1;
int rtt = -1;
if (run_tcp_check(link->device, link->tcp_target, link->tcp_port, link->check_timeout, &rtt)) {
link->tcp_ok = true;
link->tcp_rtt_ms = rtt;
}
check_success = link->tcp_ok;
}
link->current_score = check_success ? 1 : 0;
// 3. Evaluate health state changes (filtering and delay)
if (check_success) {
link->consecutive_success++;
link->consecutive_failure = 0;
if (!link->healthy && link->consecutive_success >= link->recovery_delay) {
// Recovered! Failback!
link->healthy = true;
syslog(LOG_NOTICE, "Link %s (%s, priority %d) recovered to healthy after %d successes.",
link->name, link->device, link->priority, link->consecutive_success);
// Restore original metric
update_route_metric(link, link->metric, -1);
}
} else {
link->consecutive_failure++;
link->consecutive_success = 0;
if (link->healthy && link->consecutive_failure >= link->failover_delay) {
// Failed! Failover!
link->healthy = false;
syslog(LOG_WARNING, "Link %s (%s, priority %d) went down after %d failures.",
link->name, link->device, link->priority, link->consecutive_failure);
// Push metric out of choice range
update_route_metric(link, 1000 + link->metric, -1);
}
}
// 4. Active routing metric self-healing to prevent external/netifd interference
if (link->device[0] != '\0') {
int expected_metric = (link->is_up && link->healthy) ? link->metric : (1000 + link->metric);
int real_metric = get_system_route_metric(link->device, expected_metric);
if (real_metric != -1 && real_metric != expected_metric) {
syslog(LOG_WARNING, "Route metric mismatch detected on %s (%s, priority %d): expected %d, got %d. Correcting...",
link->name, link->device, link->priority, expected_metric, real_metric);
update_route_metric(link, expected_metric, real_metric);
}
}
}
if (any_checked) {
// Write states to shared JSON file
write_status_json();
}
// High-responsiveness scheduler ticks every second
sleep(1);
}
// Terminating: clean up routes before exit
restore_all_metrics();
unlink(STATUS_FILE);
syslog(LOG_INFO, "LinkBack daemon terminated successfully.");
closelog();
return 0;
}
+67
View File
@@ -0,0 +1,67 @@
#ifndef LINKBACKD_H
#define LINKBACKD_H
#include <stdbool.h>
#include <time.h>
#define MAX_LINKS 16
#define MAX_NAME_LEN 32
#define MAX_TARGETS 8
#define MAX_IP_LEN 64
#define MAX_DOMAIN_LEN 128
#define STATUS_FILE "/var/run/linkback.json"
typedef struct {
char name[MAX_NAME_LEN];
bool enabled;
int priority;
int metric;
// Ping config
char ping_targets[MAX_TARGETS][MAX_IP_LEN];
int ping_target_count;
int ping_weight;
// DNS config
char dns_server[MAX_IP_LEN];
char dns_domain[MAX_DOMAIN_LEN];
int dns_weight;
// TCP config
char tcp_target[MAX_IP_LEN];
int tcp_port;
int tcp_weight;
// Thresholds
int weight_threshold;
int check_interval;
int check_timeout;
int recovery_delay;
int failover_delay;
// Runtime state
char device[MAX_NAME_LEN]; // physical interface name e.g., pppoe-wan, eth1
char gateway[MAX_IP_LEN]; // gateway IP address
bool is_up; // whether interface is reported up by netifd
bool healthy; // daemon link health state
int consecutive_success;
int consecutive_failure;
time_t last_checked; // Last health check timestamp
// Detailed health checks status
bool ping_ok;
int ping_rtt_ms;
bool dns_ok;
int dns_rtt_ms;
bool tcp_ok;
int tcp_rtt_ms;
int current_score;
int current_metric; // actual system metric applied
} link_t;
typedef struct {
bool enabled;
} global_config_t;
#endif // LINKBACKD_H
+15
View File
@@ -0,0 +1,15 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=luci-app-ap-switch
PKG_VERSION:=1.0.0
PKG_RELEASE:=1
PKG_LICENSE:=Apache-2.0
PKG_MAINTAINER:=Dante
LUCI_TITLE:=LuCI support for one-click AP mode switching
LUCI_DEPENDS:=+luci-base +ucode +ucode-mod-fs +ucode-mod-uci +ucode-mod-ubus
LUCI_PKGARCH:=all
include $(TOPDIR)/feeds/luci/luci.mk
# call BuildPackage - OpenWrt buildroot signature
@@ -0,0 +1,201 @@
'use strict';
'require view';
'require rpc';
'require ui';
'require uci';
var callGetStatus = rpc.declare({
object: 'luci.ap-switch',
method: 'get_status'
});
var callSetMode = rpc.declare({
object: 'luci.ap-switch',
method: 'set_mode',
params: ['mode']
});
var callProbeIP = rpc.declare({
object: 'luci.ap-switch',
method: 'probe_ip'
});
return L.view.extend({
i18n: 'ap-switch',
handleSaveApply: null,
handleSave: null,
handleReset: null,
load: function() {
return Promise.all([
callGetStatus(),
uci.load('ap-switch')
]);
},
render: function(data) {
var self = this;
var status = data[0];
var mode = status.mode || 'router';
var lan_ip = status.lan_ip || 'N/A';
var lan_proto = status.lan_proto || 'static';
var lan_mac = status.lan_mac || 'N/A';
var changeModeRows = [
E('tr', { 'class': 'tr' }, [
E('td', { 'class': 'td left', 'width': '33%' }, _('Switch to %s').format(mode === 'ap' ? _('Router Mode') : _('AP Mode'))),
E('td', { 'class': 'td left' }, [
E('button', {
'class': 'cbi-button cbi-button-apply',
'click': ui.createHandlerFn(self, function() {
return self.handleSwitch(mode === 'ap' ? 'router' : 'ap', status);
})
}, [ (mode === 'ap' ? _('Switch to Router Mode') : _('Switch to AP Mode')) ])
])
])
];
var body = E('div', { 'class': 'cbi-map' }, [
E('h2', {}, _('AP Switch Title') + ' - ' + _('Switch Mode')),
E('div', { 'class': 'cbi-map-descr' }, _('Switch your system runtime configuration smoothly between standard Router and Access Point (AP) modes. Network interfaces and bridge rules will be adjusted automatically.')),
E('fieldset', { 'class': 'cbi-section' }, [
E('legend', {}, _('Current Status')),
E('div', { 'class': 'cbi-section-node' }, [
E('table', { 'class': 'table cbi-section-table' }, [
E('tr', { 'class': 'tr' }, [
E('td', { 'class': 'td left', 'width': '33%' }, _('Operation Mode')),
E('td', { 'class': 'td left' }, E('strong', {}, (mode === 'ap' ? _('Access Point (AP)') : _('Router'))))
]),
E('tr', { 'class': 'tr' }, [
E('td', { 'class': 'td left' }, _('Login URL')),
E('td', { 'class': 'td left' }, lan_ip ? E('a', {
'href': 'http://' + lan_ip,
'target': '_blank',
'style': 'text-decoration: underline; font-weight: bold; color: blue;'
}, 'http://' + lan_ip) : _('N/A'))
]),
E('tr', { 'class': 'tr' }, [
E('td', { 'class': 'td left' }, _('LAN IP Address')),
E('td', { 'class': 'td left' }, [
E('strong', { 'style': 'color: #2196F3;' }, lan_ip || _('Pending...')),
E('span', { 'style': 'margin-left: 10px; color: #666;' }, '(' + lan_proto + ')')
])
]),
E('tr', { 'class': 'tr' }, [
E('td', { 'class': 'td left' }, _('LAN MAC Address')),
E('td', { 'class': 'td left', 'id': 'lan-mac' }, lan_mac)
])
])
])
]),
E('fieldset', { 'class': 'cbi-section' }, [
E('legend', {}, _('Change Mode')),
E('div', { 'class': 'cbi-section-node' }, [
E('table', { 'class': 'table cbi-section-table' }, changeModeRows)
])
])
]);
return body;
},
handleSwitch: function(target_mode, status) {
var self = this;
var executeSwitch = function() {
ui.showModal(null, [
E('p', { 'class': 'spinning' }, _('Applying changes and restarting network...')),
E('p', {}, _('The page will redirect or you may need to manually reconnect to the new IP address in a few moments.'))
]);
return callSetMode(target_mode).then(function(res) {
if (res && res.result === 'success') {
setTimeout(function() {
ui.hideModal();
ui.addNotification(null, E('p', _('Mode switched successfully. Please check your network connection.')), 'info');
}, 5000);
} else {
ui.hideModal();
ui.addNotification(null, E('p', _('Failed to switch mode: %s').format(res.error || 'Unknown error')), 'error');
}
}).catch(function(err) {
ui.hideModal();
ui.addNotification(null, E('p', _('Error calling RPC: %s').format(err.message)), 'error');
});
};
var showConfirmModal = function(title, messages, onConfirm) {
var content = [];
messages.forEach(function(msg) {
content.push(E('p', { 'style': 'margin-bottom: 10px; line-height: 1.5;' }, msg));
});
content.push(E('div', { 'class': 'right', 'style': 'margin-top: 20px;' }, [
E('button', {
'class': 'cbi-button cbi-button-reset',
'click': ui.hideModal
}, _('Cancel')),
E('button', {
'class': 'cbi-button cbi-button-action cbi-button-apply',
'style': 'margin-left: 10px;',
'click': function() {
ui.hideModal();
onConfirm();
}
}, _('Confirm'))
]));
ui.showModal(title, content);
};
if (target_mode === 'ap') {
ui.showModal(null, [
E('p', { 'class': 'spinning' }, _('Auto-probing for future AP IP via DHCP on br-lan...')),
E('p', {}, _('This ensures you can find your way back to the management panel after the switch.'))
]);
return callProbeIP().then(function(res) {
ui.hideModal();
var title = _('Confirm AP Mode Switch');
var messages = [];
if (res && res.ip) {
messages.push(E('span', {}, [
_('Successfully pre-fetched future management IP: '),
E('a', {
'href': 'http://' + res.ip,
'target': '_blank',
'style': 'color: #2196F3; font-weight: bold; text-decoration: underline; word-break: break-all;'
}, 'http://' + res.ip)
]));
messages.push(_('You can use this URL to access this dashboard after the switch.'));
messages.push(_('Are you sure you want to switch to AP mode and restart network?'));
} else {
messages.push(_('WARNING: Failed to pre-fetch IP address via DHCP probe!'));
messages.push(_('This may be because your LAN port is not connected to the main router.'));
messages.push(_('If you proceed, you must find the new IP from your main router client list using MAC: %s').format(status.lan_mac || 'N/A'));
messages.push(_('Do you still want to force the switch anyway?'));
}
showConfirmModal(title, messages, executeSwitch);
}).catch(function(err) {
ui.hideModal();
var title = _('Confirm AP Mode Switch');
var messages = [
_('WARNING: DHCP probe RPC error: %s').format(err.message),
_('If you proceed, you must find the new IP from your main router client list using MAC: %s').format(status.lan_mac || 'N/A'),
_('Do you still want to force the switch anyway?')
];
showConfirmModal(title, messages, executeSwitch);
});
} else {
var title = _('Confirm Router Mode Switch');
var messages = [
_('Switching to Router mode will restore the WAN port and local DHCP server. Your device will use the previous static IP address. Are you sure?')
];
showConfirmModal(title, messages, executeSwitch);
}
}
});
@@ -0,0 +1,116 @@
msgid ""
msgstr "Content-Type: text/plain; charset=UTF-8"
msgid "AP Switch"
msgstr ""
msgid "Switch between Router and Access Point (AP) mode."
msgstr ""
msgid "Current Status"
msgstr ""
msgid "Operation Mode"
msgstr ""
msgid "Access Point (AP)"
msgstr ""
msgid "Router"
msgstr ""
msgid "LAN IP Address"
msgstr ""
msgid "Change Mode"
msgstr ""
msgid "Switch to %s"
msgstr ""
msgid "Router Mode"
msgstr ""
msgid "AP Mode"
msgstr ""
msgid "Switch to Router Mode"
msgstr ""
msgid "Switch to AP Mode"
msgstr ""
msgid "LAN MAC Address"
msgstr ""
msgid "Switching to AP mode will bridge the WAN port into \"br-lan\". The \"br-lan\" interface will become a DHCP client to your main router."
msgstr ""
msgid "Pre-fetch AP IP"
msgstr ""
msgid "Probing for DHCP IP on br-lan..."
msgstr ""
msgid "Successfully fetched IP: %s"
msgstr ""
msgid "Failed to fetch IP. Ensure a LAN port is connected to your main router."
msgstr ""
msgid "Probe IP"
msgstr ""
msgid "Not probed"
msgstr ""
msgid "A valid IP was pre-fetched: %s. You can use this address to log in after the switch."
msgstr ""
msgid "Are you sure you want to proceed?"
msgstr ""
msgid "WARNING: No IP address was pre-fetched via DHCP probe!"
msgstr ""
msgid "We strongly recommend connecting your LAN port to the main router and using \"Probe IP\" first."
msgstr ""
msgid "If you proceed now, you must find the new IP from your main router using MAC: %s"
msgstr ""
msgid "Do you want to proceed anyway or cancel to plug in the cable and try again?"
msgstr ""
msgid "Pending..."
msgstr ""
msgid "Login URL"
msgstr ""
msgid "N/A"
msgstr ""
msgid "None"
msgstr ""
msgid "Are you sure?"
msgstr ""
msgid "Switching to Router mode will restore the WAN port and local DHCP server. Your device will use the previous static IP address. Are you sure?"
msgstr ""
msgid "Applying changes and restarting network..."
msgstr ""
msgid "The page will redirect or you may need to manually reconnect to the new IP address in a few moments."
msgstr ""
msgid "Mode switched successfully. Please check your network connection."
msgstr ""
msgid "Failed to switch mode: %s"
msgstr ""
msgid "Error calling RPC: %s"
msgstr ""
+1
View File
@@ -0,0 +1 @@
zh_Hans
+169
View File
@@ -0,0 +1,169 @@
msgid ""
msgstr "Content-Type: text/plain; charset=UTF-8"
msgid "AP Switch"
msgstr "AP模式切换"
msgid "Switch between Router and Access Point (AP) mode."
msgstr "在路由器模式和访问点 (AP) 模式之间切换。"
msgid "Current Status"
msgstr "当前状态"
msgid "Operation Mode"
msgstr "运行模式"
msgid "Access Point (AP)"
msgstr "访问点 (AP)"
msgid "Router"
msgstr "路由器"
msgid "LAN IP Address"
msgstr "LAN IP 地址"
msgid "Change Mode"
msgstr "更改模式"
msgid "Switch to %s"
msgstr "切换到 %s"
msgid "Router Mode"
msgstr "路由器模式"
msgid "AP Mode"
msgstr "AP 模式"
msgid "Switch to Router Mode"
msgstr "切换到路由器模式"
msgid "Switch to AP Mode"
msgstr "切换到 AP 模式"
msgid "LAN MAC Address"
msgstr "LAN MAC 地址"
msgid "Switching to AP mode will bridge the WAN port into \"br-lan\". The \"br-lan\" interface will become a DHCP client to your main router."
msgstr "切换到 AP 模式会将 WAN 口桥接到 \"br-lan\"。\"br-lan\" 接口将成为主路由器的 DHCP 客户端。"
msgid "Pre-fetch AP IP"
msgstr "预获取 AP IP"
msgid "Probing for DHCP IP on br-lan..."
msgstr "正在 br-lan 接口探测 DHCP IP..."
msgid "Successfully fetched IP: %s"
msgstr "成功获取到 IP:%s"
msgid "Failed to fetch IP. Ensure a LAN port is connected to your main router."
msgstr "获取 IP 失败。请确保 LAN 口已连接到主路由器。"
msgid "Probe IP"
msgstr "开始探测"
msgid "Not probed"
msgstr "未探测"
msgid "A valid IP was pre-fetched: %s. You can use this address to log in after the switch."
msgstr "已预获取到有效的 IP:%s。切换后,您可以使用此地址登录。"
msgid "Are you sure you want to proceed?"
msgstr "确定要继续吗?"
msgid "WARNING: No IP address was pre-fetched via DHCP probe!"
msgstr "警告:未通过 DHCP 探测预获取到 IP 地址!"
msgid "We strongly recommend connecting your LAN port to the main router and using \"Probe IP\" first."
msgstr "强烈建议先将 LAN 口连接到主路由器,并使用“预获取 AP IP”功能。"
msgid "If you proceed now, you must find the new IP from your main router using MAC: %s"
msgstr "如果您现在继续,切换后必须通过 MAC 地址在主路由中查找新 IP:%s"
msgid "Do you want to proceed anyway or cancel to plug in the cable and try again?"
msgstr "您是坚持继续,还是取消操作并在插上网线后重新尝试?"
msgid "Pending..."
msgstr "等待中..."
msgid "Login URL"
msgstr "登录地址"
msgid "N/A"
msgstr "不适用"
msgid "None"
msgstr "无"
msgid "Are you sure?"
msgstr "确定要继续吗?"
msgid "Switching to Router mode will restore the WAN port and local DHCP server. Your device will use the previous static IP address. Are you sure?"
msgstr "切换到路由器模式将恢复 WAN 口和本地 DHCP 服务。您的设备将使用之前的静态 IP 地址。确定要继续吗?"
msgid "Applying changes and restarting network..."
msgstr "正在应用更改并重启网络..."
msgid "The page will redirect or you may need to manually reconnect to the new IP address in a few moments."
msgstr "页面将会重定向,或者您可能需要在片刻后手动连接到新的 IP 地址。"
msgid "Mode switched successfully. Please check your network connection."
msgstr "模式切换成功。请检查您的网络连接。"
msgid "Failed to switch mode: %s"
msgstr "切换模式失败:%s"
msgid "Error calling RPC: %s"
msgstr "调用 RPC 错误:%s"
msgid "Switch Mode"
msgstr "模式切换"
msgid "Switch your system runtime configuration smoothly between standard Router and Access Point (AP) modes. Network interfaces and bridge rules will be adjusted automatically."
msgstr "在标准路由器模式与 AP 桥接访问点模式之间平滑切换系统运行配置。切换后,网口物理桥接规则以及接口 DHCP 客户端行为将自动智能调整。"
msgid "AP Switch Title"
msgstr "AP 模式切换"
msgid "Auto-probing for future AP IP via DHCP on br-lan..."
msgstr "正在通过 br-lan 接口的 DHCP 自动探测未来的 AP 管理 IP 地址..."
msgid "This ensures you can find your way back to the management panel after the switch."
msgstr "这可以确保您在切换模式后,能够顺利找到并登录新的设备管理后台。"
msgid "Successfully pre-fetched future management IP: "
msgstr "成功预先获取到未来的管理 IP:"
msgid "You can use this URL to access this dashboard after the switch."
msgstr "您可以使用此 URL 地址在切换后访问本控制台。"
msgid "Are you sure you want to switch to AP mode and restart network?"
msgstr "您确定要切换到 AP 模式并重启网络吗?"
msgid "WARNING: Failed to pre-fetch IP address via DHCP probe!"
msgstr "警告:通过 DHCP 探测预获取 IP 地址失败!"
msgid "This may be because your LAN port is not connected to the main router."
msgstr "这可能是由于您设备的 LAN 物理端口尚未连接到上层主路由器。"
msgid "If you proceed, you must find the new IP from your main router client list using MAC: %s"
msgstr "如果您继续,切换后必须通过 MAC 地址在上级主路由的客户端列表中查找新 IP:%s"
msgid "Do you still want to force the switch anyway?"
msgstr "您是否仍要强制执行切换?"
msgid "WARNING: DHCP probe RPC error: %s"
msgstr "警告:DHCP 探测 RPC 请求发生错误:%s"
msgid "Confirm AP Mode Switch"
msgstr "确认切换至 AP 模式"
msgid "Confirm Router Mode Switch"
msgstr "确认切换至路由器模式"
msgid "Cancel"
msgstr "取消"
msgid "Confirm"
msgstr "确认"
@@ -0,0 +1,15 @@
config global 'settings'
option mode 'router'
config backup 'router_state'
option lan_proto 'static'
option lan_ipaddr '192.168.1.1'
option lan_netmask '255.255.255.0'
option lan_gateway ''
list lan_dns ''
option dhcp_ignore '0'
option wan_device ''
option wan_disabled '0'
option wan6_disabled '0'
@@ -0,0 +1,5 @@
#!/bin/sh
[ "$1" = "bound" ] || exit 0
echo "$ip" > /tmp/ap_switch_probed_ip
@@ -0,0 +1,13 @@
{
"admin/services/ap_switch": {
"title": "AP Switch",
"action": {
"type": "view",
"path": "ap-switch/ap-switch"
},
"order": 90,
"depends": {
"acl": [ "luci-app-ap-switch" ]
}
}
}
@@ -0,0 +1,19 @@
{
"luci-app-ap-switch": {
"description": "ACL for AP Switch",
"read": {
"uci": [ "ap-switch", "network", "dhcp" ],
"ubus": {
"luci.ap-switch": [ "get_status", "probe_ip" ],
"network.interface": [ "dump" ],
"network.device": [ "status" ]
}
},
"write": {
"uci": [ "ap-switch", "network", "dhcp" ],
"ubus": {
"luci.ap-switch": [ "set_mode" ]
}
}
}
}
@@ -0,0 +1,226 @@
'use strict';
import { cursor } from 'uci';
import { connect } from 'ubus';
import { readfile, unlink } from 'fs';
const UCI_CONFIG = 'ap-switch';
const PROBE_FILE = '/tmp/ap_switch_probed_ip';
const methods = {
get_status: {
call: function() {
let uci_cursor = cursor();
let mode = uci_cursor.get(UCI_CONFIG, 'settings', 'mode') || 'router';
let lan_proto = uci_cursor.get('network', 'lan', 'proto') || 'static';
let lan_ip = ''; // We will get the real-time IP
let ubus_conn = connect();
let lan_mac = '';
let wan_mac = '';
let wan_ip = '';
if (ubus_conn) {
// 1. Get real-time LAN IP and MAC
let lan_status = ubus_conn.call('network.interface.lan', 'status');
if (lan_status && type(lan_status['ipv4-address']) === 'array' && length(lan_status['ipv4-address']) > 0) {
lan_ip = lan_status['ipv4-address'][0].address;
}
let lan_dev = ubus_conn.call('network.device', 'status', { name: 'br-lan' });
lan_mac = lan_dev?.macaddr || '';
// 2. Get current WAN interface status and its physical device MAC
let wan_status = ubus_conn.call('network.interface.wan', 'status');
let wan_device_name = wan_status?.device || '';
if (wan_device_name) {
let wan_dev = ubus_conn.call('network.device', 'status', { name: wan_device_name });
wan_mac = wan_dev?.macaddr || '';
}
// 3. Get current WAN IP
if (wan_status && type(wan_status['ipv4-address']) === 'array' && length(wan_status['ipv4-address']) > 0) {
wan_ip = wan_status['ipv4-address'][0].address;
}
ubus_conn.disconnect();
}
let probed_ip = rtrim(readfile(PROBE_FILE) || '');
return {
mode: mode,
lan_proto: lan_proto,
lan_ip: lan_ip,
lan_mac: lan_mac,
wan_mac: wan_mac,
wan_ip: wan_ip,
probed_ip: probed_ip
};
}
},
probe_ip: {
call: function() {
unlink(PROBE_FILE);
// Run udhcpc on br-lan with a short timeout and our probe script
// -n: exit if no lease
// -q: quit after obtaining lease
// -t 3: send 3 discover packets
// -T 2: pause 2 seconds between packets
let rc = system('udhcpc -i br-lan -n -q -t 3 -T 2 -s /usr/share/luci-app-ap-switch/dhcp-probe.sh >/dev/null 2>&1');
let ip = rtrim(readfile(PROBE_FILE) || '');
return { success: (rc === 0), ip: ip };
}
},
set_mode: {
args: { mode: 'string' },
call: function(request) {
let target_mode = request.args?.mode;
if (target_mode !== 'router' && target_mode !== 'ap') {
return { error: 'Invalid mode' };
}
let uci_cursor = cursor();
let current_mode = uci_cursor.get(UCI_CONFIG, 'settings', 'mode') || 'router';
if (target_mode === current_mode) {
return { result: 'Already in target mode' };
}
if (target_mode === 'ap') {
// --- Switch to AP Mode (Full Lossless Snapshot) ---
// 1. Identify WAN device
let wan_device = uci_cursor.get('network', 'wan', 'device');
if (!wan_device) {
wan_device = uci_cursor.get('network', 'wan', 'ifname');
}
// 2. Full Snapshot Backup of Router Mode state
let lan_proto = uci_cursor.get('network', 'lan', 'proto') || 'static';
let lan_ipaddr = uci_cursor.get('network', 'lan', 'ipaddr') || '';
let lan_netmask = uci_cursor.get('network', 'lan', 'netmask') || '';
let lan_gateway = uci_cursor.get('network', 'lan', 'gateway') || '';
let lan_dns = uci_cursor.get('network', 'lan', 'dns') || [];
let dhcp_ignore = uci_cursor.get('dhcp', 'lan', 'ignore') || '0';
let wan_disabled = uci_cursor.get('network', 'wan', 'disabled') || '0';
let wan6_disabled = uci_cursor.get('network', 'wan6', 'disabled') || '0';
uci_cursor.set(UCI_CONFIG, 'router_state', 'lan_proto', lan_proto);
uci_cursor.set(UCI_CONFIG, 'router_state', 'lan_ipaddr', lan_ipaddr);
uci_cursor.set(UCI_CONFIG, 'router_state', 'lan_netmask', lan_netmask);
uci_cursor.set(UCI_CONFIG, 'router_state', 'lan_gateway', lan_gateway);
uci_cursor.set(UCI_CONFIG, 'router_state', 'lan_dns', lan_dns);
uci_cursor.set(UCI_CONFIG, 'router_state', 'dhcp_ignore', dhcp_ignore);
uci_cursor.set(UCI_CONFIG, 'router_state', 'wan_device', wan_device || '');
uci_cursor.set(UCI_CONFIG, 'router_state', 'wan_disabled', wan_disabled);
uci_cursor.set(UCI_CONFIG, 'router_state', 'wan6_disabled', wan6_disabled);
uci_cursor.set(UCI_CONFIG, 'settings', 'mode', 'ap');
// 3. Bridge WAN device to LAN bridge
if (wan_device) {
uci_cursor.foreach('network', 'device', (s) => {
if (s.name === 'br-lan') {
let ports = s.ports || [];
if (type(ports) === 'string') ports = [ports];
let exists = false;
for (let p in ports) if (p === wan_device) exists = true;
if (!exists) {
push(ports, wan_device);
uci_cursor.set('network', s['.name'], 'ports', ports);
}
}
});
}
// 4. Set LAN to DHCP client
uci_cursor.set('network', 'lan', 'proto', 'dhcp');
uci_cursor.delete('network', 'lan', 'ipaddr');
uci_cursor.delete('network', 'lan', 'netmask');
uci_cursor.delete('network', 'lan', 'gateway');
uci_cursor.delete('network', 'lan', 'dns');
// 5. Disable WAN interface
uci_cursor.set('network', 'wan', 'disabled', '1');
uci_cursor.set('network', 'wan6', 'disabled', '1');
// 6. Disable DHCP Server
uci_cursor.set('dhcp', 'lan', 'ignore', '1');
} else {
// --- Switch to Router Mode (Lossless State Restoration) ---
// 1. Read Snapshot
let wan_device = uci_cursor.get(UCI_CONFIG, 'router_state', 'wan_device');
let lan_proto = uci_cursor.get(UCI_CONFIG, 'router_state', 'lan_proto') || 'static';
let lan_ipaddr = uci_cursor.get(UCI_CONFIG, 'router_state', 'lan_ipaddr') || '192.168.1.1';
let lan_netmask = uci_cursor.get(UCI_CONFIG, 'router_state', 'lan_netmask') || '';
let lan_gateway = uci_cursor.get(UCI_CONFIG, 'router_state', 'lan_gateway') || '';
let lan_dns = uci_cursor.get(UCI_CONFIG, 'router_state', 'lan_dns') || [];
let dhcp_ignore = uci_cursor.get(UCI_CONFIG, 'router_state', 'dhcp_ignore') || '0';
let wan_disabled = uci_cursor.get(UCI_CONFIG, 'router_state', 'wan_disabled') || '0';
let wan6_disabled = uci_cursor.get(UCI_CONFIG, 'router_state', 'wan6_disabled') || '0';
uci_cursor.set(UCI_CONFIG, 'settings', 'mode', 'router');
// 2. Remove WAN device from LAN bridge
if (wan_device) {
uci_cursor.foreach('network', 'device', (s) => {
if (s.name === 'br-lan') {
let ports = s.ports || [];
if (type(ports) === 'string') ports = [ports];
let new_ports = [];
for (let p in ports) if (p !== wan_device) push(new_ports, p);
uci_cursor.set('network', s['.name'], 'ports', new_ports);
}
});
}
// 3. Restore LAN settings accurately without hardcoding
uci_cursor.set('network', 'lan', 'proto', lan_proto);
if (lan_ipaddr) uci_cursor.set('network', 'lan', 'ipaddr', lan_ipaddr);
if (lan_netmask) uci_cursor.set('network', 'lan', 'netmask', lan_netmask);
if (lan_gateway) uci_cursor.set('network', 'lan', 'gateway', lan_gateway);
if (type(lan_dns) === 'array' && length(lan_dns) > 0) {
uci_cursor.set('network', 'lan', 'dns', lan_dns);
} else if (type(lan_dns) === 'string' && lan_dns !== '') {
uci_cursor.set('network', 'lan', 'dns', lan_dns);
}
// 4. Restore WAN / WAN6 states
if (wan_disabled === '1') {
uci_cursor.set('network', 'wan', 'disabled', '1');
} else {
uci_cursor.delete('network', 'wan', 'disabled');
}
if (wan6_disabled === '1') {
uci_cursor.set('network', 'wan6', 'disabled', '1');
} else {
uci_cursor.delete('network', 'wan6', 'disabled');
}
// 5. Restore DHCP Server state
if (dhcp_ignore === '1') {
uci_cursor.set('dhcp', 'lan', 'ignore', '1');
} else {
uci_cursor.delete('dhcp', 'lan', 'ignore');
}
}
uci_cursor.commit('ap-switch');
uci_cursor.commit('network');
uci_cursor.commit('dhcp');
// Apply changes in background
system('/etc/init.d/network restart &');
system('/etc/init.d/dnsmasq restart &');
return { success: true, result: 'success' };
}
}
};
return { 'luci.ap-switch': methods };
+20
View File
@@ -0,0 +1,20 @@
# This is free software, licensed under the Apache License, Version 2.0
#
# Copyright (C) 2024 Hilman Maulana <hilman0.0maulana@gmail.com>
include $(TOPDIR)/rules.mk
PKG_NAME:=luci-app-cloudflared-next
LUCI_TITLE:=LuCI for Cloudflared
LUCI_DEPENDS:=+cloudflared-next
LUCI_DESCRIPTION:=LuCI support for Cloudflare Zero Trust Tunnels
PKG_MAINTAINER:=Hilman Maulana <hilman0.0maulana@gmail.com>, Sergey Ponomarev <stokito@gmail.com>
PKG_VERSION:=1.2
PKG_RELEASE:=1
PKG_LICENSE:=Apache-2.0
include $(TOPDIR)/feeds/luci/luci.mk
# call BuildPackage - OpenWrt buildroot signature
@@ -0,0 +1,102 @@
/* This is free software, licensed under the Apache License, Version 2.0
*
* Copyright (C) 2024 Hilman Maulana <hilman0.0maulana@gmail.com>
*/
'use strict';
'require form';
'require rpc';
'require view';
const callServiceList = rpc.declare({
object: 'service',
method: 'list',
params: ['name'],
expect: { '': {} }
});
function getServiceStatus() {
return L.resolveDefault(callServiceList('cloudflared'), {}).then(function (res) {
var isRunning = false;
try {
isRunning = res['cloudflared']['instances']['cloudflared']['running'];
} catch (ignored) {}
return isRunning;
});
}
return view.extend({
load: function () {
return Promise.all([
getServiceStatus()
]);
},
render: function (data) {
let isRunning = data[0];
let m, s, o;
m = new form.Map('cloudflared', _('Cloudflare Zero Trust Tunnel'),
_('Cloudflare Zero Trust Security services help you get maximum security both from outside and within the network.') + '<br />' +
_('Create and manage your network on the <a %s>Cloudflare Zero Trust</a> dashboard.')
.format('href="https://one.dash.cloudflare.com" target="_blank"') + '<br />' +
_('See <a %s>documentation</a>.')
.format('href="https://openwrt.org/docs/guide-user/services/vpn/cloudfare_tunnel" target="_blank"')
);
s = m.section(form.NamedSection, 'config', 'cloudflared');
o = s.option(form.DummyValue, '_status', _('Status'));
o.rawhtml = true;
o.cfgvalue = function(section_id) {
var span = '<b><span style="color:%s">%s</span></b>';
var renderHTML = isRunning ?
String.format(span, 'green', _('Running')) :
String.format(span, 'red', _('Not Running'));
return renderHTML;
};
o = s.option(form.Flag, 'enabled', _('Enable'));
o.rmempty = false;
o = s.option(form.TextValue, 'token', _('Token'),
_('The tunnel token is shown in the dashboard once you create a tunnel.')
);
o.optional = true;
o.rmempty = false;
o.monospace = true;
o = s.option(form.FileUpload, 'config', _('Config file path'),
_('See <a %s>documentation</a>.')
.format('href="https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/configure-tunnels/local-management/configuration-file/" target="_blank"')
);
o.default = '/etc/cloudflared/config.yml';
o.root_directory = '/etc/cloudflared/';
o.optional = true;
o = s.option(form.FileUpload, 'origincert', _('Certificate of Origin'),
_('The account certificate for your zones authorizing the client to serve as an Origin for that zone') + '<br />' +
_('Obtain a certificate <a %s>here</a>.')
.format('href="https://dash.cloudflare.com/argotunnel" target="_blank"')
);
o.default = '/etc/cloudflared/cert.pem';
o.root_directory = '/etc/cloudflared/';
o.optional = true;
o = s.option(form.ListValue, 'region', _('Region'),
_('The region to which connections are established.')
);
o.value('us', _('United States'));
o.optional = true;
o = s.option(form.ListValue, 'loglevel', _('Logging level'));
o.value('fatal', _('Fatal'));
o.value('error', _('Error'));
o.value('warn', _('Warning'));
o.value('info', _('Info'));
o.value('debug', _('Debug'));
o.default = 'info';
return m.render();
}
});
@@ -0,0 +1,125 @@
/* This is free software, licensed under the Apache License, Version 2.0
*
* Copyright (C) 2024 Hilman Maulana <hilman0.0maulana@gmail.com>
*/
'use strict';
'require fs';
'require ui';
'require view';
'require poll';
function formatLogEntry(logObj) {
var formattedTime = new Date(logObj.time).toISOString().replace('T', ' ').split('.')[0];
var tunnelIDMessage = logObj.tunnelID ? ', ID: ' + logObj.tunnelID : '';
var errorMessage = logObj.error ? ', Error: ' + logObj.error : '';
var ipMessage = logObj.ip ? ', IP: ' + logObj.ip : '';
var configMessage = logObj.config ? ', Config: ' + JSON.stringify(logObj.config) : '';
var connectionMessage = logObj.connection ? ', Connection: ' + JSON.stringify(logObj.connection) : '';
var locationMessage = logObj.location ? ', Location: ' + logObj.location : '';
var protocolMessage = logObj.protocol ? ', Protocol: ' + logObj.protocol : '';
return '[' + formattedTime + '] [' + logObj.level + '] : ' + logObj.message + ipMessage + tunnelIDMessage + errorMessage + configMessage + connectionMessage + locationMessage + protocolMessage;
}
return view.extend({
handleSaveApply: null,
handleSave: null,
handleReset: null,
load: function() {
poll.add(function () {
return fs.read('/var/log/cloudflared.log').then(function(res) {
if (!res || res.trim() === '') {
ui.addNotification(null, E('p', {}, _('Unable to read the interface info from /var/log/cloudflared.log.')));
return '';
}
var logs = res.trim().split('\n').map(function(entry) {
try {
var logObj = JSON.parse(entry);
return logObj.time && logObj.message && logObj.level
? formatLogEntry(logObj)
: '';
} catch (error) {
console.error('Error parsing log entry:', error);
return '';
}
});
logs = logs.filter(function(entry) {
return entry.trim() !== '';
});
var info = logs.join('\n');
var view = document.getElementById('syslog');
var filterLevel = document.getElementById('filter-level').value;
var logDirection = document.getElementById('log-direction').value;
if (view) {
var filteredLogs;
if (filterLevel !== 'all') {
filteredLogs = logs.filter(function(entry) {
var logLevel = entry.match(/\[.*\] \[(.*)\]/)[1].toLowerCase();
return logLevel.includes(filterLevel.toLowerCase());
});
} else {
filteredLogs = logs;
}
if (logDirection === 'up') {
filteredLogs = filteredLogs.reverse();
}
info = filteredLogs.join('\n');
view.innerHTML = info;
}
return info;
});
});
return Promise.resolve('');
},
render: function(info) {
return E([], [
E('h2', { 'class': 'section-title' }, _('Log')),
E('div', { 'id': 'logs' }, [
E('label', { 'for': 'filter-level', 'style': 'margin-right: 8px;' }, _('Filter Level:')),
E('select', { 'id': 'filter-level', 'style': 'margin-right: 8px;' }, [
E('option', { 'value': 'all', 'selected': 'selected' }, _('All')),
E('option', { 'value': 'info' }, _('Info')),
E('option', { 'value': 'warn' }, _('Warn')),
E('option', { 'value': 'error' }, _('Error')),
]),
E('label', { 'for': 'log-direction', 'style': 'margin-right: 8px;' }, _('Log Direction:')),
E('select', { 'id': 'log-direction', 'style': 'margin-right: 8px;' }, [
E('option', { 'value': 'down', 'selected': 'selected' }, _('Down')),
E('option', { 'value': 'up' }, _('Up')),
]),
E('button', {
'id': 'download-log',
'class': 'cbi-button cbi-button-save',
'click': L.bind(this.handleDownloadLog, this),
'style': 'margin-bottom: 8px;'
}, _('Download Log')),
E('textarea', {
'id': 'syslog',
'class': 'cbi-input-textarea',
'style': 'height: 500px; overflow-y: scroll;',
'readonly': 'readonly',
'wrap': 'off',
'rows': 1
}, [ info ])
])
]);
},
handleDownloadLog: function() {
var logs = document.getElementById('syslog').value;
var blob = new Blob([logs], { type: 'text/plain' });
var link = document.createElement('a');
link.href = window.URL.createObjectURL(blob);
link.download = 'cloudflared.log';
link.click();
}
});
@@ -0,0 +1,101 @@
/* This is free software, licensed under the Apache License, Version 2.0
*
* Copyright (C) 2024 Sergey Ponomarev <stokito@gmail.com>
*/
'use strict';
'require view';
'require fs';
function listTunnels() {
let command = '/usr/bin/cloudflared';
let commandArgs = ['tunnel', 'list', '-o', 'json'];
return fs.exec(command, commandArgs).then(function (res) {
if (res.code === 0) {
return JSON.parse(res.stdout);
} else {
throw new Error(res.stdout + ' ' + res.stderr);
}
});
}
return view.extend({
handleSaveApply: null,
handleSave: null,
handleReset: null,
load: function () {
return Promise.all([
listTunnels()
]);
},
render: function (data) {
var tunnels = data[0];
var tunnelRows = tunnels.map(function (tunnel, index) {
var rowClass = index % 2 === 0 ? 'cbi-rowstyle-1' : 'cbi-rowstyle-2';
var tunneldate = new Date(tunnel.created_at).toLocaleString();
return E('tr', { 'class': 'tr ' + rowClass }, [
E('td', {'class': 'td'}, tunnel.name),
E('td', {'class': 'td'}, tunnel.id),
E('td', {'class': 'td'}, tunneldate),
E('td', {'class': 'td'}, tunnel.connections.length)
]);
});
var tunnelTable = [
E('h3', _('Tunnels Information')),
E('table', { 'class': 'table cbi-section-table' }, [
E('tr', { 'class': 'tr table-titles' }, [
E('th', {'class': 'th'}, _('Name')),
E('th', {'class': 'th'}, _('ID')),
E('th', {'class': 'th'}, _('Created At')),
E('th', {'class': 'th'}, _('Connections'))
]),
E(tunnelRows)
])
];
var connectionsTables = tunnels.map(function (tunnel) {
var connectionsTable;
if (tunnel.connections.length > 0) {
var connectionRows = tunnel.connections.map(function (connection, index) {
var rowClass = index % 2 === 0 ? 'cbi-rowstyle-1' : 'cbi-rowstyle-2';
var connectiondate = new Date(connection.opened_at).toLocaleString();
return E('tr', { 'class': 'tr ' + rowClass }, [
E('td', {'class': 'td'}, connection.id),
E('td', {'class': 'td'}, connection.origin_ip),
E('td', {'class': 'td'}, connectiondate),
E('td', {'class': 'td'}, connection.colo_name)
]);
});
connectionsTable = E('table', { 'class': 'table cbi-section-table' }, [
E('tr', { 'class': 'tr table-titles' }, [
E('th', {'class': 'th'}, _('Connection ID')),
E('th', {'class': 'th'}, _('Origin IP')),
E('th', {'class': 'th'}, _('Opened At')),
E('th', {'class': 'th'}, _('Data Center'))
]),
E(connectionRows)
]);
} else {
connectionsTable = E('div', {'class':'cbi-value center'}, [
E('em', _('No connections'))
]);
}
return E('div', {'class': 'cbi-section'}, [
E('h3', _('Connections') + ' ' + tunnel.name),
E(connectionsTable)
]);
});
return E([], [
E('h2', { 'class': 'section-title' }, _('Tunnels')),
E('div', {'class': 'cbi-section'}, tunnelTable),
E(connectionsTables)
]);
}
});
@@ -0,0 +1,207 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"PO-Revision-Date: 2024-07-16 16:41+0000\n"
"Last-Translator: Rex_sa <rex.sa@pm.me>\n"
"Language-Team: Arabic <https://hosted.weblate.org/projects/openwrt/"
"luciapplicationscloudflared/ar/>\n"
"Language: ar\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 "
"&& n%100<=10 ? 3 : n%100>=11 ? 4 : 5;\n"
"X-Generator: Weblate 5.7-dev\n"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:89
msgid "All"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:77
msgid "Certificate of Origin"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:40
msgid ""
"Cloudflare Zero Trust Security services help you get maximum security both "
"from outside and within the network."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:39
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:3
msgid "Cloudflare Zero Trust Tunnel"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:69
msgid "Config file path"
msgstr ""
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:14
msgid "Configuration"
msgstr "التكوين"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:76
msgid "Connection ID"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:54
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:90
msgid "Connections"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:41
msgid ""
"Create and manage your network on the <a %s>Cloudflare Zero Trust</a> "
"dashboard."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:53
msgid "Created At"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:79
msgid "Data Center"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:97
msgid "Debug"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:96
msgid "Down"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:104
msgid "Download Log"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:59
msgid "Enable"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:94
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:92
msgid "Error"
msgstr "خطأ"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:93
msgid "Fatal"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:87
msgid "Filter Level:"
msgstr ""
#: applications/luci-app-cloudflared/root/usr/share/rpcd/acl.d/luci-app-cloudflared.json:3
msgid "Grant access to Cloudflared configuration"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:52
msgid "ID"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:96
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:90
msgid "Info"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:85
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:30
msgid "Log"
msgstr "السجل"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:94
msgid "Log Direction:"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:92
msgid "Logging level"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:51
msgid "Name"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:85
msgid "No connections"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:55
msgid "Not Running"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:79
msgid "Obtain a certificate <a %s>here</a>."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:78
msgid "Opened At"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:77
msgid "Origin IP"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:86
msgid "Region"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:54
msgid "Running"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:43
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:70
msgid "See <a %s>documentation</a>."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:49
msgid "Status"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:78
msgid ""
"The account certificate for your zones authorizing the client to serve as an "
"Origin for that zone"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:87
msgid "The region to which connections are established."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:63
msgid "The tunnel token is shown in the dashboard once you create a tunnel."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:62
msgid "Token"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:96
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:22
msgid "Tunnels"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:48
msgid "Tunnels Information"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:33
msgid "Unable to read the interface info from /var/log/cloudflared.log."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:89
msgid "United States"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:97
msgid "Up"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:91
msgid "Warn"
msgstr "حذر"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:95
msgid "Warning"
msgstr "تحذير"
@@ -0,0 +1,202 @@
msgid ""
msgstr ""
"Last-Translator: Automatically generated\n"
"Language-Team: none\n"
"Language: be\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:89
msgid "All"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:77
msgid "Certificate of Origin"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:40
msgid ""
"Cloudflare Zero Trust Security services help you get maximum security both "
"from outside and within the network."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:39
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:3
msgid "Cloudflare Zero Trust Tunnel"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:69
msgid "Config file path"
msgstr ""
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:14
msgid "Configuration"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:76
msgid "Connection ID"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:54
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:90
msgid "Connections"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:41
msgid ""
"Create and manage your network on the <a %s>Cloudflare Zero Trust</a> "
"dashboard."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:53
msgid "Created At"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:79
msgid "Data Center"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:97
msgid "Debug"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:96
msgid "Down"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:104
msgid "Download Log"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:59
msgid "Enable"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:94
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:92
msgid "Error"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:93
msgid "Fatal"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:87
msgid "Filter Level:"
msgstr ""
#: applications/luci-app-cloudflared/root/usr/share/rpcd/acl.d/luci-app-cloudflared.json:3
msgid "Grant access to Cloudflared configuration"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:52
msgid "ID"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:96
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:90
msgid "Info"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:85
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:30
msgid "Log"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:94
msgid "Log Direction:"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:92
msgid "Logging level"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:51
msgid "Name"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:85
msgid "No connections"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:55
msgid "Not Running"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:79
msgid "Obtain a certificate <a %s>here</a>."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:78
msgid "Opened At"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:77
msgid "Origin IP"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:86
msgid "Region"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:54
msgid "Running"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:43
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:70
msgid "See <a %s>documentation</a>."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:49
msgid "Status"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:78
msgid ""
"The account certificate for your zones authorizing the client to serve as an "
"Origin for that zone"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:87
msgid "The region to which connections are established."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:63
msgid "The tunnel token is shown in the dashboard once you create a tunnel."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:62
msgid "Token"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:96
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:22
msgid "Tunnels"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:48
msgid "Tunnels Information"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:33
msgid "Unable to read the interface info from /var/log/cloudflared.log."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:89
msgid "United States"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:97
msgid "Up"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:91
msgid "Warn"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:95
msgid "Warning"
msgstr ""
@@ -0,0 +1,206 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"PO-Revision-Date: 2026-03-15 08:27+0000\n"
"Last-Translator: Daniel Konstantinov <bgshadow2010@gmail.com>\n"
"Language-Team: Bulgarian <https://hosted.weblate.org/projects/openwrt/"
"luciapplicationscloudflared/bg/>\n"
"Language: bg\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 5.17-dev\n"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:89
msgid "All"
msgstr "Всички"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:77
msgid "Certificate of Origin"
msgstr "Сертификат за произход"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:40
msgid ""
"Cloudflare Zero Trust Security services help you get maximum security both "
"from outside and within the network."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:39
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:3
msgid "Cloudflare Zero Trust Tunnel"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:69
msgid "Config file path"
msgstr ""
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:14
msgid "Configuration"
msgstr "Настройки"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:76
msgid "Connection ID"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:54
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:90
msgid "Connections"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:41
msgid ""
"Create and manage your network on the <a %s>Cloudflare Zero Trust</a> "
"dashboard."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:53
msgid "Created At"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:79
msgid "Data Center"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:97
msgid "Debug"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:96
msgid "Down"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:104
msgid "Download Log"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:59
msgid "Enable"
msgstr "Активиране"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:94
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:92
msgid "Error"
msgstr "Грешка"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:93
msgid "Fatal"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:87
msgid "Filter Level:"
msgstr ""
#: applications/luci-app-cloudflared/root/usr/share/rpcd/acl.d/luci-app-cloudflared.json:3
msgid "Grant access to Cloudflared configuration"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:52
msgid "ID"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:96
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:90
msgid "Info"
msgstr "Инфо"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:85
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:30
msgid "Log"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:94
msgid "Log Direction:"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:92
msgid "Logging level"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:51
msgid "Name"
msgstr "Име"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:85
msgid "No connections"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:55
msgid "Not Running"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:79
msgid "Obtain a certificate <a %s>here</a>."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:78
msgid "Opened At"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:77
msgid "Origin IP"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:86
msgid "Region"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:54
msgid "Running"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:43
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:70
msgid "See <a %s>documentation</a>."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:49
msgid "Status"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:78
msgid ""
"The account certificate for your zones authorizing the client to serve as an "
"Origin for that zone"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:87
msgid "The region to which connections are established."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:63
msgid "The tunnel token is shown in the dashboard once you create a tunnel."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:62
msgid "Token"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:96
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:22
msgid "Tunnels"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:48
msgid "Tunnels Information"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:33
msgid "Unable to read the interface info from /var/log/cloudflared.log."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:89
msgid "United States"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:97
msgid "Up"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:91
msgid "Warn"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:95
msgid "Warning"
msgstr ""
@@ -0,0 +1,206 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"PO-Revision-Date: 2025-04-15 20:45+0000\n"
"Last-Translator: Random Github User <shahariarrabby1@gmail.com>\n"
"Language-Team: Bengali (Bangladesh) <https://hosted.weblate.org/projects/"
"openwrt/luciapplicationscloudflared/bn_BD/>\n"
"Language: bn_BD\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n > 1;\n"
"X-Generator: Weblate 5.11-dev\n"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:89
msgid "All"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:77
msgid "Certificate of Origin"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:40
msgid ""
"Cloudflare Zero Trust Security services help you get maximum security both "
"from outside and within the network."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:39
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:3
msgid "Cloudflare Zero Trust Tunnel"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:69
msgid "Config file path"
msgstr ""
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:14
msgid "Configuration"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:76
msgid "Connection ID"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:54
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:90
msgid "Connections"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:41
msgid ""
"Create and manage your network on the <a %s>Cloudflare Zero Trust</a> "
"dashboard."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:53
msgid "Created At"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:79
msgid "Data Center"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:97
msgid "Debug"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:96
msgid "Down"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:104
msgid "Download Log"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:59
msgid "Enable"
msgstr "সক্রিয় করুন"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:94
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:92
msgid "Error"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:93
msgid "Fatal"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:87
msgid "Filter Level:"
msgstr ""
#: applications/luci-app-cloudflared/root/usr/share/rpcd/acl.d/luci-app-cloudflared.json:3
msgid "Grant access to Cloudflared configuration"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:52
msgid "ID"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:96
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:90
msgid "Info"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:85
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:30
msgid "Log"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:94
msgid "Log Direction:"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:92
msgid "Logging level"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:51
msgid "Name"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:85
msgid "No connections"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:55
msgid "Not Running"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:79
msgid "Obtain a certificate <a %s>here</a>."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:78
msgid "Opened At"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:77
msgid "Origin IP"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:86
msgid "Region"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:54
msgid "Running"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:43
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:70
msgid "See <a %s>documentation</a>."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:49
msgid "Status"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:78
msgid ""
"The account certificate for your zones authorizing the client to serve as an "
"Origin for that zone"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:87
msgid "The region to which connections are established."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:63
msgid "The tunnel token is shown in the dashboard once you create a tunnel."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:62
msgid "Token"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:96
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:22
msgid "Tunnels"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:48
msgid "Tunnels Information"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:33
msgid "Unable to read the interface info from /var/log/cloudflared.log."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:89
msgid "United States"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:97
msgid "Up"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:91
msgid "Warn"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:95
msgid "Warning"
msgstr ""
@@ -0,0 +1,206 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"PO-Revision-Date: 2025-12-02 19:00+0000\n"
"Last-Translator: Alfonso Montero López <amontero@tinet.org>\n"
"Language-Team: Catalan <https://hosted.weblate.org/projects/openwrt/"
"luciapplicationscloudflared/ca/>\n"
"Language: ca\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 5.15-dev\n"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:89
msgid "All"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:77
msgid "Certificate of Origin"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:40
msgid ""
"Cloudflare Zero Trust Security services help you get maximum security both "
"from outside and within the network."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:39
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:3
msgid "Cloudflare Zero Trust Tunnel"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:69
msgid "Config file path"
msgstr ""
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:14
msgid "Configuration"
msgstr "Configuració"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:76
msgid "Connection ID"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:54
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:90
msgid "Connections"
msgstr "Connexions"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:41
msgid ""
"Create and manage your network on the <a %s>Cloudflare Zero Trust</a> "
"dashboard."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:53
msgid "Created At"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:79
msgid "Data Center"
msgstr "Centre de dades"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:97
msgid "Debug"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:96
msgid "Down"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:104
msgid "Download Log"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:59
msgid "Enable"
msgstr "Activa"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:94
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:92
msgid "Error"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:93
msgid "Fatal"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:87
msgid "Filter Level:"
msgstr ""
#: applications/luci-app-cloudflared/root/usr/share/rpcd/acl.d/luci-app-cloudflared.json:3
msgid "Grant access to Cloudflared configuration"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:52
msgid "ID"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:96
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:90
msgid "Info"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:85
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:30
msgid "Log"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:94
msgid "Log Direction:"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:92
msgid "Logging level"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:51
msgid "Name"
msgstr "Nom"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:85
msgid "No connections"
msgstr "Cap connexió"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:55
msgid "Not Running"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:79
msgid "Obtain a certificate <a %s>here</a>."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:78
msgid "Opened At"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:77
msgid "Origin IP"
msgstr "IP origen"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:86
msgid "Region"
msgstr "Regió"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:54
msgid "Running"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:43
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:70
msgid "See <a %s>documentation</a>."
msgstr "Vegeu <a %s>la documentació</a>."
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:49
msgid "Status"
msgstr "Estat"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:78
msgid ""
"The account certificate for your zones authorizing the client to serve as an "
"Origin for that zone"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:87
msgid "The region to which connections are established."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:63
msgid "The tunnel token is shown in the dashboard once you create a tunnel."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:62
msgid "Token"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:96
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:22
msgid "Tunnels"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:48
msgid "Tunnels Information"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:33
msgid "Unable to read the interface info from /var/log/cloudflared.log."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:89
msgid "United States"
msgstr "Estats Units"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:97
msgid "Up"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:91
msgid "Warn"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:95
msgid "Warning"
msgstr ""
@@ -0,0 +1,212 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"PO-Revision-Date: 2026-03-08 17:33+0000\n"
"Last-Translator: Pavel Borecki <pavel.borecki@gmail.com>\n"
"Language-Team: Czech <https://hosted.weblate.org/projects/openwrt/"
"luciapplicationscloudflared/cs/>\n"
"Language: cs\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=((n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2);\n"
"X-Generator: Weblate 5.17-dev\n"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:89
msgid "All"
msgstr "Vše"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:77
msgid "Certificate of Origin"
msgstr "Certifikát původu"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:40
msgid ""
"Cloudflare Zero Trust Security services help you get maximum security both "
"from outside and within the network."
msgstr ""
"Cloudflare Zero Trust bezpečnostní služby pomáhají získat maximální "
"bezpečnost zvenčí a zevnitř sítě."
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:39
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:3
msgid "Cloudflare Zero Trust Tunnel"
msgstr "Tunel Cloudflare Zero Trust"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:69
msgid "Config file path"
msgstr "Popis umístění souboru s nastaveními"
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:14
msgid "Configuration"
msgstr "Nastavení"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:76
msgid "Connection ID"
msgstr "Identif. spojení"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:54
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:90
msgid "Connections"
msgstr "Spojení"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:41
msgid ""
"Create and manage your network on the <a %s>Cloudflare Zero Trust</a> "
"dashboard."
msgstr ""
"Svou síť vytvoříte a spravujete na přehledu u <a %s>Cloudflare Zero Trust</"
"a>."
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:53
msgid "Created At"
msgstr "Vytvořeno v"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:79
msgid "Data Center"
msgstr "Datacentrum"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:97
msgid "Debug"
msgstr "Ladění"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:96
msgid "Down"
msgstr "Dole"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:104
msgid "Download Log"
msgstr "Stáhnout si záznam událostí"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:59
msgid "Enable"
msgstr "Povolit"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:94
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:92
msgid "Error"
msgstr "Chyba"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:93
msgid "Fatal"
msgstr "Zásadní"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:87
msgid "Filter Level:"
msgstr "Úroveň filtru:"
#: applications/luci-app-cloudflared/root/usr/share/rpcd/acl.d/luci-app-cloudflared.json:3
msgid "Grant access to Cloudflared configuration"
msgstr "Udělit přístup do nastavování Cloudflared"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:52
msgid "ID"
msgstr "Identifikátor"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:96
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:90
msgid "Info"
msgstr "Info"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:85
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:30
msgid "Log"
msgstr "Záznam událostí"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:94
msgid "Log Direction:"
msgstr "Směr záznamu událostí:"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:92
msgid "Logging level"
msgstr "Stupeň podrobnosti zaznamenávání událostí"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:51
msgid "Name"
msgstr "Název"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:85
msgid "No connections"
msgstr "Žádná spojení"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:55
msgid "Not Running"
msgstr "Nespuštěné"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:79
msgid "Obtain a certificate <a %s>here</a>."
msgstr "Certifikát získejte <a %s>zde</a>."
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:78
msgid "Opened At"
msgstr "Otevřít v"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:77
msgid "Origin IP"
msgstr "IP adresa původu"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:86
msgid "Region"
msgstr "Oblast"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:54
msgid "Running"
msgstr "Spuštěné"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:43
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:70
msgid "See <a %s>documentation</a>."
msgstr "Viz <a %s>dokumentace</a>."
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:49
msgid "Status"
msgstr "Stav"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:78
msgid ""
"The account certificate for your zones authorizing the client to serve as an "
"Origin for that zone"
msgstr ""
"Certifikát účtu pro vaše pověřování zón ke které klient slouží jako původ "
"pro takovou zónu"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:87
msgid "The region to which connections are established."
msgstr "Oblast do které jsou spojení navázány."
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:63
msgid "The tunnel token is shown in the dashboard once you create a tunnel."
msgstr "Token tunelu je zobrazen v přehledu poté co vytvoříte tunel."
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:62
msgid "Token"
msgstr "Token"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:96
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:22
msgid "Tunnels"
msgstr "Tunely"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:48
msgid "Tunnels Information"
msgstr "Informace o tunelech"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:33
msgid "Unable to read the interface info from /var/log/cloudflared.log."
msgstr "Nepodařilo se načíst informace o rozhraní z /var/log/cloudflared.log."
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:89
msgid "United States"
msgstr "Spojené státy"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:97
msgid "Up"
msgstr "Nahoře"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:91
msgid "Warn"
msgstr "Varov."
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:95
msgid "Warning"
msgstr "Varování"
@@ -0,0 +1,203 @@
msgid ""
msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Project-Id-Version: PACKAGE VERSION\n"
"Last-Translator: Automatically generated\n"
"Language-Team: none\n"
"Language: da\n"
"MIME-Version: 1.0\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:89
msgid "All"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:77
msgid "Certificate of Origin"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:40
msgid ""
"Cloudflare Zero Trust Security services help you get maximum security both "
"from outside and within the network."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:39
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:3
msgid "Cloudflare Zero Trust Tunnel"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:69
msgid "Config file path"
msgstr ""
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:14
msgid "Configuration"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:76
msgid "Connection ID"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:54
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:90
msgid "Connections"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:41
msgid ""
"Create and manage your network on the <a %s>Cloudflare Zero Trust</a> "
"dashboard."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:53
msgid "Created At"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:79
msgid "Data Center"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:97
msgid "Debug"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:96
msgid "Down"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:104
msgid "Download Log"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:59
msgid "Enable"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:94
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:92
msgid "Error"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:93
msgid "Fatal"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:87
msgid "Filter Level:"
msgstr ""
#: applications/luci-app-cloudflared/root/usr/share/rpcd/acl.d/luci-app-cloudflared.json:3
msgid "Grant access to Cloudflared configuration"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:52
msgid "ID"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:96
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:90
msgid "Info"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:85
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:30
msgid "Log"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:94
msgid "Log Direction:"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:92
msgid "Logging level"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:51
msgid "Name"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:85
msgid "No connections"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:55
msgid "Not Running"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:79
msgid "Obtain a certificate <a %s>here</a>."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:78
msgid "Opened At"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:77
msgid "Origin IP"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:86
msgid "Region"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:54
msgid "Running"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:43
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:70
msgid "See <a %s>documentation</a>."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:49
msgid "Status"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:78
msgid ""
"The account certificate for your zones authorizing the client to serve as an "
"Origin for that zone"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:87
msgid "The region to which connections are established."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:63
msgid "The tunnel token is shown in the dashboard once you create a tunnel."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:62
msgid "Token"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:96
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:22
msgid "Tunnels"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:48
msgid "Tunnels Information"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:33
msgid "Unable to read the interface info from /var/log/cloudflared.log."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:89
msgid "United States"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:97
msgid "Up"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:91
msgid "Warn"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:95
msgid "Warning"
msgstr ""
@@ -0,0 +1,214 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"PO-Revision-Date: 2026-03-02 15:14+0000\n"
"Last-Translator: Werner Schleifer <werner.schleifer@gmail.com>\n"
"Language-Team: German <https://hosted.weblate.org/projects/openwrt/"
"luciapplicationscloudflared/de/>\n"
"Language: de\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 5.16.1-dev\n"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:89
msgid "All"
msgstr "Alle"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:77
msgid "Certificate of Origin"
msgstr "Ursprungsbescheinigung"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:40
msgid ""
"Cloudflare Zero Trust Security services help you get maximum security both "
"from outside and within the network."
msgstr ""
"Cloudflare Zero Trust Security Services helfen Ihnen, maximale Sicherheit "
"sowohl von außerhalb als auch innerhalb des Netzwerks zu erhalten."
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:39
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:3
msgid "Cloudflare Zero Trust Tunnel"
msgstr "Cloudflare Zero Trust- Tunnel"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:69
msgid "Config file path"
msgstr "Konfig-Dateipfad"
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:14
msgid "Configuration"
msgstr "Konfiguration"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:76
msgid "Connection ID"
msgstr "Verbindungs-ID"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:54
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:90
msgid "Connections"
msgstr "Verbindungen"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:41
msgid ""
"Create and manage your network on the <a %s>Cloudflare Zero Trust</a> "
"dashboard."
msgstr ""
"Erstellen und verwalten Sie Ihr Netzwerk auf dem <a %s>Cloudflare Zero "
"Trust</a>-Dashboard."
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:53
msgid "Created At"
msgstr "Erstellt am"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:79
msgid "Data Center"
msgstr "Rechenzentrum"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:97
msgid "Debug"
msgstr "Debug"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:96
msgid "Down"
msgstr "Runter"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:104
msgid "Download Log"
msgstr "Log herunterladen"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:59
msgid "Enable"
msgstr "Aktivieren"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:94
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:92
msgid "Error"
msgstr "Fehler"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:93
msgid "Fatal"
msgstr "Schwerwiegend"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:87
msgid "Filter Level:"
msgstr "Filterebene:"
#: applications/luci-app-cloudflared/root/usr/share/rpcd/acl.d/luci-app-cloudflared.json:3
msgid "Grant access to Cloudflared configuration"
msgstr "Zugriff auf Cloudflared-Konfiguration gewähren"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:52
msgid "ID"
msgstr "ID"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:96
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:90
msgid "Info"
msgstr "Info"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:85
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:30
msgid "Log"
msgstr "Log"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:94
msgid "Log Direction:"
msgstr "Log-Richtung:"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:92
msgid "Logging level"
msgstr "Protokollierungsebene"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:51
msgid "Name"
msgstr "Name"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:85
msgid "No connections"
msgstr "Keine Verbindungen"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:55
msgid "Not Running"
msgstr "Angehalten"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:79
msgid "Obtain a certificate <a %s>here</a>."
msgstr "Ein Zertifikat <a %s>hier</a> erhalten."
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:78
msgid "Opened At"
msgstr "Geöffnet Am"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:77
msgid "Origin IP"
msgstr "Ursprungs-IP"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:86
msgid "Region"
msgstr "Region"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:54
msgid "Running"
msgstr "Läuft"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:43
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:70
msgid "See <a %s>documentation</a>."
msgstr "Siehe <a %s>Dokumentation</a>."
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:49
msgid "Status"
msgstr "Status"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:78
msgid ""
"The account certificate for your zones authorizing the client to serve as an "
"Origin for that zone"
msgstr ""
"Das Konto-Zertifikat für Ihre Zonen, das den Client berechtigt, als Origin "
"für diese Zone zu dienen"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:87
msgid "The region to which connections are established."
msgstr "Der Bereich, zu dem Verbindungen aufgebaut werden."
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:63
msgid "The tunnel token is shown in the dashboard once you create a tunnel."
msgstr ""
"Der Tunnel-Token wird im Dashboard angezeigt, sobald Sie einen Tunnel "
"erstellen."
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:62
msgid "Token"
msgstr "Token"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:96
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:22
msgid "Tunnels"
msgstr "Tunnels"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:48
msgid "Tunnels Information"
msgstr "Tunnel-Informationen"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:33
msgid "Unable to read the interface info from /var/log/cloudflared.log."
msgstr "Kann die Interface-Info nicht von /var/log/cloudflared.log lesen."
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:89
msgid "United States"
msgstr "Vereinigte Staaten"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:97
msgid "Up"
msgstr "Oben"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:91
msgid "Warn"
msgstr "Warn"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:95
msgid "Warning"
msgstr "Warnung"
@@ -0,0 +1,206 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"PO-Revision-Date: 2025-05-03 17:07+0000\n"
"Last-Translator: george kitsoukakis <norhorn@gmail.com>\n"
"Language-Team: Greek <https://hosted.weblate.org/projects/openwrt/"
"luciapplicationscloudflared/el/>\n"
"Language: el\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 5.12-dev\n"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:89
msgid "All"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:77
msgid "Certificate of Origin"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:40
msgid ""
"Cloudflare Zero Trust Security services help you get maximum security both "
"from outside and within the network."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:39
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:3
msgid "Cloudflare Zero Trust Tunnel"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:69
msgid "Config file path"
msgstr ""
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:14
msgid "Configuration"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:76
msgid "Connection ID"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:54
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:90
msgid "Connections"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:41
msgid ""
"Create and manage your network on the <a %s>Cloudflare Zero Trust</a> "
"dashboard."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:53
msgid "Created At"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:79
msgid "Data Center"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:97
msgid "Debug"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:96
msgid "Down"
msgstr "Κάτω"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:104
msgid "Download Log"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:59
msgid "Enable"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:94
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:92
msgid "Error"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:93
msgid "Fatal"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:87
msgid "Filter Level:"
msgstr ""
#: applications/luci-app-cloudflared/root/usr/share/rpcd/acl.d/luci-app-cloudflared.json:3
msgid "Grant access to Cloudflared configuration"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:52
msgid "ID"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:96
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:90
msgid "Info"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:85
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:30
msgid "Log"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:94
msgid "Log Direction:"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:92
msgid "Logging level"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:51
msgid "Name"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:85
msgid "No connections"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:55
msgid "Not Running"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:79
msgid "Obtain a certificate <a %s>here</a>."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:78
msgid "Opened At"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:77
msgid "Origin IP"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:86
msgid "Region"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:54
msgid "Running"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:43
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:70
msgid "See <a %s>documentation</a>."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:49
msgid "Status"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:78
msgid ""
"The account certificate for your zones authorizing the client to serve as an "
"Origin for that zone"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:87
msgid "The region to which connections are established."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:63
msgid "The tunnel token is shown in the dashboard once you create a tunnel."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:62
msgid "Token"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:96
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:22
msgid "Tunnels"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:48
msgid "Tunnels Information"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:33
msgid "Unable to read the interface info from /var/log/cloudflared.log."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:89
msgid "United States"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:97
msgid "Up"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:91
msgid "Warn"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:95
msgid "Warning"
msgstr ""
@@ -0,0 +1,201 @@
msgid ""
msgstr ""
"Last-Translator: Automatically generated\n"
"Language-Team: none\n"
"Language: eo\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:89
msgid "All"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:77
msgid "Certificate of Origin"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:40
msgid ""
"Cloudflare Zero Trust Security services help you get maximum security both "
"from outside and within the network."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:39
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:3
msgid "Cloudflare Zero Trust Tunnel"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:69
msgid "Config file path"
msgstr ""
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:14
msgid "Configuration"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:76
msgid "Connection ID"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:54
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:90
msgid "Connections"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:41
msgid ""
"Create and manage your network on the <a %s>Cloudflare Zero Trust</a> "
"dashboard."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:53
msgid "Created At"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:79
msgid "Data Center"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:97
msgid "Debug"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:96
msgid "Down"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:104
msgid "Download Log"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:59
msgid "Enable"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:94
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:92
msgid "Error"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:93
msgid "Fatal"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:87
msgid "Filter Level:"
msgstr ""
#: applications/luci-app-cloudflared/root/usr/share/rpcd/acl.d/luci-app-cloudflared.json:3
msgid "Grant access to Cloudflared configuration"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:52
msgid "ID"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:96
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:90
msgid "Info"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:85
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:30
msgid "Log"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:94
msgid "Log Direction:"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:92
msgid "Logging level"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:51
msgid "Name"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:85
msgid "No connections"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:55
msgid "Not Running"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:79
msgid "Obtain a certificate <a %s>here</a>."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:78
msgid "Opened At"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:77
msgid "Origin IP"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:86
msgid "Region"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:54
msgid "Running"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:43
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:70
msgid "See <a %s>documentation</a>."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:49
msgid "Status"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:78
msgid ""
"The account certificate for your zones authorizing the client to serve as an "
"Origin for that zone"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:87
msgid "The region to which connections are established."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:63
msgid "The tunnel token is shown in the dashboard once you create a tunnel."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:62
msgid "Token"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:96
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:22
msgid "Tunnels"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:48
msgid "Tunnels Information"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:33
msgid "Unable to read the interface info from /var/log/cloudflared.log."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:89
msgid "United States"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:97
msgid "Up"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:91
msgid "Warn"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:95
msgid "Warning"
msgstr ""
@@ -0,0 +1,211 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"PO-Revision-Date: 2026-03-05 21:05+0000\n"
"Last-Translator: Francisco Serrador <fserrador@gmail.com>\n"
"Language-Team: Spanish <https://hosted.weblate.org/projects/openwrt/"
"luciapplicationscloudflared/es/>\n"
"Language: es\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 5.17-dev\n"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:89
msgid "All"
msgstr "Todo"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:77
msgid "Certificate of Origin"
msgstr "Certificado de origen"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:40
msgid ""
"Cloudflare Zero Trust Security services help you get maximum security both "
"from outside and within the network."
msgstr ""
"Los servicios de seguridad Cloudflare Zero Trust le ayudan a obtener la "
"máxima seguridad tanto desde el exterior como dentro de la red."
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:39
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:3
msgid "Cloudflare Zero Trust Tunnel"
msgstr "Tunel Cloudflare Zero Trust"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:69
msgid "Config file path"
msgstr "Ruta del archivo de configuración"
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:14
msgid "Configuration"
msgstr "Configuración"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:76
msgid "Connection ID"
msgstr "ID de conexión"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:54
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:90
msgid "Connections"
msgstr "Conexiones"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:41
msgid ""
"Create and manage your network on the <a %s>Cloudflare Zero Trust</a> "
"dashboard."
msgstr "Cree y gestione su red en el panel <a %s>Cloudflare Zero Trust</a>."
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:53
msgid "Created At"
msgstr "Creado en"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:79
msgid "Data Center"
msgstr "Centro de datos"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:97
msgid "Debug"
msgstr "Depuración"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:96
msgid "Down"
msgstr "Bajar"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:104
msgid "Download Log"
msgstr "Descargar registro"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:59
msgid "Enable"
msgstr "Activar"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:94
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:92
msgid "Error"
msgstr "Error"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:93
msgid "Fatal"
msgstr "Fatal"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:87
msgid "Filter Level:"
msgstr "Nivel de filtro:"
#: applications/luci-app-cloudflared/root/usr/share/rpcd/acl.d/luci-app-cloudflared.json:3
msgid "Grant access to Cloudflared configuration"
msgstr "Permitir acceso a la configuración de Cloudflared"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:52
msgid "ID"
msgstr "ID"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:96
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:90
msgid "Info"
msgstr "Informe"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:85
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:30
msgid "Log"
msgstr "Registro"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:94
msgid "Log Direction:"
msgstr "Dirección de registro:"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:92
msgid "Logging level"
msgstr "Nivel de depuración"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:51
msgid "Name"
msgstr "Nombre"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:85
msgid "No connections"
msgstr "Sin conexiones"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:55
msgid "Not Running"
msgstr "No se está ejecutando"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:79
msgid "Obtain a certificate <a %s>here</a>."
msgstr "Obtenga un certificado <a %s>aquí</a>."
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:78
msgid "Opened At"
msgstr "Abierto el"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:77
msgid "Origin IP"
msgstr "IP de origen"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:86
msgid "Region"
msgstr "Región"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:54
msgid "Running"
msgstr "Ejecutando"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:43
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:70
msgid "See <a %s>documentation</a>."
msgstr "Ver <a %s>documentación</a>."
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:49
msgid "Status"
msgstr "Estado"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:78
msgid ""
"The account certificate for your zones authorizing the client to serve as an "
"Origin for that zone"
msgstr ""
"El certificado de cuenta para sus zonas que autoriza al cliente a actuar "
"como Origen para esa zona"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:87
msgid "The region to which connections are established."
msgstr "La región con la que se establecen las conexiones."
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:63
msgid "The tunnel token is shown in the dashboard once you create a tunnel."
msgstr "El token del túnel se muestra en el panel una vez que crea un túnel."
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:62
msgid "Token"
msgstr "Token"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:96
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:22
msgid "Tunnels"
msgstr "Túneles"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:48
msgid "Tunnels Information"
msgstr "Información de túneles"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:33
msgid "Unable to read the interface info from /var/log/cloudflared.log."
msgstr ""
"No se puede leer la información de la interfaz de /var/log/cloudflared.log."
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:89
msgid "United States"
msgstr "Estados Unidos"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:97
msgid "Up"
msgstr "Subir"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:91
msgid "Warn"
msgstr "Advertir"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:95
msgid "Warning"
msgstr "Aviso"
@@ -0,0 +1,201 @@
msgid ""
msgstr ""
"Last-Translator: Automatically generated\n"
"Language-Team: none\n"
"Language: et\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:89
msgid "All"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:77
msgid "Certificate of Origin"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:40
msgid ""
"Cloudflare Zero Trust Security services help you get maximum security both "
"from outside and within the network."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:39
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:3
msgid "Cloudflare Zero Trust Tunnel"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:69
msgid "Config file path"
msgstr ""
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:14
msgid "Configuration"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:76
msgid "Connection ID"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:54
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:90
msgid "Connections"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:41
msgid ""
"Create and manage your network on the <a %s>Cloudflare Zero Trust</a> "
"dashboard."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:53
msgid "Created At"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:79
msgid "Data Center"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:97
msgid "Debug"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:96
msgid "Down"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:104
msgid "Download Log"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:59
msgid "Enable"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:94
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:92
msgid "Error"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:93
msgid "Fatal"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:87
msgid "Filter Level:"
msgstr ""
#: applications/luci-app-cloudflared/root/usr/share/rpcd/acl.d/luci-app-cloudflared.json:3
msgid "Grant access to Cloudflared configuration"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:52
msgid "ID"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:96
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:90
msgid "Info"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:85
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:30
msgid "Log"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:94
msgid "Log Direction:"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:92
msgid "Logging level"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:51
msgid "Name"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:85
msgid "No connections"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:55
msgid "Not Running"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:79
msgid "Obtain a certificate <a %s>here</a>."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:78
msgid "Opened At"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:77
msgid "Origin IP"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:86
msgid "Region"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:54
msgid "Running"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:43
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:70
msgid "See <a %s>documentation</a>."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:49
msgid "Status"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:78
msgid ""
"The account certificate for your zones authorizing the client to serve as an "
"Origin for that zone"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:87
msgid "The region to which connections are established."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:63
msgid "The tunnel token is shown in the dashboard once you create a tunnel."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:62
msgid "Token"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:96
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:22
msgid "Tunnels"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:48
msgid "Tunnels Information"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:33
msgid "Unable to read the interface info from /var/log/cloudflared.log."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:89
msgid "United States"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:97
msgid "Up"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:91
msgid "Warn"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:95
msgid "Warning"
msgstr ""
@@ -0,0 +1,207 @@
msgid ""
msgstr ""
"PO-Revision-Date: 2025-07-13 14:02+0000\n"
"Last-Translator: reza <rezad1393@protonmail.ch>\n"
"Language-Team: Persian <https://hosted.weblate.org/projects/openwrt/"
"luciapplicationscloudflared/fa/>\n"
"Language: fa\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n > 1;\n"
"X-Generator: Weblate 5.13-dev\n"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:89
msgid "All"
msgstr "همه"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:77
msgid "Certificate of Origin"
msgstr "گواهی مبدا"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:40
msgid ""
"Cloudflare Zero Trust Security services help you get maximum security both "
"from outside and within the network."
msgstr ""
"سرویس‌های امنیتی اعتماد صفر کلودفلر به شما کمک می‌کنند تا حداکثر امنیت را هم "
"از بیرون و هم از داخل شبکه داشته باشید."
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:39
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:3
msgid "Cloudflare Zero Trust Tunnel"
msgstr "تونل اعتماد صفر کلودفلر"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:69
msgid "Config file path"
msgstr "مسیر فایل پیکربندی"
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:14
msgid "Configuration"
msgstr "پیکربندی"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:76
msgid "Connection ID"
msgstr "شناسه اتصال"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:54
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:90
msgid "Connections"
msgstr "اتصالات"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:41
msgid ""
"Create and manage your network on the <a %s>Cloudflare Zero Trust</a> "
"dashboard."
msgstr ""
"شبکه خود را در داشبورد <a %s>اعتماد صفر کلودفلر</a> ایجاد و مدیریت کنید."
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:53
msgid "Created At"
msgstr "ایجاد شده در"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:79
msgid "Data Center"
msgstr "مرکز داده"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:97
msgid "Debug"
msgstr "اشکال‌زدایی"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:96
msgid "Down"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:104
msgid "Download Log"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:59
msgid "Enable"
msgstr "فعال‌"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:94
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:92
msgid "Error"
msgstr "خطا"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:93
msgid "Fatal"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:87
msgid "Filter Level:"
msgstr ""
#: applications/luci-app-cloudflared/root/usr/share/rpcd/acl.d/luci-app-cloudflared.json:3
msgid "Grant access to Cloudflared configuration"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:52
msgid "ID"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:96
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:90
msgid "Info"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:85
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:30
msgid "Log"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:94
msgid "Log Direction:"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:92
msgid "Logging level"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:51
msgid "Name"
msgstr "اسم"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:85
msgid "No connections"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:55
msgid "Not Running"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:79
msgid "Obtain a certificate <a %s>here</a>."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:78
msgid "Opened At"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:77
msgid "Origin IP"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:86
msgid "Region"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:54
msgid "Running"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:43
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:70
msgid "See <a %s>documentation</a>."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:49
msgid "Status"
msgstr "وضعیت"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:78
msgid ""
"The account certificate for your zones authorizing the client to serve as an "
"Origin for that zone"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:87
msgid "The region to which connections are established."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:63
msgid "The tunnel token is shown in the dashboard once you create a tunnel."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:62
msgid "Token"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:96
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:22
msgid "Tunnels"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:48
msgid "Tunnels Information"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:33
msgid "Unable to read the interface info from /var/log/cloudflared.log."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:89
msgid "United States"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:97
msgid "Up"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:91
msgid "Warn"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:95
msgid "Warning"
msgstr ""
@@ -0,0 +1,206 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"PO-Revision-Date: 2025-07-22 08:17+0000\n"
"Last-Translator: Ricky Tigg <ricky.tigg@gmail.com>\n"
"Language-Team: Finnish <https://hosted.weblate.org/projects/openwrt/"
"luciapplicationscloudflared/fi/>\n"
"Language: fi\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 5.13-dev\n"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:89
msgid "All"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:77
msgid "Certificate of Origin"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:40
msgid ""
"Cloudflare Zero Trust Security services help you get maximum security both "
"from outside and within the network."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:39
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:3
msgid "Cloudflare Zero Trust Tunnel"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:69
msgid "Config file path"
msgstr ""
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:14
msgid "Configuration"
msgstr "Kokoonpano"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:76
msgid "Connection ID"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:54
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:90
msgid "Connections"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:41
msgid ""
"Create and manage your network on the <a %s>Cloudflare Zero Trust</a> "
"dashboard."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:53
msgid "Created At"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:79
msgid "Data Center"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:97
msgid "Debug"
msgstr "Viankorjaus"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:96
msgid "Down"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:104
msgid "Download Log"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:59
msgid "Enable"
msgstr "Ota käyttöön"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:94
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:92
msgid "Error"
msgstr "Virhe"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:93
msgid "Fatal"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:87
msgid "Filter Level:"
msgstr ""
#: applications/luci-app-cloudflared/root/usr/share/rpcd/acl.d/luci-app-cloudflared.json:3
msgid "Grant access to Cloudflared configuration"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:52
msgid "ID"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:96
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:90
msgid "Info"
msgstr "Tiedot"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:85
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:30
msgid "Log"
msgstr "Loki"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:94
msgid "Log Direction:"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:92
msgid "Logging level"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:51
msgid "Name"
msgstr "Nimi"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:85
msgid "No connections"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:55
msgid "Not Running"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:79
msgid "Obtain a certificate <a %s>here</a>."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:78
msgid "Opened At"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:77
msgid "Origin IP"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:86
msgid "Region"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:54
msgid "Running"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:43
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:70
msgid "See <a %s>documentation</a>."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:49
msgid "Status"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:78
msgid ""
"The account certificate for your zones authorizing the client to serve as an "
"Origin for that zone"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:87
msgid "The region to which connections are established."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:63
msgid "The tunnel token is shown in the dashboard once you create a tunnel."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:62
msgid "Token"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:96
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:22
msgid "Tunnels"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:48
msgid "Tunnels Information"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:33
msgid "Unable to read the interface info from /var/log/cloudflared.log."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:89
msgid "United States"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:97
msgid "Up"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:91
msgid "Warn"
msgstr "Varoita"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:95
msgid "Warning"
msgstr ""
@@ -0,0 +1,208 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"PO-Revision-Date: 2025-11-28 05:06+0000\n"
"Last-Translator: Martin Devolder <martin.devolder2@gmail.com>\n"
"Language-Team: French <https://hosted.weblate.org/projects/openwrt/"
"luciapplicationscloudflared/fr/>\n"
"Language: fr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n > 1;\n"
"X-Generator: Weblate 5.15-dev\n"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:89
msgid "All"
msgstr "Tous"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:77
msgid "Certificate of Origin"
msgstr "Certificat d'origine"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:40
msgid ""
"Cloudflare Zero Trust Security services help you get maximum security both "
"from outside and within the network."
msgstr ""
"Les service de Zéro Trust de Cloudflare vous aident à avoir une sécurité "
"maximale à partir de l'intérieur et de l'extérieur de votre réseau."
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:39
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:3
msgid "Cloudflare Zero Trust Tunnel"
msgstr "Tunnel Zéro Trust de Cloudflare"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:69
msgid "Config file path"
msgstr ""
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:14
msgid "Configuration"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:76
msgid "Connection ID"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:54
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:90
msgid "Connections"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:41
msgid ""
"Create and manage your network on the <a %s>Cloudflare Zero Trust</a> "
"dashboard."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:53
msgid "Created At"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:79
msgid "Data Center"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:97
msgid "Debug"
msgstr "Débug"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:96
msgid "Down"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:104
msgid "Download Log"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:59
msgid "Enable"
msgstr "Activer"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:94
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:92
msgid "Error"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:93
msgid "Fatal"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:87
msgid "Filter Level:"
msgstr ""
#: applications/luci-app-cloudflared/root/usr/share/rpcd/acl.d/luci-app-cloudflared.json:3
msgid "Grant access to Cloudflared configuration"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:52
msgid "ID"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:96
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:90
msgid "Info"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:85
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:30
msgid "Log"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:94
msgid "Log Direction:"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:92
msgid "Logging level"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:51
msgid "Name"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:85
msgid "No connections"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:55
msgid "Not Running"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:79
msgid "Obtain a certificate <a %s>here</a>."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:78
msgid "Opened At"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:77
msgid "Origin IP"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:86
msgid "Region"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:54
msgid "Running"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:43
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:70
msgid "See <a %s>documentation</a>."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:49
msgid "Status"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:78
msgid ""
"The account certificate for your zones authorizing the client to serve as an "
"Origin for that zone"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:87
msgid "The region to which connections are established."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:63
msgid "The tunnel token is shown in the dashboard once you create a tunnel."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:62
msgid "Token"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:96
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:22
msgid "Tunnels"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:48
msgid "Tunnels Information"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:33
msgid "Unable to read the interface info from /var/log/cloudflared.log."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:89
msgid "United States"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:97
msgid "Up"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:91
msgid "Warn"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:95
msgid "Warning"
msgstr ""
@@ -0,0 +1,212 @@
msgid ""
msgstr ""
"PO-Revision-Date: 2026-03-09 19:10+0000\n"
"Last-Translator: Aindriú Mac Giolla Eoin <aindriu80@gmail.com>\n"
"Language-Team: Irish <https://hosted.weblate.org/projects/openwrt/"
"luciapplicationscloudflared/ga/>\n"
"Language: ga\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=5; plural=n==1 ? 0 : n==2 ? 1 : (n>2 && n<7) ? 2 :(n>"
"6 && n<11) ? 3 : 4;\n"
"X-Generator: Weblate 5.17-dev\n"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:89
msgid "All"
msgstr "Gach"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:77
msgid "Certificate of Origin"
msgstr "Deimhniú Tionscnaimh"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:40
msgid ""
"Cloudflare Zero Trust Security services help you get maximum security both "
"from outside and within the network."
msgstr ""
"Cabhraíonn seirbhísí slándála Cloudflare Zero Trust leat an t-uasmhéid "
"slándála a fháil ón taobh amuigh agus laistigh den líonra."
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:39
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:3
msgid "Cloudflare Zero Trust Tunnel"
msgstr "Tollán Iontaobhas Zero Cloudflare"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:69
msgid "Config file path"
msgstr "Cosán comhaid cumraíochta"
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:14
msgid "Configuration"
msgstr "Cumraíocht"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:76
msgid "Connection ID"
msgstr "ID ceangail"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:54
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:90
msgid "Connections"
msgstr "Naisc"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:41
msgid ""
"Create and manage your network on the <a %s>Cloudflare Zero Trust</a> "
"dashboard."
msgstr ""
"Cruthaigh agus bainistigh do líonra ar an deais <a%s>Cloudflare Zero Trust</"
"a>."
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:53
msgid "Created At"
msgstr "Cruthaithe Ag"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:79
msgid "Data Center"
msgstr "Lárionad Sonraí"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:97
msgid "Debug"
msgstr "Dífhabhtú"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:96
msgid "Down"
msgstr "an Dúin"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:104
msgid "Download Log"
msgstr "Íoslódáil an logáil isteach"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:59
msgid "Enable"
msgstr "Cumasaigh"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:94
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:92
msgid "Error"
msgstr "Earráid"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:93
msgid "Fatal"
msgstr "Marfach"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:87
msgid "Filter Level:"
msgstr "Leibhéal Scagaire:"
#: applications/luci-app-cloudflared/root/usr/share/rpcd/acl.d/luci-app-cloudflared.json:3
msgid "Grant access to Cloudflared configuration"
msgstr "Deonaigh rochtain ar chumraíocht Cloudflared"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:52
msgid "ID"
msgstr "ID"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:96
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:90
msgid "Info"
msgstr "Eolas"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:85
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:30
msgid "Log"
msgstr "Loga"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:94
msgid "Log Direction:"
msgstr "Treo Loga:"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:92
msgid "Logging level"
msgstr "Leibhéal logáil"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:51
msgid "Name"
msgstr "Ainm"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:85
msgid "No connections"
msgstr "Gan naisc"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:55
msgid "Not Running"
msgstr "Gan Rith"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:79
msgid "Obtain a certificate <a %s>here</a>."
msgstr "Faigh teastas <a %s>anseo</a>."
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:78
msgid "Opened At"
msgstr "Osclaíodh Ag"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:77
msgid "Origin IP"
msgstr "IP tionscnaimh"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:86
msgid "Region"
msgstr "Réigiún"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:54
msgid "Running"
msgstr "Ag rith"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:43
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:70
msgid "See <a %s>documentation</a>."
msgstr "Féach ar <a %s>doiciméadúchán</a>."
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:49
msgid "Status"
msgstr "Stádas"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:78
msgid ""
"The account certificate for your zones authorizing the client to serve as an "
"Origin for that zone"
msgstr ""
"An teastas cuntais le do chriosanna a údaraíonn don chliant feidhmiú mar "
"Bhunús don chrios sin"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:87
msgid "The region to which connections are established."
msgstr "An réigiún lena mbunaítear naisc."
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:63
msgid "The tunnel token is shown in the dashboard once you create a tunnel."
msgstr ""
"Taispeántar comhartha an tolláin ar an deais nuair a chruthaíonn tú tollán."
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:62
msgid "Token"
msgstr "Comhartha"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:96
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:22
msgid "Tunnels"
msgstr "Tolláin"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:48
msgid "Tunnels Information"
msgstr "Eolas Tolláin"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:33
msgid "Unable to read the interface info from /var/log/cloudflared.log."
msgstr "Ní féidir faisnéis an chomhéadain ó /var/log/cloudflared.log a léamh."
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:89
msgid "United States"
msgstr "Stáit Aontaithe Mheiriceá"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:97
msgid "Up"
msgstr "Suas"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:91
msgid "Warn"
msgstr "Rabhadh"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:95
msgid "Warning"
msgstr "Aire"
@@ -0,0 +1,203 @@
msgid ""
msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Project-Id-Version: PACKAGE VERSION\n"
"Last-Translator: Automatically generated\n"
"Language-Team: none\n"
"Language: he\n"
"MIME-Version: 1.0\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:89
msgid "All"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:77
msgid "Certificate of Origin"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:40
msgid ""
"Cloudflare Zero Trust Security services help you get maximum security both "
"from outside and within the network."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:39
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:3
msgid "Cloudflare Zero Trust Tunnel"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:69
msgid "Config file path"
msgstr ""
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:14
msgid "Configuration"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:76
msgid "Connection ID"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:54
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:90
msgid "Connections"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:41
msgid ""
"Create and manage your network on the <a %s>Cloudflare Zero Trust</a> "
"dashboard."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:53
msgid "Created At"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:79
msgid "Data Center"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:97
msgid "Debug"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:96
msgid "Down"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:104
msgid "Download Log"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:59
msgid "Enable"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:94
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:92
msgid "Error"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:93
msgid "Fatal"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:87
msgid "Filter Level:"
msgstr ""
#: applications/luci-app-cloudflared/root/usr/share/rpcd/acl.d/luci-app-cloudflared.json:3
msgid "Grant access to Cloudflared configuration"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:52
msgid "ID"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:96
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:90
msgid "Info"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:85
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:30
msgid "Log"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:94
msgid "Log Direction:"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:92
msgid "Logging level"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:51
msgid "Name"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:85
msgid "No connections"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:55
msgid "Not Running"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:79
msgid "Obtain a certificate <a %s>here</a>."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:78
msgid "Opened At"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:77
msgid "Origin IP"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:86
msgid "Region"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:54
msgid "Running"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:43
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:70
msgid "See <a %s>documentation</a>."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:49
msgid "Status"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:78
msgid ""
"The account certificate for your zones authorizing the client to serve as an "
"Origin for that zone"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:87
msgid "The region to which connections are established."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:63
msgid "The tunnel token is shown in the dashboard once you create a tunnel."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:62
msgid "Token"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:96
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:22
msgid "Tunnels"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:48
msgid "Tunnels Information"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:33
msgid "Unable to read the interface info from /var/log/cloudflared.log."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:89
msgid "United States"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:97
msgid "Up"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:91
msgid "Warn"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:95
msgid "Warning"
msgstr ""
@@ -0,0 +1,206 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"PO-Revision-Date: 2024-07-06 11:32+0000\n"
"Last-Translator: Sathvic <sathvic.p@gmail.com>\n"
"Language-Team: Hindi <https://hosted.weblate.org/projects/openwrt/"
"luciapplicationscloudflared/hi/>\n"
"Language: hi\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n > 1;\n"
"X-Generator: Weblate 5.7-dev\n"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:89
msgid "All"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:77
msgid "Certificate of Origin"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:40
msgid ""
"Cloudflare Zero Trust Security services help you get maximum security both "
"from outside and within the network."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:39
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:3
msgid "Cloudflare Zero Trust Tunnel"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:69
msgid "Config file path"
msgstr ""
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:14
msgid "Configuration"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:76
msgid "Connection ID"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:54
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:90
msgid "Connections"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:41
msgid ""
"Create and manage your network on the <a %s>Cloudflare Zero Trust</a> "
"dashboard."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:53
msgid "Created At"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:79
msgid "Data Center"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:97
msgid "Debug"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:96
msgid "Down"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:104
msgid "Download Log"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:59
msgid "Enable"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:94
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:92
msgid "Error"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:93
msgid "Fatal"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:87
msgid "Filter Level:"
msgstr ""
#: applications/luci-app-cloudflared/root/usr/share/rpcd/acl.d/luci-app-cloudflared.json:3
msgid "Grant access to Cloudflared configuration"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:52
msgid "ID"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:96
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:90
msgid "Info"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:85
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:30
msgid "Log"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:94
msgid "Log Direction:"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:92
msgid "Logging level"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:51
msgid "Name"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:85
msgid "No connections"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:55
msgid "Not Running"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:79
msgid "Obtain a certificate <a %s>here</a>."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:78
msgid "Opened At"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:77
msgid "Origin IP"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:86
msgid "Region"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:54
msgid "Running"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:43
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:70
msgid "See <a %s>documentation</a>."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:49
msgid "Status"
msgstr "स्थिति"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:78
msgid ""
"The account certificate for your zones authorizing the client to serve as an "
"Origin for that zone"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:87
msgid "The region to which connections are established."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:63
msgid "The tunnel token is shown in the dashboard once you create a tunnel."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:62
msgid "Token"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:96
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:22
msgid "Tunnels"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:48
msgid "Tunnels Information"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:33
msgid "Unable to read the interface info from /var/log/cloudflared.log."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:89
msgid "United States"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:97
msgid "Up"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:91
msgid "Warn"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:95
msgid "Warning"
msgstr ""
@@ -0,0 +1,206 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"PO-Revision-Date: 2026-03-08 17:32+0000\n"
"Last-Translator: hmzs <hmzs@1szer1.hu>\n"
"Language-Team: Hungarian <https://hosted.weblate.org/projects/openwrt/"
"luciapplicationscloudflared/hu/>\n"
"Language: hu\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 5.17-dev\n"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:89
msgid "All"
msgstr "Minden"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:77
msgid "Certificate of Origin"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:40
msgid ""
"Cloudflare Zero Trust Security services help you get maximum security both "
"from outside and within the network."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:39
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:3
msgid "Cloudflare Zero Trust Tunnel"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:69
msgid "Config file path"
msgstr ""
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:14
msgid "Configuration"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:76
msgid "Connection ID"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:54
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:90
msgid "Connections"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:41
msgid ""
"Create and manage your network on the <a %s>Cloudflare Zero Trust</a> "
"dashboard."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:53
msgid "Created At"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:79
msgid "Data Center"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:97
msgid "Debug"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:96
msgid "Down"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:104
msgid "Download Log"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:59
msgid "Enable"
msgstr "Engedélyezés"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:94
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:92
msgid "Error"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:93
msgid "Fatal"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:87
msgid "Filter Level:"
msgstr ""
#: applications/luci-app-cloudflared/root/usr/share/rpcd/acl.d/luci-app-cloudflared.json:3
msgid "Grant access to Cloudflared configuration"
msgstr "Hozzáférés engedélyezése az <em>Cloudflared</em> beállításaihoz"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:52
msgid "ID"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:96
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:90
msgid "Info"
msgstr "Infó"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:85
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:30
msgid "Log"
msgstr "Napló"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:94
msgid "Log Direction:"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:92
msgid "Logging level"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:51
msgid "Name"
msgstr "Név"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:85
msgid "No connections"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:55
msgid "Not Running"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:79
msgid "Obtain a certificate <a %s>here</a>."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:78
msgid "Opened At"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:77
msgid "Origin IP"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:86
msgid "Region"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:54
msgid "Running"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:43
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:70
msgid "See <a %s>documentation</a>."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:49
msgid "Status"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:78
msgid ""
"The account certificate for your zones authorizing the client to serve as an "
"Origin for that zone"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:87
msgid "The region to which connections are established."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:63
msgid "The tunnel token is shown in the dashboard once you create a tunnel."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:62
msgid "Token"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:96
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:22
msgid "Tunnels"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:48
msgid "Tunnels Information"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:33
msgid "Unable to read the interface info from /var/log/cloudflared.log."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:89
msgid "United States"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:97
msgid "Up"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:91
msgid "Warn"
msgstr "Figyelmeztetés"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:95
msgid "Warning"
msgstr ""
@@ -0,0 +1,210 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"PO-Revision-Date: 2025-11-25 16:35+0000\n"
"Last-Translator: Alex Caserini <alex.caserini@gmail.com>\n"
"Language-Team: Italian <https://hosted.weblate.org/projects/openwrt/"
"luciapplicationscloudflared/it/>\n"
"Language: it\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 5.15-dev\n"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:89
msgid "All"
msgstr "Tutti"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:77
msgid "Certificate of Origin"
msgstr "Certificato d'origine"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:40
msgid ""
"Cloudflare Zero Trust Security services help you get maximum security both "
"from outside and within the network."
msgstr ""
"I servizi di sicurezza Cloudflare Zero Trust ti aiutano a ottenere la "
"massima sicurezza sia dall'esterno che all'interno della rete."
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:39
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:3
msgid "Cloudflare Zero Trust Tunnel"
msgstr "Tunnel Cloudflare Zero Trust"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:69
msgid "Config file path"
msgstr "Path file di configurazione"
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:14
msgid "Configuration"
msgstr "Configurazione"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:76
msgid "Connection ID"
msgstr "ID di connessione"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:54
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:90
msgid "Connections"
msgstr "Connessioni"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:41
msgid ""
"Create and manage your network on the <a %s>Cloudflare Zero Trust</a> "
"dashboard."
msgstr ""
"Crea e gestisci la tua rete nella dashboard di <a %s>Cloudflare Zero Trust</"
"a>."
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:53
msgid "Created At"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:79
msgid "Data Center"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:97
msgid "Debug"
msgstr "Debug"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:96
msgid "Down"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:104
msgid "Download Log"
msgstr "Registro Download"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:59
msgid "Enable"
msgstr "Abilitare"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:94
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:92
msgid "Error"
msgstr "Errore"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:93
msgid "Fatal"
msgstr "Fatale"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:87
msgid "Filter Level:"
msgstr "Livello Filtro:"
#: applications/luci-app-cloudflared/root/usr/share/rpcd/acl.d/luci-app-cloudflared.json:3
msgid "Grant access to Cloudflared configuration"
msgstr "Concedere l'accesso alla configurazione Cloudflarizzata"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:52
msgid "ID"
msgstr "ID"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:96
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:90
msgid "Info"
msgstr "Info"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:85
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:30
msgid "Log"
msgstr "Registro"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:94
msgid "Log Direction:"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:92
msgid "Logging level"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:51
msgid "Name"
msgstr "Nome"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:85
msgid "No connections"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:55
msgid "Not Running"
msgstr "Non in esecuzione"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:79
msgid "Obtain a certificate <a %s>here</a>."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:78
msgid "Opened At"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:77
msgid "Origin IP"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:86
msgid "Region"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:54
msgid "Running"
msgstr "In esecuzione"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:43
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:70
msgid "See <a %s>documentation</a>."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:49
msgid "Status"
msgstr "Stato"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:78
msgid ""
"The account certificate for your zones authorizing the client to serve as an "
"Origin for that zone"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:87
msgid "The region to which connections are established."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:63
msgid "The tunnel token is shown in the dashboard once you create a tunnel."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:62
msgid "Token"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:96
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:22
msgid "Tunnels"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:48
msgid "Tunnels Information"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:33
msgid "Unable to read the interface info from /var/log/cloudflared.log."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:89
msgid "United States"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:97
msgid "Up"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:91
msgid "Warn"
msgstr "Avvisa"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:95
msgid "Warning"
msgstr "Avviso"
@@ -0,0 +1,207 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"PO-Revision-Date: 2025-12-07 21:54+0000\n"
"Last-Translator: Monarch <monarch.scrap-0p@users.noreply.hosted.weblate.org>"
"\n"
"Language-Team: Japanese <https://hosted.weblate.org/projects/openwrt/"
"luciapplicationscloudflared/ja/>\n"
"Language: ja\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: Weblate 5.15-dev\n"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:89
msgid "All"
msgstr "すべて"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:77
msgid "Certificate of Origin"
msgstr "オリジン証明書"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:40
msgid ""
"Cloudflare Zero Trust Security services help you get maximum security both "
"from outside and within the network."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:39
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:3
msgid "Cloudflare Zero Trust Tunnel"
msgstr "Cloudflare Zero Trust Tunnel"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:69
msgid "Config file path"
msgstr "構成ファイルのパス"
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:14
msgid "Configuration"
msgstr "設定"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:76
msgid "Connection ID"
msgstr "接続 ID"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:54
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:90
msgid "Connections"
msgstr "接続"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:41
msgid ""
"Create and manage your network on the <a %s>Cloudflare Zero Trust</a> "
"dashboard."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:53
msgid "Created At"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:79
msgid "Data Center"
msgstr "データ センター"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:97
msgid "Debug"
msgstr "デバッグ"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:96
msgid "Down"
msgstr "停止中"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:104
msgid "Download Log"
msgstr "ログをダウンロード"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:59
msgid "Enable"
msgstr "有効化"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:94
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:92
msgid "Error"
msgstr "エラー"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:93
msgid "Fatal"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:87
msgid "Filter Level:"
msgstr ""
#: applications/luci-app-cloudflared/root/usr/share/rpcd/acl.d/luci-app-cloudflared.json:3
msgid "Grant access to Cloudflared configuration"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:52
msgid "ID"
msgstr "ID"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:96
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:90
msgid "Info"
msgstr "情報"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:85
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:30
msgid "Log"
msgstr "ログ"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:94
msgid "Log Direction:"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:92
msgid "Logging level"
msgstr "ログ レベル"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:51
msgid "Name"
msgstr "名前"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:85
msgid "No connections"
msgstr "接続がありません"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:55
msgid "Not Running"
msgstr "停止中"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:79
msgid "Obtain a certificate <a %s>here</a>."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:78
msgid "Opened At"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:77
msgid "Origin IP"
msgstr "オリジン IP"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:86
msgid "Region"
msgstr "地域"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:54
msgid "Running"
msgstr "実行中"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:43
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:70
msgid "See <a %s>documentation</a>."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:49
msgid "Status"
msgstr "状態"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:78
msgid ""
"The account certificate for your zones authorizing the client to serve as an "
"Origin for that zone"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:87
msgid "The region to which connections are established."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:63
msgid "The tunnel token is shown in the dashboard once you create a tunnel."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:62
msgid "Token"
msgstr "トークン"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:96
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:22
msgid "Tunnels"
msgstr "トンネル"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:48
msgid "Tunnels Information"
msgstr "トンネル情報"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:33
msgid "Unable to read the interface info from /var/log/cloudflared.log."
msgstr "/var/log/cloudflared.log からインターフェース情報を読み込めません。"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:89
msgid "United States"
msgstr "アメリカ合衆国"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:97
msgid "Up"
msgstr "起動中"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:91
msgid "Warn"
msgstr "警告"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:95
msgid "Warning"
msgstr "警告"
@@ -0,0 +1,206 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"PO-Revision-Date: 2026-02-07 16:33+0000\n"
"Last-Translator: Hyeonjeong Lee <h9101654@gmail.com>\n"
"Language-Team: Korean <https://hosted.weblate.org/projects/openwrt/"
"luciapplicationscloudflared/ko/>\n"
"Language: ko\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: Weblate 5.16-dev\n"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:89
msgid "All"
msgstr "전체"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:77
msgid "Certificate of Origin"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:40
msgid ""
"Cloudflare Zero Trust Security services help you get maximum security both "
"from outside and within the network."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:39
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:3
msgid "Cloudflare Zero Trust Tunnel"
msgstr "Cloudflare Zero Trust 터널"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:69
msgid "Config file path"
msgstr "설정 파일 경로"
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:14
msgid "Configuration"
msgstr "설정"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:76
msgid "Connection ID"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:54
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:90
msgid "Connections"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:41
msgid ""
"Create and manage your network on the <a %s>Cloudflare Zero Trust</a> "
"dashboard."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:53
msgid "Created At"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:79
msgid "Data Center"
msgstr "데이터 센터"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:97
msgid "Debug"
msgstr "디버그"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:96
msgid "Down"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:104
msgid "Download Log"
msgstr "로그 다운로드"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:59
msgid "Enable"
msgstr "활성화"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:94
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:92
msgid "Error"
msgstr "오류(Error)"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:93
msgid "Fatal"
msgstr "심각(Fatal)"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:87
msgid "Filter Level:"
msgstr "필터 수준:"
#: applications/luci-app-cloudflared/root/usr/share/rpcd/acl.d/luci-app-cloudflared.json:3
msgid "Grant access to Cloudflared configuration"
msgstr "Cloudflared 설정에 접근 권한 부여"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:52
msgid "ID"
msgstr "ID"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:96
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:90
msgid "Info"
msgstr "정보(Info)"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:85
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:30
msgid "Log"
msgstr "로그"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:94
msgid "Log Direction:"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:92
msgid "Logging level"
msgstr "로그 기록 수준"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:51
msgid "Name"
msgstr "이름"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:85
msgid "No connections"
msgstr "연결된 내역이 없습니다"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:55
msgid "Not Running"
msgstr "중지됨"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:79
msgid "Obtain a certificate <a %s>here</a>."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:78
msgid "Opened At"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:77
msgid "Origin IP"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:86
msgid "Region"
msgstr "지역"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:54
msgid "Running"
msgstr "실행 중"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:43
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:70
msgid "See <a %s>documentation</a>."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:49
msgid "Status"
msgstr "상태"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:78
msgid ""
"The account certificate for your zones authorizing the client to serve as an "
"Origin for that zone"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:87
msgid "The region to which connections are established."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:63
msgid "The tunnel token is shown in the dashboard once you create a tunnel."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:62
msgid "Token"
msgstr "토큰"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:96
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:22
msgid "Tunnels"
msgstr "터널"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:48
msgid "Tunnels Information"
msgstr "터널 정보"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:33
msgid "Unable to read the interface info from /var/log/cloudflared.log."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:89
msgid "United States"
msgstr "미국"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:97
msgid "Up"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:91
msgid "Warn"
msgstr "경고(Warn)"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:95
msgid "Warning"
msgstr "경고(Warning)"
@@ -0,0 +1,218 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"PO-Revision-Date: 2026-03-10 17:04+0000\n"
"Last-Translator: Džiugas Januševičius <dziugas1959@hotmail.com>\n"
"Language-Team: Lithuanian <https://hosted.weblate.org/projects/openwrt/"
"luciapplicationscloudflared/lt/>\n"
"Language: lt\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
"(n%100<10 || n%100>=20) ? 1 : 2);\n"
"X-Generator: Weblate 5.17-dev\n"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:89
msgid "All"
msgstr "Visi"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:77
msgid "Certificate of Origin"
msgstr "Kilmės sertifikatas"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:40
msgid ""
"Cloudflare Zero Trust Security services help you get maximum security both "
"from outside and within the network."
msgstr ""
"„Cloudflare; Nulinio pasitikėjimo“ apsaugos tarnybos padeda Jums gauti "
"maksimalią apsaugą nuo išorės ir vidaus tinklo."
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:39
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:3
msgid "Cloudflare Zero Trust Tunnel"
msgstr "„Cloudflare; Nulinio pasitikėjimo tunelis“"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:69
msgid "Config file path"
msgstr "Konfigūracijos failo kelias"
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:14
msgid "Configuration"
msgstr "Konfigūracija"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:76
msgid "Connection ID"
msgstr "Prisijungimo ID"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:54
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:90
msgid "Connections"
msgstr "Prisijungimai"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:41
msgid ""
"Create and manage your network on the <a %s>Cloudflare Zero Trust</a> "
"dashboard."
msgstr ""
"Sukurti ir valdyti savo tinklą per <a %s>„Cloudflare; Nulinis "
"pasitikėjimas“</a> ataskaitų skydelį."
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:53
msgid "Created At"
msgstr "Sukurta –"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:79
msgid "Data Center"
msgstr "Duomenų centras"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:97
msgid "Debug"
msgstr "Derinimas/Trukdžių šalinimas"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:96
msgid "Down"
msgstr "Žemyn"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:104
msgid "Download Log"
msgstr "Atsisiuntimo žurnalas"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:59
msgid "Enable"
msgstr "Įjungti/Įgalinti"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:94
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:92
msgid "Error"
msgstr "Klaida"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:93
msgid "Fatal"
msgstr "Kritinė"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:87
msgid "Filter Level:"
msgstr "Filtro lygis:"
#: applications/luci-app-cloudflared/root/usr/share/rpcd/acl.d/luci-app-cloudflared.json:3
msgid "Grant access to Cloudflared configuration"
msgstr "Duoti prieigą prie „Cloudflared“ konfigūracijos"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:52
msgid "ID"
msgstr "ID – Identifikatorius"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:96
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:90
msgid "Info"
msgstr "Informacija"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:85
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:30
msgid "Log"
msgstr "Žurnalas"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:94
msgid "Log Direction:"
msgstr "Žurnalo kryptis:"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:92
msgid "Logging level"
msgstr "Žurnalinimo lygis"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:51
msgid "Name"
msgstr "Pavadinimas"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:85
msgid "No connections"
msgstr "Nėra prisijungimų"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:55
msgid "Not Running"
msgstr "Neveikia"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:79
msgid "Obtain a certificate <a %s>here</a>."
msgstr "Gauti sertifikatą <a %s>čia</a>."
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:78
msgid "Opened At"
msgstr "Atidaryta –"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:77
msgid "Origin IP"
msgstr "Kilmės IP"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:86
msgid "Region"
msgstr "Regionas"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:54
msgid "Running"
msgstr "Veikia"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:43
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:70
msgid "See <a %s>documentation</a>."
msgstr "Peržiūrėti <a %s>dokumentaciją</a>."
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:49
msgid "Status"
msgstr "Būklė/Būsena"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:78
msgid ""
"The account certificate for your zones authorizing the client to serve as an "
"Origin for that zone"
msgstr ""
"Paskyros sertifikatas Jūsų zonoms, autorizuojant klientą, kad tarnautu kaip "
"kilmė(?) („Origin“) tai zonai"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:87
msgid "The region to which connections are established."
msgstr "Regionas, kuriame prisijungimai yra įtvirtinti."
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:63
msgid "The tunnel token is shown in the dashboard once you create a tunnel."
msgstr ""
"„Tunelio“ – Tinklo protokolo, skirto šifruoti/pereiti į kitą tinklą žetonas "
"yra rodomas ataskaitų skydelyje, kai Jūs sukuriate „tunelį“ – tinklo "
"protokolą, skirta šifruoti/pereiti į kitą tinklą."
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:62
msgid "Token"
msgstr "Žetonas"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:96
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:22
msgid "Tunnels"
msgstr "„Tuneliai“ – Tinklo protokolai"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:48
msgid "Tunnels Information"
msgstr ""
"„Tunelių“ – Tinklo protokolas, skirtas šifruoti/pereiti į kitus tinklus "
"informacija"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:33
msgid "Unable to read the interface info from /var/log/cloudflared.log."
msgstr "Nepavyko skaityti sąsajos informacijos iš „/var/log/cloudflared.log“."
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:89
msgid "United States"
msgstr "Jungtinės Amerikos Valstijos"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:97
msgid "Up"
msgstr "Viršun/Aukštyn"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:91
msgid "Warn"
msgstr "Įspėti"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:95
msgid "Warning"
msgstr "Įspėjimas"
@@ -0,0 +1,202 @@
msgid ""
msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Project-Id-Version: PACKAGE VERSION\n"
"Last-Translator: Automatically generated\n"
"Language-Team: none\n"
"Language: mr\n"
"MIME-Version: 1.0\n"
"Content-Transfer-Encoding: 8bit\n"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:89
msgid "All"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:77
msgid "Certificate of Origin"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:40
msgid ""
"Cloudflare Zero Trust Security services help you get maximum security both "
"from outside and within the network."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:39
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:3
msgid "Cloudflare Zero Trust Tunnel"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:69
msgid "Config file path"
msgstr ""
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:14
msgid "Configuration"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:76
msgid "Connection ID"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:54
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:90
msgid "Connections"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:41
msgid ""
"Create and manage your network on the <a %s>Cloudflare Zero Trust</a> "
"dashboard."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:53
msgid "Created At"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:79
msgid "Data Center"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:97
msgid "Debug"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:96
msgid "Down"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:104
msgid "Download Log"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:59
msgid "Enable"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:94
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:92
msgid "Error"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:93
msgid "Fatal"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:87
msgid "Filter Level:"
msgstr ""
#: applications/luci-app-cloudflared/root/usr/share/rpcd/acl.d/luci-app-cloudflared.json:3
msgid "Grant access to Cloudflared configuration"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:52
msgid "ID"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:96
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:90
msgid "Info"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:85
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:30
msgid "Log"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:94
msgid "Log Direction:"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:92
msgid "Logging level"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:51
msgid "Name"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:85
msgid "No connections"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:55
msgid "Not Running"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:79
msgid "Obtain a certificate <a %s>here</a>."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:78
msgid "Opened At"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:77
msgid "Origin IP"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:86
msgid "Region"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:54
msgid "Running"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:43
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:70
msgid "See <a %s>documentation</a>."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:49
msgid "Status"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:78
msgid ""
"The account certificate for your zones authorizing the client to serve as an "
"Origin for that zone"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:87
msgid "The region to which connections are established."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:63
msgid "The tunnel token is shown in the dashboard once you create a tunnel."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:62
msgid "Token"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:96
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:22
msgid "Tunnels"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:48
msgid "Tunnels Information"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:33
msgid "Unable to read the interface info from /var/log/cloudflared.log."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:89
msgid "United States"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:97
msgid "Up"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:91
msgid "Warn"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:95
msgid "Warning"
msgstr ""
@@ -0,0 +1,202 @@
msgid ""
msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Project-Id-Version: PACKAGE VERSION\n"
"Last-Translator: Automatically generated\n"
"Language-Team: none\n"
"Language: ms\n"
"MIME-Version: 1.0\n"
"Content-Transfer-Encoding: 8bit\n"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:89
msgid "All"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:77
msgid "Certificate of Origin"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:40
msgid ""
"Cloudflare Zero Trust Security services help you get maximum security both "
"from outside and within the network."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:39
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:3
msgid "Cloudflare Zero Trust Tunnel"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:69
msgid "Config file path"
msgstr ""
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:14
msgid "Configuration"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:76
msgid "Connection ID"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:54
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:90
msgid "Connections"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:41
msgid ""
"Create and manage your network on the <a %s>Cloudflare Zero Trust</a> "
"dashboard."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:53
msgid "Created At"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:79
msgid "Data Center"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:97
msgid "Debug"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:96
msgid "Down"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:104
msgid "Download Log"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:59
msgid "Enable"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:94
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:92
msgid "Error"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:93
msgid "Fatal"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:87
msgid "Filter Level:"
msgstr ""
#: applications/luci-app-cloudflared/root/usr/share/rpcd/acl.d/luci-app-cloudflared.json:3
msgid "Grant access to Cloudflared configuration"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:52
msgid "ID"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:96
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:90
msgid "Info"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:85
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:30
msgid "Log"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:94
msgid "Log Direction:"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:92
msgid "Logging level"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:51
msgid "Name"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:85
msgid "No connections"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:55
msgid "Not Running"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:79
msgid "Obtain a certificate <a %s>here</a>."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:78
msgid "Opened At"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:77
msgid "Origin IP"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:86
msgid "Region"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:54
msgid "Running"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:43
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:70
msgid "See <a %s>documentation</a>."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:49
msgid "Status"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:78
msgid ""
"The account certificate for your zones authorizing the client to serve as an "
"Origin for that zone"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:87
msgid "The region to which connections are established."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:63
msgid "The tunnel token is shown in the dashboard once you create a tunnel."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:62
msgid "Token"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:96
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:22
msgid "Tunnels"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:48
msgid "Tunnels Information"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:33
msgid "Unable to read the interface info from /var/log/cloudflared.log."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:89
msgid "United States"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:97
msgid "Up"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:91
msgid "Warn"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:95
msgid "Warning"
msgstr ""
@@ -0,0 +1,206 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"PO-Revision-Date: 2025-03-14 09:11+0000\n"
"Last-Translator: Lasse Skogland <lasse.skogland@gmail.com>\n"
"Language-Team: Norwegian Bokmål <https://hosted.weblate.org/projects/openwrt/"
"luciapplicationscloudflared/nb_NO/>\n"
"Language: nb_NO\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 5.11-dev\n"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:89
msgid "All"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:77
msgid "Certificate of Origin"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:40
msgid ""
"Cloudflare Zero Trust Security services help you get maximum security both "
"from outside and within the network."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:39
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:3
msgid "Cloudflare Zero Trust Tunnel"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:69
msgid "Config file path"
msgstr ""
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:14
msgid "Configuration"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:76
msgid "Connection ID"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:54
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:90
msgid "Connections"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:41
msgid ""
"Create and manage your network on the <a %s>Cloudflare Zero Trust</a> "
"dashboard."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:53
msgid "Created At"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:79
msgid "Data Center"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:97
msgid "Debug"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:96
msgid "Down"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:104
msgid "Download Log"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:59
msgid "Enable"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:94
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:92
msgid "Error"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:93
msgid "Fatal"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:87
msgid "Filter Level:"
msgstr ""
#: applications/luci-app-cloudflared/root/usr/share/rpcd/acl.d/luci-app-cloudflared.json:3
msgid "Grant access to Cloudflared configuration"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:52
msgid "ID"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:96
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:90
msgid "Info"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:85
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:30
msgid "Log"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:94
msgid "Log Direction:"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:92
msgid "Logging level"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:51
msgid "Name"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:85
msgid "No connections"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:55
msgid "Not Running"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:79
msgid "Obtain a certificate <a %s>here</a>."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:78
msgid "Opened At"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:77
msgid "Origin IP"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:86
msgid "Region"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:54
msgid "Running"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:43
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:70
msgid "See <a %s>documentation</a>."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:49
msgid "Status"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:78
msgid ""
"The account certificate for your zones authorizing the client to serve as an "
"Origin for that zone"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:87
msgid "The region to which connections are established."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:63
msgid "The tunnel token is shown in the dashboard once you create a tunnel."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:62
msgid "Token"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:96
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:22
msgid "Tunnels"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:48
msgid "Tunnels Information"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:33
msgid "Unable to read the interface info from /var/log/cloudflared.log."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:89
msgid "United States"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:97
msgid "Up"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:91
msgid "Warn"
msgstr "Advar"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:95
msgid "Warning"
msgstr ""
@@ -0,0 +1,206 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"PO-Revision-Date: 2026-01-10 04:39+0000\n"
"Last-Translator: Marco Otto <marco.otto@tuta.com>\n"
"Language-Team: Dutch <https://hosted.weblate.org/projects/openwrt/"
"luciapplicationscloudflared/nl/>\n"
"Language: nl\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 5.15.1\n"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:89
msgid "All"
msgstr "Alle"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:77
msgid "Certificate of Origin"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:40
msgid ""
"Cloudflare Zero Trust Security services help you get maximum security both "
"from outside and within the network."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:39
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:3
msgid "Cloudflare Zero Trust Tunnel"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:69
msgid "Config file path"
msgstr ""
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:14
msgid "Configuration"
msgstr "Configuratie"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:76
msgid "Connection ID"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:54
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:90
msgid "Connections"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:41
msgid ""
"Create and manage your network on the <a %s>Cloudflare Zero Trust</a> "
"dashboard."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:53
msgid "Created At"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:79
msgid "Data Center"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:97
msgid "Debug"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:96
msgid "Down"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:104
msgid "Download Log"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:59
msgid "Enable"
msgstr "Inschakelen"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:94
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:92
msgid "Error"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:93
msgid "Fatal"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:87
msgid "Filter Level:"
msgstr ""
#: applications/luci-app-cloudflared/root/usr/share/rpcd/acl.d/luci-app-cloudflared.json:3
msgid "Grant access to Cloudflared configuration"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:52
msgid "ID"
msgstr "ID"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:96
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:90
msgid "Info"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:85
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:30
msgid "Log"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:94
msgid "Log Direction:"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:92
msgid "Logging level"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:51
msgid "Name"
msgstr "Naam"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:85
msgid "No connections"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:55
msgid "Not Running"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:79
msgid "Obtain a certificate <a %s>here</a>."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:78
msgid "Opened At"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:77
msgid "Origin IP"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:86
msgid "Region"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:54
msgid "Running"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:43
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:70
msgid "See <a %s>documentation</a>."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:49
msgid "Status"
msgstr "Status"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:78
msgid ""
"The account certificate for your zones authorizing the client to serve as an "
"Origin for that zone"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:87
msgid "The region to which connections are established."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:63
msgid "The tunnel token is shown in the dashboard once you create a tunnel."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:62
msgid "Token"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:96
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:22
msgid "Tunnels"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:48
msgid "Tunnels Information"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:33
msgid "Unable to read the interface info from /var/log/cloudflared.log."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:89
msgid "United States"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:97
msgid "Up"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:91
msgid "Warn"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:95
msgid "Warning"
msgstr ""
@@ -0,0 +1,214 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"PO-Revision-Date: 2026-01-18 00:24+0000\n"
"Last-Translator: Matthaiks <kitynska@gmail.com>\n"
"Language-Team: Polish <https://hosted.weblate.org/projects/openwrt/"
"luciapplicationscloudflared/pl/>\n"
"Language: pl\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
"|| n%100>=20) ? 1 : 2);\n"
"X-Generator: Weblate 5.15.2\n"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:89
msgid "All"
msgstr "Wszystko"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:77
msgid "Certificate of Origin"
msgstr "Certyfikat pochodzenia"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:40
msgid ""
"Cloudflare Zero Trust Security services help you get maximum security both "
"from outside and within the network."
msgstr ""
"Usługi Cloudflare Zero Trust Security pomagają uzyskać maksymalne "
"bezpieczeństwo zarówno z zewnątrz, jak i wewnątrz sieci."
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:39
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:3
msgid "Cloudflare Zero Trust Tunnel"
msgstr "Tunel Cloudflare Zero Trust"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:69
msgid "Config file path"
msgstr "Ścieżka pliku konfiguracyjnego"
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:14
msgid "Configuration"
msgstr "Konfiguracja"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:76
msgid "Connection ID"
msgstr "Identyfikator połączenia"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:54
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:90
msgid "Connections"
msgstr "Połączenia"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:41
msgid ""
"Create and manage your network on the <a %s>Cloudflare Zero Trust</a> "
"dashboard."
msgstr ""
"Twórz swoją sieć i zarządzaj nią na pulpicie nawigacyjnym <a %s>Cloudflare "
"Zero Trust</a>."
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:53
msgid "Created At"
msgstr "Utworzono"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:79
msgid "Data Center"
msgstr "Centrum danych"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:97
msgid "Debug"
msgstr "Debugowanie"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:96
msgid "Down"
msgstr "W dół"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:104
msgid "Download Log"
msgstr "Pobierz dziennik"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:59
msgid "Enable"
msgstr "Włącz"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:94
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:92
msgid "Error"
msgstr "Błąd"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:93
msgid "Fatal"
msgstr "Krytyczne"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:87
msgid "Filter Level:"
msgstr "Poziom filtra:"
#: applications/luci-app-cloudflared/root/usr/share/rpcd/acl.d/luci-app-cloudflared.json:3
msgid "Grant access to Cloudflared configuration"
msgstr "Udziel dostępu do konfiguracji Cloudflared"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:52
msgid "ID"
msgstr "Identyfikator"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:96
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:90
msgid "Info"
msgstr "Info"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:85
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:30
msgid "Log"
msgstr "Dziennik"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:94
msgid "Log Direction:"
msgstr "Kierunek dziennika:"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:92
msgid "Logging level"
msgstr "Poziom rejestrowania"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:51
msgid "Name"
msgstr "Nazwa"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:85
msgid "No connections"
msgstr "Brak połączeń"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:55
msgid "Not Running"
msgstr "Nieuruchomione"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:79
msgid "Obtain a certificate <a %s>here</a>."
msgstr "Uzyskaj certyfikat <a %s>tutaj</a>."
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:78
msgid "Opened At"
msgstr "Otworzono"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:77
msgid "Origin IP"
msgstr "Pochodzenie IP"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:86
msgid "Region"
msgstr "Region"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:54
msgid "Running"
msgstr "Uruchomione"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:43
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:70
msgid "See <a %s>documentation</a>."
msgstr "Zobacz <a %s>dokumentację</a>."
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:49
msgid "Status"
msgstr "Status"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:78
msgid ""
"The account certificate for your zones authorizing the client to serve as an "
"Origin for that zone"
msgstr ""
"Certyfikat konta dla Twoich stref, upoważniający klienta do pełnienia "
"funkcji Origin dla tej strefy"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:87
msgid "The region to which connections are established."
msgstr "Region, z którym nawiązywane są połączenia."
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:63
msgid "The tunnel token is shown in the dashboard once you create a tunnel."
msgstr "Po utworzeniu tunelu token tunelu pojawi się na pulpicie nawigacyjnym."
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:62
msgid "Token"
msgstr "Token"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:96
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:22
msgid "Tunnels"
msgstr "Tunele"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:48
msgid "Tunnels Information"
msgstr "Informacje o tunelach"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:33
msgid "Unable to read the interface info from /var/log/cloudflared.log."
msgstr ""
"Nie można odczytać informacji o interfejsie z pliku /var/log/cloudflared.log."
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:89
msgid "United States"
msgstr "Stany Zjednoczone"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:97
msgid "Up"
msgstr "W górę"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:91
msgid "Warn"
msgstr "Uwaga"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:95
msgid "Warning"
msgstr "Ostrzeżenie"
@@ -0,0 +1,214 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"PO-Revision-Date: 2025-06-06 21:59+0000\n"
"Last-Translator: \"Filipe Mota (BlackSpirits)\" <blackspirits@gmail.com>\n"
"Language-Team: Portuguese <https://hosted.weblate.org/projects/openwrt/"
"luciapplicationscloudflared/pt/>\n"
"Language: pt\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 5.12-dev\n"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:89
msgid "All"
msgstr "Todos"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:77
msgid "Certificate of Origin"
msgstr "Certificado de origem"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:40
msgid ""
"Cloudflare Zero Trust Security services help you get maximum security both "
"from outside and within the network."
msgstr ""
"Os serviços de segurança Cloudflare Zero Trust proporcionam uma proteção "
"máxima, tanto contra ameaças externas como internas à rede."
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:39
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:3
msgid "Cloudflare Zero Trust Tunnel"
msgstr "Túnel Cloudflare Zero Trust"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:69
msgid "Config file path"
msgstr "Caminho do ficheiro de configuração"
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:14
msgid "Configuration"
msgstr "Configuração"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:76
msgid "Connection ID"
msgstr "ID de ligação"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:54
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:90
msgid "Connections"
msgstr "Ligações"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:41
msgid ""
"Create and manage your network on the <a %s>Cloudflare Zero Trust</a> "
"dashboard."
msgstr ""
"Crie e administre a sua rede no painel de controlo <a %s>Cloudflare Zero "
"Trust</a>."
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:53
msgid "Created At"
msgstr "Criado em"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:79
msgid "Data Center"
msgstr "Centro de dados"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:97
msgid "Debug"
msgstr "Depuração"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:96
msgid "Down"
msgstr "Em baixo"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:104
msgid "Download Log"
msgstr "Descarregar registo"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:59
msgid "Enable"
msgstr "Ativar"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:94
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:92
msgid "Error"
msgstr "Erro"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:93
msgid "Fatal"
msgstr "Fatal"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:87
msgid "Filter Level:"
msgstr "Nível de filtro:"
#: applications/luci-app-cloudflared/root/usr/share/rpcd/acl.d/luci-app-cloudflared.json:3
msgid "Grant access to Cloudflared configuration"
msgstr "Conceder acesso à configuração do Cloudflared"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:52
msgid "ID"
msgstr "ID"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:96
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:90
msgid "Info"
msgstr "Informações"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:85
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:30
msgid "Log"
msgstr "Registo"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:94
msgid "Log Direction:"
msgstr "Direção do registo:"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:92
msgid "Logging level"
msgstr "Nível de registo"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:51
msgid "Name"
msgstr "Nome"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:85
msgid "No connections"
msgstr "Sem ligações"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:55
msgid "Not Running"
msgstr "Não em execução"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:79
msgid "Obtain a certificate <a %s>here</a>."
msgstr "Obter um certificado <a %s>aqui</a>."
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:78
msgid "Opened At"
msgstr "Aberto em"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:77
msgid "Origin IP"
msgstr "IP de origem"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:86
msgid "Region"
msgstr "Região"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:54
msgid "Running"
msgstr "A executar"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:43
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:70
msgid "See <a %s>documentation</a>."
msgstr "Ver a <a %s>documentação</a>."
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:49
msgid "Status"
msgstr "Estado"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:78
msgid ""
"The account certificate for your zones authorizing the client to serve as an "
"Origin for that zone"
msgstr ""
"O certificado de conta associado às suas zonas que autoriza o cliente a "
"atuar como Origem para essas zonas"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:87
msgid "The region to which connections are established."
msgstr "A região à qual as ligações são estabelecidas."
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:63
msgid "The tunnel token is shown in the dashboard once you create a tunnel."
msgstr ""
"O token do túnel é apresentado no painel de controlo assim que criar um "
"túnel."
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:62
msgid "Token"
msgstr "Token"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:96
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:22
msgid "Tunnels"
msgstr "Túneis"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:48
msgid "Tunnels Information"
msgstr "Informação de túneis"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:33
msgid "Unable to read the interface info from /var/log/cloudflared.log."
msgstr "Incapaz de ler as informações da interface de /var/log/cloudflared.log."
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:89
msgid "United States"
msgstr "Estados Unidos"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:97
msgid "Up"
msgstr "Para cima"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:91
msgid "Warn"
msgstr "Aviso"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:95
msgid "Warning"
msgstr "Alerta"
@@ -0,0 +1,208 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"PO-Revision-Date: 2026-03-09 19:10+0000\n"
"Last-Translator: Volenski <volenski@users.noreply.hosted.weblate.org>\n"
"Language-Team: Portuguese (Brazil) <https://hosted.weblate.org/projects/"
"openwrt/luciapplicationscloudflared/pt_BR/>\n"
"Language: pt_BR\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n > 1;\n"
"X-Generator: Weblate 5.17-dev\n"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:89
msgid "All"
msgstr "Todos"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:77
msgid "Certificate of Origin"
msgstr "Certificado de Origem"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:40
msgid ""
"Cloudflare Zero Trust Security services help you get maximum security both "
"from outside and within the network."
msgstr ""
"Os serviços de segurança Zero Trust da Cloudflare ajudam você a obter "
"segurança máxima tanto de fora quanto de dentro da rede."
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:39
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:3
msgid "Cloudflare Zero Trust Tunnel"
msgstr "Tunel do Cloudflare Zero Trust"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:69
msgid "Config file path"
msgstr "Desativar saída de cores do log"
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:14
msgid "Configuration"
msgstr "Configuração"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:76
msgid "Connection ID"
msgstr "ID da conexão (Connection ID)"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:54
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:90
msgid "Connections"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:41
msgid ""
"Create and manage your network on the <a %s>Cloudflare Zero Trust</a> "
"dashboard."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:53
msgid "Created At"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:79
msgid "Data Center"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:97
msgid "Debug"
msgstr "Depuração (Debug)"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:96
msgid "Down"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:104
msgid "Download Log"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:59
msgid "Enable"
msgstr "Habilitar"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:94
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:92
msgid "Error"
msgstr "Erro"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:93
msgid "Fatal"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:87
msgid "Filter Level:"
msgstr ""
#: applications/luci-app-cloudflared/root/usr/share/rpcd/acl.d/luci-app-cloudflared.json:3
msgid "Grant access to Cloudflared configuration"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:52
msgid "ID"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:96
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:90
msgid "Info"
msgstr "Informação (Info)"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:85
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:30
msgid "Log"
msgstr "Registro"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:94
msgid "Log Direction:"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:92
msgid "Logging level"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:51
msgid "Name"
msgstr "Nome"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:85
msgid "No connections"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:55
msgid "Not Running"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:79
msgid "Obtain a certificate <a %s>here</a>."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:78
msgid "Opened At"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:77
msgid "Origin IP"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:86
msgid "Region"
msgstr "Região"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:54
msgid "Running"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:43
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:70
msgid "See <a %s>documentation</a>."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:49
msgid "Status"
msgstr "Status"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:78
msgid ""
"The account certificate for your zones authorizing the client to serve as an "
"Origin for that zone"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:87
msgid "The region to which connections are established."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:63
msgid "The tunnel token is shown in the dashboard once you create a tunnel."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:62
msgid "Token"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:96
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:22
msgid "Tunnels"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:48
msgid "Tunnels Information"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:33
msgid "Unable to read the interface info from /var/log/cloudflared.log."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:89
msgid "United States"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:97
msgid "Up"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:91
msgid "Warn"
msgstr "Aviso"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:95
msgid "Warning"
msgstr ""
@@ -0,0 +1,209 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"PO-Revision-Date: 2025-11-24 10:29+0000\n"
"Last-Translator: CRISTIAN ANDREI <cristianvdr@gmail.com>\n"
"Language-Team: Romanian <https://hosted.weblate.org/projects/openwrt/"
"luciapplicationscloudflared/ro/>\n"
"Language: ro\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=n==1 ? 0 : "
"(n==0 || (n%100 > 0 && n%100 < 20)) ? 1 : 2;\n"
"X-Generator: Weblate 5.15-dev\n"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:89
msgid "All"
msgstr "Toate"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:77
msgid "Certificate of Origin"
msgstr "Certificat de Origine"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:40
msgid ""
"Cloudflare Zero Trust Security services help you get maximum security both "
"from outside and within the network."
msgstr ""
"Serviciile Cloudflare Zero Trust Security te ajută să obții securitate "
"maximă atât din exterior, cât și din interiorul rețelei."
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:39
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:3
msgid "Cloudflare Zero Trust Tunnel"
msgstr "Tunelul Cloudflare Zero Trust"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:69
msgid "Config file path"
msgstr "Calea fișierului de configurare"
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:14
msgid "Configuration"
msgstr "Configurație"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:76
msgid "Connection ID"
msgstr "ID-ul conexiunii"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:54
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:90
msgid "Connections"
msgstr "Conexiuni"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:41
msgid ""
"Create and manage your network on the <a %s>Cloudflare Zero Trust</a> "
"dashboard."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:53
msgid "Created At"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:79
msgid "Data Center"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:97
msgid "Debug"
msgstr "Depanare"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:96
msgid "Down"
msgstr "Nefuncțional"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:104
msgid "Download Log"
msgstr "Descărcare Jurnal"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:59
msgid "Enable"
msgstr "Activați"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:94
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:92
msgid "Error"
msgstr "Eroare"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:93
msgid "Fatal"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:87
msgid "Filter Level:"
msgstr ""
#: applications/luci-app-cloudflared/root/usr/share/rpcd/acl.d/luci-app-cloudflared.json:3
msgid "Grant access to Cloudflared configuration"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:52
msgid "ID"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:96
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:90
msgid "Info"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:85
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:30
msgid "Log"
msgstr "Jurnal"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:94
msgid "Log Direction:"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:92
msgid "Logging level"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:51
msgid "Name"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:85
msgid "No connections"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:55
msgid "Not Running"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:79
msgid "Obtain a certificate <a %s>here</a>."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:78
msgid "Opened At"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:77
msgid "Origin IP"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:86
msgid "Region"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:54
msgid "Running"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:43
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:70
msgid "See <a %s>documentation</a>."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:49
msgid "Status"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:78
msgid ""
"The account certificate for your zones authorizing the client to serve as an "
"Origin for that zone"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:87
msgid "The region to which connections are established."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:63
msgid "The tunnel token is shown in the dashboard once you create a tunnel."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:62
msgid "Token"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:96
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:22
msgid "Tunnels"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:48
msgid "Tunnels Information"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:33
msgid "Unable to read the interface info from /var/log/cloudflared.log."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:89
msgid "United States"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:97
msgid "Up"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:91
msgid "Warn"
msgstr "Atenție"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:95
msgid "Warning"
msgstr "Atenționare"
@@ -0,0 +1,215 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"PO-Revision-Date: 2026-02-20 11:50+0000\n"
"Last-Translator: SnIPeRSnIPeR <snipersniper@users.noreply.hosted.weblate.org>"
"\n"
"Language-Team: Russian <https://hosted.weblate.org/projects/openwrt/"
"luciapplicationscloudflared/ru/>\n"
"Language: ru\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
"X-Generator: Weblate 5.16.1-dev\n"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:89
msgid "All"
msgstr "Все"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:77
msgid "Certificate of Origin"
msgstr "Сертификат Origin"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:40
msgid ""
"Cloudflare Zero Trust Security services help you get maximum security both "
"from outside and within the network."
msgstr ""
"Сервисы Cloudflare Безопасность Нулевого Доверия (Zero Trust Security) "
"помогают вам получить максимальную безопасность как извне, так и внутри сети."
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:39
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:3
msgid "Cloudflare Zero Trust Tunnel"
msgstr "Cloudflare Безопасность Нулевого Доверия"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:69
msgid "Config file path"
msgstr "Путь к файлу конфигурации"
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:14
msgid "Configuration"
msgstr "Конфигурация"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:76
msgid "Connection ID"
msgstr "Идентификатор соединения"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:54
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:90
msgid "Connections"
msgstr "Соединения"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:41
msgid ""
"Create and manage your network on the <a %s>Cloudflare Zero Trust</a> "
"dashboard."
msgstr ""
"Создайте и управляйте своей сетью на панели <a%s>Cloudflare Zero Trust</a>."
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:53
msgid "Created At"
msgstr "Создано в"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:79
msgid "Data Center"
msgstr "Дата-центр"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:97
msgid "Debug"
msgstr "Отладка"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:96
msgid "Down"
msgstr "Вниз"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:104
msgid "Download Log"
msgstr "Скачать журнал"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:59
msgid "Enable"
msgstr "Включить"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:94
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:92
msgid "Error"
msgstr "Ошибка"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:93
msgid "Fatal"
msgstr "Фатальный"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:87
msgid "Filter Level:"
msgstr "Фильтровать по уровню:"
#: applications/luci-app-cloudflared/root/usr/share/rpcd/acl.d/luci-app-cloudflared.json:3
msgid "Grant access to Cloudflared configuration"
msgstr "Доступ к конфигурации Cloudflared"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:52
msgid "ID"
msgstr "Идентификатор"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:96
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:90
msgid "Info"
msgstr "Информация"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:85
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:30
msgid "Log"
msgstr "Журнал"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:94
msgid "Log Direction:"
msgstr "Направление в журнале:"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:92
msgid "Logging level"
msgstr "Уровень журналирования"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:51
msgid "Name"
msgstr "Название"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:85
msgid "No connections"
msgstr "Нет соединений"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:55
msgid "Not Running"
msgstr "Не запущенно"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:79
msgid "Obtain a certificate <a %s>here</a>."
msgstr "Получить сертификат <a%s>здесь</a>."
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:78
msgid "Opened At"
msgstr "Открыто в"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:77
msgid "Origin IP"
msgstr "Исходный IP-адрес"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:86
msgid "Region"
msgstr "Регион"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:54
msgid "Running"
msgstr "Запущено"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:43
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:70
msgid "See <a %s>documentation</a>."
msgstr "Смотрите <a%s>документацию</a>."
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:49
msgid "Status"
msgstr "Статус"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:78
msgid ""
"The account certificate for your zones authorizing the client to serve as an "
"Origin for that zone"
msgstr ""
"Сертификат учётной записи для ваших зон, уполномочивающих клиента служить "
"Происхождением (Origin) для этой зоны"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:87
msgid "The region to which connections are established."
msgstr "Регион к которому устанавливать соединение."
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:63
msgid "The tunnel token is shown in the dashboard once you create a tunnel."
msgstr ""
"Токен туннеля будет показан в панели управления после создания туннеля."
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:62
msgid "Token"
msgstr "Токен"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:96
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:22
msgid "Tunnels"
msgstr "Туннели"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:48
msgid "Tunnels Information"
msgstr "Информация о туннелях"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:33
msgid "Unable to read the interface info from /var/log/cloudflared.log."
msgstr ""
"Невозможно прочитать информацию об интерфейсе из /var/log/cloudflared.log."
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:89
msgid "United States"
msgstr "Соединенные Штаты"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:97
msgid "Up"
msgstr "Вверх"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:91
msgid "Warn"
msgstr "Предупреждение"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:95
msgid "Warning"
msgstr "Предупреждение"
@@ -0,0 +1,203 @@
msgid ""
msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Project-Id-Version: PACKAGE VERSION\n"
"Last-Translator: Automatically generated\n"
"Language-Team: none\n"
"Language: sk\n"
"MIME-Version: 1.0\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:89
msgid "All"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:77
msgid "Certificate of Origin"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:40
msgid ""
"Cloudflare Zero Trust Security services help you get maximum security both "
"from outside and within the network."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:39
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:3
msgid "Cloudflare Zero Trust Tunnel"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:69
msgid "Config file path"
msgstr ""
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:14
msgid "Configuration"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:76
msgid "Connection ID"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:54
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:90
msgid "Connections"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:41
msgid ""
"Create and manage your network on the <a %s>Cloudflare Zero Trust</a> "
"dashboard."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:53
msgid "Created At"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:79
msgid "Data Center"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:97
msgid "Debug"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:96
msgid "Down"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:104
msgid "Download Log"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:59
msgid "Enable"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:94
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:92
msgid "Error"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:93
msgid "Fatal"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:87
msgid "Filter Level:"
msgstr ""
#: applications/luci-app-cloudflared/root/usr/share/rpcd/acl.d/luci-app-cloudflared.json:3
msgid "Grant access to Cloudflared configuration"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:52
msgid "ID"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:96
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:90
msgid "Info"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:85
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:30
msgid "Log"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:94
msgid "Log Direction:"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:92
msgid "Logging level"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:51
msgid "Name"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:85
msgid "No connections"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:55
msgid "Not Running"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:79
msgid "Obtain a certificate <a %s>here</a>."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:78
msgid "Opened At"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:77
msgid "Origin IP"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:86
msgid "Region"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:54
msgid "Running"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:43
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:70
msgid "See <a %s>documentation</a>."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:49
msgid "Status"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:78
msgid ""
"The account certificate for your zones authorizing the client to serve as an "
"Origin for that zone"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:87
msgid "The region to which connections are established."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:63
msgid "The tunnel token is shown in the dashboard once you create a tunnel."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:62
msgid "Token"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:96
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:22
msgid "Tunnels"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:48
msgid "Tunnels Information"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:33
msgid "Unable to read the interface info from /var/log/cloudflared.log."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:89
msgid "United States"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:97
msgid "Up"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:91
msgid "Warn"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:95
msgid "Warning"
msgstr ""
@@ -0,0 +1,206 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"PO-Revision-Date: 2026-01-25 20:29+0000\n"
"Last-Translator: Kristoffer Grundström <swedishsailfishosuser@tutanota.com>\n"
"Language-Team: Swedish <https://hosted.weblate.org/projects/openwrt/"
"luciapplicationscloudflared/sv/>\n"
"Language: sv\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 5.16-dev\n"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:89
msgid "All"
msgstr "Alla"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:77
msgid "Certificate of Origin"
msgstr "Originalcertifikat"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:40
msgid ""
"Cloudflare Zero Trust Security services help you get maximum security both "
"from outside and within the network."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:39
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:3
msgid "Cloudflare Zero Trust Tunnel"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:69
msgid "Config file path"
msgstr "Genväg för konfig-fil"
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:14
msgid "Configuration"
msgstr "Konfiguration"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:76
msgid "Connection ID"
msgstr "ID för anslutningen"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:54
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:90
msgid "Connections"
msgstr "Anslutningar"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:41
msgid ""
"Create and manage your network on the <a %s>Cloudflare Zero Trust</a> "
"dashboard."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:53
msgid "Created At"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:79
msgid "Data Center"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:97
msgid "Debug"
msgstr "Felsök"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:96
msgid "Down"
msgstr "Ner"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:104
msgid "Download Log"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:59
msgid "Enable"
msgstr "Aktivera"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:94
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:92
msgid "Error"
msgstr "Fel"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:93
msgid "Fatal"
msgstr "Dödligt"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:87
msgid "Filter Level:"
msgstr ""
#: applications/luci-app-cloudflared/root/usr/share/rpcd/acl.d/luci-app-cloudflared.json:3
msgid "Grant access to Cloudflared configuration"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:52
msgid "ID"
msgstr "ID"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:96
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:90
msgid "Info"
msgstr "Info"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:85
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:30
msgid "Log"
msgstr "Logg"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:94
msgid "Log Direction:"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:92
msgid "Logging level"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:51
msgid "Name"
msgstr "Namn"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:85
msgid "No connections"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:55
msgid "Not Running"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:79
msgid "Obtain a certificate <a %s>here</a>."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:78
msgid "Opened At"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:77
msgid "Origin IP"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:86
msgid "Region"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:54
msgid "Running"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:43
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:70
msgid "See <a %s>documentation</a>."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:49
msgid "Status"
msgstr "Status"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:78
msgid ""
"The account certificate for your zones authorizing the client to serve as an "
"Origin for that zone"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:87
msgid "The region to which connections are established."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:63
msgid "The tunnel token is shown in the dashboard once you create a tunnel."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:62
msgid "Token"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:96
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:22
msgid "Tunnels"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:48
msgid "Tunnels Information"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:33
msgid "Unable to read the interface info from /var/log/cloudflared.log."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:89
msgid "United States"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:97
msgid "Up"
msgstr "Upp"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:91
msgid "Warn"
msgstr "Varna"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:95
msgid "Warning"
msgstr "Varning"
@@ -0,0 +1,212 @@
msgid ""
msgstr ""
"PO-Revision-Date: 2025-01-25 02:34+0000\n"
"Last-Translator: தமிழ்நேரம் <anishprabu.t@gmail.com>\n"
"Language-Team: Tamil <https://hosted.weblate.org/projects/openwrt/"
"luciapplicationscloudflared/ta/>\n"
"Language: ta\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 5.10-dev\n"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:89
msgid "All"
msgstr "அனைத்தும்"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:77
msgid "Certificate of Origin"
msgstr "தோற்றம் சான்றிதழ்"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:40
msgid ""
"Cloudflare Zero Trust Security services help you get maximum security both "
"from outside and within the network."
msgstr ""
"கிளவுட்ஃப்ளேர் சீரோ அறக்கட்டளை பாதுகாப்பு சேவைகள் வெளியில் இருந்து மற்றும் பிணையத்திற்குள் "
"அதிகபட்ச பாதுகாப்பைப் பெற உதவுகின்றன."
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:39
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:3
msgid "Cloudflare Zero Trust Tunnel"
msgstr "கிளவுட்ஃப்ளேர் சீரோ டிரச்ட் சுரங்கப்பாதை"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:69
msgid "Config file path"
msgstr "கோப்பு பாதை"
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:14
msgid "Configuration"
msgstr "உள்ளமைவு"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:76
msgid "Connection ID"
msgstr "இணைப்பு ஐடி"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:54
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:90
msgid "Connections"
msgstr "இணைப்புகள்"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:41
msgid ""
"Create and manage your network on the <a %s>Cloudflare Zero Trust</a> "
"dashboard."
msgstr ""
"<a %s> கிளவுட்ஃப்ளேர் சீரோ டிரச்ட் </a> டாச்போர்டில் உங்கள் பிணையத்தை உருவாக்கி "
"நிர்வகிக்கவும்."
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:53
msgid "Created At"
msgstr "உருவாக்கப்பட்டது"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:79
msgid "Data Center"
msgstr "தரவு நடுவண்"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:97
msgid "Debug"
msgstr "பிழைத்திருத்தம்"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:96
msgid "Down"
msgstr "கீழே"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:104
msgid "Download Log"
msgstr "பதிவைப் பதிவிறக்கவும்"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:59
msgid "Enable"
msgstr "இயக்கு"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:94
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:92
msgid "Error"
msgstr "பிழை"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:93
msgid "Fatal"
msgstr "அபாயகரமான"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:87
msgid "Filter Level:"
msgstr "வடிகட்டி நிலை:"
#: applications/luci-app-cloudflared/root/usr/share/rpcd/acl.d/luci-app-cloudflared.json:3
msgid "Grant access to Cloudflared configuration"
msgstr "கிளவுட்ஃப்ளைர் உள்ளமைவுக்கு அணுகலை வழங்கவும்"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:52
msgid "ID"
msgstr "ஐடி"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:96
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:90
msgid "Info"
msgstr "தகவல்"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:85
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:30
msgid "Log"
msgstr "பதிவு"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:94
msgid "Log Direction:"
msgstr "பதிவு திசை:"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:92
msgid "Logging level"
msgstr "பதிவு நிலை"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:51
msgid "Name"
msgstr "பெயர்"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:85
msgid "No connections"
msgstr "இணைப்புகள் இல்லை"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:55
msgid "Not Running"
msgstr "ஓடவில்லை"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:79
msgid "Obtain a certificate <a %s>here</a>."
msgstr "ஒரு சான்றிதழைப் பெறுங்கள் <a %s> இங்கே </a>."
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:78
msgid "Opened At"
msgstr "இல் திறக்கப்பட்டது"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:77
msgid "Origin IP"
msgstr "ஆரிசின் ஐபி"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:86
msgid "Region"
msgstr "பகுதி"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:54
msgid "Running"
msgstr "இயங்கும்"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:43
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:70
msgid "See <a %s>documentation</a>."
msgstr "<a %s> ஆவணங்கள் </a> ஐப் பார்க்கவும்."
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:49
msgid "Status"
msgstr "நிலை"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:78
msgid ""
"The account certificate for your zones authorizing the client to serve as an "
"Origin for that zone"
msgstr ""
"உங்கள் மண்டலங்களுக்கான கணக்கு சான்றிதழ் வாடிக்கையாளருக்கு அந்த மண்டலத்திற்கான தோற்றமாக "
"செயல்பட ஏற்பு அளிக்கிறது"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:87
msgid "The region to which connections are established."
msgstr "இணைப்புகள் நிறுவப்பட்ட பகுதி."
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:63
msgid "The tunnel token is shown in the dashboard once you create a tunnel."
msgstr ""
"நீங்கள் ஒரு சுரங்கப்பாதையை உருவாக்கியவுடன் டாச்போர்டில் சுரங்கப்பாதை கிள்ளாக்கு "
"காட்டப்பட்டுள்ளது."
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:62
msgid "Token"
msgstr "கிள்ளாக்கு"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:96
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:22
msgid "Tunnels"
msgstr "சுரங்கங்கள்"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:48
msgid "Tunnels Information"
msgstr "சுரங்கங்கள் செய்தி"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:33
msgid "Unable to read the interface info from /var/log/cloudflared.log."
msgstr "/Var/log/cloudflared.log இலிருந்து இடைமுக தகவலை படிக்க முடியவில்லை."
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:89
msgid "United States"
msgstr "ஐக்கிய அமெரிக்கா"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:97
msgid "Up"
msgstr "மேலே"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:91
msgid "Warn"
msgstr "எச்சரிக்கை"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:95
msgid "Warning"
msgstr "எச்சரிக்கை"
@@ -0,0 +1,195 @@
msgid ""
msgstr "Content-Type: text/plain; charset=UTF-8"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:89
msgid "All"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:77
msgid "Certificate of Origin"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:40
msgid ""
"Cloudflare Zero Trust Security services help you get maximum security both "
"from outside and within the network."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:39
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:3
msgid "Cloudflare Zero Trust Tunnel"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:69
msgid "Config file path"
msgstr ""
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:14
msgid "Configuration"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:76
msgid "Connection ID"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:54
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:90
msgid "Connections"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:41
msgid ""
"Create and manage your network on the <a %s>Cloudflare Zero Trust</a> "
"dashboard."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:53
msgid "Created At"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:79
msgid "Data Center"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:97
msgid "Debug"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:96
msgid "Down"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:104
msgid "Download Log"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:59
msgid "Enable"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:94
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:92
msgid "Error"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:93
msgid "Fatal"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:87
msgid "Filter Level:"
msgstr ""
#: applications/luci-app-cloudflared/root/usr/share/rpcd/acl.d/luci-app-cloudflared.json:3
msgid "Grant access to Cloudflared configuration"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:52
msgid "ID"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:96
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:90
msgid "Info"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:85
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:30
msgid "Log"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:94
msgid "Log Direction:"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:92
msgid "Logging level"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:51
msgid "Name"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:85
msgid "No connections"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:55
msgid "Not Running"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:79
msgid "Obtain a certificate <a %s>here</a>."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:78
msgid "Opened At"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:77
msgid "Origin IP"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:86
msgid "Region"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:54
msgid "Running"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:43
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:70
msgid "See <a %s>documentation</a>."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:49
msgid "Status"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:78
msgid ""
"The account certificate for your zones authorizing the client to serve as an "
"Origin for that zone"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:87
msgid "The region to which connections are established."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:63
msgid "The tunnel token is shown in the dashboard once you create a tunnel."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:62
msgid "Token"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:96
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:22
msgid "Tunnels"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:48
msgid "Tunnels Information"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:33
msgid "Unable to read the interface info from /var/log/cloudflared.log."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:89
msgid "United States"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:97
msgid "Up"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:91
msgid "Warn"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:95
msgid "Warning"
msgstr ""
@@ -0,0 +1,211 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"PO-Revision-Date: 2025-09-08 17:09+0000\n"
"Last-Translator: Derman <mole.qnap@gmail.com>\n"
"Language-Team: Turkish <https://hosted.weblate.org/projects/openwrt/"
"luciapplicationscloudflared/tr/>\n"
"Language: tr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 5.14-dev\n"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:89
msgid "All"
msgstr "Hepsi"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:77
msgid "Certificate of Origin"
msgstr "Menşei Belgesi"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:40
msgid ""
"Cloudflare Zero Trust Security services help you get maximum security both "
"from outside and within the network."
msgstr ""
"Cloudflare Zero Trust Security hizmetleri, hem dışarıdan hem de ağ içinden "
"maksimum güvenlik elde etmenize yardımcı olur."
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:39
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:3
msgid "Cloudflare Zero Trust Tunnel"
msgstr "Cloudflare Zero Trust Tüneli"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:69
msgid "Config file path"
msgstr "Yapılandırma dosyası yolu"
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:14
msgid "Configuration"
msgstr "Yapılandırma"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:76
msgid "Connection ID"
msgstr "Bağlantı Kimliği"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:54
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:90
msgid "Connections"
msgstr "Bağlantılar"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:41
msgid ""
"Create and manage your network on the <a %s>Cloudflare Zero Trust</a> "
"dashboard."
msgstr "Ağınızı <a%s>Cloudflare Zero Trust</a> panosunda oluşturun ve yönetin."
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:53
msgid "Created At"
msgstr "Oluşturulduğu Yer"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:79
msgid "Data Center"
msgstr "Veri Merkezi"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:97
msgid "Debug"
msgstr "Hata Ayıklama"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:96
msgid "Down"
msgstr "Aşağı"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:104
msgid "Download Log"
msgstr "Günlüğü indir"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:59
msgid "Enable"
msgstr "Etkinleştir"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:94
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:92
msgid "Error"
msgstr "Hata"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:93
msgid "Fatal"
msgstr "Ölümcül"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:87
msgid "Filter Level:"
msgstr "Filtre Seviyesi:"
#: applications/luci-app-cloudflared/root/usr/share/rpcd/acl.d/luci-app-cloudflared.json:3
msgid "Grant access to Cloudflared configuration"
msgstr "Cloudflared yapılandırmasına erişim izni ver"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:52
msgid "ID"
msgstr "ID"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:96
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:90
msgid "Info"
msgstr "Bilgi"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:85
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:30
msgid "Log"
msgstr "Günlük"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:94
msgid "Log Direction:"
msgstr "Günlük Yolu:"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:92
msgid "Logging level"
msgstr "Günlük seviyesi"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:51
msgid "Name"
msgstr "İsim"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:85
msgid "No connections"
msgstr "Bağlantı yok"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:55
msgid "Not Running"
msgstr "Çalışmıyor"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:79
msgid "Obtain a certificate <a %s>here</a>."
msgstr "<a %s>buradan</a> bir sertifika edinin."
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:78
msgid "Opened At"
msgstr "Açıldığı Yer"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:77
msgid "Origin IP"
msgstr "Kaynak IP"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:86
msgid "Region"
msgstr "Bölge"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:54
msgid "Running"
msgstr "Çalışıyor"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:43
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:70
msgid "See <a %s>documentation</a>."
msgstr "<a %s>dokümantasyon</a> bölümüne bakın."
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:49
msgid "Status"
msgstr "Durum"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:78
msgid ""
"The account certificate for your zones authorizing the client to serve as an "
"Origin for that zone"
msgstr ""
"Bölgeleriniz için, istemciyi o bölge için bir Origin olarak hizmet vermek "
"üzere yetkilendiren hesap sertifikası"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:87
msgid "The region to which connections are established."
msgstr "Bağlantıların kurulduğu bölge."
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:63
msgid "The tunnel token is shown in the dashboard once you create a tunnel."
msgstr ""
"Tünel belirteci, bir tünel oluşturduğunuzda kontrol panelinde gösterilir."
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:62
msgid "Token"
msgstr "Token"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:96
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:22
msgid "Tunnels"
msgstr "Tüneller"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:48
msgid "Tunnels Information"
msgstr "Tünel Bilgileri"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:33
msgid "Unable to read the interface info from /var/log/cloudflared.log."
msgstr "Arayüz bilgisi /var/log/cloudflared.log dosyasından okunamıyor."
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:89
msgid "United States"
msgstr "Amerika Birleşik Devletleri"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:97
msgid "Up"
msgstr "Yukarı"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:91
msgid "Warn"
msgstr "Uyarı"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:95
msgid "Warning"
msgstr "Dikkat"
@@ -0,0 +1,215 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"PO-Revision-Date: 2026-01-22 09:00+0000\n"
"Last-Translator: Максим Горпиніч <gorpinicmaksim0@gmail.com>\n"
"Language-Team: Ukrainian <https://hosted.weblate.org/projects/openwrt/"
"luciapplicationscloudflared/uk/>\n"
"Language: uk\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
"X-Generator: Weblate 5.16-dev\n"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:89
msgid "All"
msgstr "Усі"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:77
msgid "Certificate of Origin"
msgstr "Сертифікат походження"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:40
msgid ""
"Cloudflare Zero Trust Security services help you get maximum security both "
"from outside and within the network."
msgstr ""
"Служби безпеки Cloudflare Zero Trust допомагають забезпечити максимальний "
"рівень захисту як іззовні, так і всередині мережі."
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:39
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:3
msgid "Cloudflare Zero Trust Tunnel"
msgstr "Тунель нульової довіри Cloudflare"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:69
msgid "Config file path"
msgstr "Шлях до конфігураційного файлу"
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:14
msgid "Configuration"
msgstr "Конфігурація"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:76
msgid "Connection ID"
msgstr "ID підключення"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:54
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:90
msgid "Connections"
msgstr "Зв'язки"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:41
msgid ""
"Create and manage your network on the <a %s>Cloudflare Zero Trust</a> "
"dashboard."
msgstr ""
"Створюйте свою мережу та керуйте нею на інформаційній панелі <a "
"%s>Cloudflare Zero Trust</a>."
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:53
msgid "Created At"
msgstr "Створено Ат"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:79
msgid "Data Center"
msgstr "Центр обробки даних"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:97
msgid "Debug"
msgstr "Налагодження"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:96
msgid "Down"
msgstr "Вниз"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:104
msgid "Download Log"
msgstr "Журнал завантажень"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:59
msgid "Enable"
msgstr "Увімкнути"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:94
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:92
msgid "Error"
msgstr "Помилка"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:93
msgid "Fatal"
msgstr "Фатальний"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:87
msgid "Filter Level:"
msgstr "Рівень фільтра:"
#: applications/luci-app-cloudflared/root/usr/share/rpcd/acl.d/luci-app-cloudflared.json:3
msgid "Grant access to Cloudflared configuration"
msgstr "Надайте доступ до конфігурації Cloudflare"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:52
msgid "ID"
msgstr "ID"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:96
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:90
msgid "Info"
msgstr "Інфо"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:85
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:30
msgid "Log"
msgstr "Журнал"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:94
msgid "Log Direction:"
msgstr "Напрямок журналу:"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:92
msgid "Logging level"
msgstr "Рівень реєстрації"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:51
msgid "Name"
msgstr "Ім'я"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:85
msgid "No connections"
msgstr "Жодних зв'язків"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:55
msgid "Not Running"
msgstr "Не працює"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:79
msgid "Obtain a certificate <a %s>here</a>."
msgstr "Отримайте сертифікат <a %s>тут</a>."
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:78
msgid "Opened At"
msgstr "Відкрито при"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:77
msgid "Origin IP"
msgstr "Походження IP"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:86
msgid "Region"
msgstr "Регіон"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:54
msgid "Running"
msgstr "Запуск"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:43
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:70
msgid "See <a %s>documentation</a>."
msgstr "Перегляньте <a %s>документацію</a>."
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:49
msgid "Status"
msgstr "Статус"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:78
msgid ""
"The account certificate for your zones authorizing the client to serve as an "
"Origin for that zone"
msgstr ""
"Сертифікат облікового запису для ваших зон, що дозволяє клієнту служити "
"джерелом для цієї зони"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:87
msgid "The region to which connections are established."
msgstr "Регіон, з яким встановлені зв'язки."
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:63
msgid "The tunnel token is shown in the dashboard once you create a tunnel."
msgstr ""
"Маркер тунелю відображається на інформаційній панелі після створення тунелю."
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:62
msgid "Token"
msgstr "Токен"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:96
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:22
msgid "Tunnels"
msgstr "Тунелі"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:48
msgid "Tunnels Information"
msgstr "Інформація про тунелі"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:33
msgid "Unable to read the interface info from /var/log/cloudflared.log."
msgstr ""
"Не вдалося прочитати інформацію про інтерфейс із /var/log/cloudflared.log."
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:89
msgid "United States"
msgstr "США"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:97
msgid "Up"
msgstr "Вгору"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:91
msgid "Warn"
msgstr "Попередити"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:95
msgid "Warning"
msgstr "Попередження"
@@ -0,0 +1,222 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"PO-Revision-Date: 2025-08-01 11:02+0000\n"
"Last-Translator: Vũ Minh Ngọc <vuminhngocpt@gmail.com>\n"
"Language-Team: Vietnamese <https://hosted.weblate.org/projects/openwrt/"
"luciapplicationscloudflared/vi/>\n"
"Language: vi\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: Weblate 5.13-dev\n"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:89
msgid "All"
msgstr "Tất cả"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:77
#, fuzzy
msgid "Certificate of Origin"
msgstr "Giấy chứng nhận xuất xứ"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:40
#, fuzzy
msgid ""
"Cloudflare Zero Trust Security services help you get maximum security both "
"from outside and within the network."
msgstr ""
"Dịch vụ Cloudflare Zero Trust Security giúp bạn có được mức bảo mật tối đa "
"từ cả bên ngoài và bên trong mạng."
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:39
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:3
#, fuzzy
msgid "Cloudflare Zero Trust Tunnel"
msgstr "Đường hầm Cloudflare Zero Trust"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:69
#, fuzzy
msgid "Config file path"
msgstr "Đường dẫn tệp cấu hình"
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:14
#, fuzzy
msgid "Configuration"
msgstr "Cấu hình"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:76
#, fuzzy
msgid "Connection ID"
msgstr "ID kết nối"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:54
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:90
#, fuzzy
msgid "Connections"
msgstr "Kết nối"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:41
#, fuzzy
msgid ""
"Create and manage your network on the <a %s>Cloudflare Zero Trust</a> "
"dashboard."
msgstr ""
"Tạo và quản lý mạng của bạn trên bảng điều khiển <a %s>Cloudflare Zero "
"Trust</a>."
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:53
msgid "Created At"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:79
msgid "Data Center"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:97
msgid "Debug"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:96
msgid "Down"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:104
msgid "Download Log"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:59
msgid "Enable"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:94
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:92
msgid "Error"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:93
msgid "Fatal"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:87
msgid "Filter Level:"
msgstr ""
#: applications/luci-app-cloudflared/root/usr/share/rpcd/acl.d/luci-app-cloudflared.json:3
msgid "Grant access to Cloudflared configuration"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:52
msgid "ID"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:96
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:90
msgid "Info"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:85
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:30
msgid "Log"
msgstr "Nhật ký"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:94
#, fuzzy
msgid "Log Direction:"
msgstr "Hướng nhật ký:"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:92
msgid "Logging level"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:51
msgid "Name"
msgstr "Tên"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:85
msgid "No connections"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:55
msgid "Not Running"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:79
msgid "Obtain a certificate <a %s>here</a>."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:78
msgid "Opened At"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:77
msgid "Origin IP"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:86
msgid "Region"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:54
msgid "Running"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:43
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:70
msgid "See <a %s>documentation</a>."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:49
msgid "Status"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:78
msgid ""
"The account certificate for your zones authorizing the client to serve as an "
"Origin for that zone"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:87
msgid "The region to which connections are established."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:63
#, fuzzy
msgid "The tunnel token is shown in the dashboard once you create a tunnel."
msgstr ""
"Mã thông báo đường hầm sẽ được hiển thị trên bảng điều khiển sau khi bạn tạo "
"đường hầm."
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:62
msgid "Token"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:96
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:22
msgid "Tunnels"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:48
msgid "Tunnels Information"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:33
msgid "Unable to read the interface info from /var/log/cloudflared.log."
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:89
msgid "United States"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:97
msgid "Up"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:91
msgid "Warn"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:95
msgid "Warning"
msgstr ""
@@ -0,0 +1,209 @@
msgid ""
msgstr ""
"PO-Revision-Date: 2024-09-07 19:01+0000\n"
"Last-Translator: brodrigueznu <brodrigueznu@hotmail.com>\n"
"Language-Team: Yucateco <https://hosted.weblate.org/projects/openwrt/"
"luciapplicationscloudflared/yua/>\n"
"Language: yua\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 5.8-dev\n"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:89
msgid "All"
msgstr "Toda"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:77
msgid "Certificate of Origin"
msgstr "Certificado de origen"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:40
msgid ""
"Cloudflare Zero Trust Security services help you get maximum security both "
"from outside and within the network."
msgstr ""
"Los servicios de seguridad Cloudflare Zero Trust le ayudan a obtener la "
"máxima seguridad tanto desde el exterior como dentro de la red."
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:39
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:3
msgid "Cloudflare Zero Trust Tunnel"
msgstr "Tunel Cloudflare Zero Trust"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:69
msgid "Config file path"
msgstr "Ruta del archivo de configuración"
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:14
msgid "Configuration"
msgstr "Configuración"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:76
msgid "Connection ID"
msgstr "ID de conexión"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:54
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:90
msgid "Connections"
msgstr "Conexiones"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:41
msgid ""
"Create and manage your network on the <a %s>Cloudflare Zero Trust</a> "
"dashboard."
msgstr "Cree y gestione su red en el panel <a %s>Cloudflare Zero Trust</a>."
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:53
msgid "Created At"
msgstr "Creado en"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:79
msgid "Data Center"
msgstr "Centro de datos"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:97
msgid "Debug"
msgstr "Depurar"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:96
msgid "Down"
msgstr "Abajo"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:104
msgid "Download Log"
msgstr "Descargar registro"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:59
msgid "Enable"
msgstr "Activar"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:94
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:92
msgid "Error"
msgstr "Error"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:93
msgid "Fatal"
msgstr "Fatal"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:87
msgid "Filter Level:"
msgstr "Nivel de filtro:"
#: applications/luci-app-cloudflared/root/usr/share/rpcd/acl.d/luci-app-cloudflared.json:3
msgid "Grant access to Cloudflared configuration"
msgstr "Permitir acceso a la configuración de Cloudflared"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:52
msgid "ID"
msgstr "ID"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:96
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:90
msgid "Info"
msgstr "Info"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:85
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:30
msgid "Log"
msgstr "Registro"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:94
msgid "Log Direction:"
msgstr "Dirección de registro:"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:92
msgid "Logging level"
msgstr "Nivel de depuración"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:51
msgid "Name"
msgstr "Nombre"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:85
msgid "No connections"
msgstr "Sin conexiones"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:55
msgid "Not Running"
msgstr "No se está ejecutando"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:79
msgid "Obtain a certificate <a %s>here</a>."
msgstr "Obtenga un certificado <a %s>aquí</a>."
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:78
msgid "Opened At"
msgstr "Abierto el"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:77
msgid "Origin IP"
msgstr "IP de origen"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:86
msgid "Region"
msgstr "Región"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:54
msgid "Running"
msgstr "Ejecutando"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:43
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:70
msgid "See <a %s>documentation</a>."
msgstr "Ver <a %s>documentación</a>."
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:49
msgid "Status"
msgstr "Estado"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:78
msgid ""
"The account certificate for your zones authorizing the client to serve as an "
"Origin for that zone"
msgstr ""
"El certificado de cuenta para sus zonas que autoriza al cliente a actuar "
"como Origen para esa zona"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:87
msgid "The region to which connections are established."
msgstr "La región con la que se establecen las conexiones."
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:63
msgid "The tunnel token is shown in the dashboard once you create a tunnel."
msgstr "El token del túnel se muestra en el panel una vez que crea un túnel."
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:62
msgid "Token"
msgstr "Token"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:96
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:22
msgid "Tunnels"
msgstr "Túneles"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:48
msgid "Tunnels Information"
msgstr "Información de túneles"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:33
msgid "Unable to read the interface info from /var/log/cloudflared.log."
msgstr ""
"No se puede leer la información de la interfaz de /var/log/cloudflared.log."
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:89
msgid "United States"
msgstr "Estados Unidos"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:97
msgid "Up"
msgstr "Arriba"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:91
msgid "Warn"
msgstr "Advertir"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:95
msgid "Warning"
msgstr "Advertencia"
+1
View File
@@ -0,0 +1 @@
zh_Hans
@@ -0,0 +1,206 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"PO-Revision-Date: 2026-03-06 16:33+0000\n"
"Last-Translator: nKsyn <e.nksyn@gmail.com>\n"
"Language-Team: Chinese (Simplified Han script) <https://hosted.weblate.org/"
"projects/openwrt/luciapplicationscloudflared/zh_Hans/>\n"
"Language: zh_Hans\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: Weblate 5.17-dev\n"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:89
msgid "All"
msgstr "全部"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:77
msgid "Certificate of Origin"
msgstr "源站证书"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:40
msgid ""
"Cloudflare Zero Trust Security services help you get maximum security both "
"from outside and within the network."
msgstr "Cloudflare 零信任安全服务帮助你从网络内外部获取最大程度的安全性。"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:39
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:3
msgid "Cloudflare Zero Trust Tunnel"
msgstr "Cloudflare 零信任隧道"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:69
msgid "Config file path"
msgstr "配置文件路径"
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:14
msgid "Configuration"
msgstr "配置"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:76
msgid "Connection ID"
msgstr "连接 ID"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:54
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:90
msgid "Connections"
msgstr "连接"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:41
msgid ""
"Create and manage your network on the <a %s>Cloudflare Zero Trust</a> "
"dashboard."
msgstr "在 <a %s>Cloudflare 零信任</a>仪表板上创建并管理你的网络。"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:53
msgid "Created At"
msgstr "创建于"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:79
msgid "Data Center"
msgstr "数据中心"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:97
msgid "Debug"
msgstr "调试 (Debug)"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:96
msgid "Down"
msgstr "↓"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:104
msgid "Download Log"
msgstr "下载日志"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:59
msgid "Enable"
msgstr "启用"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:94
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:92
msgid "Error"
msgstr "错误 (Error)"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:93
msgid "Fatal"
msgstr "致命"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:87
msgid "Filter Level:"
msgstr "过滤等级:"
#: applications/luci-app-cloudflared/root/usr/share/rpcd/acl.d/luci-app-cloudflared.json:3
msgid "Grant access to Cloudflared configuration"
msgstr "授予访问 Cloudflared 配置的权限"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:52
msgid "ID"
msgstr "ID"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:96
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:90
msgid "Info"
msgstr "信息 (Info)"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:85
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:30
msgid "Log"
msgstr "日志"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:94
msgid "Log Direction:"
msgstr "日志呈现时序:"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:92
msgid "Logging level"
msgstr "调试等级"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:51
msgid "Name"
msgstr "名称"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:85
msgid "No connections"
msgstr "无连接"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:55
msgid "Not Running"
msgstr "未在运行"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:79
msgid "Obtain a certificate <a %s>here</a>."
msgstr "在<a %s>此处</a>获取证书。"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:78
msgid "Opened At"
msgstr "连接时间"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:77
msgid "Origin IP"
msgstr "源 IP"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:86
msgid "Region"
msgstr "地区"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:54
msgid "Running"
msgstr "运行中"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:43
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:70
msgid "See <a %s>documentation</a>."
msgstr "见 <a %s>文档</a>。"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:49
msgid "Status"
msgstr "状态"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:78
msgid ""
"The account certificate for your zones authorizing the client to serve as an "
"Origin for that zone"
msgstr "您区域的账户证书,用于授权客户端充当该区域的源站"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:87
msgid "The region to which connections are established."
msgstr "建立连接的目标地区。"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:63
msgid "The tunnel token is shown in the dashboard once you create a tunnel."
msgstr "一旦你创建了隧道,隧道令牌就会显示在仪表板中。"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:62
msgid "Token"
msgstr "令牌"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:96
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:22
msgid "Tunnels"
msgstr "隧道"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:48
msgid "Tunnels Information"
msgstr "隧道信息"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:33
msgid "Unable to read the interface info from /var/log/cloudflared.log."
msgstr "无法从 /var/log/cloudflared.log 中读取接口信息。"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:89
msgid "United States"
msgstr "美国"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:97
msgid "Up"
msgstr "↑"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:91
msgid "Warn"
msgstr "警告"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:95
msgid "Warning"
msgstr "警告 (Warning)"
@@ -0,0 +1,206 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"PO-Revision-Date: 2026-03-09 19:11+0000\n"
"Last-Translator: EESF-2 <eesf-2@users.noreply.hosted.weblate.org>\n"
"Language-Team: Chinese (Traditional Han script) <https://hosted.weblate.org/"
"projects/openwrt/luciapplicationscloudflared/zh_Hant/>\n"
"Language: zh_Hant\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: Weblate 5.17-dev\n"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:89
msgid "All"
msgstr "全部"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:77
msgid "Certificate of Origin"
msgstr "原點憑證"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:40
msgid ""
"Cloudflare Zero Trust Security services help you get maximum security both "
"from outside and within the network."
msgstr "Cloudflare Zero Trust 安全服務幫助您在網路內外都得到最大程度的安全性。"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:39
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:3
msgid "Cloudflare Zero Trust Tunnel"
msgstr "Cloudflare Zero Trust 隧道"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:69
msgid "Config file path"
msgstr "配置檔案路徑"
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:14
msgid "Configuration"
msgstr "配置"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:76
msgid "Connection ID"
msgstr "連線 ID"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:54
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:90
msgid "Connections"
msgstr "連線數"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:41
msgid ""
"Create and manage your network on the <a %s>Cloudflare Zero Trust</a> "
"dashboard."
msgstr "在 <a %s>Cloudflare Zero Trust</a> 儀表板上建立並管理你的網路。"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:53
msgid "Created At"
msgstr "建立於"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:79
msgid "Data Center"
msgstr "資料中心"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:97
msgid "Debug"
msgstr "偵錯"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:96
msgid "Down"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:104
msgid "Download Log"
msgstr "下載紀錄"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:59
msgid "Enable"
msgstr "啟用"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:94
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:92
msgid "Error"
msgstr "錯誤"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:93
msgid "Fatal"
msgstr "致命"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:87
msgid "Filter Level:"
msgstr "篩選等級:"
#: applications/luci-app-cloudflared/root/usr/share/rpcd/acl.d/luci-app-cloudflared.json:3
msgid "Grant access to Cloudflared configuration"
msgstr "授予存取 Cloudflared 配置的權限"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:52
msgid "ID"
msgstr "ID"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:96
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:90
msgid "Info"
msgstr "資訊"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:85
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:30
msgid "Log"
msgstr "紀錄"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:94
msgid "Log Direction:"
msgstr "紀錄方向:"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:92
msgid "Logging level"
msgstr "記錄等級"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:51
msgid "Name"
msgstr "名稱"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:85
msgid "No connections"
msgstr "無連線"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:55
msgid "Not Running"
msgstr "未執行"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:79
msgid "Obtain a certificate <a %s>here</a>."
msgstr "從<a %s>這裡</a>取得憑證。"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:78
msgid "Opened At"
msgstr "已開啟於"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:77
msgid "Origin IP"
msgstr "原點 IP"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:86
msgid "Region"
msgstr "地區"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:54
msgid "Running"
msgstr "執行中"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:43
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:70
msgid "See <a %s>documentation</a>."
msgstr "請看<a %s>文件</a>。"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:49
msgid "Status"
msgstr "狀態"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:78
msgid ""
"The account certificate for your zones authorizing the client to serve as an "
"Origin for that zone"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:87
msgid "The region to which connections are established."
msgstr "建立連線的區域。"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:63
msgid "The tunnel token is shown in the dashboard once you create a tunnel."
msgstr "當您建立隧道時,權杖會顯示在儀表板上。"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:62
msgid "Token"
msgstr "權杖"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:96
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:22
msgid "Tunnels"
msgstr "隧道"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:48
msgid "Tunnels Information"
msgstr "隧道資訊"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:33
msgid "Unable to read the interface info from /var/log/cloudflared.log."
msgstr "無法從 /var/log/cloudflared.log 讀取介面資訊。"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:89
msgid "United States"
msgstr "美國"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:97
msgid "Up"
msgstr ""
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:91
msgid "Warn"
msgstr "警告"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:95
msgid "Warning"
msgstr "警告"
@@ -0,0 +1,37 @@
{
"admin/vpn/cloudflared": {
"title": "Cloudflare Zero Trust Tunnel",
"order": 80,
"action": {
"type": "firstchild"
},
"depends": {
"acl": [ "luci-app-cloudflared" ],
"uci": { "cloudflared": true }
}
},
"admin/vpn/cloudflared/config": {
"title": "Configuration",
"order": 10,
"action": {
"type": "view",
"path": "cloudflared/config"
}
},
"admin/vpn/cloudflared/tunnels": {
"title": "Tunnels",
"order": 20,
"action": {
"type": "view",
"path": "cloudflared/tunnels"
}
},
"admin/vpn/cloudflared/log": {
"title": "Log",
"order": 30,
"action": {
"type": "view",
"path": "cloudflared/log"
}
}
}
@@ -0,0 +1,22 @@
{
"luci-app-cloudflared": {
"description": "Grant access to Cloudflared configuration",
"read": {
"uci": [ "cloudflared" ],
"ubus": {
"service": [ "list" ]
},
"file": {
"/etc/cloudflared/*": [ "read" ],
"/var/log/cloudflared.log": [ "read" ]
}
},
"write": {
"uci": [ "cloudflared" ],
"file": {
"/etc/cloudflared/*": [ "write" ],
"/usr/bin/cloudflared *": [ "exec" ]
}
}
}
}
+1 -1
View File
@@ -4,7 +4,7 @@ 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_DEPENDS:=+easytier-next +luci-base +ucode +ucode-mod-fs +ucode-mod-uci +ucode-mod-ubus
LUCI_PKGARCH:=all
define Package/luci-app-easytier-next/conffiles
@@ -1,471 +0,0 @@
#!/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,419 @@
'use strict';
import { connect } from 'ubus';
import { access, readfile, writefile, stat, popen } from 'fs';
function exec(cmd) {
let p = popen(cmd, 'r');
if (!p) return { code: -1, stdout: [] };
let out = [];
while (true) {
let line = p.read('line');
if (line == null) break;
push(out, rtrim(line, '\r\n'));
}
let code = p.close();
return { code: code, stdout: out };
}
function trim(s) {
if (s == null) return '';
return replace('' + s, /^[\s\r\n]+|[\s\r\n]+$/g, '');
}
function get_procd_status(instance_name) {
let u = connect();
if (!u) return { running: false };
let res = u.call('service', 'list', { name: 'easytier' });
if (res && res['easytier'] && res['easytier'].instances) {
let instances = res['easytier'].instances;
let inst = instances[instance_name || 'core'];
if (inst && inst.running)
return { running: true, pid: inst.pid };
}
return { running: false };
}
function get_rogue_pid(bin_name, managed_pid) {
let res = exec('pidof ' + bin_name + ' 2>/dev/null');
if (res.code == 0 && length(res.stdout) > 0) {
let pid_str = trim(join(' ', res.stdout));
if (pid_str != '') {
let pids = split(pid_str, /\s+/);
for (let i = 0; i < length(pids); i++) {
let pid = pids[i];
if (pid != '' && (managed_pid == null || pid != ('' + managed_pid)))
return +pid;
}
}
}
return null;
}
function get_service_state(bin_name, instance_name) {
let procd_st = get_procd_status(instance_name);
let rogue_pid = get_rogue_pid(bin_name, procd_st.pid);
let state = 'stopped';
if (procd_st.running)
state = 'managed';
else if (rogue_pid)
state = 'unmanaged';
return {
state: state,
running: (state != 'stopped'),
pid: procd_st.pid || rogue_pid || null
};
}
function get_cached_version() {
const cache_file = '/tmp/easytier_version.cache';
const bin_path = '/usr/bin/easytier-core';
if (!access(bin_path)) return 'Unknown';
let bin_st = stat(bin_path);
let cache_st = access(cache_file) ? stat(cache_file) : null;
if (cache_st && cache_st.size > 0 && bin_st && cache_st.mtime >= bin_st.mtime) {
let cached = trim(readfile(cache_file) || '');
if (cached != '') return cached;
}
let ver_res = exec(bin_path + ' --version 2>/dev/null');
if (ver_res.code == 0 && length(ver_res.stdout) > 0) {
let ver_line = trim(ver_res.stdout[0]);
if (ver_line != '') {
writefile(cache_file, ver_line + '\n');
return ver_line;
}
}
return 'Unknown';
}
const methods = {};
methods.get_status = {
call: function() {
let core_st = get_service_state('/usr/bin/easytier-core', 'core');
let web_st = get_service_state('/usr/bin/easytier-web', 'web');
let data = {
installed: access('/usr/bin/easytier-core') ? true : false,
web_installed: access('/usr/bin/easytier-web') ? true : false,
version: get_cached_version(),
core: core_st,
web: web_st,
node_info: null
};
if (core_st.running && access('/usr/bin/easytier-cli')) {
let node_res = exec('/usr/bin/easytier-cli node 2>/dev/null');
if (node_res.code == 0 && length(node_res.stdout) > 0) {
data.node_info = join('\n', node_res.stdout);
}
}
return data;
}
};
function get_route_info_map() {
let route_map = {};
if (!access('/usr/bin/easytier-cli')) return route_map;
let r_res = exec('/usr/bin/easytier-cli -o json route 2>/dev/null');
if (r_res.code == 0 && length(r_res.stdout) > 0) {
let r_data = json(join('\n', r_res.stdout));
if (r_data && length(r_data) > 0) {
for (let i = 0; i < length(r_data); i++) {
let item = r_data[i];
let cidrs = trim(item.proxy_cidrs || '');
let ip = trim(item.ipv4 || '');
let host = trim(item.hostname || '');
let next_hop_host = trim(item.next_hop_hostname_lat_first || item.next_hop_hostname || '');
let next_hop_ip = trim(item.next_hop_ipv4_lat_first || item.next_hop_ipv4 || '');
let path_len = item.path_len_lat_first != null ? item.path_len_lat_first : item.path_len;
let path_lat = item.path_latency_lat_first != null ? item.path_latency_lat_first : item.path_latency;
let 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 != '') {
route_map[ip] = entry;
let ip_clean = split(ip, '/')[0];
route_map[ip_clean] = entry;
}
if (host != '') {
route_map[host] = entry;
}
}
}
}
return route_map;
}
methods.get_peers = {
call: function() {
if (!access('/usr/bin/easytier-cli')) {
return { peers: [], raw: '' };
}
let route_map = get_route_info_map();
let json_res = exec('/usr/bin/easytier-cli -o json peer 2>/dev/null');
if (json_res.code == 0 && length(json_res.stdout) > 0) {
let j_data = json(join('\n', json_res.stdout));
if (j_data && length(j_data) > 0) {
let peers = [];
for (let i = 0; i < length(j_data); i++) {
let item = j_data[i];
let p_ip = trim(item.cidr || item.ipv4 || '');
let p_host = trim(item.hostname || '');
let p_ip_clean = split(p_ip, '/')[0];
let r_entry = route_map[p_ip] || route_map[p_ip_clean] || route_map[p_host] || {};
let proxy_cidrs = r_entry.proxy_cidrs || '';
let next_hop_hostname = r_entry.next_hop_hostname || '';
let next_hop_ipv4 = r_entry.next_hop_ipv4 || '';
let path_latency = r_entry.path_latency != null ? r_entry.path_latency : '';
push(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 || ''),
latency: (item.lat_ms != null && item.lat_ms != '-') ? ('' + item.lat_ms) : '-',
loss_rate: trim(item.loss_rate || '-'),
rx: trim(item.rx_bytes || '-'),
tx: trim(item.tx_bytes || '-'),
tunnel: trim(item.tunnel_proto || '-'),
nat: trim(item.nat_type || '-'),
version: trim(item.version || '-')
});
}
return { peers: peers, raw: '' };
}
}
let peer_res = exec('/usr/bin/easytier-cli peer 2>/dev/null');
let raw_output = (peer_res.code == 0) ? join('\n', peer_res.stdout) : '';
let peers = [];
if (peer_res.code == 0 && length(peer_res.stdout) > 0) {
for (let i = 0; i < length(peer_res.stdout); i++) {
let line = trim(peer_res.stdout[i]);
if (line == '' || match(line, /ipv4|hostname|--/i) && match(line, /\|/)) continue;
if (match(line, /^[-+─━=| ]+$/)) continue;
let parts = split(line, '|');
let cols = [];
for (let idx = 0; idx < length(parts); idx++) {
push(cols, trim(parts[idx]));
}
if (length(cols) > 0 && cols[0] == '') shift(cols);
if (length(cols) > 0 && cols[length(cols) - 1] == '') pop(cols);
if (length(cols) >= 2) {
let peer_ip = trim(cols[0] || '');
let peer_host = trim(cols[1] || '');
let peer_ip_clean = split(peer_ip, '/')[0];
let r_entry = route_map[peer_ip] || route_map[peer_ip_clean] || route_map[peer_host] || {};
let proxy_cidrs = r_entry.proxy_cidrs || '';
let next_hop_hostname = r_entry.next_hop_hostname || '';
let next_hop_ipv4 = r_entry.next_hop_ipv4 || '';
let path_latency = r_entry.path_latency != null ? r_entry.path_latency : '';
push(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: trim(cols[2] || ''),
latency: trim(cols[3] || ''),
loss_rate: trim(cols[4] || ''),
rx: trim(cols[5] || ''),
tx: trim(cols[6] || ''),
tunnel: trim(cols[7] || ''),
nat: trim(cols[8] || ''),
version: trim(cols[9] || '')
});
}
}
}
return { peers: peers, raw: raw_output };
}
};
methods.get_logs = {
call: function() {
let logs = [];
let res = exec('logread -e easytier 2>/dev/null | tail -n 80');
if (res.code == 0 && length(res.stdout) > 0) {
logs = res.stdout;
} else if (access('/tmp/easytier.log')) {
let f_res = exec('tail -n 80 /tmp/easytier.log 2>/dev/null');
if (f_res.code == 0) logs = f_res.stdout;
}
return { logs: logs };
}
};
methods.get_topology = {
call: function() {
if (!access('/usr/bin/easytier-cli')) {
return { nodes: [] };
}
let route_map = get_route_info_map();
let res = exec('/usr/bin/easytier-cli -o json peer-center 2>/dev/null');
if (res.code == 0 && length(res.stdout) > 0) {
let full_str = join('\n', res.stdout);
let data = json(full_str);
if (data && length(data) > 0) {
let valid_nodes = [];
for (let i = 0; i < length(data); i++) {
let n_ip = trim(data[i].ipv4 || '');
let n_host = trim(data[i].hostname || '');
if (n_host == '' || match(n_host, /^unknown$/i)) continue;
if (n_ip == '' || n_ip == '-') continue;
let n_ip_clean = split(n_ip, '/')[0];
let r_entry = route_map[n_ip] || route_map[n_ip_clean] || route_map[n_host] || {};
data[i].proxy_cidrs = r_entry.proxy_cidrs || '';
push(valid_nodes, data[i]);
}
return { nodes: valid_nodes };
}
}
return { nodes: [] };
}
};
methods.get_subroutes = {
call: function() {
try {
let subnets = [];
let seen = {};
// 1. 尝试 ip -j route (支持 JSON 的 iproute2)
let res = exec('ip -j route 2>/dev/null');
if (res && res.code == 0 && length(res.stdout) > 0) {
let routes_json = json(join('', res.stdout));
if (routes_json && length(routes_json) > 0) {
for (let i = 0; i < length(routes_json); i++) {
let r = routes_json[i];
if (r.dst && r.dst != 'default' && r.scope == 'link' && index(r.dst, '.') != -1 && r.dev != 'easytier0' && r.dev != 'lo') {
if (!seen[r.dst]) {
seen[r.dst] = true;
push(subnets, r.dst);
}
}
}
}
}
// 2. 降级:标准文本格式 ip route (兼容 OpenWrt 21.02/BusyBox)
if (length(subnets) == 0) {
let txt_res = exec('ip route 2>/dev/null');
if (txt_res && txt_res.code == 0 && length(txt_res.stdout) > 0) {
for (let i = 0; i < length(txt_res.stdout); i++) {
let line = trim(txt_res.stdout[i]);
if (line == '' || match(line, /^default/i)) continue;
if (index(line, 'easytier0') != -1 || index(line, 'lo') != -1) continue;
let m = match(line, /^([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+\/[0-9]+)\s+dev\s+([^\s]+)/);
if (m && m[1]) {
let subnet = m[1];
let dev = m[2];
if (dev != 'easytier0' && dev != 'lo' && !seen[subnet]) {
seen[subnet] = true;
push(subnets, subnet);
}
}
}
}
}
// 3. 终极兜底:通过 ubus 调用 network.interface dump 提取各接口 IPv4 直连子网
if (length(subnets) == 0) {
let net_res = exec('ubus call network.interface dump 2>/dev/null');
if (net_res && net_res.code == 0 && length(net_res.stdout) > 0) {
let net_data = json(join('', net_res.stdout));
if (net_data && net_data.interface && length(net_data.interface) > 0) {
for (let i = 0; i < length(net_data.interface); i++) {
let iface = net_data.interface[i];
if (iface.interface == 'loopback' || iface.interface == 'easytier') continue;
if (iface['ipv4-address'] && length(iface['ipv4-address']) > 0) {
for (let j = 0; j < length(iface['ipv4-address']); j++) {
let addr = iface['ipv4-address'][j];
let ip_str = addr.address;
let mask = addr.mask;
if (ip_str && mask) {
let parts = split(ip_str, '.');
if (length(parts) == 4) {
let subnet = '';
if (mask == 24) {
subnet = parts[0] + '.' + parts[1] + '.' + parts[2] + '.0/24';
} else if (mask == 16) {
subnet = parts[0] + '.' + parts[1] + '.0.0/16';
} else if (mask == 8) {
subnet = parts[0] + '.0.0.0/8';
} else {
subnet = ip_str + '/' + mask;
}
if (subnet != '' && !seen[subnet]) {
seen[subnet] = true;
push(subnets, subnet);
}
}
}
}
}
}
}
}
}
return { routes: subnets };
} catch(e) {
return { routes: [] };
}
}
};
methods.clear_logs = {
call: function() {
writefile('/tmp/easytier.log', '');
writefile('/tmp/easytier-web.log', '');
return { success: true };
}
};
methods.service_action = {
args: { action: 'action' },
call: function(req) {
let action = req.args?.action;
if (!action) return { success: false, error: 'Missing action' };
if (action == 'restart' || action == 'stop') {
exec('killall -9 easytier-core easytier-web 2>/dev/null');
}
if (action == 'start' || action == 'restart') {
exec('/etc/init.d/easytier restart >/dev/null 2>&1');
} else if (action == 'stop') {
exec('/etc/init.d/easytier stop >/dev/null 2>&1');
}
return { success: true };
}
};
return { 'easytier': methods };
+33
View File
@@ -0,0 +1,33 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=luci-app-flowproxy
PKG_VERSION:=1.0.3
PKG_RELEASE:=1
LUCI_TITLE:=LuCI Support for FlowProxy Traffic Diversion
LUCI_DEPENDS:=+luci-base
LUCI_PKGARCH:=all
define Package/$(PKG_NAME)/prerm
#!/bin/sh
if [ -z "$${IPKG_INSTROOT}" ]; then
/etc/init.d/flowproxy stop
/etc/init.d/flowproxy disable
fi
exit 0
endef
define Package/$(PKG_NAME)/postrm
#!/bin/sh
if [ -z "$${IPKG_INSTROOT}" ]; then
rm -rf /tmp/flowproxy
rm -rf /usr/share/flowproxy
rm -f /var/log/flowproxy.log*
rm -f /var/run/flowproxy.*
fi
exit 0
endef
include $(TOPDIR)/feeds/luci/luci.mk
# call BuildPackage - OpenWrt buildroot signature
@@ -0,0 +1,560 @@
'use strict';
'require form';
'require uci';
'require rpc';
'require poll';
'require view';
'require dom';
'require fs';
'require ui';
'require network';
var callGetStatus = rpc.declare({
object: 'luci.flowproxy',
method: 'get_status'
});
var callGetLogs = rpc.declare({
object: 'luci.flowproxy',
method: 'get_logs',
params: ['lines']
});
var callClearLogs = rpc.declare({
object: 'luci.flowproxy',
method: 'clear_logs'
});
var callGenerateNftConfig = rpc.declare({
object: 'luci.flowproxy',
method: 'generate_nft_config'
});
var callGetRuntimeConfig = rpc.declare({
object: 'luci.flowproxy',
method: 'get_runtime_config'
});
var callRestartService = rpc.declare({
object: 'luci.flowproxy',
method: 'restart_service'
});
return L.view.extend({
load: function() {
return Promise.all([
uci.load('flowproxy').catch(function() { return {}; }),
network.getDevices(),
callGetStatus().catch(function() { return {}; }),
network.getNetworks().catch(function() { return []; })
]);
},
highlightNft: function(text) {
if (!text || text.trim() === '') return '<span style="color: #999;">' + _('(no content / table not loaded)') + '</span>';
var rules = [
{ rex: /#(.*)/g, cls: 'comment' },
{ rex: /\b(table|chain|set|elements|type)\b/g, cls: 'keyword' },
{ rex: /\b(ip|ip6|tcp|udp|ether|meta|meta nfproto)\b/g, cls: 'proto' },
{ rex: /\b(saddr|daddr|sport|dport|mark)\b/g, cls: 'match' },
{ rex: /\b(return|accept|drop|reject|counter|set)\b/g, cls: 'action' },
{ rex: /@[\w_]+/g, cls: 'variable' },
{ rex: /\{|\}/g, cls: 'bracket' }
];
var html = text.replace(/[&<>"']/g, function(m) {
return { '&': '&amp;', '<': '&lt;', '>': '&gt;', '"': '&quot;', "'": '&#39;' }[m];
});
rules.forEach(function(r) {
html = html.replace(r.rex, function(match) {
return '<span class="nft-' + r.cls + '">' + match + '</span>';
});
});
return html;
},
refreshStatus: function(map, node) {
return callGetStatus().then(L.bind(function(status) {
if (!status) return;
var isRunning = (status.running == 1);
var container = node || document;
var statusEl = container.querySelector('#service-status');
if (statusEl) {
var content = [];
if (isRunning) {
var chains = [];
if (status.nft && status.nft.tcp) chains.push('TCP');
if (status.nft && status.nft.udp) chains.push('UDP');
var ip = status.proxy_server_ip_addr || '-';
content.push(E('span', { 'style': 'color: green; font-weight: bold;' }, [ _('running') ]));
content.push(' (' + ip + ':');
content.push(E('span', { 'style': 'color: #FF9800; font-weight: bold;' }, [ chains.join('+') || '-' ]));
content.push(') ');
content.push(E('button', {
'class': 'btn cbi-button cbi-button-apply',
'style': 'margin-left: 10px;',
'click': ui.createHandlerFn(this, 'handleRestart')
}, [ _('Restart') ]));
} else {
content.push(E('span', { 'style': 'color: red; font-weight: bold;' }, [ _('stopped') ]));
}
L.dom.content(statusEl, content);
}
var dnsEl = container.querySelector('#dns-status');
if (dnsEl) {
var dcontent = [];
if (status.dns_running == 1) {
var ip = status.proxy_server_ip_addr || '-';
var port = status.proxy_server_dns_port || '5353';
dcontent.push(E('span', { 'style': 'color: green; font-weight: bold;' }, [ _('running') ]));
dcontent.push(' (' + ip + ':');
dcontent.push(E('span', { 'style': 'color: #FF9800; font-weight: bold;' }, [ port ]));
dcontent.push(')');
} else {
dcontent.push(E('span', { 'style': 'color: red; font-weight: bold;' }, [ _('stopped') ]));
}
L.dom.content(dnsEl, dcontent);
}
}, this));
},
refreshLogs: function() {
return callGetLogs(500).then(L.bind(function(data) {
var logEl = document.getElementById('log-content');
if (logEl) {
var logs = (data && Array.isArray(data.logs)) ? data.logs : [];
logEl.value = logs.length > 0 ? logs.join('\n') : _('no logs available');
if (logs.length > 0) logEl.scrollTop = logEl.scrollHeight;
}
}, this));
},
handleRestart: function() {
ui.showModal(null, [
E('p', { 'class': 'spinning' }, _('Restarting FlowProxy service...'))
]);
return callRestartService().then(L.bind(function(res) {
ui.hideModal();
if (res && res.result) {
ui.addNotification(null, E('p', _('FlowProxy service restarted successfully.')), 'info');
window.setTimeout(function() {
location.reload();
}, 1500);
} else {
ui.addNotification(null, E('p', _('Failed to restart FlowProxy service.')), 'error');
}
}, this)).catch(function(err) {
ui.hideModal();
ui.addNotification(null, E('p', _('RPC error: %s').format((err && (err.message || String(err))) || 'Unknown error')), 'error');
});
},
render: function(data) {
var self = this;
var devices = data[1];
var status = data[2];
var ifaces = data[3] || [];
var m, s, o;
m = new form.Map('flowproxy', _('FlowProxy'),
_('Traffic diversion based on nftables rules. The service will automatically start/stop when you click "Save & Apply".'));
if (!document.getElementById('flowproxy-style')) {
document.head.appendChild(E('style', { id: 'flowproxy-style' }, `
#log-content { width: 100% !important; height: 60vh; min-height: 400px; font-family: monospace; font-size: 12px; background: #f5f5f5 !important; color: #333 !important; border: 1px solid #ccc !important; padding: 10px; resize: vertical; border-radius: 4px; box-sizing: border-box; }
.nft-code-view { background: #f5f5f5 !important; color: #333333 !important; padding: 15px !important; font-family: monospace !important; font-size: 12px !important; overflow-x: auto !important; white-space: pre-wrap !important; width: 100% !important; border: 1px solid #cccccc !important; border-radius: 4px; box-sizing: border-box; max-height: 70vh; }
.nft-comment { color: #777777; font-style: italic; } .nft-keyword { color: #a626a1; font-weight: bold; } .nft-proto { color: #4078f2; } .nft-match { color: #986801; } .nft-action { color: #e45649; font-weight: bold; } .nft-variable { color: #50a14f; font-weight: bold; }
.cbi-section-table-titles th[data-sortable-row]::after, .cbi-section-table-titles th[data-sortable-row]::before { display: none !important; }
.cbi-section-table-titles th[data-sortable-row] { pointer-events: none !important; cursor: default !important; }
`));
}
s = m.section(form.NamedSection, 'global', 'flowproxy');
s.tab('settings', _('Settings'));
s.tab('rules', _('Rules'));
s.tab('lists', _('Lists'));
s.tab('preview', _('Preview'));
s.tab('logs', _('Logs'));
// --- Settings ---
o = s.taboption('settings', form.DummyValue, '_service_status', _('Current Status'));
o.rawhtml = true;
o.cfgvalue = function() { return '<div id="service-status" style="display:inline-block;"><em class="spinning">' + _('checking...') + '</em></div>'; };
o = s.taboption('settings', form.DummyValue, '_dns_status', _('DNS Redirection'));
o.rawhtml = true;
o.cfgvalue = function() { return '<div id="dns-status" style="display:inline-block;">-</div>'; };
s.taboption('settings', form.Flag, 'enabled', _('Enable FlowProxy')).rmempty = false;
s.taboption('settings', form.Flag, 'dns_proxy_enabled', _('Force upstream DNS to proxy server')).rmempty = false;
o = s.taboption('settings', form.Value, 'proxy_server_ip_addr', _('Proxy server IP address'));
o.datatype = 'ip4addr'; o.rmempty = false;
o.placeholder = '192.168.1.254';
o.validate = function(section_id, value) {
var ipInCidr = function(ipStr, cidrStr) {
if (!cidrStr || cidrStr.indexOf(':') !== -1 || !ipStr || ipStr.indexOf(':') !== -1) return false;
var parts = cidrStr.split('/');
var cidrIp = parts[0];
var maskBits = parseInt(parts[1] || '32', 10);
var ipToNum = function(s) {
var p = s.split('.');
if (p.length !== 4) return 0;
return (((parseInt(p[0], 10) << 24) |
(parseInt(p[1], 10) << 16) |
(parseInt(p[2], 10) << 8) |
parseInt(p[3], 10)) >>> 0);
};
var ipNum = ipToNum(ipStr);
var cidrNum = ipToNum(cidrIp);
if (maskBits === 0) return true;
var mask = (0xffffffff << (32 - maskBits)) >>> 0;
return (ipNum & mask) === (cidrNum & mask);
};
var selected_interface = s.formvalue(section_id, 'interface');
if (!value || !selected_interface) return true;
var target_iface = null;
for (var i = 0; i < ifaces.length; i++) {
var dev = ifaces[i].getL3Device() || ifaces[i].getDevice();
if ((dev && dev.getName() === selected_interface) || ifaces[i].getName() === selected_interface) {
target_iface = ifaces[i];
break;
}
}
if (!target_iface) return true;
var ips = target_iface.getIPAddrs();
if (!ips || ips.length === 0) return true;
var inSubnet = false;
for (var j = 0; j < ips.length; j++) {
if (ipInCidr(value, ips[j])) {
inSubnet = true;
break;
}
}
if (!inSubnet) {
return _('The proxy server IP address must be within the subnet of the selected interface (%s).').format(ips.join(', '));
}
return true;
};
o = s.taboption('settings', form.Value, 'proxy_server_dns_port', _('Proxy server DNS port'));
o.datatype = 'port'; o.default = '5353'; o.rmempty = false;
o = s.taboption('settings', form.ListValue, 'interface', _('Proxy server interface'));
devices.forEach(function(d) { o.value(d.getName(), d.getName()); });
o.default = 'br-lan';
s.taboption('settings', form.Value, 'traffic_mark', _('Traffic Mark')).datatype = 'or(uinteger, hex)';
s.taboption('settings', form.Value, 'routing_table', _('Routing Table ID')).datatype = 'and(uinteger,range(1, 4294967295))';
s.taboption('settings', form.Value, 'rule_priority', _('Rule Priority')).datatype = 'and(uinteger,range(0, 4294967295))';
// --- Rules ---
var nftsets = uci.sections('flowproxy', 'nftset').map(function(ss) { return '@' + ss['.name']; });
var setupRuleTable = function(type, title, switch_opt) {
var st = s.taboption('rules', form.SectionValue, '_tab_' + type, form.TableSection, type, title);
var ss = st.subsection;
ss.addremove = true; ss.anonymous = true; ss.sortable = true;
var refreshTable = function() {
return ss.render().then(function(newNode) {
var el = document.getElementById('flowproxy-table-' + type);
if (el && el.parentNode) {
el.parentNode.replaceChild(newNode, el);
}
});
};
var createTemplateButtons = function() {
var presets = {
'priv': { name: 'private (dst)', type: 'dst_ip', val: '@private_dst_ip_v4' },
'china': { name: 'china (dst)', type: 'dst_ip', val: '@chnroute_dst_ip_v4' },
'src_ip': { name: 'ip (src)', type: 'src_ip', val: '@no_proxy_src_ip_v4' },
'dst_ip': { name: 'ip (dst)', type: 'dst_ip', val: '@no_proxy_dst_ip_v4' },
'mac': { name: 'mac (src)', type: 'src_mac', val: '@no_proxy_src_mac' },
'ports': { name: 'ports (dst)', type: 'dst_port', val: (type === 'tcp_rule') ? '@no_proxy_dst_tcp_ports' : '@no_proxy_dst_udp_ports' }
};
var btnGroup = E('div', { 'style': 'display: flex; flex-wrap: wrap; gap: 4px; margin-top: 8px; align-items: center;' }, [ E('small', { 'style': 'margin-right: 5px; color: #888;' }, _('Quick add:')) ]);
Object.keys(presets).forEach(function(k) {
var p = presets[k];
var bgColors = {
'dst_ip': '#2196F3',
'src_ip': '#2196F3',
'custom': '#2196F3',
'src_mac': '#9C27B0',
'dst_port': '#FF9800'
};
var btnStyle = 'padding: 0 6px; font-size: 0.75rem; height: 22px; line-height: 22px; opacity: 0.9; margin-bottom: 4px; border: none; color: #fff; border-radius: 3px; cursor: pointer;';
var bgColor = bgColors[p.type] || '#607d8b';
btnStyle += ' background-color: ' + bgColor + ';';
btnGroup.appendChild(E('button', {
'style': btnStyle,
'title': p.val,
'click': ui.createHandlerFn(self, function() {
var sid = uci.add('flowproxy', type);
uci.set('flowproxy', sid, 'enabled', '1');
uci.set('flowproxy', sid, 'match_type', p.type);
uci.set('flowproxy', sid, 'match_value', p.val);
uci.set('flowproxy', sid, 'action', 'return');
uci.set('flowproxy', sid, 'counter', '0');
return Promise.resolve().then(function() {
return m.load().then(function() {
return refreshTable();
});
});
})
}, [ E('em', { 'class': 'icon-plus' }), ' ', p.name ]));
});
return btnGroup;
};
ss.render = function() {
return form.TableSection.prototype.render.apply(ss).then(function(node) {
node.id = 'flowproxy-table-' + type;
var titleEl = node.querySelector('h3');
if (titleEl) {
titleEl.style.display = 'block';
var headerRow = E('div', { 'style': 'display: flex; align-items: center; gap: 10px;' }, [
E('span', {}, title),
E('div', { 'style': 'font-size: 0.8em; font-weight: normal; display: inline-flex; align-items: center; gap: 5px; color: #666;' }, [
(function() {
var val = uci.get('flowproxy', 'global', switch_opt);
return E('input', { 'type': 'checkbox', 'style': 'width: 16px; height: 18px; cursor: pointer;', 'checked': (val !== '0') ? 'checked' : null,
'change': function(ev) { uci.set('flowproxy', 'global', switch_opt, ev.target.checked ? '1' : '0'); ui.addNotification(null, E('p', _('Master switch updated.')), 'info'); }
});
})(),
E('span', {}, _('enable protocol'))
])
]);
L.dom.content(titleEl, [ headerRow, createTemplateButtons() ]);
}
return node;
});
};
ss.renderSectionAdd = function(extra_class) {
var node = form.TableSection.prototype.renderSectionAdd.apply(this, [extra_class]);
var label = (type === 'tcp_rule') ? 'TCP' : 'UDP';
var addBtn = node.querySelector('.cbi-button-add'); if (addBtn) addBtn.innerText = _('Add rule');
var resetBtn = E('button', { 'class': 'cbi-button cbi-button-reset', 'style': 'margin-left: 10px; border: 1px solid #cc0000; color: #cc0000;',
'click': ui.createHandlerFn(self, function() {
if (confirm(_('this will delete ALL current %s rules and generate default templates. are you sure?').format(label))) {
uci.sections('flowproxy', type).forEach(function(r) { uci.remove('flowproxy', r['.name']); });
var defs = [ { t: 'src_mac', v: '@no_proxy_src_mac' }, { t: 'dst_ip', v: '@private_dst_ip_v4' }, { t: 'dst_ip', v: '@chnroute_dst_ip_v4' } ];
if (type === 'tcp_rule') defs.push({ t: 'dst_port', v: '@no_proxy_dst_tcp_ports' }); else if (type === 'udp_rule') defs.push({ t: 'dst_port', v: '@no_proxy_dst_udp_ports' });
defs.forEach(function(r) { var sid = uci.add('flowproxy', type); uci.set('flowproxy', sid, 'enabled', '1'); uci.set('flowproxy', sid, 'match_type', r.t); uci.set('flowproxy', sid, 'match_value', r.v); uci.set('flowproxy', sid, 'action', 'return'); uci.set('flowproxy', sid, 'counter', '0'); });
return Promise.resolve().then(function() {
return m.load().then(function() {
return refreshTable();
});
});
}
})
}, [ E('em', { 'class': 'icon-reload' }), ' ', _('reset %s templates').format(label) ]);
node.appendChild(resetBtn); return node;
};
ss.option(form.Flag, 'enabled', _('Enabled')).width = '8%';
var match_type = ss.option(form.ListValue, 'match_type', _('Match Type'));
match_type.value('dst_ip', 'dest ip'); match_type.value('src_ip', 'src ip'); match_type.value('src_mac', 'src mac');
match_type.value('dst_port', 'dest port'); match_type.value('src_port', 'src port'); match_type.value('custom', 'custom (raw)');
match_type.default = 'dst_ip'; match_type.rmempty = false; match_type.width = '15%';
var match_value = ss.option(form.Value, 'match_value', _('Match Value'));
match_value.rmempty = false; match_value.width = '45%';
nftsets.forEach(function(set) { match_value.value(set); });
match_value.validate = function(sid, val) {
if (!val || val === '') return _('Expecting: %s').format(_('Match Value'));
var type = match_type.formvalue(sid);
if (!type) {
var typeEl = document.querySelector('[name="cbid.flowproxy.' + sid + '.match_type"]');
if (typeEl && typeEl.value) type = typeEl.value;
}
if (!type) type = uci.get('flowproxy', sid, 'match_type');
if (val.match(/^@/)) {
var setName = val.substring(1);
// 仅当 section 确实存在时才尝试获取 type,否则不进行类型校验
var section = uci.get('flowproxy', setName);
var setType = (section && section['.type'] === 'nftset') ? uci.get('flowproxy', setName, 'type') : null;
if (!setType) return true;
var expectedType = '';
if (type === 'dst_ip' || type === 'src_ip') expectedType = 'ipv4_addr';
else if (type === 'src_mac') expectedType = 'ether_addr';
else if (type === 'dst_port' || type === 'src_port') expectedType = 'inet_service';
if (expectedType && setType !== expectedType && type !== 'custom') {
return _('Set type mismatch: expected %s, got %s').format(expectedType, setType);
}
return true;
}
switch (type) {
case 'dst_ip':
case 'src_ip':
if (!val.match(/^([0-9]{1,3}\.){3}[0-9]{1,3}(\/[0-9]{1,2})?$/)) return _('Invalid IPv4 address or CIDR');
break;
case 'src_mac':
if (!val.match(/^([0-9a-fA-F]{2}:){5}[0-9a-fA-F]{2}$/)) return _('Invalid MAC address');
break;
case 'dst_port':
case 'src_port':
if (!val.match(/^[0-9]+(-[0-9]+)?$/)) return _('Invalid port or range');
break;
}
return true;
};
// 联动:当 match_type 改变时,强制触发 match_value 的校验
match_type.onchange = function(ev, sid, val) {
var value_input = m.lookupOption('match_value', sid)[0];
if (value_input) setTimeout(function() {
var el = document.getElementById(value_input.cbid(sid));
if (el) {
var inputEl = el.tagName === 'INPUT' ? el : el.querySelector('input');
if (inputEl) {
inputEl.dispatchEvent(new CustomEvent('change', { bubbles: true }));
inputEl.dispatchEvent(new CustomEvent('blur', { bubbles: true }));
inputEl.dispatchEvent(new CustomEvent('input', { bubbles: true }));
}
}
}, 0);
};
ss.option(form.Flag, 'counter', _('Counter')).width = '8%';
o = ss.option(form.ListValue, 'action', _('Action')); o.value('return', 'return'); o.value('accept', 'accept'); o.value('drop', 'drop'); o.default = 'return'; o.width = '12%';
};
setupRuleTable('tcp_rule', _('TCP Matching Rules'), 'tcp_enabled');
setupRuleTable('udp_rule', _('UDP Matching Rules'), 'udp_enabled');
// --- Lists ---
var predefined = [ { id: 'no_proxy_src_mac', name: _('no_proxy_src_mac'), type: 'macaddr' }, { id: 'no_proxy_src_ip_v4', name: _('no_proxy_src_ip_v4'), type: 'or(ip4addr, cidr4)' }, { id: 'no_proxy_dst_ip_v4', name: _('no_proxy_dst_ip_v4'), type: 'or(ip4addr, cidr4)' }, { id: 'no_proxy_dst_tcp_ports', name: _('no_proxy_dst_tcp_ports'), type: 'or(port, portrange)' }, { id: 'no_proxy_dst_udp_ports', name: _('no_proxy_dst_udp_ports'), type: 'or(port, portrange)' } ];
predefined.forEach(function(p) {
var sl = s.taboption('lists', form.SectionValue, '_list_' + p.id, form.NamedSection, p.id, 'nftset', p.name + ' (@' + p.id + ')');
sl.subsection.option(form.Flag, 'enabled', _('Enabled')).default = '1';
sl.subsection.option(form.DynamicList, 'elements', _('Elements')).datatype = p.type;
});
var spriv = s.taboption('lists', form.SectionValue, '_list_priv', form.NamedSection, 'private_dst_ip_v4', 'nftset', _('private_dst_ip_v4') + ' (@private_dst_ip_v4)');
spriv.subsection.option(form.Flag, 'enabled', _('Enabled')).default = '1';
spriv.subsection.option(form.Flag, 'auto_generate', _('auto_generate')).default = '1';
o = spriv.subsection.option(form.DynamicList, 'elements', _('elements')); o.datatype = 'cidr4'; o.depends('auto_generate', '0');
var sc = s.taboption('lists', form.SectionValue, '_list_chnroute', form.NamedSection, 'chnroute_dst_ip_v4', 'nftset', _('chnroute_dst_ip_v4') + ' (@chnroute_dst_ip_v4)');
sc.subsection.option(form.Flag, 'enabled', _('Enabled')).default = '1';
o = sc.subsection.option(form.Value, 'file_path', _('File Path')); o.default = '/usr/share/flowproxy/chnroute.txt';
o.render = function(sid) {
return form.Value.prototype.render.apply(this, arguments).then(function(node) {
var path = uci.get('flowproxy', sid, 'file_path') || '/usr/share/flowproxy/chnroute.txt';
var resNode = E('span', { 'style': 'margin-left: 10px; font-weight: bold; color: #444;', 'id': 'line-count-status' }, [ '...' ]);
var input = node.querySelector('input'); if (input) input.parentNode.appendChild(resNode);
fs.exec('/usr/bin/wc', ['-l', path]).then(function(res) { L.dom.content(resNode, (res.code === 0) ? [ _('(%d lines)').format(res.stdout.trim().split(' ')[0]) ] : [ _('(n/a)') ]); });
return node;
});
};
sc.subsection.option(form.Value, 'download_url', _('Download URL'));
o = sc.subsection.option(form.Button, '_download', _('Update Chnroute')); o.inputstyle = 'apply';
o.onclick = function(ev, sid) {
var urlOpt = m.lookupOption('download_url', sid)[0];
var url = urlOpt ? urlOpt.formvalue(sid) : uci.get('flowproxy', sid, 'download_url');
var pathOpt = m.lookupOption('file_path', sid)[0];
var path = pathOpt ? pathOpt.formvalue(sid) : uci.get('flowproxy', sid, 'file_path');
if (!path) path = '/usr/share/flowproxy/chnroute.txt';
if (!url) { ui.addNotification(null, E('p', _('Please set download_url first')), 'error'); return; }
ui.showModal(null, [ E('p', { 'class': 'spinning', 'id': 'download-msg' }, [ _('Downloading chnroute data...') ]) ]);
return fs.exec('/usr/bin/wget', ['-q', '-O', path, url, '--timeout=10', '--no-check-certificate']).then(function(res) {
var msgEl = document.getElementById('download-msg');
if (res.code === 0) {
if (msgEl) { msgEl.classList.remove('spinning'); L.dom.content(msgEl, [ _('Updated successfully.') ]); }
var cn = document.getElementById('line-count-status'); if (cn) fs.exec('/usr/bin/wc', ['-l', path]).then(function(r) { L.dom.content(cn, (r.code === 0) ? [ _('(%d lines)').format(r.stdout.trim().split(' ')[0]) ] : [ _('(n/a)') ]); });
setTimeout(ui.hideModal, 1500);
} else { ui.hideModal(); ui.addNotification(null, E('p', _('Download failed')), 'error'); }
}).catch(function(e) { ui.hideModal(); ui.addNotification(null, E('p', _('Error: %s').format(e.message)), 'error'); });
};
var sg = s.taboption('lists', form.SectionValue, '_list_custom', form.GridSection, 'nftset', _('Custom nftables sets'));
sg.subsection.addremove = true; sg.subsection.anonymous = false; sg.subsection.nodescription = true;
sg.subsection.filter = function(sid) { var pre = predefined.map(function(p){return p.id}); pre.push('private_dst_ip_v4','chnroute_dst_ip_v4'); return pre.indexOf(sid) === -1; };
sg.subsection.option(form.Flag, 'enabled', _('Enabled')).default = '1';
o = sg.subsection.option(form.ListValue, 'type', _('Element Type')); o.value('ipv4_addr', 'IPv4 Address/CIDR'); o.value('ether_addr', 'MAC Address'); o.value('inet_service', 'Port/Service'); o.default = 'ipv4_addr';
sg.subsection.option(form.DynamicList, 'elements', _('Elements'));
// --- Preview & Logs ---
var sp = s.taboption('preview', form.SectionValue, '_preview_section', form.NamedSection, 'global', 'flowproxy');
sp.subsection.tab('generated', _('Generated Config')); sp.subsection.tab('runtime', _('Live Runtime State'));
o = sp.subsection.taboption('generated', form.DummyValue, '_preview_gen');
o.render = function() {
var node = E('div', { 'style': 'width:100%; box-sizing:border-box; margin-top: 10px;' }, [
E('div', { 'style': 'margin-bottom: 10px' }, [
E('button', { 'class': 'cbi-button cbi-button-apply', 'click': function() {
var el = document.getElementById('gen-code');
if (el) { navigator.clipboard.writeText(el.innerText); ui.addNotification(null, E('p', _('Copied')), 'info'); }
} }, [ _('Copy Config') ])
]),
E('pre', { 'class': 'nft-code-view', 'id': 'gen-code' }, [ _('loading...') ])
]);
callGenerateNftConfig().then(function(res) {
var el = node.querySelector('#gen-code');
if (el) el.innerHTML = self.highlightNft(res.config || '');
});
return node;
};
o = sp.subsection.taboption('runtime', form.DummyValue, '_preview_run');
o.render = function() {
var node = E('div', { 'style': 'width:100%; box-sizing:border-box; margin-top: 10px;' }, [
E('div', { 'style': 'margin-bottom: 10px' }, [
E('button', { 'class': 'cbi-button cbi-button-refresh', 'click': function() { location.reload(); } }, [ _('Refresh Status') ])
]),
E('pre', { 'class': 'nft-code-view', 'id': 'run-code' }, [ _('loading...') ])
]);
callGetRuntimeConfig().then(function(res) {
var el = node.querySelector('#run-code');
if (el) el.innerHTML = self.highlightNft(res.runtime || '');
});
return node;
};
o = s.taboption('logs', form.ListValue, 'log_level', _('Log Level'));
o.value('debug'); o.value('info'); o.value('warn'); o.value('error'); o.default = 'info';
s.taboption('logs', form.Value, 'log_size', _('Log Size (KB)')).datatype = 'uinteger';
o = s.taboption('logs', form.DummyValue, '_log_view');
o.render = function() {
var node = E('div', { 'style': 'width:100%; box-sizing:border-box; margin-top: 15px;' }, [
E('div', { 'style': 'margin-bottom: 5px; text-align: left;' }, [
E('button', { 'class': 'cbi-button cbi-button-refresh', 'click': L.bind(self.refreshLogs, self) }, [ _('Refresh Logs') ]),
E('button', { 'class': 'cbi-button cbi-button-reset', 'style': 'margin-left: 10px;', 'click': L.bind(function() { if(confirm(_('Clear logs?'))) callClearLogs().then(L.bind(self.refreshLogs, self)); }, self) }, [ _('Clear Logs') ])
]),
E('textarea', { 'id': 'log-content', 'readonly': true }, [ _('loading logs...') ])
]);
callGetLogs(500).then(function(data) {
var logEl = node.querySelector('#log-content');
if (logEl) {
var logs = (data && Array.isArray(data.logs)) ? data.logs : [];
logEl.value = logs.length > 0 ? logs.join('\n') : _('no logs available');
if (logs.length > 0) logEl.scrollTop = logEl.scrollHeight;
}
});
return node;
};
return m.render().then(L.bind(function(node) {
this.refreshStatus(m, node);
poll.add(L.bind(function() { if (!document.body.contains(node)) return false; return this.refreshStatus(m, node); }, this), 5);
return node;
}, this));
}
});
@@ -0,0 +1,228 @@
msgid ""
msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Project-Id-Version: luci-app-flowproxy\n"
""
msgid "(%d lines)"
msgstr ""
msgid "(n/a)"
msgstr ""
msgid "(no content / table not loaded)"
msgstr ""
msgid "Action"
msgstr ""
msgid "Add rule"
msgstr ""
msgid "Clear Logs"
msgstr ""
msgid "Clear logs?"
msgstr ""
msgid "Copied"
msgstr ""
msgid "Copy Config"
msgstr ""
msgid "Counter"
msgstr ""
msgid "Current Status"
msgstr ""
msgid "Custom nftables sets"
msgstr ""
msgid "DNS Redirection"
msgstr ""
msgid "Download URL"
msgstr ""
msgid "Download failed"
msgstr ""
msgid "Downloading chnroute data..."
msgstr ""
msgid "Element Type"
msgstr ""
msgid "Elements"
msgstr ""
msgid "Enable FlowProxy"
msgstr ""
msgid "Enabled"
msgstr ""
msgid "Error: %s"
msgstr ""
msgid "Expecting: %s"
msgstr ""
msgid "File Path"
msgstr ""
msgid "FlowProxy"
msgstr ""
msgid "Force upstream DNS to proxy server"
msgstr ""
msgid "Generated Config"
msgstr ""
msgid "Invalid IPv4 address or CIDR"
msgstr ""
msgid "Invalid MAC address"
msgstr ""
msgid "Invalid port or range"
msgstr ""
msgid "Lists"
msgstr ""
msgid "Live Runtime State"
msgstr ""
msgid "Log Level"
msgstr ""
msgid "Log Size (KB)"
msgstr ""
msgid "Logs"
msgstr ""
msgid "LuCI Support for FlowProxy Traffic Diversion"
msgstr ""
msgid "Master switch updated."
msgstr ""
msgid "Match Type"
msgstr ""
msgid "Match Value"
msgstr ""
msgid "Network interface"
msgstr ""
msgid "Please set download_url first"
msgstr ""
msgid "Preview"
msgstr ""
msgid "Proxy server DNS port"
msgstr ""
msgid "Proxy server IP address"
msgstr ""
msgid "Quick add:"
msgstr ""
msgid "Refresh Logs"
msgstr ""
msgid "Refresh Status"
msgstr ""
msgid "Routing Table ID"
msgstr ""
msgid "Rules"
msgstr ""
msgid "Set type mismatch: expected %s, got %s"
msgstr ""
msgid "Settings"
msgstr ""
msgid "TCP Matching Rules"
msgstr ""
msgid "Traffic Mark"
msgstr ""
msgid "Traffic diversion based on nftables rules. The service will automatically start/stop when you click \"Save & Apply\"."
msgstr ""
msgid "UDP Matching Rules"
msgstr ""
msgid "Update Chnroute"
msgstr ""
msgid "Updated successfully."
msgstr ""
msgid "auto_generate"
msgstr ""
msgid "checking..."
msgstr ""
msgid "chnroute_dst_ip_v4"
msgstr ""
msgid "elements"
msgstr ""
msgid "enable protocol"
msgstr ""
msgid "loading logs..."
msgstr ""
msgid "loading..."
msgstr ""
msgid "no logs available"
msgstr ""
msgid "no_proxy_dst_ip_v4"
msgstr ""
msgid "no_proxy_dst_tcp_ports"
msgstr ""
msgid "no_proxy_dst_udp_ports"
msgstr ""
msgid "no_proxy_src_ip_v4"
msgstr ""
msgid "no_proxy_src_mac"
msgstr ""
msgid "private_dst_ip_v4"
msgstr ""
msgid "reset %s templates"
msgstr ""
msgid "running"
msgstr ""
msgid "stopped"
msgstr ""
msgid "this will delete ALL current %s rules and generate default templates. are you sure?"
msgstr ""
+1
View File
@@ -0,0 +1 @@
zh_Hans
+252
View File
@@ -0,0 +1,252 @@
msgid ""
msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Project-Id-Version: luci-app-flowproxy\n"
"Language: zh_Hans\n"
msgid "(%d lines)"
msgstr "(%d 行)"
msgid "(n/a)"
msgstr "(未知)"
msgid "(no content / table not loaded)"
msgstr "(无内容 / 列表未加载)"
msgid "Action"
msgstr "动作"
msgid "Add rule"
msgstr "添加规则"
msgid "Clear Logs"
msgstr "清空日志"
msgid "Clear logs?"
msgstr "确定要清空日志吗?"
msgid "Copied"
msgstr "已复制"
msgid "Copy Config"
msgstr "复制配置"
msgid "Counter"
msgstr "计数器"
msgid "Current Status"
msgstr "当前状态"
msgid "Custom nftables sets"
msgstr "自定义 nftables 集合"
msgid "DNS Redirection"
msgstr "DNS 转发"
msgid "Download URL"
msgstr "下载地址"
msgid "Download failed"
msgstr "下载失败"
msgid "Downloading chnroute data..."
msgstr "正在下载数据集..."
msgid "Element Type"
msgstr "元素类型"
msgid "Elements"
msgstr "元素列表"
msgid "Enable FlowProxy"
msgstr "启用代理分流"
msgid "Enabled"
msgstr "已启用"
msgid "Error: %s"
msgstr "错误: %s"
msgid "Expecting: %s"
msgstr "期望值: %s"
msgid "File Path"
msgstr "文件路径"
msgid "FlowProxy"
msgstr "代理分流"
msgid "Force upstream DNS to proxy server"
msgstr "强制上游 DNS 为代理服务器"
msgid "Generated Config"
msgstr "生成的配置"
msgid "Invalid IPv4 address or CIDR"
msgstr "无效的 IPv4 地址或 CIDR"
msgid "Invalid MAC address"
msgstr "无效的 MAC 地址"
msgid "Invalid port or range"
msgstr "无效的端口或端口范围"
msgid "Lists"
msgstr "名单"
msgid "Live Runtime State"
msgstr "实时运行状态"
msgid "Log Level"
msgstr "日志级别"
msgid "Log Size (KB)"
msgstr "日志文件大小 (KB)"
msgid "Logs"
msgstr "日志"
msgid "LuCI Support for FlowProxy Traffic Diversion"
msgstr "LuCI 支持 FlowProxy 流量分流"
msgid "Master switch updated."
msgstr "总开关状态已更新。"
msgid "Match Type"
msgstr "匹配类型"
msgid "Match Value"
msgstr "匹配值"
msgid "Network interface"
msgstr "网络接口"
msgid "Please set download_url first"
msgstr "请先设置下载 URL"
msgid "Preview"
msgstr "预览"
msgid "Proxy server DNS port"
msgstr "代理服务器 DNS 端口"
msgid "Proxy server IP address"
msgstr "代理服务器 IP 地址"
msgid "Proxy server interface"
msgstr "代理服务器所在接口"
msgid "Quick add:"
msgstr "快速添加预设:"
msgid "Refresh Logs"
msgstr "刷新日志"
msgid "Refresh Status"
msgstr "刷新实时状态"
msgid "Routing Table ID"
msgstr "路由表 ID"
msgid "Rule Priority"
msgstr "策略路由优先级"
msgid "Rules"
msgstr "规则"
msgid "Set type mismatch: expected %s, got %s"
msgstr "集合类型不匹配: 期望 %s, 实际为 %s"
msgid "Settings"
msgstr "设置"
msgid "TCP Matching Rules"
msgstr "TCP 匹配规则列表"
msgid "Traffic Mark"
msgstr "流量标记"
msgid "Traffic diversion based on nftables rules. The service will automatically start/stop when you click \"Save & Apply\"."
msgstr "基于 nftables 规则的流量分流。当你点击 “保存并应用” 后,服务将自动启动或停止。"
msgid "UDP Matching Rules"
msgstr "UDP 匹配规则列表"
msgid "Update Chnroute"
msgstr "立即更新数据集"
msgid "Updated successfully."
msgstr "数据集更新成功。"
msgid "auto_generate"
msgstr "自动生成"
msgid "checking..."
msgstr "检测中..."
msgid "chnroute_dst_ip_v4"
msgstr "中国大陆 IP"
msgid "elements"
msgstr "元素列表"
msgid "enable protocol"
msgstr "启用协议"
msgid "loading logs..."
msgstr "日志加载中..."
msgid "loading..."
msgstr "加载中..."
msgid "no logs available"
msgstr "暂无日志内容"
msgid "no_proxy_dst_ip_v4"
msgstr "不代理的目标 IP"
msgid "no_proxy_dst_tcp_ports"
msgstr "不代理的目标 TCP 端口"
msgid "no_proxy_dst_udp_ports"
msgstr "不代理的目标 UDP 端口"
msgid "no_proxy_src_ip_v4"
msgstr "不代理的源 IP"
msgid "no_proxy_src_mac"
msgstr "不代理的源 MAC"
msgid "private_dst_ip_v4"
msgstr "私有 IP"
msgid "reset %s templates"
msgstr "重置 %s 模版"
msgid "running"
msgstr "运行中"
msgid "stopped"
msgstr "已停止"
msgid "this will delete ALL current %s rules and generate default templates. are you sure?"
msgstr "这将删除当前所有 %s 规则并加载推荐的默认模版。确定吗?"
msgid "Restart"
msgstr "重启"
msgid "Restarting FlowProxy service..."
msgstr "正在重启 FlowProxy 服务..."
msgid "FlowProxy service restarted successfully."
msgstr "FlowProxy 服务重启成功。"
msgid "Failed to restart FlowProxy service."
msgstr "重启 FlowProxy 服务失败。"
msgid "RPC error: %s"
msgstr "RPC 错误: %s"
msgid "The proxy server IP address must be within the subnet of the selected interface (%s)."
msgstr "代理服务器 IP 地址必须在所选网络接口的子网网段之内 (%s)。"
@@ -0,0 +1,104 @@
config flowproxy 'global'
option enabled '0'
option tcp_enabled '1'
option udp_enabled '1'
option proxy_server_ip_addr ''
option interface 'br-lan'
option traffic_mark '0x666'
option routing_table '888'
option rule_priority '1000'
option dns_proxy_enabled '0'
option proxy_server_dns_port '5353'
option log_level 'info'
option log_size '1024'
option log_count '3'
# --- TCP 默认规则 ---
config tcp_rule
option enabled '1'
option match_type 'src_mac'
option match_value '@no_proxy_src_mac'
option action 'return'
option counter '0'
config tcp_rule
option enabled '1'
option match_type 'dst_ip'
option match_value '@private_dst_ip_v4'
option action 'return'
option counter '0'
config tcp_rule
option enabled '1'
option match_type 'dst_ip'
option match_value '@chnroute_dst_ip_v4'
option action 'return'
option counter '0'
config tcp_rule
option enabled '1'
option match_type 'dst_port'
option match_value '@no_proxy_dst_tcp_ports'
option action 'return'
option counter '0'
# --- UDP 默认规则 ---
config udp_rule
option enabled '1'
option match_type 'src_mac'
option match_value '@no_proxy_src_mac'
option action 'return'
option counter '0'
config udp_rule
option enabled '1'
option match_type 'dst_ip'
option match_value '@private_dst_ip_v4'
option action 'return'
option counter '0'
config udp_rule
option enabled '1'
option match_type 'dst_ip'
option match_value '@chnroute_dst_ip_v4'
option action 'return'
option counter '0'
config udp_rule
option enabled '1'
option match_type 'dst_port'
option match_value '@no_proxy_dst_udp_ports'
option action 'return'
option counter '0'
# nftables set 配置
config nftset 'no_proxy_src_mac'
option enabled '1'
option type 'ether_addr'
config nftset 'no_proxy_src_ip_v4'
option enabled '1'
option type 'ipv4_addr'
config nftset 'no_proxy_dst_ip_v4'
option enabled '1'
option type 'ipv4_addr'
config nftset 'private_dst_ip_v4'
option enabled '1'
option type 'ipv4_addr'
option auto_generate '1'
config nftset 'chnroute_dst_ip_v4'
option enabled '1'
option type 'ipv4_addr'
option file_path '/usr/share/flowproxy/chnroute.txt'
option download_url 'https://proxy.seckv.com/https://raw.githubusercontent.com/mayaxcn/china-ip-list/master/chnroute.txt'
config nftset 'no_proxy_dst_tcp_ports'
option enabled '1'
option type 'inet_service'
config nftset 'no_proxy_dst_udp_ports'
option enabled '1'
option type 'inet_service'
+299
View File
@@ -0,0 +1,299 @@
#!/bin/sh /etc/rc.common
# FlowProxy - Traffic Diversion Service
START=99
STOP=10
USE_PROCD=1
NAME="flowproxy"
UCI_CONFIG="flowproxy"
LOG_FILE="/var/log/flowproxy.log"
NFT_CONF="/tmp/flowproxy/nft.conf"
GENERATE_SCRIPT="/usr/share/flowproxy/generate_nft.sh"
STATE_FILE="/var/run/flowproxy.running"
get_level_weight() {
case "$1" in
debug) echo 0 ;;
info) echo 1 ;;
warn) echo 2 ;;
error) echo 3 ;;
*) echo 1 ;;
esac
}
log_msg() {
local level="$1"; shift
local msg="$*"
local timestamp=$(date '+%Y-%m-%d %H:%M:%S')
# 等级过滤
local conf_level=$(uci -q get "$UCI_CONFIG.global.log_level" || echo "info")
local conf_weight=$(get_level_weight "$conf_level")
local msg_weight=$(get_level_weight "$level")
[ "$msg_weight" -lt "$conf_weight" ] && return
# 简单的日志截断逻辑,防止日志无限增长
# 读取配置的大小限制,默认 1024KB
local max_size=$(uci -q get "$UCI_CONFIG.global.log_size" || echo 1024)
local current_size=$(du -k "$LOG_FILE" 2>/dev/null | cut -f1)
if [ "${current_size:-0}" -gt "$max_size" ]; then
mv "$LOG_FILE" "$LOG_FILE.old"
touch "$LOG_FILE"
fi
echo "[$timestamp] [$level] $msg" >> "$LOG_FILE"
}
check_env() {
# 检测核心二进制工具是否存在
if ! command -v nft >/dev/null 2>&1; then
log_msg error "nftables binary not found"
return 1
fi
return 0
}
check_config() {
local proxy_server_ip_addr=$(uci -q get "$UCI_CONFIG.global.proxy_server_ip_addr")
[ -z "$proxy_server_ip_addr" ] && { log_msg error "proxy_server_ip_addr not configured"; return 1; }
return 0
}
apply_nft_rules() {
log_msg info "Generating nftables configuration..."
local conf_level=$(uci -q get "$UCI_CONFIG.global.log_level" || echo "info")
mkdir -p "$(dirname "$NFT_CONF")"
if [ -x "$GENERATE_SCRIPT" ]; then
# 传递日志等级并捕获 stderr 到临时文件
local err_file="/tmp/flowproxy/gen_err.tmp"
FLOWPROXY_LOG_LEVEL="$conf_level" "$GENERATE_SCRIPT" >/dev/null 2> "$err_file"
local ret=$?
# 将脚本的输出记录到日志
if [ -s "$err_file" ]; then
while read -r line; do
log_msg debug "Script: $line"
done < "$err_file"
rm -f "$err_file"
fi
if [ $ret -eq 0 ]; then
log_msg info "Applying nftables rules from $NFT_CONF"
# 确保内核支持 inet 表
nft delete table inet flowproxy 2>/dev/null
if nft -f "$NFT_CONF"; then
return 0
else
log_msg error "nftables rules application failed (syntax error)"
return 1
fi
else
log_msg error "Failed to generate nftables config"
return 1
fi
else
log_msg error "Generator script $GENERATE_SCRIPT not found or not executable"
return 1
fi
}
add_route() {
local proxy_server_ip_addr=$(uci -q get "$UCI_CONFIG.global.proxy_server_ip_addr")
local interface=$(uci -q get "$UCI_CONFIG.global.interface" || echo "br-lan")
local traffic_mark=$(uci -q get "$UCI_CONFIG.global.traffic_mark" || echo "0x666")
local routing_table=$(uci -q get "$UCI_CONFIG.global.routing_table" || echo "888")
local rule_priority=$(uci -q get "$UCI_CONFIG.global.rule_priority" || echo "1000")
# 1. 先尝试用旧记录清理一次,防止由于配置变更导致的残留
delete_route "quiet"
log_msg info "Setting up routing table $routing_table and rule for mark $traffic_mark with priority $rule_priority..."
# 2. 记录当前使用的标记值、路由表 ID 和优先级
echo "$traffic_mark:$routing_table:$rule_priority" > "/var/run/flowproxy.mark"
# 3. 再次确保新标记和表的规则是干净的
while ip rule del fwmark "$traffic_mark" lookup "$routing_table" 2>/dev/null; do :; done
ip route flush table "$routing_table" 2>/dev/null
# 4. 添加路由和策略
local err
ip route add default via "$proxy_server_ip_addr" dev "$interface" table "$routing_table" 2>/dev/null
err=$(ip rule add fwmark "$traffic_mark" lookup "$routing_table" priority "$rule_priority" 2>&1)
if [ $? -eq 0 ]; then
log_msg info "Route added: via $proxy_server_ip_addr dev $interface table $routing_table for mark $traffic_mark with priority $rule_priority"
else
log_msg error "Failed to add ip rule: $err"
fi
}
delete_route() {
local traffic_mark routing_table rule_priority
local quiet="$1"
# 1. 获取两组清理目标:旧值(记录文件) 和 新值(当前UCI)
local old_mark="" old_table="" old_prio=""
if [ -f "/var/run/flowproxy.mark" ]; then
local saved_val=$(cat "/var/run/flowproxy.mark")
old_mark=$(echo "$saved_val" | cut -d':' -f1)
old_table=$(echo "$saved_val" | cut -d':' -f2)
old_prio=$(echo "$saved_val" | cut -d':' -f3)
[ "$quiet" != "quiet" ] && rm -f "/var/run/flowproxy.mark"
fi
local curr_mark=$(uci -q get "$UCI_CONFIG.global.traffic_mark" || echo "0x666")
local curr_table=$(uci -q get "$UCI_CONFIG.global.routing_table" || echo "888")
local curr_prio=$(uci -q get "$UCI_CONFIG.global.rule_priority" || echo "1000")
[ "$quiet" != "quiet" ] && log_msg info "Cleaning up FlowProxy routes (Atomic Mode)..."
# 2. 核心清理函数:只清理带 fwmark 且指向特定 table 的规则
safe_del_rule() {
local m="$1" t="$2" p="$3"
[ -z "$m" ] || [ -z "$t" ] && return
log_msg debug "Attempting cleanup: mark=$m, table=$t, priority=${p:-any}"
# 精准清理 (带优先级)
[ -n "$p" ] && while ip rule del fwmark "$m" lookup "$t" priority "$p" 2>/dev/null; do
log_msg debug "Removed stale ip rule: mark $m lookup $t priority $p"
done
# 模糊清理 (不带优先级,防止配置中途被手动改动)
while ip rule del fwmark "$m" lookup "$t" 2>/dev/null; do
log_msg debug "Removed stale ip rule (fuzzy): mark $m lookup $t"
done
# 清空路由表
ip route flush table "$t" 2>/dev/null
log_msg debug "Flushed routing table $t"
}
# 执行清理:先清旧值,再清当前值 (防止残留)
safe_del_rule "$old_mark" "$old_table" "$old_prio"
[ "$old_mark" != "$curr_mark" ] || [ "$old_table" != "$curr_table" ] && \
safe_del_rule "$curr_mark" "$curr_table" "$curr_prio"
}
delete_nft() {
nft delete table inet flowproxy 2>/dev/null
log_msg info "Removed nftables table 'flowproxy'"
}
setup_dns() {
local enabled=$(uci -q get "$UCI_CONFIG.global.enabled" || echo 0)
local dns_proxy_enabled=$(uci -q get "$UCI_CONFIG.global.dns_proxy_enabled" || echo 0)
local proxy_server_dns_port=$(uci -q get "$UCI_CONFIG.global.proxy_server_dns_port" || echo 5353)
local proxy_server_ip_addr=$(uci -q get "$UCI_CONFIG.global.proxy_server_ip_addr")
# Only apply DNS proxy if BOTH main service and DNS proxy are enabled
if [ "$enabled" -eq 0 ] || [ "$dns_proxy_enabled" -eq 0 ]; then
cleanup_dns
return 0
fi
[ -z "$proxy_server_ip_addr" ] && { log_msg error "proxy_server_ip_addr not configured, cannot setup DNS"; return 1; }
log_msg info "Setting up DNS redirection to $proxy_server_ip_addr#$proxy_server_dns_port..."
# Persistent backup in UCI
if ! uci -q get "$UCI_CONFIG.dns_backup" >/dev/null; then
local old_noresolv=$(uci -q get dhcp.@dnsmasq[0].noresolv)
local old_dns_redirect=$(uci -q get dhcp.@dnsmasq[0].dns_redirect)
local old_servers=$(uci -q get dhcp.@dnsmasq[0].server | tr '\n' ',' | sed 's/,$//')
log_msg debug "Backing up DNS: noresolv=${old_noresolv:-empty}, redirect=${old_dns_redirect:-empty}, servers=${old_servers:-empty}"
uci set "$UCI_CONFIG.dns_backup=dns_backup"
[ -n "$old_noresolv" ] && uci set "$UCI_CONFIG.dns_backup.noresolv=$old_noresolv"
[ -n "$old_dns_redirect" ] && uci set "$UCI_CONFIG.dns_backup.dns_redirect=$old_dns_redirect"
[ -n "$old_servers" ] && uci set "$UCI_CONFIG.dns_backup.servers=$old_servers"
uci commit "$UCI_CONFIG"
fi
log_msg debug "Applying new DNS: noresolv=1, redirect=0, server=$proxy_server_ip_addr#$proxy_server_dns_port"
uci set dhcp.@dnsmasq[0].noresolv='1'
uci set dhcp.@dnsmasq[0].dns_redirect='0'
# Delete current servers and add our proxy
uci -q delete dhcp.@dnsmasq[0].server
uci add_list dhcp.@dnsmasq[0].server="$proxy_server_ip_addr#$proxy_server_dns_port"
uci commit dhcp
/etc/init.d/dnsmasq restart
}
cleanup_dns() {
if uci -q get "$UCI_CONFIG.dns_backup" >/dev/null; then
log_msg info "Restoring original DNS configuration..."
local noresolv=$(uci -q get "$UCI_CONFIG.dns_backup.noresolv")
local dns_redirect=$(uci -q get "$UCI_CONFIG.dns_backup.dns_redirect")
local servers=$(uci -q get "$UCI_CONFIG.dns_backup.servers")
log_msg debug "Restoring DNS values: noresolv=${noresolv:-0}, redirect=${dns_redirect:-1}, servers=${servers:-empty}"
# Restore noresolv (default to 0 if not backed up)
[ -n "$noresolv" ] && uci set dhcp.@dnsmasq[0].noresolv="$noresolv" || uci set dhcp.@dnsmasq[0].noresolv="0"
# Restore dns_redirect (default to 1 as requested for OpenWrt typical modded builds)
[ -n "$dns_redirect" ] && uci set dhcp.@dnsmasq[0].dns_redirect="$dns_redirect" || uci set dhcp.@dnsmasq[0].dns_redirect="1"
# Restore servers
uci -q delete dhcp.@dnsmasq[0].server
if [ -n "$servers" ]; then
for s in $servers; do
[ -n "$s" ] && uci add_list dhcp.@dnsmasq[0].server="$s"
done
fi
uci commit dhcp
uci delete "$UCI_CONFIG.dns_backup"
uci commit "$UCI_CONFIG"
/etc/init.d/dnsmasq restart
fi
}
start_service() {
local enabled=$(uci -q get "$UCI_CONFIG.global.enabled" || echo 0)
if [ "$enabled" -eq 0 ]; then
log_msg info "FlowProxy is disabled, ensuring service is stopped"
stop_service
return 0
fi
log_msg info "Starting FlowProxy..."
check_env || return 1
check_config || return 1
apply_nft_rules || return 1
add_route
setup_dns
touch "$STATE_FILE"
log_msg info "FlowProxy service started successfully"
}
stop_service() {
log_msg info "Stopping FlowProxy..."
# 强制先移除标记,防止状态误报
rm -f "$STATE_FILE"
delete_route
delete_nft
cleanup_dns
log_msg info "FlowProxy service stopped"
}
restart_service() {
stop_service
start_service
}
service_triggers() {
# 监听自身配置改动
procd_add_reload_trigger "$UCI_CONFIG"
# 监听防火墙重载事件,防止规则被 fw4 清空后无法自动恢复
procd_add_reload_trigger "firewall"
}
reload_service() {
restart
}
File diff suppressed because it is too large. Load diff
+215
View File
@@ -0,0 +1,215 @@
#!/bin/sh
# Generate nftables configuration for flowproxy
. /lib/functions.sh
[ -n "$UCI_CONFIG_DIR" ] && export UCI_CONFIG_DIR
CONFIG="flowproxy"
NFT_TABLE="flowproxy"
OUTPUT_FILE="/tmp/flowproxy/nft.conf"
mkdir -p "$(dirname "$OUTPUT_FILE")"
ENABLED_SETS=" "
log_debug() {
[ "$FLOWPROXY_LOG_LEVEL" = "debug" ] && echo "DEBUG: $*" >&2
}
gen_set_definition() {
local section="$1"
local type enabled auto_gen file_path elems is_interval
enabled=$(uci -q get "$CONFIG.$section.enabled")
[ "$enabled" = "0" ] && { log_debug "Set $section is disabled, skipping"; return; }
log_debug "Generating set: $section"
ENABLED_SETS="${ENABLED_SETS}@${section} "
type=$(uci -q get "$CONFIG.$section.type")
[ -z "$type" ] && type="ipv4_addr"
if [ "$section" = "private_dst_ip_v4" ]; then
auto_gen=$(uci -q get "$CONFIG.$section.auto_generate")
if [ "$auto_gen" = "1" ] || [ -z "$auto_gen" ]; then
elems="10.0.0.0/8, 127.0.0.0/8, 169.254.0.0/16, 172.16.0.0/12, 192.168.0.0/16"
fi
fi
local uci_elems=""
for e in $(uci -q get "$CONFIG.$section.elements"); do
[ -n "$uci_elems" ] && uci_elems="${uci_elems}, "
uci_elems="${uci_elems}${e}"
done
[ -n "$uci_elems" ] && { [ -n "$elems" ] && elems="${elems}, "; elems="${elems}${uci_elems}"; }
file_path=$(uci -q get "$CONFIG.$section.file_path")
download_url=$(uci -q get "$CONFIG.$section.download_url")
if [ -n "$download_url" ] && [ -n "$file_path" ]; then
if [ ! -f "$file_path" ]; then
echo "Downloading $section data from $download_url to $file_path..." >&2
wget -q -O "$file_path" "$download_url" --timeout=10 --no-check-certificate
[ $? -ne 0 ] && { echo "Failed to download $section data" >&2; rm -f "$file_path"; }
fi
fi
if [ -n "$file_path" ] && [ -f "$file_path" ]; then
local file_elems=$(get_file_elements "$file_path")
if [ -n "$file_elems" ]; then
[ -n "$elems" ] && elems="${elems}, "
elems="${elems}${file_elems}"
fi
fi
case "$type" in "ipv4_addr"|"inet_service"|"ether_addr") is_interval=1 ;; *) is_interval=0 ;; esac
[ "$is_interval" = "0" ] && { case "$elems" in */*|*-*) is_interval=1 ;; esac; }
printf "\tset %s {\n" "$section"
printf "\t\ttype %s\n" "$type"
[ "$is_interval" = "1" ] && printf "\t\tflags interval\n"
[ -n "$elems" ] && printf "\t\telements = { %s }\n" "$elems"
printf "\t}\n\n"
}
get_file_elements() {
local file_path="$1"
[ ! -f "$file_path" ] && return
if [ "$FLOWPROXY_PREVIEW" = "1" ]; then
local total=$(wc -l < "$file_path")
if [ "$total" -gt 100 ]; then
awk 'BEGIN { count=0 }
!/^($|#)/ {
if (count < 100) {
if (count > 0) {
printf ", "
if (count % 2 == 0) printf "\n\t\t\t "
}
printf "%s", $0
count++
}
}
END { printf ", ... (%d more items omitted for preview)", '"$total"'-100 }' "$file_path"
return
fi
fi
awk 'BEGIN { count=0 }
!/^($|#)/ {
if (count > 0) {
printf ", "
if (count % 2 == 0) printf "\n\t\t\t "
}
printf "%s", $0
count++
}
END { print "" }' "$file_path"
}
process_rule() {
local section="$1"; local proto="$2"
local enabled match_type match_value action counter
enabled=$(uci -q get "$CONFIG.$section.enabled"); [ "$enabled" = "0" ] && { log_debug "Rule $section is disabled, skipping"; return; }
match_type=$(uci -q get "$CONFIG.$section.match_type")
[ -z "$match_type" ] && match_type="dst_ip"
match_value=$(uci -q get "$CONFIG.$section.match_value")
log_debug "Processing $proto rule: $section ($match_type=$match_value)"
action=$(uci -q get "$CONFIG.$section.action"); [ -z "$action" ] && action="return"
counter=$(uci -q get "$CONFIG.$section.counter")
[ -z "$match_value" ] && return
case "$match_value" in
@*)
local set_ref=$(echo "$match_value" | cut -d' ' -f1)
if ! echo "$ENABLED_SETS" | grep -q " ${set_ref} "; then
log_debug "Skipping rule $section: set ${set_ref} is not defined or disabled"
return
fi
;;
esac
match_value=$(echo "$match_value" | sed -E 's/ (return|accept|drop)$//g')
local segment=""
case "$match_type" in
src_mac) segment="ether saddr $match_value ip protocol $proto" ;;
src_ip) segment="ip saddr $match_value ip protocol $proto" ;;
dst_ip) segment="ip daddr $match_value ip protocol $proto" ;;
src_port) segment="ip protocol $proto $proto sport $match_value" ;;
dst_port) segment="ip protocol $proto $proto dport $match_value" ;;
*) segment="$match_value ip protocol $proto" ;;
esac
local line="$segment"; [ "$counter" = "1" ] && line="$line counter"; line="$line $action"
[ -n "$line" ] && echo " $line"
}
SECTIONS_SET=$(uci -q show "$CONFIG" | grep "=nftset" | cut -d'.' -f2 | cut -d'=' -f1)
SECTIONS_TCP=$(uci -q show "$CONFIG" | grep "=tcp_rule" | cut -d'.' -f2 | cut -d'=' -f1)
SECTIONS_UDP=$(uci -q show "$CONFIG" | grep "=udp_rule" | cut -d'.' -f2 | cut -d'=' -f1)
if [ "$1" = "runtime" ]; then
TRAFFIC_MARK=$(uci -q get "$CONFIG.global.traffic_mark" || echo "0x666")
ROUTING_TABLE=$(uci -q get "$CONFIG.global.routing_table" || echo "888")
echo "--- [ nftables live rules ] ---"
nft list table inet "$CONFIG" 2>/dev/null | awk 'BEGIN { count=0; skip=0 }
/elements = \{/ { print $0; skip=1; next }
skip == 1 && /\}/ { printf "\t\t\t ... (items truncated for preview)\n"; print $0; skip=0; next }
skip == 1 { count++; if (count < 20) print $0; next }
{ print $0 }' || echo "(table not found)"
echo ""
echo "--- [ ip rule list ] ---"
ip rule show 2>/dev/null
echo ""
echo "--- [ ip route table $ROUTING_TABLE ] ---"
ip route show table "$ROUTING_TABLE" 2>/dev/null || echo "(table empty)"
exit 0
fi
cat > "$OUTPUT_FILE" << EOF
#!/usr/sbin/nft -f
table inet $NFT_TABLE
flush table inet $NFT_TABLE
table inet $NFT_TABLE {
EOF
for s in $SECTIONS_SET; do
gen_set_definition "$s" >> "$OUTPUT_FILE"
done
TCP_ENABLED=$(uci -q get "$CONFIG.global.tcp_enabled" || echo "1")
UDP_ENABLED=$(uci -q get "$CONFIG.global.udp_enabled" || echo "1")
TRAFFIC_MARK=$(uci -q get "$CONFIG.global.traffic_mark" || echo "0x666")
PROXY_SERVER_IP_ADDR=$(uci -q get "$CONFIG.global.proxy_server_ip_addr")
if [ "$TCP_ENABLED" = "1" ]; then
cat >> "$OUTPUT_FILE" << EOF
chain LAN_MARKFLOW_TCP {
type filter hook prerouting priority mangle; policy accept;
fib daddr type { unspec, local, anycast, multicast } counter return
EOF
if [ -n "$PROXY_SERVER_IP_ADDR" ]; then
echo " ip saddr $PROXY_SERVER_IP_ADDR ip protocol tcp counter return" >> "$OUTPUT_FILE"
fi
for s in $SECTIONS_TCP; do process_rule "$s" "tcp" >> "$OUTPUT_FILE"; done
echo " ip protocol tcp counter meta mark set $TRAFFIC_MARK" >> "$OUTPUT_FILE"
echo " }" >> "$OUTPUT_FILE"
fi
if [ "$UDP_ENABLED" = "1" ]; then
cat >> "$OUTPUT_FILE" << EOF
chain LAN_MARKFLOW_UDP {
type filter hook prerouting priority mangle; policy accept;
fib daddr type { unspec, local, anycast, multicast } counter return
EOF
if [ -n "$PROXY_SERVER_IP_ADDR" ]; then
echo " ip saddr $PROXY_SERVER_IP_ADDR ip protocol udp counter return" >> "$OUTPUT_FILE"
fi
for s in $SECTIONS_UDP; do process_rule "$s" "udp" >> "$OUTPUT_FILE"; done
echo " ip protocol udp counter meta mark set $TRAFFIC_MARK" >> "$OUTPUT_FILE"
echo " }" >> "$OUTPUT_FILE"
fi
echo "}" >> "$OUTPUT_FILE"
cat "$OUTPUT_FILE"
@@ -0,0 +1,11 @@
{
"admin/services/flowproxy": {
"title": "FlowProxy",
"description": "LuCI Support for FlowProxy Traffic Diversion",
"index": 50,
"action": {
"type": "view",
"path": "flowproxy/flowproxy"
}
}
}
@@ -0,0 +1,26 @@
{
"luci-app-flowproxy": {
"description": "Grant access to flowproxy configuration",
"read": {
"uci": [ "flowproxy" ],
"file": {
"/usr/share/flowproxy/*": [ "read" ]
},
"ubus": {
"luci.flowproxy": [ "*" ],
"network.interface": [ "dump" ]
}
},
"write": {
"uci": [ "flowproxy" ],
"file": {
"/usr/bin/wget": [ "exec" ],
"/usr/bin/wc": [ "exec" ],
"/usr/share/flowproxy/generate_nft.sh": [ "exec" ]
},
"ubus": {
"luci.flowproxy": [ "*" ]
}
}
}
}
+175
View File
@@ -0,0 +1,175 @@
'use strict';
import { access, readfile, writefile, stat } from 'fs';
import { cursor } from 'uci';
import { connect } from 'ubus';
const UCI_CONFIG = 'flowproxy';
const STATE_FILE = '/var/run/flowproxy.running';
const IP_CACHE = '/tmp/flowproxy/lan_ip.cache';
const LOG_FILE = '/var/log/flowproxy.log';
const NFT_TABLE = 'flowproxy';
// 辅助函数:安全 trim
function safe_trim(str) {
return (type(str) === 'string') ? trim(str) : '';
}
const methods = {
get_status: {
call: function() {
// 1. 快速探测
let is_running = access(STATE_FILE, 'f');
// 2. 自愈:检查内核状态并同步标记文件
let tcp_active = (system('nft list chain inet ' + NFT_TABLE + ' LAN_MARKFLOW_TCP >/dev/null 2>&1') === 0);
let udp_active = (system('nft list chain inet ' + NFT_TABLE + ' LAN_MARKFLOW_UDP >/dev/null 2>&1') === 0);
let real_running = (tcp_active || udp_active);
if (real_running && !is_running) {
try { writefile(STATE_FILE, ''); } catch(e) {}
} else if (!real_running && is_running) {
try { system('rm -f ' + STATE_FILE); } catch(e) {}
}
// 3. IP 获取 (带缓存)
let lan_ip = readfile(IP_CACHE) || '';
if (!lan_ip) {
try {
let ubus_conn = connect();
if (ubus_conn) {
let ifaces = ubus_conn.call('network.interface', 'dump');
if (type(ifaces?.interface) === 'array') {
// 优先寻找名为 'lan' 的接口,或者寻找拥有 ipv4 地址的第一个非回环接口
let fallback_ip = '';
for (let iface in ifaces.interface) {
if (iface.interface === 'lan' && iface['ipv4-address']?.[0]?.address) {
lan_ip = iface['ipv4-address'][0].address;
break;
}
if (!fallback_ip && iface.interface !== 'loopback' && iface['ipv4-address']?.[0]?.address) {
fallback_ip = iface['ipv4-address'][0].address;
}
}
if (!lan_ip) lan_ip = fallback_ip;
}
if (lan_ip) {
system('mkdir -p /tmp/flowproxy');
writefile(IP_CACHE, lan_ip);
}
ubus_conn.disconnect();
}
} catch (e) {}
}
let uci_cursor = cursor();
let proxy_server_ip_addr = uci_cursor.get(UCI_CONFIG, 'global', 'proxy_server_ip_addr') || '';
let dns_running = (uci_cursor.get(UCI_CONFIG, 'dns_backup') ? 1 : 0);
return {
running: real_running ? 1 : 0,
dns_running: dns_running,
enabled: int(uci_cursor.get(UCI_CONFIG, 'global', 'enabled') || '0'),
proxy_server_ip_addr: proxy_server_ip_addr,
proxy_server_dns_port: uci_cursor.get(UCI_CONFIG, 'global', 'proxy_server_dns_port') || '5353',
lan_ip: safe_trim(lan_ip),
interface: uci_cursor.get(UCI_CONFIG, 'global', 'interface') || 'br-lan',
traffic_mark: uci_cursor.get(UCI_CONFIG, 'global', 'traffic_mark') || '0x666',
nft: { tcp: tcp_active ? 1 : 0, udp: udp_active ? 1 : 0 }
};
}
},
get_logs: {
args: { lines: 100 },
call: function(request) {
let lines = request.args?.lines ?? 100;
let logs = [];
try {
if (access(LOG_FILE, 'r')) {
let log_stat = stat(LOG_FILE);
let content = '';
if (log_stat && log_stat.size > 65536) {
let fd = popen('tail -c 65536 ' + LOG_FILE);
if (fd) {
content = fd.read('all');
fd.close();
}
} else {
content = readfile(LOG_FILE);
}
if (content) {
let log_lines = split(content, "\n");
let total = length(log_lines);
let start = (total > lines) ? (total - lines) : 0;
for (let i = start; i < total; i++) {
if (log_lines[i]) push(logs, log_lines[i]);
}
}
}
} catch (e) {}
return { logs };
}
},
generate_nft_config: {
call: function() {
system('mkdir -p /tmp/flowproxy');
system('FLOWPROXY_PREVIEW=1 /usr/share/flowproxy/generate_nft.sh 2>&1');
return { config: safe_trim(readfile('/tmp/flowproxy/nft.conf') || '') };
}
},
get_runtime_config: {
call: function() {
let res_file = '/tmp/flowproxy/runtime.tmp';
let dns_file = '/tmp/flowproxy/dns_runtime.tmp';
system('mkdir -p /tmp/flowproxy');
system('/usr/share/flowproxy/generate_nft.sh runtime > ' + res_file + ' 2>&1');
let nft_runtime = readfile(res_file) || "(failed)";
system('rm -f ' + res_file);
system('uci show dhcp.@dnsmasq[0] | grep -E "noresolv|dns_redirect|server" | sed -E "s/^dhcp\\.[^.]*\\.([^=]*)=(.*)/\\1: \\2/; s/\\x27//g; s/#/:/g" > ' + dns_file + ' 2>&1');
let dns_out = readfile(dns_file);
system('rm -f ' + dns_file);
let dns_runtime = "\n--- [ DNSmasq Runtime Configuration ] ---\n";
dns_runtime += (dns_out || "(no active dnsmasq overrides)");
return { runtime: safe_trim(nft_runtime + dns_runtime) };
}
},
get_interfaces: {
call: function() {
let interfaces = [];
try {
let ubus_conn = connect();
if (ubus_conn) {
// 使用 network.device status 以获取所有物理设备 (包括 eth0 等 bridge 成员)
let dev_status = ubus_conn.call('network.device', 'status');
if (dev_status) {
for (let name in dev_status) {
push(interfaces, { name: name });
}
}
ubus_conn.disconnect();
}
} catch (e) {}
return { interfaces };
}
},
start_service: { call: function() { return { result: (system('/etc/init.d/flowproxy start >/dev/null 2>&1') === 0) }; } },
stop_service: { call: function() { return { result: (system('/etc/init.d/flowproxy stop >/dev/null 2>&1') === 0) }; } },
restart_service: { call: function() { return { result: (system('/etc/init.d/flowproxy restart >/dev/null 2>&1') === 0) }; } },
clear_logs: { call: function() { try { writefile(LOG_FILE, ''); return { result: true }; } catch(e) { return { result: false }; } } }
};
return { 'luci.flowproxy': methods };
reload_service() {
restart
}
+32
View File
@@ -0,0 +1,32 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=luci-app-frpc-next
PKG_VERSION:=1.0.0
PKG_RELEASE:=1
PKG_LICENSE:=MIT
PKG_MAINTAINER:=Dante <dante@seckv.com>
LUCI_TITLE:=LuCI support for frp client (v0.68.x/v0.69.x+)
LUCI_DEPENDS:=+frpc-next +curl
LUCI_PKGARCH:=all
include $(TOPDIR)/feeds/luci/luci.mk
define Package/$(PKG_NAME)
$(call Package/luci/webtemplate)
TITLE:=$(LUCI_TITLE)
DEPENDS:=$(LUCI_DEPENDS)
PROVIDES:=luci-app-frpc
CONFLICTS:=luci-app-frpc
endef
define Package/$(PKG_NAME)/postinst
#!/bin/sh
[ -n "$${IPKG_INSTROOT}" ] || {
chmod 0755 /etc/init.d/frpc /etc/hotplug.d/iface/99-frpc 2>/dev/null || true
}
exit 0
endef
# call BuildPackage - OpenWrt buildroot signature
@@ -0,0 +1,44 @@
'use strict';
'require view';
'require rpc';
'require poll';
const callFrpcLog = rpc.declare({
object: 'luci.frpc',
method: 'get_log'
});
return view.extend({
handleSaveApply: null,
handleSave: null,
handleReset: null,
render: function() {
const area = E('textarea', {
id: 'frpc_log_content',
style: 'width:100%; height:500px; background:#f4f4f4; color:#333; padding:10px; border:1px solid #ccc; border-radius:3px; font-family:monospace; font-size:12px; overflow-y:auto; white-space:pre-wrap; word-break:break-all; margin-top:10px;',
readonly: 'readonly'
}, _('Loading logs...'));
poll.add(() => this.updateLogs(), 5);
return E('div', { 'class': 'cbi-map' }, [
E('h2', {}, _('Frp Client Title') + ' - ' + _('Log')),
E('div', { 'class': 'cbi-map-descr' }, _('Real-time background system logs of the active frpc process, helping you diagnose server handshake and protocol errors.')),
E('fieldset', { 'class': 'cbi-section' }, [
E('legend', {}, _('Logs')),
E('div', { 'class': 'cbi-section-node' }, area)
])
]);
},
updateLogs: function() {
return callFrpcLog().then(function(res) {
const area = document.getElementById('frpc_log_content');
if (area) {
area.value = res && res.log ? res.log : _('No logs available...');
area.scrollTop = area.scrollHeight;
}
});
}
});
@@ -0,0 +1,294 @@
'use strict';
'require view';
'require rpc';
'require poll';
'require ui';
const callFrpcStatus = rpc.declare({
object: 'luci.frpc',
method: 'get_status'
});
const callAdoptProcess = rpc.declare({
object: 'luci.frpc',
method: 'adopt_process'
});
const callServiceAction = rpc.declare({
object: 'luci.frpc',
method: 'service_action',
params: [ 'action' ]
});
const callRuntimeInfo = rpc.declare({
object: 'luci.frpc',
method: 'get_runtime_info'
});
function renderState(status) {
let text = _('Unknown');
let color = '#999';
if (status.state === 'managed') {
text = _('Running');
color = 'green';
} else if (status.state === 'unmanaged') {
text = _('Running (Unmanaged)');
color = 'orange';
} else if (status.state === 'stopped') {
text = _('Stopped');
color = 'red';
}
if (status.pid)
text += ' [PID: ' + status.pid + ']';
return { text, color };
}
function flattenProxies(statusObj) {
const rows = [];
if (!statusObj || typeof statusObj !== 'object')
return rows;
Object.keys(statusObj).forEach((ptype) => {
const arr = statusObj[ptype];
if (!Array.isArray(arr))
return;
arr.forEach((p) => {
if (!p || typeof p !== 'object')
return;
rows.push({
name: p.name || '-',
type: p.type || ptype || '-',
status: p.status || '-',
local: p.local_addr || '-',
remote: p.remote_addr || '-',
err: p.err || ''
});
});
});
return rows;
}
return view.extend({
handleSaveApply: null,
handleSave: null,
handleReset: null,
load: function() {
return Promise.all([ callFrpcStatus(), callRuntimeInfo() ]);
},
render: function(data) {
const status = data && data[0] ? data[0] : {};
const runtime = data && data[1] ? data[1] : {};
const stateInfo = renderState(status || {});
const container = E('div', { 'class': 'cbi-map' }, [
E('h2', {}, _('Frp Client Title') + ' - ' + _('Overview')),
E('div', { 'class': 'cbi-map-descr' }, _('Overview of the local frpc service state, active process PID, loaded config files, and detailed online proxy information.'))
]);
// Service Status Section (Aligned with lucky style)
const statusSection = E('fieldset', { 'class': 'cbi-section' }, [
E('legend', {}, _('Service Status')),
E('div', { 'class': 'cbi-section-node' }, [
E('table', { 'class': 'table cbi-section-table' }, [
E('tr', { 'class': 'tr' }, [
E('td', { 'class': 'td left', 'width': '33%' }, _('Current Status')),
E('td', { 'class': 'td left' }, [
E('span', { id: 'frpc-status-text', 'style': 'font-weight:bold; color:' + stateInfo.color + '; margin-right:10px;' }, stateInfo.text),
E('button', {
id: 'frpc-restart-btn',
'class': 'btn cbi-button cbi-button-apply',
'style': 'display:' + ((status.state === 'managed' || status.state === 'unmanaged') ? 'inline-block' : 'none') + ';',
click: ui.createHandlerFn(this, function(ev) {
if (!ev || !ev.currentTarget) return;
const btn = ev.currentTarget;
btn.disabled = true;
ui.addNotification(null, E('p', _('Restarting FRP Client, please wait...')), 'info');
return callServiceAction('restart').then(function(res) {
btn.disabled = false;
if (res && res.success) {
ui.addNotification(null, E('p', _('Service restarted successfully.')), 'info');
} else {
ui.addNotification(null, E('p', _('Failed to restart service.')), 'error');
}
}).catch(function(err) {
btn.disabled = false;
ui.addNotification(null, E('p', _('An error occurred: ') + err.message), 'error');
});
})
}, _('Restart'))
])
]),
E('tr', { 'class': 'tr' }, [
E('td', { 'class': 'td left' }, _('Generated Runtime Config')),
E('td', { 'class': 'td left', id: 'frpc-runtime-config' }, status.runtime_config || '-')
]),
E('tr', { 'class': 'tr' }, [
E('td', { 'class': 'td left' }, _('Configured Proxies')),
E('td', { 'class': 'td left', id: 'frpc-proxy-count' }, String(status.proxy_count || 0))
]),
E('tr', { 'class': 'tr' }, [
E('td', { 'class': 'td left' }, _('frpc Version')),
E('td', { 'class': 'td left', id: 'frpc-version' }, status.version || '-')
])
])
])
]);
container.appendChild(statusSection);
const proxyRows = flattenProxies(runtime.status);
const runtimeSection = E('fieldset', {
'class': 'cbi-section',
id: 'frpc-runtime-section',
style: (status.state === 'managed') ? '' : 'display:none'
}, [
E('legend', {}, _('Runtime Details')),
E('div', { 'class': 'cbi-section-node' }, [
E('table', { 'class': 'table cbi-section-table' }, [
E('tr', { 'class': 'tr' }, [
E('td', { 'class': 'td left', 'width': '33%' }, _('Web Panel')),
E('td', { 'class': 'td left' }, [
E('span', { id: 'frpc-web-api' }, [
runtime.web_url ? E('a', {
'class': 'btn cbi-button',
href: runtime.web_url,
target: '_blank',
rel: 'noopener noreferrer'
}, _('Open')) : '-'
])
])
]),
E('tr', { 'class': 'tr' }, [
E('td', { 'class': 'td left' }, _('Connected Server')),
E('td', { 'class': 'td left' }, [
E('span', { id: 'frpc-connected-server' }, (runtime.server_addr && runtime.server_port) ? (runtime.server_addr + ':' + runtime.server_port) : '-'),
E('div', { 'class': 'cbi-value-description', style: 'margin: 4px 0 0 0;' }, _('Connect to FRP server'))
])
]),
E('tr', { 'class': 'tr' }, [
E('td', { 'class': 'td left' }, _('Proxy Runtime List')),
E('td', { 'class': 'td left' }, [
E('div', { 'class': 'cbi-value-description', style: 'margin: 0 0 6px 0;' }, _('Running proxy list')),
E('div', {
id: 'frpc-proxy-list-wrap',
style: 'max-height:220px; overflow:auto;'
}, proxyRows.length > 0 ? E('table', { 'class': 'table cbi-section-table' }, [
E('tr', { 'class': 'tr table-titles' }, [
E('th', { 'class': 'th' }, _('Name')),
E('th', { 'class': 'th' }, _('Type')),
E('th', { 'class': 'th' }, _('Status')),
E('th', { 'class': 'th' }, _('Local')),
E('th', { 'class': 'th' }, _('Remote')),
E('th', { 'class': 'th' }, _('Error'))
]),
...proxyRows.map((row) => E('tr', { 'class': 'tr' }, [
E('td', { 'class': 'td' }, row.name),
E('td', { 'class': 'td' }, row.type),
E('td', { 'class': 'td' }, row.status),
E('td', { 'class': 'td' }, row.local),
E('td', { 'class': 'td' }, row.remote),
E('td', { 'class': 'td' }, row.err || '-')
]))
]) : E('div', {}, _('No running proxies')))
])
])
])
])
]);
container.appendChild(runtimeSection);
poll.add(() => Promise.all([callFrpcStatus(), callRuntimeInfo()]).then((res) => {
const s = res[0] || {};
const r = res[1] || {};
const next = renderState(s);
const statusNode = document.getElementById('frpc-status-text');
if (statusNode) {
statusNode.textContent = next.text;
statusNode.style.color = next.color;
}
const restartBtnNode = document.getElementById('frpc-restart-btn');
if (restartBtnNode) {
if (s.state === 'managed' || s.state === 'unmanaged') {
restartBtnNode.style.display = 'inline-block';
} else {
restartBtnNode.style.display = 'none';
}
}
const runtimeConfigNode = document.getElementById('frpc-runtime-config');
if (runtimeConfigNode)
runtimeConfigNode.textContent = s.runtime_config || '-';
const proxyCountNode = document.getElementById('frpc-proxy-count');
if (proxyCountNode)
proxyCountNode.textContent = String(s.proxy_count || 0);
const versionNode = document.getElementById('frpc-version');
if (versionNode)
versionNode.textContent = s.version || '-';
const runtimeSectionNode = document.getElementById('frpc-runtime-section');
if (runtimeSectionNode)
runtimeSectionNode.style.display = (s.state === 'managed') ? '' : 'none';
const webNode = document.getElementById('frpc-web-api');
if (webNode) {
if (r.web_url) {
webNode.innerHTML = '';
webNode.appendChild(E('a', {
'class': 'btn cbi-button',
href: r.web_url,
target: '_blank',
rel: 'noopener noreferrer'
}, _('Open')));
} else {
webNode.textContent = '-';
}
}
const serverNode = document.getElementById('frpc-connected-server');
if (serverNode)
serverNode.textContent = (r.server_addr && r.server_port) ? (r.server_addr + ':' + r.server_port) : '-';
const listWrap = document.getElementById('frpc-proxy-list-wrap');
if (listWrap) {
const rows = flattenProxies(r.status);
listWrap.innerHTML = '';
if (rows.length === 0) {
listWrap.appendChild(E('div', {}, _('No running proxies')));
} else {
const table = E('table', { 'class': 'table cbi-section-table' }, [
E('tr', { 'class': 'tr table-titles' }, [
E('th', { 'class': 'th' }, _('Name')),
E('th', { 'class': 'th' }, _('Type')),
E('th', { 'class': 'th' }, _('Status')),
E('th', { 'class': 'th' }, _('Local')),
E('th', { 'class': 'th' }, _('Remote')),
E('th', { 'class': 'th' }, _('Error'))
])
]);
rows.forEach((row) => {
table.appendChild(E('tr', { 'class': 'tr' }, [
E('td', { 'class': 'td' }, row.name),
E('td', { 'class': 'td' }, row.type),
E('td', { 'class': 'td' }, row.status),
E('td', { 'class': 'td' }, row.local),
E('td', { 'class': 'td' }, row.remote),
E('td', { 'class': 'td' }, row.err || '-')
]));
});
listWrap.appendChild(table);
}
}
}), 5);
return container;
}
});
@@ -0,0 +1,276 @@
'use strict';
'require view';
'require rpc';
'require ui';
const callGetConfig = rpc.declare({
object: 'luci.frpc',
method: 'get_config'
});
const callSaveConfig = rpc.declare({
object: 'luci.frpc',
method: 'save_config',
params: [ 'config' ]
});
const callValidateConfig = rpc.declare({
object: 'luci.frpc',
method: 'validate_config',
params: [ 'config' ]
});
const callStatus = rpc.declare({
object: 'luci.frpc',
method: 'get_status'
});
const callSetEnabled = rpc.declare({
object: 'luci.frpc',
method: 'set_enabled',
params: [ 'enabled' ]
});
const callServiceAction = rpc.declare({
object: 'luci.frpc',
method: 'service_action',
params: [ 'action' ]
});
function parseErrorPosition(errText) {
const s = String(errText || '');
let m = s.match(/line\s+(\d+)\s*[,;:]?\s*(?:col|column)\s+(\d+)/i);
if (m)
return { line: +m[1], col: +m[2] };
m = s.match(/at\s+line\s+(\d+)\s*[,;:]?\s*column\s+(\d+)/i);
if (m)
return { line: +m[1], col: +m[2] };
m = s.match(/line\s+(\d+)/i);
if (m)
return { line: +m[1], col: null };
return null;
}
return view.extend({
_validateTimer: null,
_errorLine: null,
injectStyle: function() {
if (document.getElementById('frpc_editor_style'))
return;
const css = [
'.frpc-editor-wrap{border:1px solid #ccc;border-radius:4px;overflow:hidden;background:#fff;max-width:900px;box-sizing:border-box;}',
'.frpc-editor-main{display:flex;min-height:400px;max-height:65vh;}',
'.frpc-editor-gutter{width:48px;background:#f7f7f7;color:#888;border-right:1px solid #e5e5e5;overflow:hidden;font:13px/1.5 monospace;padding:12px 6px;text-align:right;user-select:none;box-sizing:border-box;}',
'.frpc-editor-gutter-line{height:1.5em;line-height:1.5;}',
'.frpc-editor-gutter-line.err{background:#ffe8e8;color:#b00020;font-weight:700;}',
'.frpc-editor-input-wrap{flex:1;background:#fff;position:relative;}',
'.frpc-editor-input{width:100%;min-height:100%;box-sizing:border-box;border:0;outline:none;resize:vertical;overflow-wrap:anywhere;white-space:pre;word-break:keep-all;font:13px/1.5 monospace;padding:12px;margin:0;display:block;}'
].join('\n');
document.head.appendChild(E('style', { id: 'frpc_editor_style' }, css));
},
refreshEditor: function() {
const ta = document.getElementById('frpc_config');
const gutter = document.getElementById('frpc_editor_gutter');
if (!ta || !gutter)
return;
const text = ta.value || '';
const lineCount = Math.max(1, text.split('\n').length);
gutter.innerHTML = '';
for (let i = 1; i <= lineCount; i++) {
gutter.appendChild(E('div', {
'class': 'frpc-editor-gutter-line' + (this._errorLine === i ? ' err' : '')
}, String(i)));
}
},
renderEditor: function(configText) {
const gutter = E('div', { id: 'frpc_editor_gutter', 'class': 'frpc-editor-gutter' });
const ta = E('textarea', {
id: 'frpc_config',
class: 'frpc-editor-input',
spellcheck: 'false',
wrap: 'off'
}, configText || '');
ta.addEventListener('keydown', function(ev) {
if (ev.keyCode === 9) { // Tab key
ev.preventDefault();
const start = this.selectionStart;
const end = this.selectionEnd;
const val = this.value;
this.value = val.substring(0, start) + ' ' + val.substring(end);
this.selectionStart = this.selectionEnd = start + 2;
}
});
ta.addEventListener('input', L.bind(function() {
this.refreshEditor();
this.scheduleValidate();
}, this));
ta.addEventListener('scroll', function() {
gutter.scrollTop = ta.scrollTop;
});
window.setTimeout(L.bind(function() { this.refreshEditor(); }, this), 0);
const inputWrap = E('div', { 'class': 'frpc-editor-input-wrap' }, [ ta ]);
return E('div', { 'class': 'frpc-editor-wrap' }, [
E('div', { 'class': 'frpc-editor-main' }, [ gutter, inputWrap ])
]);
},
setValidateHint: function(ok, message, pos) {
const hint = document.getElementById('frpc_validate_hint');
if (!hint)
return;
hint.style.color = ok ? 'green' : 'red';
hint.textContent = message;
this._errorLine = (!ok && pos && pos.line) ? pos.line : null;
this.refreshEditor();
},
runValidate: function() {
const content = document.getElementById('frpc_config')?.value || '';
if (!content.trim()) {
this.setValidateHint(true, _('Configuration is empty.'));
return Promise.resolve();
}
return callValidateConfig(content).then(L.bind(function(res) {
if (res && res.success) {
this.setValidateHint(true, _('Configuration is valid.'));
return;
}
const err = (res && res.error) ? String(res.error).trim() : _('Unknown error');
const pos = parseErrorPosition(err);
let msg = _('Verification failed: ') + err;
if (pos && pos.line)
msg += ' (' + _('Line') + ' ' + pos.line + (pos.col ? ', ' + _('Column') + ' ' + pos.col : '') + ')';
this.setValidateHint(false, msg, pos);
}, this));
},
scheduleValidate: function() {
if (this._validateTimer)
window.clearTimeout(this._validateTimer);
this._validateTimer = window.setTimeout(L.bind(function() {
this.runValidate().catch(function() {});
}, this), 700);
},
load: function() {
return Promise.all([ callGetConfig(), callStatus() ]);
},
render: function(data) {
this.injectStyle();
const cfg = data && data[0] ? data[0] : {};
const st = data && data[1] ? data[1] : {};
const configText = cfg.config || '';
const enabled = (st.enabled === 1 || st.enabled === true);
window.setTimeout(L.bind(function() {
this.runValidate().catch(function() {});
}, this), 0);
return E('div', { 'class': 'cbi-map' }, [
E('h2', {}, _('Frp Client Title') + ' - ' + _('Settings')),
E('div', { 'class': 'cbi-map-descr' }, _('Configure the Frp client parameters. Complete the server link details and local port forwarding rules to build an intranet penetration channel.')),
E('div', { 'class': 'cbi-section' }, [
E('h3', { 'class': 'cbi-section-title' }, _('Service Control')),
E('div', { 'class': 'cbi-value' }, [
E('label', { 'class': 'cbi-value-title' }, _('Enabled')),
E('div', { 'class': 'cbi-value-field' }, [
E('input', {
id: 'frpc_enabled',
type: 'checkbox',
checked: enabled ? 'checked' : null
})
])
])
]),
E('div', { 'class': 'cbi-section' }, [
E('h3', { 'class': 'cbi-section-title' }, _('Configuration Editor')),
this.renderEditor(configText)
]),
E('div', { 'class': 'cbi-section frpc-editor-buttons' }, [
E('button', {
'class': 'btn cbi-button cbi-button-apply',
click: ui.createHandlerFn(this, function() {
return this.runValidate();
})
}, _('Verify Configuration')),
E('span', { id: 'frpc_validate_hint', style: 'margin-left:12px;' }, '')
])
]);
},
validateAndSave: function() {
const configText = document.getElementById('frpc_config')?.value || '';
const enabledCheckbox = document.getElementById('frpc_enabled');
const on = enabledCheckbox && enabledCheckbox.checked ? 1 : 0;
ui.showModal(null, [ E('p', { 'class': 'spinning' }, [ _('Applying changes...') ]) ]);
return callValidateConfig(configText).then(L.bind(function(res) {
if (!res || !res.success) {
ui.hideModal();
const err = (res && res.error) ? String(res.error).trim() : _('Unknown error');
this.setValidateHint(false, _('Verification failed: ') + err, parseErrorPosition(err));
ui.addNotification(null, E('pre', { style: 'white-space:pre-wrap; margin:0;' }, _('frpc config verify failed:\n') + err), 'danger');
throw new Error('frpc verify failed');
}
this.setValidateHint(true, _('Configuration is valid.'));
return callSetEnabled(on).then(L.bind(function(setRes) {
if (!setRes || !setRes.success) {
ui.hideModal();
ui.addNotification(null, E('p', _('Failed to update service enable state.')), 'danger');
throw new Error('frpc set enabled failed');
}
return callSaveConfig(configText).then(L.bind(function(saveRes) {
ui.hideModal();
if (saveRes && saveRes.success) {
if (on === 0) {
return callServiceAction('stop');
} else {
if (saveRes.applied === false) {
ui.addNotification(null, E('p', _('Configuration saved, but service is not running or reload failed. Please force restart service.')), 'warning');
}
}
return;
}
ui.addNotification(null, E('p', _('Configuration save failed: ') + (saveRes && saveRes.error ? saveRes.error : _('Unknown error'))), 'danger');
throw new Error('frpc config save failed');
}, this));
}, this));
}, this)).catch(function(err) {
ui.hideModal();
throw err;
});
},
handleSave: function() {
return this.validateAndSave();
},
handleSaveApply: function() {
return this.validateAndSave();
}
});
+1
View File
@@ -0,0 +1 @@
zh_Hans
+342
View File
@@ -0,0 +1,342 @@
msgid ""
msgstr ""
"Project-Id-Version: luci-app-frpc\n"
"PO-Revision-Date: 2026-05-19 12:00+0800\n"
"Last-Translator: Dante <dante@seckv.com>\n"
"Language-Team: Chinese (Simplified)\n"
"Language: zh_Hans\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Transfer-Encoding: 8bit\n"
msgid "Service Status"
msgstr "服务运行状态"
msgid "Current Status"
msgstr "当前状态"
msgid "Adopting process, please wait..."
msgstr "正在接管进程,请稍候..."
msgid "Kill and Adopt Rogue Process"
msgstr "杀死并接管孤儿进程"
msgid "Proxy Health"
msgstr "穿透隧道健康度"
msgid "Configuration View (/var/etc/frpc.toml)"
msgstr "运行配置查看 (/var/etc/frpc.toml)"
msgid "Overview"
msgstr "概览"
msgid "Unknown"
msgstr "未知"
msgid "Running"
msgstr "运行中"
msgid "Running (Unmanaged)"
msgstr "运行中 (非托管)"
msgid "Stopped"
msgstr "已停止"
msgid "Name"
msgstr "名称"
msgid "Type"
msgstr "类型"
msgid "Status"
msgstr "状态"
msgid "Today Traffic (In/Out)"
msgstr "今日流量 (入/出)"
msgid "Error Message"
msgstr "报错信息"
msgid "No data (Service stopped or API not configured)"
msgstr "暂无数据 (服务未启动或 API 未配置)"
msgid "No proxies configured"
msgstr "没有配置任何隧道"
msgid "Frp Client"
msgstr "Frp客户端"
msgid "Open frp Console"
msgstr "打开 frp 控制台"
msgid "Global Settings"
msgstr "全局配置"
msgid "Basic Settings"
msgstr "基本设置"
msgid "Admin API (Required for Hot Reload)"
msgstr "管理 API (热重载必须)"
msgid "Recommended 0.0.0.0 for LAN access, 127.0.0.1 for local only."
msgstr "推荐设置 0.0.0.0 以便从 LAN 访问,127.0.0.1 仅限本地访问"
msgid "Log Settings"
msgstr "日志设置"
msgid "Enable"
msgstr "启用"
msgid "Server Address"
msgstr "服务器地址"
msgid "Server Port"
msgstr "服务器端口"
msgid "Default 7000"
msgstr "默认 7000"
msgid "Token"
msgstr "令牌"
msgid "Transport Protocol"
msgstr "传输协议"
msgid "Admin Address"
msgstr "管理地址"
msgid "Recommended 127.0.0.1"
msgstr "推荐 127.0.0.1"
msgid "Admin Port"
msgstr "管理端口"
msgid "Admin User"
msgstr "管理用户名"
msgid "Admin Password"
msgstr "管理密码"
msgid "Log File"
msgstr "日志路径"
msgid "Leave empty to use system log"
msgstr "留空则输出到系统日志"
msgid "Log Level"
msgstr "日志级别"
msgid "Max Days"
msgstr "保留天数"
msgid "Proxies"
msgstr "穿透列表"
msgid "Local IP"
msgstr "本地 IP"
msgid "Local Port"
msgstr "本地端口"
msgid "Remote Port"
msgstr "远程端口"
msgid "Custom Domains"
msgstr "自定义域名"
msgid "Use Encryption"
msgstr "开启加密"
msgid "Use Compression"
msgstr "开启压缩"
msgid "No logs available..."
msgstr "暂无日志..."
msgid "Real-time Logs"
msgstr "实时日志"
msgid "Log Viewer"
msgstr "日志查看"
msgid "Frp Client Overview"
msgstr "Frp客户端概览"
msgid "Overview of frpc runtime state, generated config, and proxy count."
msgstr "展示 frpc 运行状态、生成配置路径与代理数量。"
msgid "Generated Runtime Config"
msgstr "运行配置"
msgid "Configured Proxies"
msgstr "代理数量"
msgid "Frp Client Settings"
msgstr "Frp客户端设置"
msgid "Configuration saved successfully."
msgstr "配置保存成功。"
msgid "Configuration save failed: "
msgstr "配置保存失败:"
msgid "Unknown error"
msgstr "未知错误"
msgid "Log"
msgstr "日志"
msgid "Verify Configuration"
msgstr "校验客户端配置"
msgid "Configuration is empty."
msgstr "配置为空。"
msgid "Configuration is valid."
msgstr "配置校验通过。"
msgid "Verification failed: "
msgstr "配置校验失败:"
msgid "Service Status"
msgstr "服务状态"
msgid "Logs"
msgstr "日志"
msgid "Frp Client overview of runtime state, generated config, and proxy count."
msgstr "Frp Client 运行状态概览,包含生成配置路径和代理数量。"
msgid "Single TOML editor with syntax highlight, line numbers and error position hints."
msgstr "单一 TOML 编辑器,支持语法高亮、行号和错误位置提示。"
msgid "Line"
msgstr "行"
msgid "Column"
msgstr "列"
msgid "frpc Version"
msgstr "frpc 版本"
msgid "frpc config verify failed:\n"
msgstr "frpc 配置校验失败:\n"
msgid "Frp Client Log"
msgstr "Frp客户端日志"
msgid "Service Control"
msgstr "服务控制"
msgid "Enabled"
msgstr "启用"
msgid "Actions"
msgstr "操作"
msgid "Start"
msgstr "启动"
msgid "Stop"
msgstr "停止"
msgid "Restart"
msgstr "重启"
msgid "Service enable state updated."
msgstr "服务启用状态已更新。"
msgid "Failed to update service enable state."
msgstr "更新服务启用状态失败。"
msgid "Configuration Editor"
msgstr "配置修改"
msgid "Runtime Details"
msgstr "运行详情"
msgid "Web API"
msgstr "Web API"
msgid "Connected Server"
msgstr "连接服务器"
msgid "Web API Status JSON"
msgstr "Web API 状态 JSON"
msgid "Proxy Runtime List"
msgstr "代理运行列表"
msgid "Local"
msgstr "本地地址"
msgid "Remote"
msgstr "远程地址"
msgid "Error"
msgstr "错误"
msgid "No running proxies"
msgstr "暂无运行中的代理"
msgid "Connect to FRP server"
msgstr "连接FRP服务端"
msgid "Running proxy list"
msgstr "运行的代理列表"
msgid "Web Panel"
msgstr "Web面板"
msgid "Loading logs..."
msgstr "日志加载中..."
msgid "Showing the last 100 lines of frpc service logs."
msgstr "显示 frpc 服务最近 100 行日志。"
msgid "Open"
msgstr "打开"
msgid "Failed to apply service state."
msgstr "应用服务状态失败。"
msgid "Restarting service, please wait..."
msgstr "正在重启服务,请稍候..."
msgid "Restart and Take Over"
msgstr "重启并接管"
msgid "Restart Service"
msgstr "重启服务"
msgid "Force Restart"
msgstr "强制重启"
msgid "Force restarting service, please wait..."
msgstr "正在强制重启服务,请稍候..."
msgid "Hide Preview"
msgstr "关闭预览"
msgid "Configuration saved and applied successfully."
msgstr "配置已保存并生效。"
msgid "Configuration saved, but apply failed. Please force restart service."
msgstr "配置已保存,但生效失败,请强制重启服务。"
msgid "Configuration saved, but service is not running or reload failed. Please force restart service."
msgstr "配置已保存,但服务未运行或重载失败,请强制重启服务。"
msgid "Overview of the local frpc service state, active process PID, loaded config files, and detailed online proxy information."
msgstr "展示 frpc 客户端本地服务运行状态、活动进程 PID、当前加载的配置文件以及在线穿透隧道的实时统计与健康度参数。"
msgid "Configure the Frp client parameters. Complete the server link details and local port forwarding rules to build an intranet penetration channel."
msgstr "配置 Frp 客户端的核心参数。支持一键式服务状态启用控制,并提供具备语法高亮、实时语法校验、行号提示的专业级 TOML 配置文件编辑器。"
msgid "Real-time background system logs of the active frpc process, helping you diagnose server handshake and protocol errors."
msgstr "实时查询当前活跃 frpc 进程的后台系统日志,方便您快速诊断与 frp 服务端的握手协议及穿透连接异常。"
msgid "Frp Client Title"
msgstr "Frp 客户端"
+2
View File
@@ -0,0 +1,2 @@
config frpc 'main'
option enabled '0'
+25
View File
@@ -0,0 +1,25 @@
#!/bin/sh
[ "$ACTION" = "ifup" ] || exit 0
[ "$INTERFACE" = "loopback" ] && exit 0
# Skip if frpc is not enabled
[ "$(uci -q get frpc.main.enabled)" = "1" ] || exit 0
# Skip if frpc process is already running
if pidof /usr/bin/frpc >/dev/null 2>&1 || pidof frpc >/dev/null 2>&1; then
exit 0
fi
LOCK=/tmp/frpc_hotplug.lock
# Debounce: avoid duplicate concurrent starts within 5 seconds
if [ -f "$LOCK" ]; then
ts=$(cat "$LOCK" 2>/dev/null)
[ -n "$ts" ] && [ $(( $(date +%s) - ts )) -lt 5 ] && exit 0
fi
date +%s > "$LOCK"
logger -t frpc-hotplug "${INTERFACE:-$DEVICE} ifup: frpc is enabled but not running, starting service"
/etc/init.d/frpc start >/dev/null 2>&1 &
+50
View File
@@ -0,0 +1,50 @@
#!/bin/sh /etc/rc.common
START=90
STOP=10
USE_PROCD=1
PROG=/usr/bin/frpc
CONF_FILE=/etc/config/frpc.toml
is_enabled() {
local enabled
config_load frpc
config_get_bool enabled "main" "enabled" 0
[ "$enabled" -eq 1 ]
}
start_service() {
is_enabled || return 0
if [ ! -s "$CONF_FILE" ]; then
logger -t frpc "Config file missing or empty: $CONF_FILE"
return 1
fi
procd_open_instance
procd_set_param command "$PROG" -c "$CONF_FILE"
procd_set_param respawn
procd_set_param stdout 1
procd_set_param stderr 1
procd_close_instance
}
reload_service() {
if ! is_enabled; then
stop
return 0
fi
if [ ! -s "$CONF_FILE" ]; then
logger -t frpc "Config file missing or empty: $CONF_FILE"
stop
return 1
fi
restart
}
service_triggers() {
procd_add_reload_trigger "frpc"
}
Loaded 100 of 146 files, more files were not shown because too many files have changed in this diff. Show more