mirror of
https://github.com/kiddin9/op-packages.git
synced 2026-10-26 20:02:51 +08:00
🍓 Sync 2026-09-15 02:13:06
This commit is contained in:
1 parent
0e5393594c
commit
1dd96ac2bb
146 files changed
+26541
-508
No files matched your search
+4
-4
@@ -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))
|
||||
|
||||
@@ -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))
|
||||
@@ -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'
|
||||
|
||||
Executable
+64
@@ -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
|
||||
}
|
||||
@@ -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
|
||||
@@ -0,0 +1,3 @@
|
||||
#!/bin/sh
|
||||
|
||||
cloudflared --version | grep "$PKG_VERSION"
|
||||
Executable
+78
@@ -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
|
||||
@@ -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)))
|
||||
@@ -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))
|
||||
Executable
+3
@@ -0,0 +1,3 @@
|
||||
#!/bin/sh
|
||||
|
||||
frpc --version | grep "$PKG_VERSION"
|
||||
Executable
+45
@@ -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)"
|
||||
@@ -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)))
|
||||
@@ -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'
|
||||
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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
|
||||
@@ -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 ""
|
||||
Symlink
+1
@@ -0,0 +1 @@
|
||||
zh_Hans
|
||||
@@ -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 };
|
||||
@@ -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
@@ -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" ]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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 };
|
||||
@@ -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 { '&': '&', '<': '<', '>': '>', '"': '"', "'": ''' }[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 ""
|
||||
|
||||
Symlink
+1
@@ -0,0 +1 @@
|
||||
zh_Hans
|
||||
@@ -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'
|
||||
Executable
+299
@@ -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
@@ -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
@@ -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
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
});
|
||||
Symlink
+1
@@ -0,0 +1 @@
|
||||
zh_Hans
|
||||
@@ -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 客户端"
|
||||
@@ -0,0 +1,2 @@
|
||||
config frpc 'main'
|
||||
option enabled '0'
|
||||
+25
@@ -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 &
|
||||
Executable
+50
@@ -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
Reference in new issue
Block a user