From f4c336b20023761cee3d34ea7e91392ca32eb751 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 2 Jun 2026 21:18:52 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=8C=B4=20Sync=202026-06-02=2021:18:52?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ipv6-neigh/Makefile | 2 +- ipv6-neigh/src/db.rs | 245 +-- ipv6-neigh/src/filter.rs | 27 +- ipv6-neigh/src/iface.rs | 73 +- ipv6-neigh/src/main.rs | 408 ++-- ipv6-neigh/src/op.rs | 31 +- ipv6-neigh/src/probe.rs | 79 +- ipv6-neigh/src/reconcile.rs | 44 +- ipv6-neigh/src/types.rs | 15 +- .../htdocs/luci-static/resources/fchomo.js | 1 + .../luci-static/resources/fchomo/listeners.js | 49 +- .../luci-static/resources/view/fchomo/node.js | 21 +- luci-app-fchomo/po/templates/fchomo.pot | 1644 +++++++++-------- luci-app-fchomo/po/zh_Hans/fchomo.po | 1644 +++++++++-------- luci-app-fchomo/po/zh_Hant/fchomo.po | 1644 +++++++++-------- .../root/usr/share/fchomo/generate_client.uc | 3 + .../root/usr/share/ucode/fchomo.uc | 14 +- luci-app-passwall/Makefile | 4 +- luci-app-passwall2/Makefile | 2 +- .../luasrc/passwall2/util_xray.lua | 12 +- luci-app-quickfile/Makefile | 2 +- .../share/luci/menu.d/luci-app-quickfile.json | 3 - mihomo-alpha/Makefile | 8 +- mihomo-meta/Makefile | 8 +- mihomo/Makefile | 4 +- 25 files changed, 3094 insertions(+), 2893 deletions(-) diff --git a/ipv6-neigh/Makefile b/ipv6-neigh/Makefile index 213320bd..002cd5bd 100644 --- a/ipv6-neigh/Makefile +++ b/ipv6-neigh/Makefile @@ -2,7 +2,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=ipv6-neigh PKG_VERSION:=0.1.0 -PKG_RELEASE:=18 +PKG_RELEASE:=19 PKG_BUILD_DEPENDS:=rust/host PKG_BUILD_PARALLEL:=1 diff --git a/ipv6-neigh/src/db.rs b/ipv6-neigh/src/db.rs index f851832b..2c806b8b 100644 --- a/ipv6-neigh/src/db.rs +++ b/ipv6-neigh/src/db.rs @@ -1,3 +1,4 @@ +use std::cell::RefCell; use std::net::{IpAddr, Ipv4Addr, Ipv6Addr, SocketAddr}; use std::time::{Duration, SystemTime, UNIX_EPOCH}; @@ -8,6 +9,8 @@ use tokio::io::{AsyncReadExt, AsyncWriteExt}; use tokio::net::TcpStream; use tokio::time::timeout; +use crate::filter::if_ipv6_in_private_subnet; + const TCP_TIMEOUT: Duration = Duration::from_secs(5); fn check_response(response: &Message, allowed: &[ResponseCode]) -> Result<(), Box> { @@ -20,6 +23,10 @@ fn check_response(response: &Message, allowed: &[ResponseCode]) -> Result<(), Bo } /// DNS dynamic update client that sends RFC 2136 updates over TCP to the hickory-dns server. +/// TCP connections are reused across calls to reduce syscall overhead. +/// +/// Uses `RefCell` for interior mutability — safe because the entire program runs on a +/// single-threaded tokio runtime (`current_thread`). pub(crate) struct DnsUpdater { server_addr: SocketAddr, zone: Name, @@ -28,11 +35,20 @@ pub(crate) struct DnsUpdater { ipv4_ptr_zones: Vec<(u32, u8, Name)>, /// Reverse zone for ULA IPv6 (d.f.ip6.arpa) ula_ptr_zone: Option, + /// Reusable TCP connection (lazy connect + auto-reconnect on failure). + conn: RefCell>, } impl DnsUpdater { pub fn new(server_addr: SocketAddr, zone: Name, signer: TSigner) -> Self { - Self { server_addr, zone, signer, ipv4_ptr_zones: vec![], ula_ptr_zone: None } + Self { + server_addr, + zone, + signer, + ipv4_ptr_zones: vec![], + ula_ptr_zone: None, + conn: RefCell::new(None), + } } /// Configure reverse PTR zones. @@ -49,6 +65,74 @@ impl DnsUpdater { self } + // -- generic helpers (eliminates upsert_a/upsert_aaaa and delete_a/delete_aaaa duplication) -- + + /// Create-or-append a record (A or AAAA). Tries CREATE first; on YXRRSet + /// (name already exists) falls back to APPEND so multiple addresses per host work. + async fn upsert_record( + &self, + hostname: &str, + rtype: RecordType, + rdata: RData, + ttl: u32, + ) -> Result<(), Box> { + let name = Name::from_ascii(hostname)?.append_domain(&self.zone)?; + let mut rrset = RecordSet::with_ttl(name.clone(), rtype, ttl); + rrset.add_rdata(rdata.clone()); + let msg = update_message::create(rrset, self.zone.clone(), false); + let response = self.send_tcp(msg).await?; + if response.metadata.response_code == ResponseCode::YXRRSet { + let mut rrset = RecordSet::with_ttl(name, rtype, ttl); + rrset.add_rdata(rdata); + let msg = update_message::append(rrset, self.zone.clone(), false, false); + let response = self.send_tcp(msg).await?; + check_response(&response, &[])?; + } else { + check_response(&response, &[])?; + } + Ok(()) + } + + /// Delete a single record by rdata (A or AAAA). + async fn delete_record( + &self, + hostname: &str, + rtype: RecordType, + rdata: RData, + ) -> Result<(), Box> { + let name = Name::from_ascii(hostname)?.append_domain(&self.zone)?; + let mut rrset = RecordSet::new(name, rtype, 0); + rrset.add_rdata(rdata); + let msg = update_message::delete_by_rdata(rrset, self.zone.clone(), false); + let response = self.send_tcp(msg).await?; + check_response(&response, &[])?; + Ok(()) + } + + // -- public A / AAAA wrappers -- + + /// Create or append a AAAA record. + pub async fn upsert_aaaa(&self, hostname: &str, addr: Ipv6Addr, ttl: u32) -> Result<(), Box> { + self.upsert_record(hostname, RecordType::AAAA, RData::AAAA(addr.into()), ttl).await + } + + /// Create or append an A record. + pub async fn upsert_a(&self, hostname: &str, addr: Ipv4Addr, ttl: u32) -> Result<(), Box> { + self.upsert_record(hostname, RecordType::A, RData::A(addr.into()), ttl).await + } + + /// Delete a specific AAAA record. + pub async fn delete_aaaa(&self, hostname: &str, addr: Ipv6Addr) -> Result<(), Box> { + self.delete_record(hostname, RecordType::AAAA, RData::AAAA(addr.into())).await + } + + /// Delete a specific A record. + pub async fn delete_a(&self, hostname: &str, addr: Ipv4Addr) -> Result<(), Box> { + self.delete_record(hostname, RecordType::A, RData::A(addr.into())).await + } + + // -- PTR -- + /// Upsert a PTR record. Silently skips IPs with no configured reverse zone. pub async fn upsert_ptr( &self, @@ -61,20 +145,18 @@ impl DnsUpdater { let Some(zone) = self.find_ipv4_ptr_zone(ip).cloned() else { return Ok(()) }; (ipv4_ptr_name(ip), zone) } - IpAddr::V6(ip) if (ip.segments()[0] & 0xfe00) == 0xfc00 => { + IpAddr::V6(ip) if if_ipv6_in_private_subnet(&ip) => { let Some(zone) = self.ula_ptr_zone.clone() else { return Ok(()) }; (ipv6_ptr_name(ip), zone) } _ => return Ok(()), }; let target = Name::from_ascii(hostname)?.append_domain(&self.zone)?; - // Delete any existing PTR rrset first (replace semantics: one PTR per IP). let del_record = Record::update0(ptr_name.clone(), 0, RecordType::PTR); let del_msg = update_message::delete_rrset(del_record, rev_zone.clone(), false); let del_resp = self.send_tcp(del_msg).await?; check_response(&del_resp, &[])?; - // Add the new PTR. let mut rrset = RecordSet::with_ttl(ptr_name, RecordType::PTR, ttl); rrset.add_rdata(RData::PTR(PtrRData(target))); @@ -94,7 +176,7 @@ impl DnsUpdater { let Some(zone) = self.find_ipv4_ptr_zone(ip).cloned() else { return Ok(()) }; (ipv4_ptr_name(ip), zone) } - IpAddr::V6(ip) if (ip.segments()[0] & 0xfe00) == 0xfc00 => { + IpAddr::V6(ip) if if_ipv6_in_private_subnet(&ip) => { let Some(zone) = self.ula_ptr_zone.clone() else { return Ok(()) }; (ipv6_ptr_name(ip), zone) } @@ -120,118 +202,72 @@ impl DnsUpdater { .map(|(_, _, name)| name) } - /// Create or append a AAAA record. - pub async fn upsert_aaaa( - &self, - hostname: &str, - addr: Ipv6Addr, - ttl: u32, - ) -> Result<(), Box> { - let name = Name::from_ascii(hostname)?.append_domain(&self.zone)?; - let mut rrset = RecordSet::with_ttl(name.clone(), RecordType::AAAA, ttl); - rrset.add_rdata(RData::AAAA(addr.into())); + // -- TCP transport (connection-reusing) -- - let msg = update_message::create(rrset, self.zone.clone(), false); - let response = self.send_tcp(msg).await?; - if response.metadata.response_code == ResponseCode::YXRRSet { - let mut rrset = RecordSet::with_ttl(name, RecordType::AAAA, ttl); - rrset.add_rdata(RData::AAAA(addr.into())); - let msg = update_message::append(rrset, self.zone.clone(), false, false); - let response = self.send_tcp(msg).await?; - check_response(&response, &[])?; - } else { - check_response(&response, &[])?; - } - Ok(()) - } - - /// Create or append an A record. - pub async fn upsert_a( - &self, - hostname: &str, - addr: Ipv4Addr, - ttl: u32, - ) -> Result<(), Box> { - let name = Name::from_ascii(hostname)?.append_domain(&self.zone)?; - let mut rrset = RecordSet::with_ttl(name.clone(), RecordType::A, ttl); - rrset.add_rdata(RData::A(addr.into())); - - let msg = update_message::create(rrset, self.zone.clone(), false); - let response = self.send_tcp(msg).await?; - if response.metadata.response_code == ResponseCode::YXRRSet { - let mut rrset = RecordSet::with_ttl(name, RecordType::A, ttl); - rrset.add_rdata(RData::A(addr.into())); - let msg = update_message::append(rrset, self.zone.clone(), false, false); - let response = self.send_tcp(msg).await?; - check_response(&response, &[])?; - } else { - check_response(&response, &[])?; - } - Ok(()) - } - - /// Delete a specific AAAA record. - pub async fn delete_aaaa( - &self, - hostname: &str, - addr: Ipv6Addr, - ) -> Result<(), Box> { - let name = Name::from_ascii(hostname)?.append_domain(&self.zone)?; - let mut rrset = RecordSet::new(name, RecordType::AAAA, 0); - rrset.add_rdata(RData::AAAA(addr.into())); - let msg = update_message::delete_by_rdata(rrset, self.zone.clone(), false); - let response = self.send_tcp(msg).await?; - check_response(&response, &[])?; - Ok(()) - } - - /// Delete a specific A record. - pub async fn delete_a( - &self, - hostname: &str, - addr: Ipv4Addr, - ) -> Result<(), Box> { - let name = Name::from_ascii(hostname)?.append_domain(&self.zone)?; - let mut rrset = RecordSet::new(name, RecordType::A, 0); - rrset.add_rdata(RData::A(addr.into())); - let msg = update_message::delete_by_rdata(rrset, self.zone.clone(), false); - let response = self.send_tcp(msg).await?; - check_response(&response, &[])?; - Ok(()) - } - - /// Send a DNS message over TCP (2-byte length prefix + message bytes) and read the response. + /// Send a DNS message over TCP and read the response. + /// Reuses an existing connection when possible; reconnects automatically on failure. async fn send_tcp(&self, mut msg: Message) -> Result> { let now = SystemTime::now().duration_since(UNIX_EPOCH)?.as_secs(); msg.finalize(&self.signer, now)?; - let bytes = msg.to_vec()?; - let len = u16::try_from(bytes.len())?; + let len_bytes = u16::try_from(bytes.len())?.to_be_bytes(); - let result = timeout(TCP_TIMEOUT, async { - let mut stream = TcpStream::connect(self.server_addr).await?; - stream.write_all(&len.to_be_bytes()).await?; - stream.write_all(&bytes).await?; + // Try the existing connection first. + // Take it out of the RefCell so we don't hold the borrow across await. + let existing = self.conn.borrow_mut().take(); + if let Some(mut stream) = existing { + match Self::do_send_recv(&mut stream, &len_bytes, &bytes, self.server_addr).await { + Ok(resp) => { + // Put the connection back for reuse. + *self.conn.borrow_mut() = Some(stream); + return Ok(resp); + } + Err(_) => { + // Connection broken — will reconnect below. + } + } + } + + // Establish a new connection. + let mut stream = timeout(TCP_TIMEOUT, TcpStream::connect(self.server_addr)) + .await + .map_err(|_| -> Box { + format!("DNS TCP connect timeout after {}s to {}", TCP_TIMEOUT.as_secs(), self.server_addr).into() + })??; + + let resp = Self::do_send_recv(&mut stream, &len_bytes, &bytes, self.server_addr).await?; + *self.conn.borrow_mut() = Some(stream); + Ok(resp) + } + + /// Write a length-prefixed DNS message and read the response on an existing stream. + async fn do_send_recv( + stream: &mut TcpStream, + len_bytes: &[u8], + msg_bytes: &[u8], + server_addr: SocketAddr, + ) -> Result> { + timeout(TCP_TIMEOUT, async { + stream.write_all(len_bytes).await?; + stream.write_all(msg_bytes).await?; stream.flush().await?; - let resp_len = stream.read_u16().await? as usize; let mut resp_buf = vec![0u8; resp_len]; stream.read_exact(&mut resp_buf).await?; - Ok::<_, Box>(Message::from_vec(&resp_buf)?) }) .await .map_err(|_| -> Box { - format!("DNS TCP timeout after {}s connecting to {}", TCP_TIMEOUT.as_secs(), self.server_addr).into() - })??; - - Ok(result) + format!("DNS TCP timeout after {}s to {}", TCP_TIMEOUT.as_secs(), server_addr).into() + })? } + // -- AXFR (uses its own connection -- streaming protocol) -- + /// Fetch all A and AAAA records in the zone via AXFR (RFC 5936). /// - /// Returns a list of `(hostname_label, IpAddr)` pairs — only records whose owner - /// name is directly under the zone apex (e.g. `foo.lan.` → `"foo"`). + /// Returns a list of `(hostname_label, IpAddr)` pairs -- only records whose owner + /// name is directly under the zone apex (e.g. `foo.lan.` -> `"foo"`). /// SOA, NS, and apex records are excluded. /// /// Requires `axfr_policy = "AllowAll"` (or `"AllowSigned"`) in the server config. @@ -241,9 +277,9 @@ impl DnsUpdater { let query = Query::new(self.zone.clone(), RecordType::AXFR); let mut msg = Message::query(); msg.add_query(query); - let bytes = msg.to_vec()?; let len = u16::try_from(bytes.len())?; + let zone = self.zone.clone(); let addr = self.server_addr; @@ -264,11 +300,9 @@ impl DnsUpdater { let mut buf = vec![0u8; resp_len]; stream.read_exact(&mut buf).await?; let response = Message::from_vec(&buf)?; - if response.metadata.response_code != ResponseCode::NoError { return Err(format!("AXFR error: {:?}", response.metadata.response_code).into()); } - for record in &response.answers { match &record.data { RData::SOA(_) => { @@ -287,25 +321,22 @@ impl DnsUpdater { _ => {} } } - if soa_count >= 2 { break; } } - Ok::<_, Box>(records) }) .await .map_err(|_| -> Box { format!("AXFR timeout after {}s connecting to {}", AXFR_TIMEOUT.as_secs(), self.server_addr).into() })??; - Ok(records) } } /// Build the PTR owner name for an IPv4 address. -/// e.g. 192.168.3.5 → `5.3.168.192.in-addr.arpa.` +/// e.g. 192.168.3.5 -> `5.3.168.192.in-addr.arpa.` fn ipv4_ptr_name(addr: Ipv4Addr) -> Name { let o = addr.octets(); Name::from_ascii(&format!("{}.{}.{}.{}.in-addr.arpa.", o[3], o[2], o[1], o[0])) @@ -341,7 +372,7 @@ fn ipv4_zone_name(net: Ipv4Addr, prefix_len: u8) -> Name { /// Extract the single label that precedes the zone apex from a fully-qualified record name. /// -/// e.g. `"foo.lan."` with zone `"lan."` → `Some("foo")`. +/// e.g. `"foo.lan."` with zone `"lan."` -> `Some("foo")`. /// Returns `None` for the apex itself or for names not directly under the zone. fn extract_hostname(name: &Name, zone: &Name) -> Option { let n = name.to_ascii().to_lowercase(); diff --git a/ipv6-neigh/src/filter.rs b/ipv6-neigh/src/filter.rs index 23bcd7a5..5349a153 100644 --- a/ipv6-neigh/src/filter.rs +++ b/ipv6-neigh/src/filter.rs @@ -1,10 +1,14 @@ use std::net::{Ipv4Addr, Ipv6Addr}; - use crate::types::LanPrefix; +/// Returns true if `addr` is link-local (fe80::/10). +/// Centralised here so every module uses the same check. +pub(crate) fn is_link_local_ipv6(addr: &Ipv6Addr) -> bool { + (addr.segments()[0] & 0xffc0) == 0xfe80 +} + +/// Returns true if `addr` is ULA (fc00::/7). pub(crate) fn if_ipv6_in_private_subnet(ip: &Ipv6Addr) -> bool { - // Check if address is ULA (fc00::/7) - // Note: link-local is always filtered earlier by is_link_local_ipv6() (ip.segments()[0] & 0xfe00) == 0xfc00 } @@ -13,29 +17,36 @@ pub(crate) fn is_gua_ipv6(addr: &Ipv6Addr) -> bool { (addr.segments()[0] & 0xe000) == 0x2000 } +/// Returns true if this IPv6 address should be skipped for LAN purposes. +/// Skips link-local always; skips non-ULA when `private_subnet_v6` is set. +pub(crate) fn should_skip_v6(addr: &Ipv6Addr, private_subnet_v6: bool) -> bool { + if is_link_local_ipv6(addr) { + return true; + } + if private_subnet_v6 && !if_ipv6_in_private_subnet(addr) { + return true; + } + false +} + pub(crate) fn if_ipv4_in_private_subnet(ip: &Ipv4Addr) -> bool { let octets = ip.octets(); - // 10.0.0.0/8 if octets[0] == 10 { return true; } - // 172.16.0.0/12 if octets[0] == 172 && (octets[1] >= 16 && octets[1] <= 31) { return true; } - // 192.168.0.0/16 if octets[0] == 192 && octets[1] == 168 { return true; } - // 127.0.0.0/8 (loopback) if octets[0] == 127 { return true; } - false } diff --git a/ipv6-neigh/src/iface.rs b/ipv6-neigh/src/iface.rs index a5614acc..88e34220 100644 --- a/ipv6-neigh/src/iface.rs +++ b/ipv6-neigh/src/iface.rs @@ -1,5 +1,4 @@ use std::net::{IpAddr, SocketAddr}; - use futures::stream::TryStreamExt; use log::{info, warn}; use netlink_packet_route::address::{AddressAttribute, AddressFlags, AddressHeaderFlags, AddressMessage}; @@ -7,6 +6,7 @@ use rtnetlink::Handle; use tokio::time::{self, Duration}; use crate::db::DnsUpdater; +use crate::filter::should_skip_v6; use crate::types::{DEFAULT_TTL, LanPrefix}; /// Check whether an address message is deprecated (preferred lifetime expired). @@ -24,6 +24,28 @@ pub(crate) fn is_addr_deprecated(msg: &AddressMessage) -> bool { false } +/// Look up the interface index and collect all address messages for `iface`. +/// Shared between `get_active_lan_prefixes` and `register_router_addresses` +/// to avoid duplicating the link-lookup + address-enumeration boilerplate. +async fn get_iface_addresses( + handle: Handle, + iface: &str, +) -> Result<(u32, Vec), String> { + let mut links = handle.link().get().match_name(iface.to_owned()).execute(); + let link = match links.try_next().await { + Ok(Some(l)) => l, + Ok(None) => return Err(format!("interface {} not found", iface)), + Err(e) => return Err(format!("failed to find interface {}: {}", iface, e)), + }; + let ifindex = link.header.index; + let mut addr_stream = handle.address().get().set_link_index_filter(ifindex).execute(); + let mut msgs = Vec::new(); + while let Ok(Some(msg)) = addr_stream.try_next().await { + msgs.push(msg); + } + Ok((ifindex, msgs)) +} + /// Enumerate non-link-local IPv6 prefixes currently assigned to `iface`. /// Used during startup to filter out neighbour entries from expired/old prefixes. pub(crate) async fn get_active_lan_prefixes( @@ -31,29 +53,20 @@ pub(crate) async fn get_active_lan_prefixes( iface: &str, private_subnet_v6: bool, ) -> Vec { - let mut links = handle.link().get().match_name(iface.to_owned()).execute(); - let link = match links.try_next().await { - Ok(Some(l)) => l, - _ => return vec![], + let (_ifindex, msgs) = match get_iface_addresses(handle, iface).await { + Ok(v) => v, + Err(_) => return vec![], }; - let ifindex = link.header.index; - let mut addresses = handle.address().get().set_link_index_filter(ifindex).execute(); + let mut prefixes = Vec::new(); - while let Ok(Some(msg)) = addresses.try_next().await { + for msg in &msgs { let prefix_len = msg.header.prefix_len; - // Skip deprecated addresses; they are no longer used for new connections - // and should not be treated as active LAN prefixes. - if is_addr_deprecated(&msg) { + if is_addr_deprecated(msg) { continue; } for attr in &msg.attributes { if let AddressAttribute::Address(IpAddr::V6(addr)) = attr { - // Skip link-local - if (addr.segments()[0] & 0xffc0) == 0xfe80 { - continue; - } - let is_ula = (addr.segments()[0] & 0xfe00) == 0xfc00; - if private_subnet_v6 && !is_ula { + if should_skip_v6(addr, private_subnet_v6) { continue; } prefixes.push(LanPrefix { addr: *addr, prefix_len }); @@ -72,22 +85,16 @@ pub(crate) async fn register_router_addresses( updater: &DnsUpdater, private_subnet_v6: bool, ) { - let mut links = handle.link().get().match_name(iface.to_owned()).execute(); - let link = match links.try_next().await { - Ok(Some(l)) => l, - Ok(None) => { - warn!("interface {} not found, skipping router address registration", iface); - return; - } + let (_ifindex, msgs) = match get_iface_addresses(handle, iface).await { + Ok(v) => v, Err(e) => { - warn!("failed to find interface {}: {}", iface, e); + warn!("{}, skipping router address registration", e); return; } }; - let ifindex = link.header.index; - let mut addresses = handle.address().get().set_link_index_filter(ifindex).execute(); - while let Ok(Some(msg)) = addresses.try_next().await { - if is_addr_deprecated(&msg) { + + for msg in &msgs { + if is_addr_deprecated(msg) { continue; } for attr in &msg.attributes { @@ -97,13 +104,7 @@ pub(crate) async fn register_router_addresses( }; match ip { IpAddr::V6(addr) => { - // Always skip link-local - if (addr.segments()[0] & 0xffc0) == 0xfe80 { - continue; - } - // Restrict to ULA only when private_subnet_v6 is set - let is_ula = (addr.segments()[0] & 0xfe00) == 0xfc00; - if private_subnet_v6 && !is_ula { + if should_skip_v6(addr, private_subnet_v6) { continue; } for name in std::iter::once(hostname).chain(extra_alias) { diff --git a/ipv6-neigh/src/main.rs b/ipv6-neigh/src/main.rs index dda9f021..a904f047 100644 --- a/ipv6-neigh/src/main.rs +++ b/ipv6-neigh/src/main.rs @@ -1,10 +1,10 @@ use std::collections::HashMap; -use std::net::{IpAddr, Ipv4Addr, SocketAddr as StdSocketAddr}; +use std::net::{Ipv4Addr, SocketAddr as StdSocketAddr}; use std::time::Instant; use futures::stream::StreamExt; use futures::stream::TryStreamExt; -use log::{debug, error, info, warn}; +use log::{debug, info, warn}; use netlink_packet_core::NetlinkPayload; use netlink_packet_route::RouteNetlinkMessage; use netlink_packet_route::neighbour::NeighbourMessage; @@ -29,10 +29,10 @@ mod types; use filter::{if_ipv4_in_private_subnet, if_ipv6_in_private_subnet, ipv6_in_prefix, ipv6_passes_active_prefix, is_gua_ipv6}; use iface::{get_active_lan_prefixes, register_router_addresses, wait_for_dns_server}; -use probe::{probe_gua_keepalive, probe_registered_neighbours, prune_gua_keepalive, send_icmpv4_echo, send_icmpv6_echo}; +use probe::{Prober, probe_gua_keepalive, probe_registered_neighbours, prune_gua_keepalive}; use reconcile::{do_delete_dns, process_new_neigh, prune_ula_for_host, reconcile_dns}; use types::{ - DEFAULT_TTL, RTNLGRP_NEIGH, GuaKeepaliveEntry, Neigh, RegisteredEntry, nl_mgrp, + RTNLGRP_NEIGH, GuaKeepaliveEntry, Neigh, RegisteredEntry, format_mac, nl_mgrp, }; #[derive(Debug, Parser)] @@ -41,54 +41,68 @@ struct Cli { /// Restrict IPv4 neighbours to private subnets only (10/8, 172.16/12, 192.168/16, 127/8) #[clap(long)] private_subnet_v4: bool, + /// Also publish GUA (Global Unicast Address) AAAA records; by default only ULA (fc00::/7) is published #[clap(long)] publish_gua: bool, + /// hickory-dns server address for DNS updates (e.g. "[::1]:5335") #[clap(short, long, default_value = "[::1]:5335")] dns_server: StdSocketAddr, + /// DNS zone to update (e.g. "lan") #[clap(short, long, default_value = "lan")] zone: String, + /// Path to TSIG key file (raw HMAC secret) #[clap(short, long, default_value = "/etc/hickory-dns/update.key")] key_file: std::path::PathBuf, + /// TSIG key name #[clap(short = 'n', long, default_value = "update-key.")] key_name: String, + /// Log level (error, warn, info, debug, trace) #[clap(short = 'l', long, default_value = "info")] log_level: String, + /// Probe interval in seconds for active reachability checks (0 to disable) #[clap(long, default_value = "75")] probe_interval: u64, + /// Network interface to read the router's own addresses from #[clap(long, default_value = "br-lan")] router_iface: String, - /// Additional DNS name to register router addresses under (e.g. "router" → "router.lan") + + /// Additional DNS name to register router addresses under (e.g. "router" -> "router.lan") #[clap(long)] router_alias: Option, + /// Periodically probe the newest GUA per host to maintain NUD/Wi-Fi reachability (without publishing to DNS) #[clap(long)] keepalive_gua: bool, + /// Probe interval in seconds for GUA keepalive (only used with --keepalive-gua) #[clap(long, default_value = "120")] keepalive_gua_interval: u64, + /// Maximum number of GUA addresses to keepalive-probe per host #[clap(long, default_value = "2")] keepalive_gua_per_host: usize, + /// Maximum number of ULA AAAA records to publish per host (oldest pruned first) #[clap(long, default_value = "2")] max_ula_per_host: usize, + /// IPv4 subnets for PTR reverse DNS (CIDR notation, e.g. "192.168.3.0/24", repeatable) #[clap(long, value_name = "SUBNET")] ptr_ipv4_subnet: Vec, + /// Enable PTR reverse DNS for ULA IPv6 addresses (fc00::/7) via d.f.ip6.arpa #[clap(long)] ptr_ula: bool, } - fn should_skip_route_type(route_type: RouteType) -> bool { matches!(route_type, RouteType::Multicast | RouteType::Broadcast | RouteType::Local) } @@ -103,7 +117,6 @@ fn is_failed_state(state: NeighbourState) -> bool { } /// Parse an IPv4 CIDR string like "192.168.3.0/24" into (network_addr, prefix_len). -/// Panics with a clear message on invalid input. fn parse_ipv4_cidr(s: &str) -> (Ipv4Addr, u8) { let (addr_str, prefix_str) = s.split_once('/').unwrap_or_else(|| { panic!("invalid --ptr-ipv4-subnet \"{s}\": expected CIDR notation like \"192.168.3.0/24\"") @@ -112,12 +125,125 @@ fn parse_ipv4_cidr(s: &str) -> (Ipv4Addr, u8) { panic!("invalid --ptr-ipv4-subnet \"{s}\": \"{addr_str}\" is not a valid IPv4 address") }); let prefix_len: u8 = prefix_str.parse().unwrap_or_else(|_| { - panic!("invalid --ptr-ipv4-subnet \"{s}\": prefix length must be 0–32") + panic!("invalid --ptr-ipv4-subnet \"{s}\": prefix length must be 0-32") }); assert!(prefix_len <= 32, "invalid --ptr-ipv4-subnet \"{s}\": prefix length {prefix_len} > 32"); (addr, prefix_len) } +/// Register a new REACHABLE neighbour in DNS and add to the registered map. +/// Handles ULA pruning and delegates to `process_new_neigh` for the actual DNS update. +/// Caller must ensure the (hostname, ip) key is not already in `registered`. +async fn try_register_neigh( + neigh: &Neigh, + hostname: &str, + ip_str: &str, + registered: &mut HashMap<(String, String), RegisteredEntry>, + leases: &HashMap, + updater: &db::DnsUpdater, + max_ula_per_host: usize, + private_subnet_v6: bool, +) { + // Enforce per-host ULA limit before adding. + if let NeighbourAddress::Inet6(addr) = &neigh.inet { + if if_ipv6_in_private_subnet(addr) { + prune_ula_for_host(hostname, max_ula_per_host, registered, updater).await; + } + } + if process_new_neigh(neigh, updater, leases, private_subnet_v6).await { + registered.insert( + (hostname.to_owned(), ip_str.to_owned()), + RegisteredEntry { + hostname: hostname.to_owned(), + last_confirmed: Instant::now(), + ifindex: neigh.ifindex, + }, + ); + } +} + +fn inet_to_string(addr: &NeighbourAddress) -> String { + match addr { + NeighbourAddress::Inet(ip) => ip.to_string(), + NeighbourAddress::Inet6(ip) => ip.to_string(), + other => format!("{other:?}"), + } +} + +fn is_link_local_neigh_addr(addr: &NeighbourAddress) -> bool { + matches!(addr, NeighbourAddress::Inet6(ip) if filter::is_link_local_ipv6(ip)) +} + +fn parse_neighbour_message(neigh: NeighbourMessage, private_subnet_v4: bool) -> Option { + let state = neigh.header.state; + + // Filter out static and incomplete entries + if matches!(state, NeighbourState::Permanent | NeighbourState::Noarp) { + return None; + } + + let addr: NeighbourAddress = neigh.attributes.iter().find_map(|attr| match attr { + NeighbourAttribute::Destination(inet) => Some(inet.to_owned()), + _ => None, + })?; + + // Link-local IPv6 addresses are interface-scoped and useless in DNS + if is_link_local_neigh_addr(&addr) { + return None; + } + + // IPv4 private-subnet filter stays here (no keepalive concept for IPv4 GUA) + if let NeighbourAddress::Inet(ipv4) = &addr { + if private_subnet_v4 && !if_ipv4_in_private_subnet(ipv4) { + return None; + } + } + + let kind = neigh.header.kind; + let ifindex = neigh.header.ifindex; + + let mac_bytes = neigh.attributes.iter().find_map(|attr| match attr { + NeighbourAttribute::LinkLayerAddress(mac) => Some(mac.to_owned()), + _ => None, + }); + + // FAILED events may arrive without a hardware address (e.g. when ARP/NDP never + // succeeded, or the kernel cleared the lladdr on failure). Allow them through + // with an empty MAC so the FAILED handler can fall back to IP-based lookup. + let mac_str = match mac_bytes { + Some(m) => format_mac(&m), + None if matches!(state, NeighbourState::Failed) => String::new(), + None => return None, + }; + + // Filter out empty or all-zero MACs for non-FAILED states + // (router own addresses, incomplete entries). + if !matches!(state, NeighbourState::Failed) && (mac_str.is_empty() || mac_str == "00:00:00:00:00:00") { + return None; + } + + Some(Neigh { + ifindex, + state, + kind, + inet: addr, + mac: mac_str, + }) +} + +async fn dump_neighbours(handle: Handle, private_subnet_v4: bool) -> Result, Error> { + let mut neighbours = handle.neighbours().get().execute(); + let mut vec: Vec = Vec::new(); + while let Some(route) = neighbours.try_next().await? { + if let Some(neigh) = parse_neighbour_message(route, private_subnet_v4) { + if !should_skip_neigh(&neigh) { + vec.push(neigh); + } + } + } + Ok(vec) +} + #[tokio::main(flavor = "current_thread")] async fn main() -> Result<(), ()> { let args = Cli::parse(); @@ -128,8 +254,6 @@ async fn main() -> Result<(), ()> { .parse() .expect("invalid log level (use: error, warn, info, debug, trace)"), ) - // Suppress spurious warnings from netlink_packet_route when the kernel - // provides more NLA data than the crate version expects (newer kernel). .filter_module("netlink_packet_route", log::LevelFilter::Error) .format_timestamp_secs() .init(); @@ -140,8 +264,8 @@ async fn main() -> Result<(), ()> { let keepalive_gua_interval = args.keepalive_gua_interval; let keepalive_gua_per_host = args.keepalive_gua_per_host; let max_ula_per_host = args.max_ula_per_host; - let zone = Name::from_ascii(&args.zone).expect("invalid zone name"); + let zone = Name::from_ascii(&args.zone).expect("invalid zone name"); let key_data = std::fs::read(&args.key_file) .unwrap_or_else(|e| panic!("failed to read TSIG key file {:?}: {e}", args.key_file)); let key_name = Name::from_ascii(&args.key_name).expect("invalid TSIG key name"); @@ -152,20 +276,24 @@ async fn main() -> Result<(), ()> { .iter() .map(|s| parse_ipv4_cidr(s)) .collect(); + let updater = db::DnsUpdater::new(args.dns_server, zone, signer) .with_ptr_zones(&ipv4_ptr_subnets, args.ptr_ula); + // Create reusable ICMP probe sockets once at startup. + let prober = Prober::new().expect("failed to create ICMP probe sockets"); + // Wait for the DNS server to become available before sending any updates. wait_for_dns_server(args.dns_server).await; let (mut connection, handle, mut messages) = new_connection().unwrap(); - // Subscribe to neighbour events on the same connection used for queries. - // This avoids a second netlink socket and spawned task. + connection .socket_mut() .socket_mut() .bind(&SocketAddr::new(0, nl_mgrp(RTNLGRP_NEIGH))) .expect("Failed to bind netlink multicast group"); + tokio::spawn(connection); // Register router's own addresses in DNS @@ -189,7 +317,6 @@ async fn main() -> Result<(), ()> { } // Load DHCP leases (mac -> hostname) from ubus. - // Use spawn_blocking: op::get_lease() makes a synchronous ubus call. let mut leases: HashMap = tokio::task::spawn_blocking(|| { op::get_lease().unwrap_or_default() }) @@ -197,17 +324,9 @@ async fn main() -> Result<(), ()> { .unwrap_or_default(); info!("loaded {} DHCP leases", leases.len()); - // State cache: tracks (mac, ip_string) -> registered entry (hostname, last confirmed time, ifindex) let mut registered: HashMap<(String, String), RegisteredEntry> = HashMap::new(); - - // GUA keepalive: tracks GUA addresses per MAC for periodic probing (not published to DNS). - // Key = MAC address, value = list of GUA entries for that host. let mut gua_keepalive: HashMap> = HashMap::new(); - // Get active LAN prefixes to filter out neighbours from expired/old prefixes. - // If prefix detection fails we log a warning but continue without filtering. - // When keepalive_gua is enabled, also include GUA prefixes so we can filter - // keepalive targets against active prefixes (pass private_subnet_v6=false). let prefix_filter_v6 = if keepalive_gua { false } else { private_subnet_v6 }; let active_prefixes = get_active_lan_prefixes(handle.clone(), &args.router_iface, prefix_filter_v6).await; if active_prefixes.is_empty() { @@ -223,13 +342,7 @@ async fn main() -> Result<(), ()> { ); } - // Dump existing neighbours: - // - Skip entries whose IP is not within any active LAN prefix (old-prefix residuals). - // - Route GUA addresses to keepalive map (if enabled) instead of DNS. - // - Register REACHABLE entries immediately. - // - Send a probe to STALE/DELAY/PROBE entries; the event loop will register them - // once the kernel confirms they are REACHABLE. - // - Ignore FAILED and other states. + // Dump existing neighbours debug!("dumping neighbours"); if let Ok(neighbours) = dump_neighbours(handle.clone(), private_subnet_v4).await { for neigh in &neighbours { @@ -237,10 +350,10 @@ async fn main() -> Result<(), ()> { if should_skip_neigh(neigh) { continue; } - // Drop IPv6 neighbours that are not within any active LAN prefix. + if let NeighbourAddress::Inet6(addr) = &neigh.inet { if !active_prefixes.is_empty() && !active_prefixes.iter().any(|p| ipv6_in_prefix(*addr, p)) { - debug!("init dump: skipping {} — not in any active LAN prefix", addr); + debug!("init dump: skipping {} -- not in any active LAN prefix", addr); continue; } } @@ -265,15 +378,12 @@ async fn main() -> Result<(), ()> { } } } else if matches!(neigh.state, NeighbourState::Stale | NeighbourState::Delay | NeighbourState::Probe) { - // Probe stale GUA so the kernel NUD state machine can confirm - // reachability; the event loop will add it to gua_keepalive on REACHABLE. - match send_icmpv6_echo(*addr, neigh.ifindex) { + match prober.send_icmpv6_echo(*addr, neigh.ifindex) { Ok(()) => debug!("init dump: probing stale GUA {}", addr), Err(e) => debug!("init GUA probe failed for {}: {}", addr, e), } } } - // GUA addresses are never published to DNS (unless --publish-gua) if private_subnet_v6 { continue; } @@ -283,95 +393,53 @@ async fn main() -> Result<(), ()> { let ip_str = inet_to_string(&neigh.inet); match neigh.state { NeighbourState::Reachable => { - // Confirmed online — register in DNS immediately. if let Some(hostname) = leases.get(&neigh.mac) { let key = (hostname.clone(), ip_str.clone()); if !registered.contains_key(&key) { - // Enforce per-host ULA limit before adding a new one. - if let NeighbourAddress::Inet6(addr) = &neigh.inet { - if if_ipv6_in_private_subnet(addr) { - prune_ula_for_host(hostname, max_ula_per_host, &mut registered, &updater).await; - } - } - let result = match &neigh.inet { - NeighbourAddress::Inet6(addr) => updater.upsert_aaaa(hostname, *addr, DEFAULT_TTL).await, - NeighbourAddress::Inet(addr) => updater.upsert_a(hostname, *addr, DEFAULT_TTL).await, - _ => Ok(()), - }; - match result { - Ok(()) => { - info!("DNS update: added {} -> {:?}", hostname, neigh.inet); - let ip = match &neigh.inet { - NeighbourAddress::Inet6(addr) => Some(IpAddr::V6(*addr)), - NeighbourAddress::Inet(addr) => Some(IpAddr::V4(*addr)), - _ => None, - }; - if let Some(ip) = ip { - if let Err(e) = updater.upsert_ptr(ip, hostname, DEFAULT_TTL).await { - warn!("PTR update failed for {}: {}", hostname, e); - } - } - registered.insert(key, RegisteredEntry { - hostname: hostname.clone(), - last_confirmed: Instant::now(), - ifindex: neigh.ifindex, - }); - } - Err(e) => error!("DNS update failed for {}: {}", hostname, e), - } + try_register_neigh(neigh, hostname, &ip_str, &mut registered, &leases, &updater, max_ula_per_host, private_subnet_v6).await; } } else { debug!("no lease for mac {}, skipping DNS update", neigh.mac); } } NeighbourState::Stale | NeighbourState::Delay | NeighbourState::Probe => { - // Uncertain — probe to trigger NUD verification. If the device - // is online, the kernel will emit a REACHABLE NewNeighbour event - // which the event loop will pick up and register in DNS. match &neigh.inet { NeighbourAddress::Inet6(addr) => { - match send_icmpv6_echo(*addr, neigh.ifindex) { + match prober.send_icmpv6_echo(*addr, neigh.ifindex) { Ok(()) => debug!("init dump: probing stale neighbour {}", addr), Err(e) => debug!("init probe failed for {}: {}", addr, e), } } NeighbourAddress::Inet(addr) => { - if let Err(e) = send_icmpv4_echo(*addr, neigh.ifindex) { + if let Err(e) = prober.send_icmpv4_echo(*addr, neigh.ifindex) { debug!("init probe failed for {}: {}", addr, e); } } _ => {} } } - _ => { - // FAILED and others — skip. - } + _ => {} } } } - // (netlink event socket already set up above — reuse the same connection) - - // Start periodic probing task let probe_interval = args.probe_interval; let mut probe_timer = if probe_interval > 0 { time::interval(Duration::from_secs(probe_interval)) } else { - // Create a very long interval that effectively disables probing time::interval(Duration::from_secs(u64::MAX / 2)) }; - probe_timer.tick().await; // consume the immediate first tick + probe_timer.tick().await; - // GUA keepalive timer (separate cadence from DNS probe timer) let mut gua_keepalive_timer = if keepalive_gua && keepalive_gua_interval > 0 { time::interval(Duration::from_secs(keepalive_gua_interval)) } else { time::interval(Duration::from_secs(u64::MAX / 2)) }; - gua_keepalive_timer.tick().await; // consume the immediate first tick + gua_keepalive_timer.tick().await; let mut lease_refresh_timer = time::interval(Duration::from_secs(60)); - lease_refresh_timer.tick().await; // consume the immediate first tick + lease_refresh_timer.tick().await; loop { tokio::select! { @@ -379,7 +447,6 @@ async fn main() -> Result<(), ()> { let Some((message, _)) = msg_opt else { break; }; - let payload = message.payload; if let NetlinkPayload::InnerMessage(msg) = payload { match msg { @@ -390,15 +457,14 @@ async fn main() -> Result<(), ()> { if should_skip_neigh(&neigh) { continue; } - // Drop IPv6 events for addresses not in any active LAN prefix. + if let NeighbourAddress::Inet6(addr) = &neigh.inet { if !ipv6_passes_active_prefix(*addr, &active_prefixes) { - debug!("event: skipping {} — not in any active LAN prefix", addr); + debug!("event: skipping {} -- not in any active LAN prefix", addr); let key = (neigh.mac.clone(), inet_to_string(&neigh.inet)); if let Some(entry) = registered.remove(&key) { do_delete_dns(&entry.hostname, &neigh.inet, &updater).await; } - // Also remove from GUA keepalive if present if let Some(entries) = gua_keepalive.get_mut(&neigh.mac) { entries.retain(|e| e.addr != *addr); } @@ -409,7 +475,6 @@ async fn main() -> Result<(), ()> { // Route GUA addresses to keepalive map instead of DNS. if let NeighbourAddress::Inet6(addr) = &neigh.inet { if is_gua_ipv6(addr) && private_subnet_v6 { - // GUA not published to DNS — handle keepalive tracking only if keepalive_gua { if is_failed_state(neigh.state) { if let Some(entries) = gua_keepalive.get_mut(&neigh.mac) { @@ -435,7 +500,6 @@ async fn main() -> Result<(), ()> { } } } else if matches!(neigh.state, NeighbourState::Stale | NeighbourState::Delay | NeighbourState::Probe) { - // Update ifindex only if let Some(entries) = gua_keepalive.get_mut(&neigh.mac) { if let Some(e) = entries.iter_mut().find(|e| e.addr == *addr) { e.ifindex = neigh.ifindex; @@ -448,20 +512,17 @@ async fn main() -> Result<(), ()> { } let ip_str = inet_to_string(&neigh.inet); + if is_failed_state(neigh.state) { - // Neighbour confirmed unreachable — remove DNS record. - // Resolve key by hostname (handles MAC changes: new MAC in leases - // can now evict entries registered under an old MAC). - // Fall back to scanning registered by IP if MAC is no longer in leases. debug!("Neighbour failed: {:?}", neigh); let key_opt: Option<(String, String)> = leases .get(&neigh.mac) .map(|h| (h.clone(), ip_str.clone())) .or_else(|| registered.keys().find(|(_, ip)| ip == &ip_str).cloned()); + if let Some(key) = key_opt { if let Some(entry) = registered.remove(&key) { if !do_delete_dns(&entry.hostname, &neigh.inet, &updater).await { - // DNS delete failed, put back so we retry registered.insert(key, entry); } } else { @@ -474,34 +535,16 @@ async fn main() -> Result<(), ()> { if let Some(hostname) = leases.get(&neigh.mac) { let key = (hostname.clone(), ip_str.clone()); if let Some(entry) = registered.get_mut(&key) { - // Already registered, just update timestamp and ifindex entry.last_confirmed = Instant::now(); entry.ifindex = neigh.ifindex; } else { - // New reachable neighbour — register in DNS debug!("New neighbour: {:?}", neigh); - // Enforce per-host ULA limit before adding. - if let NeighbourAddress::Inet6(addr) = &neigh.inet { - if if_ipv6_in_private_subnet(addr) { - prune_ula_for_host(hostname, max_ula_per_host, &mut registered, &updater).await; - } - } - if process_new_neigh(&neigh, &updater, &leases, private_subnet_v6).await { - registered.insert(key, RegisteredEntry { - hostname: hostname.clone(), - last_confirmed: Instant::now(), - ifindex: neigh.ifindex, - }); - } + try_register_neigh(&neigh, hostname, &ip_str, &mut registered, &leases, &updater, max_ula_per_host, private_subnet_v6).await; } } else { debug!("no lease for mac {}, skipping DNS update", neigh.mac); } } else if matches!(neigh.state, NeighbourState::Stale | NeighbourState::Delay | NeighbourState::Probe) { - // Uncertain state: update ifindex only so the next probe uses - // the right interface, but do NOT refresh last_confirmed — - // STALE/DELAY/PROBE is not confirmed reachable and refreshing - // the timestamp would suppress the periodic probe. if let Some(hostname) = leases.get(&neigh.mac) { let key = (hostname.clone(), ip_str.clone()); if let Some(entry) = registered.get_mut(&key) { @@ -517,7 +560,7 @@ async fn main() -> Result<(), ()> { if should_skip_neigh(&neigh) { continue; } - // Remove from GUA keepalive if applicable + if let NeighbourAddress::Inet6(addr) = &neigh.inet { if is_gua_ipv6(addr) && keepalive_gua { if let Some(entries) = gua_keepalive.get_mut(&neigh.mac) { @@ -529,12 +572,13 @@ async fn main() -> Result<(), ()> { } } } + let ip_str = inet_to_string(&neigh.inet); - // Resolve key by hostname; fall back to scanning by IP if MAC gone from leases. let key_opt: Option<(String, String)> = leases .get(&neigh.mac) .map(|h| (h.clone(), ip_str.clone())) .or_else(|| registered.keys().find(|(_, ip)| ip == &ip_str).cloned()); + debug!("Del neighbour: {:?}", neigh); if let Some(key) = key_opt { registered.remove(&key); @@ -549,7 +593,7 @@ async fn main() -> Result<(), ()> { if probe_interval == 0 { continue; } - probe_registered_neighbours(®istered).await; + probe_registered_neighbours(&prober, ®istered).await; reconcile_dns( &updater, &mut registered, @@ -557,14 +601,10 @@ async fn main() -> Result<(), ()> { &active_prefixes, private_subnet_v4, private_subnet_v6, + &prober, ) .await; - // Recover kernel orphans: neighbours that are REACHABLE in the kernel - // but absent from `registered` and DNS. This happens when a netlink - // NewNeighbour event is lost (receive-buffer overflow) or when a device - // transitions to REACHABLE during the startup race window. - // reconcile_dns's AXFR pass cannot catch these because the record is - // also absent from DNS, so no probe is ever triggered for them. + if let Ok(neighbours) = dump_neighbours(handle.clone(), private_subnet_v4).await { let all_dump_ips: std::collections::HashSet = neighbours .iter() @@ -575,11 +615,7 @@ async fn main() -> Result<(), ()> { if should_skip_neigh(neigh) { continue; } - if is_failed_state(neigh.state) { - // Kernel confirms FAILED — remove from registered + DNS if present. - // Mirrors the real-time NewNeighbour(FAILED) handler but catches - // cases where that event was lost. let ip_str = inet_to_string(&neigh.inet); let key_opt: Option<(String, String)> = leases .get(&neigh.mac) @@ -600,7 +636,6 @@ async fn main() -> Result<(), ()> { } continue; } - if neigh.state != NeighbourState::Reachable { continue; } @@ -618,43 +653,16 @@ async fn main() -> Result<(), ()> { let Some(hostname) = leases.get(&neigh.mac) else { continue; }; - let key = (hostname.clone(), ip_str); + let key = (hostname.clone(), ip_str.clone()); if let Some(entry) = registered.get_mut(&key) { - // Already tracked — refresh to suppress spurious probes. entry.last_confirmed = Instant::now(); entry.ifindex = neigh.ifindex; } else { debug!("reconcile neigh: kernel orphan {} -> {:?}", hostname, neigh.inet); - if let NeighbourAddress::Inet6(addr) = &neigh.inet { - if if_ipv6_in_private_subnet(addr) { - prune_ula_for_host( - hostname, - max_ula_per_host, - &mut registered, - &updater, - ) - .await; - } - } - if process_new_neigh(neigh, &updater, &leases, private_subnet_v6).await { - registered.insert( - key, - RegisteredEntry { - hostname: hostname.clone(), - last_confirmed: Instant::now(), - ifindex: neigh.ifindex, - }, - ); - } + try_register_neigh(neigh, hostname, &ip_str, &mut registered, &leases, &updater, max_ula_per_host, private_subnet_v6).await; } } - // Sweep registered entries whose IP the kernel has evicted entirely - // (not present in the dump at all, not even as FAILED) AND that haven't - // been confirmed recently. These are devices whose FAILED event was - // lost and which the kernel has since garbage-collected from its table. - // Only act if the entry is old enough (> 2× probe interval) to avoid - // racing with normal STALE→REACHABLE transitions. let stale_cutoff = Duration::from_secs(probe_interval.saturating_mul(2)); let now = Instant::now(); let to_remove: Vec<(String, String)> = registered @@ -688,7 +696,7 @@ async fn main() -> Result<(), ()> { if !keepalive_gua || keepalive_gua_interval == 0 { continue; } - probe_gua_keepalive(&gua_keepalive, keepalive_gua_per_host); + probe_gua_keepalive(&prober, &gua_keepalive, keepalive_gua_per_host); prune_gua_keepalive(&mut gua_keepalive, keepalive_gua_interval, keepalive_gua_per_host); } _ = lease_refresh_timer.tick() => { @@ -705,87 +713,3 @@ async fn main() -> Result<(), ()> { } Ok(()) } - - -fn format_mac(mac: Vec) -> String { - let mut mac_str = String::new(); - for byte in mac { - mac_str.push_str(&format!("{:02x}:", byte)); - } - mac_str.pop(); - mac_str -} - -fn inet_to_string(addr: &NeighbourAddress) -> String { - match addr { - NeighbourAddress::Inet(ip) => ip.to_string(), - NeighbourAddress::Inet6(ip) => ip.to_string(), - other => format!("{other:?}"), - } -} - -fn is_link_local_ipv6(addr: &NeighbourAddress) -> bool { - matches!(addr, NeighbourAddress::Inet6(ip) if (ip.segments()[0] & 0xffc0) == 0xfe80) -} - -fn parse_neighbour_message(neigh: NeighbourMessage, private_subnet_v4: bool) -> Option { - let state = neigh.header.state; - // Filter out static and incomplete entries - if matches!(state, NeighbourState::Permanent | NeighbourState::Noarp) { - return None; - } - let addr: NeighbourAddress = neigh.attributes.iter().find_map(|attr| match attr { - NeighbourAttribute::Destination(inet) => Some(inet.to_owned()), - _ => None, - })?; - // Link-local IPv6 addresses are interface-scoped and useless in DNS - if is_link_local_ipv6(&addr) { - return None; - } - // IPv4 private-subnet filter stays here (no keepalive concept for IPv4 GUA) - if let NeighbourAddress::Inet(ipv4) = &addr { - if private_subnet_v4 && !if_ipv4_in_private_subnet(ipv4) { - return None; - } - } - let kind = neigh.header.kind; - let ifindex = neigh.header.ifindex; - let mac_bytes = neigh.attributes.iter().find_map(|attr| match attr { - NeighbourAttribute::LinkLayerAddress(mac) => Some(mac.to_owned()), - _ => None, - }); - // FAILED events may arrive without a hardware address (e.g. when ARP/NDP never - // succeeded, or the kernel cleared the lladdr on failure). Allow them through - // with an empty MAC so the FAILED handler can fall back to IP-based lookup. - let mac_str = match mac_bytes { - Some(m) => format_mac(m), - None if matches!(state, NeighbourState::Failed) => String::new(), - None => return None, - }; - // Filter out empty or all-zero MACs for non-FAILED states - // (router own addresses, incomplete entries). - if !matches!(state, NeighbourState::Failed) && (mac_str.is_empty() || mac_str == "00:00:00:00:00:00") { - return None; - } - Some(Neigh { - ifindex, - state, - kind, - inet: addr, - mac: mac_str, - }) -} - -async fn dump_neighbours(handle: Handle, private_subnet_v4: bool) -> Result, Error> { - let mut neighbours = handle.neighbours().get().execute(); - let mut vec: Vec = Vec::new(); - while let Some(route) = neighbours.try_next().await? { - if let Some(neigh) = parse_neighbour_message(route, private_subnet_v4) { - if !should_skip_neigh(&neigh) { - vec.push(neigh); - } - } - } - Ok(vec) -} - diff --git a/ipv6-neigh/src/op.rs b/ipv6-neigh/src/op.rs index ce9c2d20..2782df46 100644 --- a/ipv6-neigh/src/op.rs +++ b/ipv6-neigh/src/op.rs @@ -4,21 +4,21 @@ use std::path::Path; pub fn call_ubus(obj_path: &str, method: &str) -> Result> { let socket = Path::new("/var/run/ubus/ubus.sock"); - let mut connection = ubus::Connection::connect(&socket)?; - let json = connection.call(obj_path, method, "")?; let parsed: Value = serde_json::from_str(&json)?; Ok(parsed) } -/// Convert a hex MAC string like "44237cdcb75b" to colon-separated "44:23:7c:dc:b7:5b" -fn format_mac_from_hex(hex: &str) -> String { - hex.as_bytes() +/// Decode a hex string (e.g. "44237cdcb75b") to raw bytes and format via +/// the shared `types::format_mac`, producing "44:23:7c:dc:b7:5b". +fn hex_to_mac(hex: &str) -> String { + let bytes: Vec = hex + .as_bytes() .chunks(2) - .filter_map(|chunk| std::str::from_utf8(chunk).ok()) - .collect::>() - .join(":") + .filter_map(|c| u8::from_str_radix(std::str::from_utf8(c).ok()?, 16).ok()) + .collect(); + crate::types::format_mac(&bytes) } /// Sanitize a DHCP hostname into a valid DNS label. @@ -53,7 +53,9 @@ fn mac_from_duid(duid: &str) -> Option { if !duid.chars().all(|c| c.is_ascii_hexdigit()) { return None; } + let duid_type = u16::from_str_radix(duid.get(0..4)?, 16).ok()?; + // DUID-LLT (1): type(4) + hw_type(4) + time(8) = 16 hex chars before MAC // DUID-LL (3): type(4) + hw_type(4) = 8 hex chars before MAC let mac_offset = match duid_type { @@ -61,14 +63,9 @@ fn mac_from_duid(duid: &str) -> Option { 3 => 8, _ => return None, }; + let mac_hex = duid.get(mac_offset..mac_offset + 12)?; - let mac = mac_hex - .as_bytes() - .chunks(2) - .map(|chunk| std::str::from_utf8(chunk).unwrap()) - .collect::>() - .join(":"); - Some(mac) + Some(hex_to_mac(mac_hex)) } // get mac to hostname mapping @@ -77,14 +74,16 @@ pub fn get_lease() -> Result, Box let leases = call_ubus("dhcp", "ipv4leases")?; let devices = leases["device"].as_object() .ok_or("missing 'device' in ipv4leases response")?; + let mut result = HashMap::new(); + for (_device, leases) in devices { let leases = leases["leases"].as_array() .ok_or("missing 'leases' array in device")?; for lease in leases { let Some(raw_mac) = lease["mac"].as_str() else { continue }; let Some(hostname) = lease["hostname"].as_str() else { continue }; - let mac = format_mac_from_hex(raw_mac); + let mac = hex_to_mac(raw_mac); let hostname = sanitize_hostname(hostname); if hostname.is_empty() { continue; diff --git a/ipv6-neigh/src/probe.rs b/ipv6-neigh/src/probe.rs index 88af518a..7c833f51 100644 --- a/ipv6-neigh/src/probe.rs +++ b/ipv6-neigh/src/probe.rs @@ -9,14 +9,6 @@ use tokio::time::Duration; use crate::types::{GuaKeepaliveEntry, RegisteredEntry}; -fn set_ipv6_unicast_if(socket: &Socket, ifindex: u32) -> std::io::Result<()> { - socket.bind_device_by_index_v6(NonZeroU32::new(ifindex)) -} - -fn set_ip_unicast_if(socket: &Socket, ifindex: u32) -> std::io::Result<()> { - socket.bind_device_by_index_v4(NonZeroU32::new(ifindex)) -} - fn compute_icmpv4_checksum(packet: &mut [u8]) { packet[2] = 0; packet[3] = 0; @@ -32,36 +24,54 @@ fn compute_icmpv4_checksum(packet: &mut [u8]) { packet[2..4].copy_from_slice(&checksum.to_be_bytes()); } -pub(crate) fn send_icmpv6_echo(addr: Ipv6Addr, ifindex: u32) -> std::io::Result<()> { - let socket = Socket::new(Domain::IPV6, Type::RAW, Some(Protocol::ICMPV6))?; - socket.set_nonblocking(true)?; - // Bind outgoing packet to the specific interface via IPV6_UNICAST_IF so the - // kernel NUD state machine updates the correct neighbour entry. - set_ipv6_unicast_if(&socket, ifindex)?; - // ICMPv6 Echo Request: type=128, code=0, checksum=0 (kernel computes for RAW ICMPV6), id=0, seq=1 - let packet: [u8; 8] = [128, 0, 0, 0, 0, 0, 0, 1]; - let dest = SockAddr::from(std::net::SocketAddrV6::new(addr, 0, 0, 0)); - socket.send_to(&packet, &dest)?; - Ok(()) +/// Reusable ICMP probe sockets. Created once at startup and shared across all +/// probe call-sites, avoiding the overhead of creating and destroying a raw +/// socket for every single probe packet. +pub(crate) struct Prober { + v6: Socket, + v4: Socket, } -pub(crate) fn send_icmpv4_echo(addr: Ipv4Addr, ifindex: u32) -> std::io::Result<()> { - let socket = Socket::new(Domain::IPV4, Type::RAW, Some(Protocol::ICMPV4))?; - socket.set_nonblocking(true)?; - // Bind outgoing packet to the specific interface via IP_UNICAST_IF. - set_ip_unicast_if(&socket, ifindex)?; - // ICMPv4 Echo Request: type=8, code=0, checksum (computed), id=0, seq=1 - let mut packet: [u8; 8] = [8, 0, 0, 0, 0, 0, 0, 1]; - compute_icmpv4_checksum(&mut packet); - let dest = SockAddr::from(std::net::SocketAddrV4::new(addr, 0)); - socket.send_to(&packet, &dest)?; - Ok(()) +impl Prober { + pub fn new() -> std::io::Result { + let v6 = Socket::new(Domain::IPV6, Type::RAW, Some(Protocol::ICMPV6))?; + v6.set_nonblocking(true)?; + + let v4 = Socket::new(Domain::IPV4, Type::RAW, Some(Protocol::ICMPV4))?; + v4.set_nonblocking(true)?; + + Ok(Self { v6, v4 }) + } + + pub fn send_icmpv6_echo(&self, addr: Ipv6Addr, ifindex: u32) -> std::io::Result<()> { + // Re-bind outgoing interface before each send (lightweight setsockopt). + self.v6.bind_device_by_index_v6(NonZeroU32::new(ifindex))?; + + // ICMPv6 Echo Request: type=128, code=0, checksum=0 (kernel computes), id=0, seq=1 + let packet: [u8; 8] = [128, 0, 0, 0, 0, 0, 0, 1]; + let dest = SockAddr::from(std::net::SocketAddrV6::new(addr, 0, 0, 0)); + self.v6.send_to(&packet, &dest)?; + Ok(()) + } + + pub fn send_icmpv4_echo(&self, addr: Ipv4Addr, ifindex: u32) -> std::io::Result<()> { + // Re-bind outgoing interface before each send (lightweight setsockopt). + self.v4.bind_device_by_index_v4(NonZeroU32::new(ifindex))?; + + // ICMPv4 Echo Request: type=8, code=0, checksum (computed), id=0, seq=1 + let mut packet: [u8; 8] = [8, 0, 0, 0, 0, 0, 0, 1]; + compute_icmpv4_checksum(&mut packet); + let dest = SockAddr::from(std::net::SocketAddrV4::new(addr, 0)); + self.v4.send_to(&packet, &dest)?; + Ok(()) + } } /// Send ICMPv6/ICMPv4 Echo Requests to all registered neighbours that haven't been /// confirmed recently. This forces the kernel NUD state machine to verify reachability, /// generating NewNeighbour events with the resulting state (Reachable or Failed). pub(crate) async fn probe_registered_neighbours( + prober: &Prober, registered: &HashMap<(String, String), RegisteredEntry>, ) { let now = Instant::now(); @@ -71,11 +81,11 @@ pub(crate) async fn probe_registered_neighbours( continue; } if let Ok(addr) = ip_str.parse::() { - if let Err(e) = send_icmpv6_echo(addr, entry.ifindex) { + if let Err(e) = prober.send_icmpv6_echo(addr, entry.ifindex) { debug!("probe failed for {}: {}", ip_str, e); } } else if let Ok(addr) = ip_str.parse::() { - if let Err(e) = send_icmpv4_echo(addr, entry.ifindex) { + if let Err(e) = prober.send_icmpv4_echo(addr, entry.ifindex) { debug!("probe failed for {}: {}", ip_str, e); } } @@ -86,6 +96,7 @@ pub(crate) async fn probe_registered_neighbours( /// Only the top `per_host` addresses (by most-recently-seen) are probed per MAC. /// This does NOT publish any records to DNS. pub(crate) fn probe_gua_keepalive( + prober: &Prober, gua_keepalive: &HashMap>, per_host: usize, ) { @@ -101,7 +112,7 @@ pub(crate) fn probe_gua_keepalive( if now.duration_since(e.last_confirmed) < Duration::from_secs(30) { continue; } - match send_icmpv6_echo(e.addr, e.ifindex) { + match prober.send_icmpv6_echo(e.addr, e.ifindex) { Ok(()) => debug!("GUA keepalive probe: {} ({}) -> {}", e.hostname, mac, e.addr), Err(err) => debug!("GUA keepalive probe failed for {}: {}", e.addr, err), } @@ -109,7 +120,7 @@ pub(crate) fn probe_gua_keepalive( } } -/// Remove GUA keepalive entries that haven't been confirmed REACHABLE within 3× the +/// Remove GUA keepalive entries that haven't been confirmed REACHABLE within 3x the /// keepalive interval, and drop excess entries beyond `per_host` (oldest first). pub(crate) fn prune_gua_keepalive( gua_keepalive: &mut HashMap>, diff --git a/ipv6-neigh/src/reconcile.rs b/ipv6-neigh/src/reconcile.rs index 851fbcf8..834d4716 100644 --- a/ipv6-neigh/src/reconcile.rs +++ b/ipv6-neigh/src/reconcile.rs @@ -7,7 +7,7 @@ use netlink_packet_route::neighbour::NeighbourAddress; use crate::db::DnsUpdater; use crate::filter::{if_ipv4_in_private_subnet, if_ipv6_in_private_subnet, ipv6_in_prefix, is_gua_ipv6}; -use crate::probe::{send_icmpv4_echo, send_icmpv6_echo}; +use crate::probe::Prober; use crate::types::{LanPrefix, Neigh, RegisteredEntry, DEFAULT_TTL}; pub(crate) async fn process_new_neigh( @@ -20,6 +20,7 @@ pub(crate) async fn process_new_neigh( debug!("no lease for mac {}, skipping DNS update", neigh.mac); return false; }; + // Guard: never publish GUA to DNS when private_subnet_v6 is set. if let NeighbourAddress::Inet6(addr) = &neigh.inet { if private_subnet_v6 && is_gua_ipv6(addr) { @@ -27,11 +28,13 @@ pub(crate) async fn process_new_neigh( return false; } } + let result = match &neigh.inet { NeighbourAddress::Inet6(addr) => updater.upsert_aaaa(hostname, *addr, DEFAULT_TTL).await, NeighbourAddress::Inet(addr) => updater.upsert_a(hostname, *addr, DEFAULT_TTL).await, _ => return false, }; + match result { Ok(()) => { info!("DNS update: added {} -> {:?}", hostname, neigh.inet); @@ -63,6 +66,7 @@ pub(crate) async fn do_delete_dns( NeighbourAddress::Inet(addr) => updater.delete_a(hostname, *addr).await, _ => return true, }; + match result { Ok(()) => { info!("DNS update: removed {} -> {:?}", hostname, inet); @@ -101,42 +105,40 @@ pub(crate) async fn prune_ula_for_host( .map(|(k, e)| (k.clone(), e.last_confirmed)) .collect(); - if ula_keys.len() < max { - return ula_keys.len(); + let initial_count = ula_keys.len(); + if initial_count < max { + return initial_count; } // Sort oldest first (by last_confirmed asc). ula_keys.sort_by_key(|(_, ts)| *ts); // Remove excess (keep the newest `max - 1` so there's room for the new one). - let to_remove = ula_keys.len() - (max.saturating_sub(1)); + let to_remove = initial_count - (max.saturating_sub(1)); + let mut actually_removed = 0; for (key, _) in ula_keys.into_iter().take(to_remove) { if let Some(entry) = registered.remove(&key) { let addr: Ipv6Addr = key.1.parse().unwrap(); let inet = NeighbourAddress::Inet6(addr); do_delete_dns(&entry.hostname, &inet, updater).await; info!("ULA pruning: removed oldest {} -> {} for host {}", entry.hostname, key.1, host); + actually_removed += 1; } } - // Return count after pruning. - registered - .iter() - .filter(|((h, ip_str), _)| { - h == host && ip_str.parse::().map_or(false, |a| if_ipv6_in_private_subnet(&a)) - }) - .count() + // Return count after pruning (computed, no second scan needed). + initial_count - actually_removed } /// Reconcile the in-memory `registered` map against the live DNS zone obtained via AXFR. /// /// Two corrections are made on each call: -/// 1. **DNS orphans** – records present in DNS but absent from `registered`. +/// 1. **DNS orphans** -- records present in DNS but absent from `registered`. /// These are either stale leftovers from a previous run or records from a prefix that /// is no longer active. Records that fail prefix/subnet filtering are deleted from DNS /// immediately; records that pass filtering are probed with ICMP so the kernel NUD /// state machine can confirm reachability and re-populate `registered` via the event loop. -/// 2. **Registered orphans** – entries in `registered` that are missing from DNS (e.g. +/// 2. **Registered orphans** -- entries in `registered` that are missing from DNS (e.g. /// because hickory-dns restarted and lost its in-memory state). These are re-pushed /// via DNS UPDATE so the zone stays consistent. pub(crate) async fn reconcile_dns( @@ -146,6 +148,7 @@ pub(crate) async fn reconcile_dns( active_prefixes: &[LanPrefix], private_subnet_v4: bool, private_subnet_v6: bool, + prober: &Prober, ) { use std::collections::{HashMap as Map, HashSet}; @@ -182,7 +185,7 @@ pub(crate) async fn reconcile_dns( if passes { dns_ips.insert(ip.to_string(), hostname.clone()); } else { - // Stale record (wrong prefix / subnet) — remove from DNS. + // Stale record (wrong prefix / subnet) -- remove from DNS. let result = match ip { IpAddr::V6(addr) => updater.delete_aaaa(hostname, *addr).await, IpAddr::V4(addr) => updater.delete_a(hostname, *addr).await, @@ -204,15 +207,12 @@ pub(crate) async fn reconcile_dns( registered.keys().map(|(_, ip)| ip.as_str()).collect(); // --- DNS orphans (in DNS but not in registered) --- - // Delete the orphan immediately — DNS TTL only controls resolver caches, not - // authoritative record lifetime, so records do NOT auto-expire. - // After deletion we probe the address: if the device is still alive the kernel - // will emit a REACHABLE NewNeighbour event which re-registers it in DNS. for (ip_str, hostname) in &dns_ips { if registered_ips.contains(ip_str.as_str()) { continue; } info!("reconcile: DNS orphan {} -> {}, deleting and probing", hostname, ip_str); + let del_result = match ip_str.parse::() { Ok(IpAddr::V6(addr)) => updater.delete_aaaa(hostname, addr).await, Ok(IpAddr::V4(addr)) => updater.delete_a(hostname, addr).await, @@ -229,15 +229,16 @@ pub(crate) async fn reconcile_dns( } Err(e) => warn!("reconcile: failed to delete orphan {} {}: {}", hostname, ip_str, e), } + // Probe so alive devices trigger a REACHABLE event and re-register. match ip_str.parse::() { Ok(IpAddr::V6(addr)) => { - if let Err(e) = send_icmpv6_echo(addr, 0) { + if let Err(e) = prober.send_icmpv6_echo(addr, 0) { debug!("reconcile: probe failed for {}: {}", addr, e); } } Ok(IpAddr::V4(addr)) => { - if let Err(e) = send_icmpv4_echo(addr, 0) { + if let Err(e) = prober.send_icmpv4_echo(addr, 0) { debug!("reconcile: probe failed for {}: {}", addr, e); } } @@ -246,14 +247,13 @@ pub(crate) async fn reconcile_dns( } // --- Registered orphans (in registered but not in DNS) --- - // hickory-dns may have restarted and lost its journal; re-push the record. - // Use the hostname stored in the entry — independent of the current lease table. for ((_, ip_str), entry) in registered.iter_mut() { if dns_ips.contains_key(ip_str.as_str()) { continue; } let hostname = &entry.hostname; debug!("reconcile: registered orphan {} -> {}, re-pushing", hostname, ip_str); + let result = match ip_str.parse::() { Ok(IpAddr::V6(addr)) => updater.upsert_aaaa(hostname, addr, DEFAULT_TTL).await, Ok(IpAddr::V4(addr)) => updater.upsert_a(hostname, addr, DEFAULT_TTL).await, diff --git a/ipv6-neigh/src/types.rs b/ipv6-neigh/src/types.rs index 919ff899..1ef0a8b5 100644 --- a/ipv6-neigh/src/types.rs +++ b/ipv6-neigh/src/types.rs @@ -1,6 +1,6 @@ +use std::fmt::Write; use std::net::Ipv6Addr; use std::time::Instant; - use netlink_packet_route::neighbour::{NeighbourAddress, NeighbourState}; use netlink_packet_route::route::RouteType; @@ -14,6 +14,17 @@ pub(crate) const fn nl_mgrp(group: u32) -> u32 { if group == 0 { 0 } else { 1 << (group - 1) } } +/// Format raw MAC bytes as colon-separated hex string, e.g. "44:23:7c:dc:b7:5b". +/// Shared across modules to avoid duplicate formatting logic. +pub(crate) fn format_mac(mac: &[u8]) -> String { + let mut s = String::with_capacity(mac.len() * 3); + for (i, byte) in mac.iter().enumerate() { + if i > 0 { s.push(':'); } + write!(s, "{:02x}", byte).unwrap(); + } + s +} + #[derive(Debug)] pub(crate) struct Neigh { pub(crate) ifindex: u32, @@ -41,7 +52,7 @@ pub(crate) struct GuaKeepaliveEntry { pub(crate) hostname: String, pub(crate) addr: Ipv6Addr, pub(crate) ifindex: u32, - /// When this GUA was first observed — used to select the "newest" address per host. + /// When this GUA was first observed -- used to select the "newest" address per host. pub(crate) first_seen: Instant, /// Last time this address was confirmed REACHABLE by the kernel. pub(crate) last_confirmed: Instant, diff --git a/luci-app-fchomo/htdocs/luci-static/resources/fchomo.js b/luci-app-fchomo/htdocs/luci-static/resources/fchomo.js index 06ecdd41..8e88941b 100644 --- a/luci-app-fchomo/htdocs/luci-static/resources/fchomo.js +++ b/luci-app-fchomo/htdocs/luci-static/resources/fchomo.js @@ -156,6 +156,7 @@ const inbound_type = [ ['shadowsocks', _('Shadowsocks') + ' - ' + _('TCP/UDP')], ['mieru', _('Mieru') + ' - ' + _('TCP/UDP')], ['sudoku', _('Sudoku') + ' - ' + _('TCP')], + ['snell', _('Snell') + ' - ' + _('TCP')], ['vmess', _('VMess') + ' - ' + _('TCP')], ['vless', _('VLESS') + ' - ' + _('TCP')], ['trojan', _('Trojan') + ' - ' + _('TCP')], diff --git a/luci-app-fchomo/htdocs/luci-static/resources/fchomo/listeners.js b/luci-app-fchomo/htdocs/luci-static/resources/fchomo/listeners.js index a2db97bc..2da6c140 100644 --- a/luci-app-fchomo/htdocs/luci-static/resources/fchomo/listeners.js +++ b/luci-app-fchomo/htdocs/luci-static/resources/fchomo/listeners.js @@ -193,6 +193,7 @@ function renderListeners(s, uciconfig, isClient) { o = s.taboption('field_general', form.ListValue, 'hysteria_obfs_type', _('Obfuscate type')); o.value('', _('Disable')); o.value('salamander', _('Salamander')); + o.value('gecko', _('Gecko')); o.depends('type', 'hysteria2'); o.modalonly = true; @@ -204,6 +205,16 @@ function renderListeners(s, uciconfig, isClient) { o.depends({type: 'hysteria2', hysteria_obfs_type: /.+/}); o.modalonly = true; + o = s.taboption('field_general', form.Value, 'hysteria_obfs_min_packet_size', _('Obfuscate minimum packet size')); + o.placeholder = '512' + o.depends('hysteria_obfs_type', 'gecko'); + o.modalonly = true; + + o = s.taboption('field_general', form.Value, 'hysteria_obfs_max_packet_size', _('Obfuscate maximum packet size')); + o.placeholder = '1200' + o.depends('hysteria_obfs_type', 'gecko'); + o.modalonly = true; + o = s.taboption('field_general', form.Value, 'hysteria_masquerade', _('Masquerade'), _('HTTP3 server behavior when authentication fails.
A 404 page will be returned if empty.')); o.placeholder = 'file:///var/www or http://127.0.0.1:8080' @@ -440,6 +451,24 @@ function renderListeners(s, uciconfig, isClient) { o.depends('sudoku_http_mask', '1'); o.modalonly = true; + /* Snell fields */ + o = s.taboption('field_general', hm.GenValue, 'snell_psk', _('Pre-shared key')); + o.password = true; + o.rmempty = false; + o.validate = hm.validateAuthPassword; + o.depends('type', 'snell'); + o.modalonly = true; + + o = s.taboption('field_general', form.ListValue, 'snell_version', _('Version')); + o.value('1', _('v1')); + o.value('2', _('v2')); + o.value('3', _('v3')); + o.value('4', _('v4')); + o.value('5', _('v5')); + o.default = '4'; + o.depends('type', 'snell'); + o.modalonly = true; + /* Tuic fields */ o = s.taboption('field_general', hm.GenValue, 'uuid', _('UUID')); o.rmempty = false; @@ -539,6 +568,14 @@ function renderListeners(s, uciconfig, isClient) { o.value('http', _('HTTP')); o.value('tls', _('TLS')); o.depends('plugin', 'obfs'); + o.depends('type', 'snell'); + o.modalonly = true; + + o = s.taboption('field_general', form.Value, 'plugin_opts_host', _('Plugin: ') + _('Host that supports TLS 1.3')); + o.datatype = 'hostname'; + o.placeholder = 'cloud.tencent.com'; + o.rmempty = false; + o.depends('type', 'snell'); o.modalonly = true; o = s.taboption('field_general', form.Value, 'plugin_opts_handshake_dest', _('Plugin: ') + _('Handshake target that supports TLS 1.3')); @@ -605,8 +642,8 @@ function renderListeners(s, uciconfig, isClient) { o.modalonly = true; o = s.taboption('field_general', form.Flag, 'udp', _('UDP')); - o.default = o.disabled; - o.depends({type: /^(socks|mixed|shadowsocks)$/}); + o.default = o.enabled; + o.depends({type: /^(socks|mixed|shadowsocks|snell)$/}); o.modalonly = true; /* Vless Encryption fields */ @@ -855,6 +892,12 @@ function renderListeners(s, uciconfig, isClient) { // @ 下面支持填写针对server-url的TLS配置(sni, skip-cert-verify, fingerprint, certificate, private-key, alpn) /* TLS fields */ + o = s.taboption('field_general', form.Flag, 'allow_insecure', _('Allow insecure connections'), + _('Only applicable when %s are used as a frontend.').format('nginx/caddy')); + o.default = o.disabled; + o.depends({type: /^(vless|trojan|anytls)$/}); + o.modalonly = true; + o = s.taboption('field_general', form.Flag, 'tls', _('TLS')); o.default = o.disabled; o.validate = function(section_id, value) { @@ -906,7 +949,7 @@ function renderListeners(s, uciconfig, isClient) { return true; } - o.depends({type: /^(http|socks|mixed|vmess|vless|trojan|anytls|tuic|hysteria2|hysteria2-realm|trusttunnel)$/}); + o.depends({allow_insecure: '0', type: /^(http|socks|mixed|vmess|vless|trojan|anytls|tuic|hysteria2|hysteria2-realm|trusttunnel)$/}); o.modalonly = true; o = s.taboption('field_tls', form.DynamicList, 'tls_alpn', _('TLS ALPN'), diff --git a/luci-app-fchomo/htdocs/luci-static/resources/view/fchomo/node.js b/luci-app-fchomo/htdocs/luci-static/resources/view/fchomo/node.js index c30a3feb..cb252daa 100644 --- a/luci-app-fchomo/htdocs/luci-static/resources/view/fchomo/node.js +++ b/luci-app-fchomo/htdocs/luci-static/resources/view/fchomo/node.js @@ -298,6 +298,7 @@ return view.extend({ so = ss.taboption('field_general', form.ListValue, 'hysteria_obfs_type', _('Obfuscate type')); so.value('', _('Disable')); so.value('salamander', _('Salamander')); + so.value('gecko', _('Gecko')); so.depends('type', 'hysteria2'); so.modalonly = true; @@ -309,6 +310,16 @@ return view.extend({ so.depends({type: 'hysteria2', hysteria_obfs_type: /.+/}); so.modalonly = true; + so = ss.taboption('field_general', form.Value, 'hysteria_obfs_min_packet_size', _('Obfuscate minimum packet size')); + so.placeholder = '512' + so.depends('hysteria_obfs_type', 'gecko'); + so.modalonly = true; + + so = ss.taboption('field_general', form.Value, 'hysteria_obfs_max_packet_size', _('Obfuscate maximum packet size')); + so.placeholder = '1200' + so.depends('hysteria_obfs_type', 'gecko'); + so.modalonly = true; + /* SSH fields */ so = ss.taboption('field_general', form.TextValue, 'ssh_priv_key', _('Priv-key')); so.depends('type', 'ssh'); @@ -508,10 +519,17 @@ return view.extend({ so.value('1', _('v1')); so.value('2', _('v2')); so.value('3', _('v3')); - so.default = '3'; + so.value('4', _('v4')); + so.value('5', _('v5')); + so.default = '4'; so.depends('type', 'snell'); so.modalonly = true; + so = ss.taboption('field_general', form.Flag, 'snell_reuse', _('Connection reuse')); + so.default = so.disabled; + so.depends({type: 'snell', snell_version: /^(4|5)$/}); + so.modalonly = true; + /* TUIC fields */ so = ss.taboption('field_general', form.Value, 'uuid', _('UUID')); so.rmempty = false; @@ -875,6 +893,7 @@ return view.extend({ so = ss.taboption('field_general', form.Flag, 'udp', _('UDP')); so.default = so.disabled; so.depends({type: /^(direct|socks5|ss|mieru|vmess|vless|trojan|anytls|trusttunnel|masque|wireguard)$/}); + so.depends({type: 'snell', snell_version: /^(3|4|5)$/}); so.modalonly = true; so = ss.taboption('field_general', form.Flag, 'uot', _('UoT'), diff --git a/luci-app-fchomo/po/templates/fchomo.pot b/luci-app-fchomo/po/templates/fchomo.pot index 9bb8cfbe..0f060ea3 100644 --- a/luci-app-fchomo/po/templates/fchomo.pot +++ b/luci-app-fchomo/po/templates/fchomo.pot @@ -5,30 +5,30 @@ msgstr "Content-Type: text/plain; charset=UTF-8" msgid "%s log" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:240 #: htdocs/luci-static/resources/fchomo.js:241 #: htdocs/luci-static/resources/fchomo.js:242 #: htdocs/luci-static/resources/fchomo.js:243 #: htdocs/luci-static/resources/fchomo.js:244 #: htdocs/luci-static/resources/fchomo.js:245 +#: htdocs/luci-static/resources/fchomo.js:246 msgid "%s ports" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:605 -#: htdocs/luci-static/resources/fchomo.js:608 +#: htdocs/luci-static/resources/fchomo.js:606 +#: htdocs/luci-static/resources/fchomo.js:609 #: htdocs/luci-static/resources/view/fchomo/client.js:315 msgid "(Imported)" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:947 -#: htdocs/luci-static/resources/fchomo/listeners.js:955 -#: htdocs/luci-static/resources/fchomo/listeners.js:964 +#: htdocs/luci-static/resources/fchomo/listeners.js:990 +#: htdocs/luci-static/resources/fchomo/listeners.js:998 +#: htdocs/luci-static/resources/fchomo/listeners.js:1007 #: htdocs/luci-static/resources/view/fchomo/global.js:543 #: htdocs/luci-static/resources/view/fchomo/global.js:549 -#: htdocs/luci-static/resources/view/fchomo/node.js:1094 -#: htdocs/luci-static/resources/view/fchomo/node.js:1100 -#: htdocs/luci-static/resources/view/fchomo/node.js:1108 -#: htdocs/luci-static/resources/view/fchomo/node.js:1114 +#: htdocs/luci-static/resources/view/fchomo/node.js:1113 +#: htdocs/luci-static/resources/view/fchomo/node.js:1119 +#: htdocs/luci-static/resources/view/fchomo/node.js:1127 +#: htdocs/luci-static/resources/view/fchomo/node.js:1133 msgid "(mTLS)" msgstr "" @@ -39,19 +39,19 @@ msgstr "" #: htdocs/luci-static/resources/view/fchomo/client.js:1056 #: htdocs/luci-static/resources/view/fchomo/client.js:1057 #: htdocs/luci-static/resources/view/fchomo/client.js:1278 -#: htdocs/luci-static/resources/view/fchomo/node.js:1897 -#: htdocs/luci-static/resources/view/fchomo/node.js:1903 -#: htdocs/luci-static/resources/view/fchomo/node.js:1917 -#: htdocs/luci-static/resources/view/fchomo/node.js:1923 +#: htdocs/luci-static/resources/view/fchomo/node.js:1916 +#: htdocs/luci-static/resources/view/fchomo/node.js:1922 +#: htdocs/luci-static/resources/view/fchomo/node.js:1936 +#: htdocs/luci-static/resources/view/fchomo/node.js:1942 msgid "-- Please choose --" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:392 +#: htdocs/luci-static/resources/fchomo.js:393 msgid "0-RTT reuse." msgstr "" -#: htdocs/luci-static/resources/fchomo.js:389 -#: htdocs/luci-static/resources/fchomo.js:393 +#: htdocs/luci-static/resources/fchomo.js:390 +#: htdocs/luci-static/resources/fchomo.js:394 msgid "1-RTT only." msgstr "" @@ -59,15 +59,15 @@ msgstr "" msgid "163Music" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:339 +#: htdocs/luci-static/resources/fchomo.js:340 msgid "2022-blake3-aes-128-gcm" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:340 +#: htdocs/luci-static/resources/fchomo.js:341 msgid "2022-blake3-aes-256-gcm" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:341 +#: htdocs/luci-static/resources/fchomo.js:342 msgid "2022-blake3-chacha20-poly1305" msgstr "" @@ -75,16 +75,16 @@ msgstr "" msgid "0 or 1 only." msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:925 -#: htdocs/luci-static/resources/fchomo/listeners.js:940 -#: htdocs/luci-static/resources/fchomo/listeners.js:965 -#: htdocs/luci-static/resources/view/fchomo/node.js:1101 -#: htdocs/luci-static/resources/view/fchomo/node.js:1115 +#: htdocs/luci-static/resources/fchomo/listeners.js:968 +#: htdocs/luci-static/resources/fchomo/listeners.js:983 +#: htdocs/luci-static/resources/fchomo/listeners.js:1008 +#: htdocs/luci-static/resources/view/fchomo/node.js:1120 +#: htdocs/luci-static/resources/view/fchomo/node.js:1134 msgid "Save your configuration before uploading files!" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:275 -#: htdocs/luci-static/resources/view/fchomo/node.js:380 +#: htdocs/luci-static/resources/fchomo/listeners.js:286 +#: htdocs/luci-static/resources/view/fchomo/node.js:391 msgid "" "A base64 string is used to fine-tune network behavior.
Please refer to " "the document" msgstr "" @@ -387,14 +391,14 @@ msgstr "" msgid "Bypass DSCP" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:426 -#: htdocs/luci-static/resources/fchomo/listeners.js:427 -#: htdocs/luci-static/resources/fchomo/listeners.js:428 -#: htdocs/luci-static/resources/fchomo/listeners.js:429 -#: htdocs/luci-static/resources/view/fchomo/node.js:458 -#: htdocs/luci-static/resources/view/fchomo/node.js:459 -#: htdocs/luci-static/resources/view/fchomo/node.js:460 -#: htdocs/luci-static/resources/view/fchomo/node.js:461 +#: htdocs/luci-static/resources/fchomo/listeners.js:437 +#: htdocs/luci-static/resources/fchomo/listeners.js:438 +#: htdocs/luci-static/resources/fchomo/listeners.js:439 +#: htdocs/luci-static/resources/fchomo/listeners.js:440 +#: htdocs/luci-static/resources/view/fchomo/node.js:469 +#: htdocs/luci-static/resources/view/fchomo/node.js:470 +#: htdocs/luci-static/resources/view/fchomo/node.js:471 +#: htdocs/luci-static/resources/view/fchomo/node.js:472 msgid "CDN support" msgstr "" @@ -410,21 +414,21 @@ msgstr "" msgid "CORS allowed origins, * will be used if empty." msgstr "" -#: htdocs/luci-static/resources/fchomo.js:721 +#: htdocs/luci-static/resources/fchomo.js:722 msgid "Cancel" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1073 +#: htdocs/luci-static/resources/view/fchomo/node.js:1092 msgid "Cert fingerprint" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1074 +#: htdocs/luci-static/resources/view/fchomo/node.js:1093 msgid "" "Certificate fingerprint. Used to implement SSL Pinning and prevent MitM." msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:917 -#: htdocs/luci-static/resources/view/fchomo/node.js:1094 +#: htdocs/luci-static/resources/fchomo/listeners.js:960 +#: htdocs/luci-static/resources/view/fchomo/node.js:1113 msgid "Certificate path" msgstr "" @@ -453,16 +457,16 @@ msgstr "" msgid "China list version" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:244 -#: htdocs/luci-static/resources/fchomo/listeners.js:342 -#: htdocs/luci-static/resources/view/fchomo/node.js:333 -#: htdocs/luci-static/resources/view/fchomo/node.js:392 -#: htdocs/luci-static/resources/view/fchomo/node.js:645 +#: htdocs/luci-static/resources/fchomo/listeners.js:255 +#: htdocs/luci-static/resources/fchomo/listeners.js:353 +#: htdocs/luci-static/resources/view/fchomo/node.js:344 +#: htdocs/luci-static/resources/view/fchomo/node.js:403 +#: htdocs/luci-static/resources/view/fchomo/node.js:663 msgid "Chipher" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:351 -#: htdocs/luci-static/resources/view/fchomo/node.js:401 +#: htdocs/luci-static/resources/fchomo/listeners.js:362 +#: htdocs/luci-static/resources/view/fchomo/node.js:412 msgid "Chipher must be enabled if obfuscate downlink is disabled." msgstr "" @@ -476,29 +480,29 @@ msgid "" "to download the latest initial package." msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:689 -#: htdocs/luci-static/resources/fchomo/listeners.js:956 +#: htdocs/luci-static/resources/fchomo/listeners.js:726 +#: htdocs/luci-static/resources/fchomo/listeners.js:999 #: htdocs/luci-static/resources/view/fchomo/global.js:550 -#: htdocs/luci-static/resources/view/fchomo/node.js:929 -#: htdocs/luci-static/resources/view/fchomo/node.js:1095 -#: htdocs/luci-static/resources/view/fchomo/node.js:1109 +#: htdocs/luci-static/resources/view/fchomo/node.js:948 +#: htdocs/luci-static/resources/view/fchomo/node.js:1114 +#: htdocs/luci-static/resources/view/fchomo/node.js:1128 #: root/usr/share/luci/menu.d/luci-app-fchomo.json:22 msgid "Client" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:955 +#: htdocs/luci-static/resources/fchomo/listeners.js:998 msgid "Client Auth Certificate path" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:947 +#: htdocs/luci-static/resources/fchomo/listeners.js:990 msgid "Client Auth type" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1140 +#: htdocs/luci-static/resources/view/fchomo/node.js:1159 msgid "Client fingerprint" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:338 +#: htdocs/luci-static/resources/fchomo/listeners.js:349 msgid "Client key" msgstr "" @@ -510,21 +514,21 @@ msgstr "" msgid "Collecting data..." msgstr "" -#: htdocs/luci-static/resources/fchomo.js:238 #: htdocs/luci-static/resources/fchomo.js:239 +#: htdocs/luci-static/resources/fchomo.js:240 msgid "Common ports (bypass P2P traffic)" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:1368 +#: htdocs/luci-static/resources/fchomo.js:1369 msgid "Complete" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1715 +#: htdocs/luci-static/resources/view/fchomo/node.js:1734 msgid "Configuration Items" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:583 -#: htdocs/luci-static/resources/view/fchomo/node.js:858 +#: htdocs/luci-static/resources/fchomo/listeners.js:620 +#: htdocs/luci-static/resources/view/fchomo/node.js:876 msgid "Congestion controller" msgstr "" @@ -532,23 +536,27 @@ msgstr "" msgid "Connection check" msgstr "" +#: htdocs/luci-static/resources/view/fchomo/node.js:528 +msgid "Connection reuse" +msgstr "" + #: htdocs/luci-static/resources/fchomo.js:61 msgid "Conservative" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:590 +#: htdocs/luci-static/resources/fchomo.js:591 msgid "Content copied to clipboard!" msgstr "" #: htdocs/luci-static/resources/view/fchomo/client.js:670 -#: htdocs/luci-static/resources/view/fchomo/node.js:1625 -#: htdocs/luci-static/resources/view/fchomo/node.js:1651 +#: htdocs/luci-static/resources/view/fchomo/node.js:1644 +#: htdocs/luci-static/resources/view/fchomo/node.js:1670 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:339 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:365 msgid "Content will not be verified, Please make sure you enter it correctly." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1624 +#: htdocs/luci-static/resources/view/fchomo/node.js:1643 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:338 msgid "Contents" msgstr "" @@ -557,7 +565,7 @@ msgstr "" msgid "Contents have been saved." msgstr "" -#: htdocs/luci-static/resources/fchomo.js:592 +#: htdocs/luci-static/resources/fchomo.js:593 msgid "Copy" msgstr "" @@ -573,7 +581,7 @@ msgstr "" msgid "Custom Direct List" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1686 +#: htdocs/luci-static/resources/view/fchomo/node.js:1705 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:400 msgid "Custom HTTP header." msgstr "" @@ -582,8 +590,8 @@ msgstr "" msgid "Custom Proxy List" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:366 -#: htdocs/luci-static/resources/view/fchomo/node.js:416 +#: htdocs/luci-static/resources/fchomo/listeners.js:377 +#: htdocs/luci-static/resources/view/fchomo/node.js:427 msgid "Custom byte layout" msgstr "" @@ -592,7 +600,7 @@ msgid "" "Custom internal hosts. Support yaml or json format." msgstr "" -#: htdocs/luci-static/resources/fchomo.js:186 +#: htdocs/luci-static/resources/fchomo.js:187 msgid "DIRECT" msgstr "" @@ -608,8 +616,8 @@ msgstr "" #: htdocs/luci-static/resources/view/fchomo/client.js:873 #: htdocs/luci-static/resources/view/fchomo/client.js:1428 #: htdocs/luci-static/resources/view/fchomo/client.js:1437 -#: htdocs/luci-static/resources/view/fchomo/node.js:716 -#: htdocs/luci-static/resources/view/fchomo/node.js:799 +#: htdocs/luci-static/resources/view/fchomo/node.js:734 +#: htdocs/luci-static/resources/view/fchomo/node.js:817 msgid "DNS server" msgstr "" @@ -637,15 +645,15 @@ msgstr "" msgid "Default DNS server" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:770 +#: htdocs/luci-static/resources/view/fchomo/node.js:788 msgid "Destination addresses allowed to be forwarded via Wireguard." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1896 +#: htdocs/luci-static/resources/view/fchomo/node.js:1915 msgid "Destination provider" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1902 +#: htdocs/luci-static/resources/view/fchomo/node.js:1921 msgid "Destination proxy node" msgstr "" @@ -653,8 +661,8 @@ msgstr "" msgid "Dial fields" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1909 -#: htdocs/luci-static/resources/view/fchomo/node.js:1929 +#: htdocs/luci-static/resources/view/fchomo/node.js:1928 +#: htdocs/luci-static/resources/view/fchomo/node.js:1948 msgid "Different chain head/tail" msgstr "" @@ -692,7 +700,7 @@ msgstr "" msgid "Disable ICMP Forwarding" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1014 +#: htdocs/luci-static/resources/view/fchomo/node.js:1033 msgid "Disable SNI" msgstr "" @@ -718,46 +726,46 @@ msgstr "" msgid "Domain" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1015 +#: htdocs/luci-static/resources/view/fchomo/node.js:1034 msgid "Donot send server name in ClientHello." msgstr "" #: htdocs/luci-static/resources/view/fchomo/client.js:1577 -#: htdocs/luci-static/resources/view/fchomo/node.js:1087 -#: htdocs/luci-static/resources/view/fchomo/node.js:1755 +#: htdocs/luci-static/resources/view/fchomo/node.js:1106 +#: htdocs/luci-static/resources/view/fchomo/node.js:1774 msgid "Donot verifying server certificate." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1434 +#: htdocs/luci-static/resources/view/fchomo/node.js:1453 msgid "Download bandwidth" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1435 +#: htdocs/luci-static/resources/view/fchomo/node.js:1454 msgid "Download bandwidth in Mbps." msgstr "" -#: htdocs/luci-static/resources/fchomo.js:1247 +#: htdocs/luci-static/resources/fchomo.js:1248 msgid "Download failed: %s" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:1245 +#: htdocs/luci-static/resources/fchomo.js:1246 msgid "Download successful." msgstr "" -#: htdocs/luci-static/resources/fchomo.js:172 +#: htdocs/luci-static/resources/fchomo.js:173 msgid "Dual stack" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1134 +#: htdocs/luci-static/resources/view/fchomo/node.js:1153 msgid "ECH HTTPS record query servername" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:1013 -#: htdocs/luci-static/resources/view/fchomo/node.js:1128 +#: htdocs/luci-static/resources/fchomo/listeners.js:1056 +#: htdocs/luci-static/resources/view/fchomo/node.js:1147 msgid "ECH config" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:972 +#: htdocs/luci-static/resources/fchomo/listeners.js:1015 msgid "ECH key" msgstr "" @@ -773,11 +781,11 @@ msgstr "" msgid "ETag support" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1274 +#: htdocs/luci-static/resources/view/fchomo/node.js:1293 msgid "Early Data first packet length limit." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1280 +#: htdocs/luci-static/resources/view/fchomo/node.js:1299 msgid "Early Data header name" msgstr "" @@ -793,12 +801,12 @@ msgstr "" msgid "Edit ruleset" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1622 +#: htdocs/luci-static/resources/view/fchomo/node.js:1641 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:336 msgid "Editer" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:383 +#: htdocs/luci-static/resources/fchomo.js:384 msgid "Eliminate encryption header characteristics" msgstr "" @@ -813,22 +821,22 @@ msgstr "" #: htdocs/luci-static/resources/view/fchomo/global.js:401 #: htdocs/luci-static/resources/view/fchomo/global.js:680 #: htdocs/luci-static/resources/view/fchomo/node.js:235 -#: htdocs/luci-static/resources/view/fchomo/node.js:1595 -#: htdocs/luci-static/resources/view/fchomo/node.js:1794 -#: htdocs/luci-static/resources/view/fchomo/node.js:1883 +#: htdocs/luci-static/resources/view/fchomo/node.js:1614 +#: htdocs/luci-static/resources/view/fchomo/node.js:1813 +#: htdocs/luci-static/resources/view/fchomo/node.js:1902 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:264 #: htdocs/luci-static/resources/view/fchomo/server.js:49 msgid "Enable" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:554 +#: htdocs/luci-static/resources/view/fchomo/node.js:572 msgid "" "Enable 0-RTT QUIC connection handshake on the client side. This is not " "impacting much on the performance, as the protocol is fully multiplexed.
Disabling this is highly recommended, as it is vulnerable to replay attacks." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:553 +#: htdocs/luci-static/resources/view/fchomo/node.js:571 msgid "Enable 0-RTT handshake" msgstr "" @@ -838,53 +846,53 @@ msgid "" "conversion for outbound connections" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1122 +#: htdocs/luci-static/resources/view/fchomo/node.js:1141 msgid "Enable ECH" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1422 +#: htdocs/luci-static/resources/view/fchomo/node.js:1441 msgid "Enable TCP Brutal" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1423 +#: htdocs/luci-static/resources/view/fchomo/node.js:1442 msgid "Enable TCP Brutal congestion control algorithm" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1411 +#: htdocs/luci-static/resources/view/fchomo/node.js:1430 msgid "Enable multiplexing only for TCP." msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:412 -#: htdocs/luci-static/resources/view/fchomo/node.js:444 +#: htdocs/luci-static/resources/fchomo/listeners.js:423 +#: htdocs/luci-static/resources/view/fchomo/node.js:455 msgid "Enable obfuscate for downlink" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1405 +#: htdocs/luci-static/resources/view/fchomo/node.js:1424 msgid "Enable padding" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1416 +#: htdocs/luci-static/resources/view/fchomo/node.js:1435 msgid "Enable statistic" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:881 -#: htdocs/luci-static/resources/view/fchomo/node.js:1737 +#: htdocs/luci-static/resources/view/fchomo/node.js:900 +#: htdocs/luci-static/resources/view/fchomo/node.js:1756 msgid "" "Enable the SUoT protocol, requires server support. Conflict with Multiplex." msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:200 -#: htdocs/luci-static/resources/view/fchomo/node.js:305 +#: htdocs/luci-static/resources/fchomo/listeners.js:201 +#: htdocs/luci-static/resources/view/fchomo/node.js:306 msgid "" "Enabling obfuscation will make the server incompatible with standard QUIC " "connections, losing the ability to masquerade with HTTP/3." msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:652 +#: htdocs/luci-static/resources/fchomo/listeners.js:689 msgid "Encryption method" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:683 +#: htdocs/luci-static/resources/view/fchomo/node.js:701 msgid "Endpoint pubkic key" msgstr "" @@ -907,7 +915,7 @@ msgid "" "if empty." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1852 +#: htdocs/luci-static/resources/view/fchomo/node.js:1871 msgid "Exclude matched node types." msgstr "" @@ -918,7 +926,7 @@ msgid "" msgstr "" #: htdocs/luci-static/resources/view/fchomo/client.js:1161 -#: htdocs/luci-static/resources/view/fchomo/node.js:1845 +#: htdocs/luci-static/resources/view/fchomo/node.js:1864 msgid "Exclude nodes that meet keywords or regexps." msgstr "" @@ -927,66 +935,66 @@ msgid "Expand/Collapse result" msgstr "" #: htdocs/luci-static/resources/view/fchomo/client.js:1121 -#: htdocs/luci-static/resources/view/fchomo/node.js:1830 +#: htdocs/luci-static/resources/view/fchomo/node.js:1849 msgid "Expected HTTP code. 204 will be used if empty." msgstr "" #: htdocs/luci-static/resources/view/fchomo/client.js:1123 -#: htdocs/luci-static/resources/view/fchomo/node.js:1832 +#: htdocs/luci-static/resources/view/fchomo/node.js:1851 msgid "Expected status" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:440 -#: htdocs/luci-static/resources/fchomo.js:443 -#: htdocs/luci-static/resources/fchomo.js:446 -#: htdocs/luci-static/resources/fchomo.js:1385 -#: htdocs/luci-static/resources/fchomo.js:1393 -#: htdocs/luci-static/resources/fchomo.js:1401 -#: htdocs/luci-static/resources/fchomo.js:1424 -#: htdocs/luci-static/resources/fchomo.js:1427 -#: htdocs/luci-static/resources/fchomo.js:1434 -#: htdocs/luci-static/resources/fchomo.js:1450 -#: htdocs/luci-static/resources/fchomo.js:1459 -#: htdocs/luci-static/resources/fchomo.js:1471 -#: htdocs/luci-static/resources/fchomo.js:1474 -#: htdocs/luci-static/resources/fchomo.js:1484 -#: htdocs/luci-static/resources/fchomo.js:1496 -#: htdocs/luci-static/resources/fchomo.js:1499 -#: htdocs/luci-static/resources/fchomo.js:1509 -#: htdocs/luci-static/resources/fchomo.js:1519 -#: htdocs/luci-static/resources/fchomo.js:1554 -#: htdocs/luci-static/resources/fchomo.js:1556 -#: htdocs/luci-static/resources/fchomo.js:1569 -#: htdocs/luci-static/resources/fchomo.js:1575 -#: htdocs/luci-static/resources/fchomo.js:1582 -#: htdocs/luci-static/resources/fchomo.js:1591 -#: htdocs/luci-static/resources/fchomo/listeners.js:351 -#: htdocs/luci-static/resources/fchomo/listeners.js:398 -#: htdocs/luci-static/resources/fchomo/listeners.js:681 -#: htdocs/luci-static/resources/fchomo/listeners.js:712 -#: htdocs/luci-static/resources/fchomo/listeners.js:813 +#: htdocs/luci-static/resources/fchomo.js:441 +#: htdocs/luci-static/resources/fchomo.js:444 +#: htdocs/luci-static/resources/fchomo.js:447 +#: htdocs/luci-static/resources/fchomo.js:1386 +#: htdocs/luci-static/resources/fchomo.js:1394 +#: htdocs/luci-static/resources/fchomo.js:1402 +#: htdocs/luci-static/resources/fchomo.js:1425 +#: htdocs/luci-static/resources/fchomo.js:1428 +#: htdocs/luci-static/resources/fchomo.js:1435 +#: htdocs/luci-static/resources/fchomo.js:1451 +#: htdocs/luci-static/resources/fchomo.js:1460 +#: htdocs/luci-static/resources/fchomo.js:1472 +#: htdocs/luci-static/resources/fchomo.js:1475 +#: htdocs/luci-static/resources/fchomo.js:1485 +#: htdocs/luci-static/resources/fchomo.js:1497 +#: htdocs/luci-static/resources/fchomo.js:1500 +#: htdocs/luci-static/resources/fchomo.js:1510 +#: htdocs/luci-static/resources/fchomo.js:1520 +#: htdocs/luci-static/resources/fchomo.js:1555 +#: htdocs/luci-static/resources/fchomo.js:1557 +#: htdocs/luci-static/resources/fchomo.js:1570 +#: htdocs/luci-static/resources/fchomo.js:1576 +#: htdocs/luci-static/resources/fchomo.js:1583 +#: htdocs/luci-static/resources/fchomo.js:1592 +#: htdocs/luci-static/resources/fchomo/listeners.js:362 +#: htdocs/luci-static/resources/fchomo/listeners.js:409 +#: htdocs/luci-static/resources/fchomo/listeners.js:718 +#: htdocs/luci-static/resources/fchomo/listeners.js:749 +#: htdocs/luci-static/resources/fchomo/listeners.js:850 #: htdocs/luci-static/resources/view/fchomo/client.js:68 #: htdocs/luci-static/resources/view/fchomo/client.js:1018 #: htdocs/luci-static/resources/view/fchomo/client.js:1508 #: htdocs/luci-static/resources/view/fchomo/global.js:880 -#: htdocs/luci-static/resources/view/fchomo/node.js:401 -#: htdocs/luci-static/resources/view/fchomo/node.js:437 -#: htdocs/luci-static/resources/view/fchomo/node.js:490 -#: htdocs/luci-static/resources/view/fchomo/node.js:492 -#: htdocs/luci-static/resources/view/fchomo/node.js:952 -#: htdocs/luci-static/resources/view/fchomo/node.js:1079 -#: htdocs/luci-static/resources/view/fchomo/node.js:1909 -#: htdocs/luci-static/resources/view/fchomo/node.js:1929 +#: htdocs/luci-static/resources/view/fchomo/node.js:412 +#: htdocs/luci-static/resources/view/fchomo/node.js:448 +#: htdocs/luci-static/resources/view/fchomo/node.js:501 +#: htdocs/luci-static/resources/view/fchomo/node.js:503 +#: htdocs/luci-static/resources/view/fchomo/node.js:971 +#: htdocs/luci-static/resources/view/fchomo/node.js:1098 +#: htdocs/luci-static/resources/view/fchomo/node.js:1928 +#: htdocs/luci-static/resources/view/fchomo/node.js:1948 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:291 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:305 msgid "Expecting: %s" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:1080 -#: htdocs/luci-static/resources/fchomo/listeners.js:1087 -#: htdocs/luci-static/resources/view/fchomo/node.js:1189 -#: htdocs/luci-static/resources/view/fchomo/node.js:1196 -#: htdocs/luci-static/resources/view/fchomo/node.js:1204 +#: htdocs/luci-static/resources/fchomo/listeners.js:1123 +#: htdocs/luci-static/resources/fchomo/listeners.js:1130 +#: htdocs/luci-static/resources/view/fchomo/node.js:1208 +#: htdocs/luci-static/resources/view/fchomo/node.js:1215 +#: htdocs/luci-static/resources/view/fchomo/node.js:1223 msgid "Expecting: only support %s." msgstr "" @@ -1005,24 +1013,24 @@ msgstr "" msgid "Factor" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:1326 +#: htdocs/luci-static/resources/fchomo.js:1327 msgid "Failed to execute \"/etc/init.d/fchomo %s %s\" reason: %s" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:1279 +#: htdocs/luci-static/resources/fchomo.js:1280 msgid "Failed to generate %s, error: %s." msgstr "" -#: htdocs/luci-static/resources/fchomo.js:1691 +#: htdocs/luci-static/resources/fchomo.js:1692 msgid "Failed to upload %s, error: %s." msgstr "" -#: htdocs/luci-static/resources/fchomo.js:1710 +#: htdocs/luci-static/resources/fchomo.js:1711 msgid "Failed to upload, error: %s." msgstr "" -#: htdocs/luci-static/resources/fchomo.js:230 -#: htdocs/luci-static/resources/fchomo/listeners.js:437 +#: htdocs/luci-static/resources/fchomo.js:231 +#: htdocs/luci-static/resources/fchomo/listeners.js:448 msgid "Fallback" msgstr "" @@ -1036,7 +1044,7 @@ msgid "Fallback filter" msgstr "" #: htdocs/luci-static/resources/view/fchomo/client.js:1156 -#: htdocs/luci-static/resources/view/fchomo/node.js:1839 +#: htdocs/luci-static/resources/view/fchomo/node.js:1858 msgid "Filter nodes that meet keywords or regexps." msgstr "" @@ -1065,8 +1073,8 @@ msgstr "" msgid "Firewall" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:505 -#: htdocs/luci-static/resources/view/fchomo/node.js:631 +#: htdocs/luci-static/resources/fchomo/listeners.js:534 +#: htdocs/luci-static/resources/view/fchomo/node.js:649 msgid "Flow" msgstr "" @@ -1077,15 +1085,15 @@ msgid "" msgstr "" #: htdocs/luci-static/resources/view/fchomo/client.js:1122 -#: htdocs/luci-static/resources/view/fchomo/node.js:1705 -#: htdocs/luci-static/resources/view/fchomo/node.js:1831 +#: htdocs/luci-static/resources/view/fchomo/node.js:1724 +#: htdocs/luci-static/resources/view/fchomo/node.js:1850 msgid "" "For format see
%s." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:711 -#: htdocs/luci-static/resources/view/fchomo/node.js:794 +#: htdocs/luci-static/resources/view/fchomo/node.js:729 +#: htdocs/luci-static/resources/view/fchomo/node.js:812 msgid "Force DNS remote resolution." msgstr "" @@ -1104,7 +1112,7 @@ msgstr "" msgid "FullCombo Shark!" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1229 +#: htdocs/luci-static/resources/view/fchomo/node.js:1248 msgid "GET" msgstr "" @@ -1112,6 +1120,11 @@ msgstr "" msgid "GFW list version" msgstr "" +#: htdocs/luci-static/resources/fchomo/listeners.js:196 +#: htdocs/luci-static/resources/view/fchomo/node.js:301 +msgid "Gecko" +msgstr "" + #: htdocs/luci-static/resources/view/fchomo/global.js:388 msgid "General" msgstr "" @@ -1119,7 +1132,7 @@ msgstr "" #: htdocs/luci-static/resources/fchomo/listeners.js:119 #: htdocs/luci-static/resources/view/fchomo/client.js:1009 #: htdocs/luci-static/resources/view/fchomo/node.js:222 -#: htdocs/luci-static/resources/view/fchomo/node.js:1585 +#: htdocs/luci-static/resources/view/fchomo/node.js:1604 msgid "General fields" msgstr "" @@ -1127,15 +1140,15 @@ msgstr "" msgid "General settings" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:541 -#: htdocs/luci-static/resources/fchomo.js:543 -#: htdocs/luci-static/resources/fchomo.js:557 -#: htdocs/luci-static/resources/fchomo.js:559 -#: htdocs/luci-static/resources/fchomo/listeners.js:329 -#: htdocs/luci-static/resources/fchomo/listeners.js:373 -#: htdocs/luci-static/resources/fchomo/listeners.js:375 -#: htdocs/luci-static/resources/fchomo/listeners.js:785 -#: htdocs/luci-static/resources/fchomo/listeners.js:1005 +#: htdocs/luci-static/resources/fchomo.js:542 +#: htdocs/luci-static/resources/fchomo.js:544 +#: htdocs/luci-static/resources/fchomo.js:558 +#: htdocs/luci-static/resources/fchomo.js:560 +#: htdocs/luci-static/resources/fchomo/listeners.js:340 +#: htdocs/luci-static/resources/fchomo/listeners.js:384 +#: htdocs/luci-static/resources/fchomo/listeners.js:386 +#: htdocs/luci-static/resources/fchomo/listeners.js:822 +#: htdocs/luci-static/resources/fchomo/listeners.js:1048 #: htdocs/luci-static/resources/view/fchomo/global.js:587 msgid "Generate" msgstr "" @@ -1179,7 +1192,7 @@ msgstr "" msgid "Global Authentication" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:655 +#: htdocs/luci-static/resources/view/fchomo/node.js:673 msgid "Global padding" msgstr "" @@ -1187,7 +1200,7 @@ msgstr "" msgid "Google" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:243 +#: htdocs/luci-static/resources/fchomo.js:244 msgid "Google FCM" msgstr "" @@ -1200,49 +1213,49 @@ msgid "Group" msgstr "" #: htdocs/luci-static/resources/fchomo.js:153 -#: htdocs/luci-static/resources/fchomo.js:187 -#: htdocs/luci-static/resources/fchomo/listeners.js:539 -#: htdocs/luci-static/resources/view/fchomo/node.js:817 -#: htdocs/luci-static/resources/view/fchomo/node.js:1178 -#: htdocs/luci-static/resources/view/fchomo/node.js:1189 -#: htdocs/luci-static/resources/view/fchomo/node.js:1196 +#: htdocs/luci-static/resources/fchomo.js:188 +#: htdocs/luci-static/resources/fchomo/listeners.js:568 +#: htdocs/luci-static/resources/view/fchomo/node.js:835 +#: htdocs/luci-static/resources/view/fchomo/node.js:1197 +#: htdocs/luci-static/resources/view/fchomo/node.js:1208 +#: htdocs/luci-static/resources/view/fchomo/node.js:1215 msgid "HTTP" msgstr "" #: htdocs/luci-static/resources/view/fchomo/node.js:268 -#: htdocs/luci-static/resources/view/fchomo/node.js:1251 -#: htdocs/luci-static/resources/view/fchomo/node.js:1685 +#: htdocs/luci-static/resources/view/fchomo/node.js:1270 +#: htdocs/luci-static/resources/view/fchomo/node.js:1704 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:399 msgid "HTTP header" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:418 -#: htdocs/luci-static/resources/view/fchomo/node.js:450 +#: htdocs/luci-static/resources/fchomo/listeners.js:429 +#: htdocs/luci-static/resources/view/fchomo/node.js:461 msgid "HTTP mask" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:423 -#: htdocs/luci-static/resources/view/fchomo/node.js:455 -#: htdocs/luci-static/resources/view/fchomo/node.js:490 -#: htdocs/luci-static/resources/view/fchomo/node.js:492 +#: htdocs/luci-static/resources/fchomo/listeners.js:434 +#: htdocs/luci-static/resources/view/fchomo/node.js:466 +#: htdocs/luci-static/resources/view/fchomo/node.js:501 +#: htdocs/luci-static/resources/view/fchomo/node.js:503 msgid "HTTP mask mode" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:480 +#: htdocs/luci-static/resources/view/fchomo/node.js:491 msgid "HTTP mask multiplex" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:465 -#: htdocs/luci-static/resources/view/fchomo/node.js:470 +#: htdocs/luci-static/resources/view/fchomo/node.js:476 +#: htdocs/luci-static/resources/view/fchomo/node.js:481 msgid "HTTP mask: %s" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1228 +#: htdocs/luci-static/resources/view/fchomo/node.js:1247 msgid "HTTP request method" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:433 -#: htdocs/luci-static/resources/view/fchomo/node.js:476 +#: htdocs/luci-static/resources/fchomo/listeners.js:444 +#: htdocs/luci-static/resources/view/fchomo/node.js:487 msgid "HTTP root path" msgstr "" @@ -1250,15 +1263,15 @@ msgstr "" msgid "HTTP/3" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:208 +#: htdocs/luci-static/resources/fchomo/listeners.js:219 msgid "" "HTTP3 server behavior when authentication fails.
A 404 page will be " "returned if empty." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1179 -#: htdocs/luci-static/resources/view/fchomo/node.js:1190 -#: htdocs/luci-static/resources/view/fchomo/node.js:1197 +#: htdocs/luci-static/resources/view/fchomo/node.js:1198 +#: htdocs/luci-static/resources/view/fchomo/node.js:1209 +#: htdocs/luci-static/resources/view/fchomo/node.js:1216 msgid "HTTPUpgrade" msgstr "" @@ -1266,52 +1279,52 @@ msgstr "" msgid "Handle domain" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:372 +#: htdocs/luci-static/resources/view/fchomo/node.js:383 msgid "Handshake mode" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:544 +#: htdocs/luci-static/resources/fchomo/listeners.js:581 msgid "Handshake target that supports TLS 1.3" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:405 +#: htdocs/luci-static/resources/fchomo/listeners.js:416 msgid "Handshake timeout" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:233 +#: htdocs/luci-static/resources/fchomo/listeners.js:244 msgid "Header to read real client IP from (e.g. X-Forwarded-For)" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:722 +#: htdocs/luci-static/resources/view/fchomo/node.js:740 msgid "Health check" msgstr "" #: htdocs/luci-static/resources/view/fchomo/client.js:1091 -#: htdocs/luci-static/resources/view/fchomo/node.js:1799 +#: htdocs/luci-static/resources/view/fchomo/node.js:1818 msgid "Health check URL" msgstr "" #: htdocs/luci-static/resources/view/fchomo/client.js:1120 -#: htdocs/luci-static/resources/view/fchomo/node.js:1829 +#: htdocs/luci-static/resources/view/fchomo/node.js:1848 msgid "Health check expected status" msgstr "" #: htdocs/luci-static/resources/view/fchomo/client.js:1100 -#: htdocs/luci-static/resources/view/fchomo/node.js:1809 +#: htdocs/luci-static/resources/view/fchomo/node.js:1828 msgid "Health check interval" msgstr "" #: htdocs/luci-static/resources/view/fchomo/client.js:1107 -#: htdocs/luci-static/resources/view/fchomo/node.js:1816 +#: htdocs/luci-static/resources/view/fchomo/node.js:1835 msgid "Health check timeout" msgstr "" #: htdocs/luci-static/resources/view/fchomo/client.js:1011 -#: htdocs/luci-static/resources/view/fchomo/node.js:1587 +#: htdocs/luci-static/resources/view/fchomo/node.js:1606 msgid "Health fields" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:560 +#: htdocs/luci-static/resources/view/fchomo/node.js:578 msgid "Heartbeat interval" msgstr "" @@ -1319,19 +1332,20 @@ msgstr "" msgid "Hidden" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:823 +#: htdocs/luci-static/resources/fchomo/listeners.js:574 +#: htdocs/luci-static/resources/view/fchomo/node.js:841 msgid "Host that supports TLS 1.3" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:327 +#: htdocs/luci-static/resources/view/fchomo/node.js:338 msgid "Host-key" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:322 +#: htdocs/luci-static/resources/view/fchomo/node.js:333 msgid "Host-key algorithms" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:470 +#: htdocs/luci-static/resources/view/fchomo/node.js:481 msgid "Host/SNI override" msgstr "" @@ -1340,12 +1354,12 @@ msgstr "" msgid "Hosts" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:164 -#: htdocs/luci-static/resources/fchomo.js:199 +#: htdocs/luci-static/resources/fchomo.js:165 +#: htdocs/luci-static/resources/fchomo.js:200 msgid "Hysteria2" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:165 +#: htdocs/luci-static/resources/fchomo.js:166 msgid "Hysteria2 Realm" msgstr "" @@ -1363,20 +1377,20 @@ msgstr "" msgid "IP CIDR" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:522 +#: htdocs/luci-static/resources/view/fchomo/node.js:540 msgid "IP override" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1467 -#: htdocs/luci-static/resources/view/fchomo/node.js:1785 +#: htdocs/luci-static/resources/view/fchomo/node.js:1486 +#: htdocs/luci-static/resources/view/fchomo/node.js:1804 msgid "IP version" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:173 +#: htdocs/luci-static/resources/fchomo.js:174 msgid "IPv4 only" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:174 +#: htdocs/luci-static/resources/fchomo.js:175 msgid "IPv6 only" msgstr "" @@ -1389,19 +1403,19 @@ msgstr "" msgid "Icon" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:604 +#: htdocs/luci-static/resources/view/fchomo/node.js:622 msgid "Idle session check interval" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:611 +#: htdocs/luci-static/resources/view/fchomo/node.js:629 msgid "Idle session timeout" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:456 +#: htdocs/luci-static/resources/fchomo/listeners.js:485 msgid "Idle timeout" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:1427 +#: htdocs/luci-static/resources/fchomo.js:1428 msgid "If All ports is selected, uncheck others" msgstr "" @@ -1413,7 +1427,7 @@ msgstr "" msgid "Ignore client bandwidth" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:726 +#: htdocs/luci-static/resources/fchomo.js:727 msgid "Import" msgstr "" @@ -1429,8 +1443,8 @@ msgstr "" #: htdocs/luci-static/resources/view/fchomo/client.js:1713 #: htdocs/luci-static/resources/view/fchomo/client.js:1748 #: htdocs/luci-static/resources/view/fchomo/client.js:1769 -#: htdocs/luci-static/resources/view/fchomo/node.js:1492 -#: htdocs/luci-static/resources/view/fchomo/node.js:1573 +#: htdocs/luci-static/resources/view/fchomo/node.js:1511 +#: htdocs/luci-static/resources/view/fchomo/node.js:1592 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:153 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:241 msgid "Import mihomo config" @@ -1446,37 +1460,37 @@ msgstr "" #: htdocs/luci-static/resources/fchomo/listeners.js:182 #: htdocs/luci-static/resources/view/fchomo/node.js:287 #: htdocs/luci-static/resources/view/fchomo/node.js:293 -#: htdocs/luci-static/resources/view/fchomo/node.js:1743 -#: htdocs/luci-static/resources/view/fchomo/node.js:1749 +#: htdocs/luci-static/resources/view/fchomo/node.js:1762 +#: htdocs/luci-static/resources/view/fchomo/node.js:1768 msgid "In Mbps." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1663 +#: htdocs/luci-static/resources/view/fchomo/node.js:1682 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:377 msgid "In bytes. %s will be used if empty." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:561 -#: htdocs/luci-static/resources/view/fchomo/node.js:568 +#: htdocs/luci-static/resources/view/fchomo/node.js:579 +#: htdocs/luci-static/resources/view/fchomo/node.js:586 msgid "In millisecond." msgstr "" #: htdocs/luci-static/resources/view/fchomo/client.js:1108 #: htdocs/luci-static/resources/view/fchomo/client.js:1137 -#: htdocs/luci-static/resources/view/fchomo/node.js:1817 +#: htdocs/luci-static/resources/view/fchomo/node.js:1836 msgid "In millisecond. %s will be used if empty." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1320 +#: htdocs/luci-static/resources/view/fchomo/node.js:1339 msgid "In milliseconds." msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:406 -#: htdocs/luci-static/resources/fchomo/listeners.js:457 -#: htdocs/luci-static/resources/fchomo/listeners.js:464 -#: htdocs/luci-static/resources/view/fchomo/node.js:605 -#: htdocs/luci-static/resources/view/fchomo/node.js:612 -#: htdocs/luci-static/resources/view/fchomo/node.js:1267 +#: htdocs/luci-static/resources/fchomo/listeners.js:417 +#: htdocs/luci-static/resources/fchomo/listeners.js:486 +#: htdocs/luci-static/resources/fchomo/listeners.js:493 +#: htdocs/luci-static/resources/view/fchomo/node.js:623 +#: htdocs/luci-static/resources/view/fchomo/node.js:630 +#: htdocs/luci-static/resources/view/fchomo/node.js:1286 msgid "In seconds." msgstr "" @@ -1485,14 +1499,14 @@ msgstr "" #: htdocs/luci-static/resources/view/fchomo/global.js:430 #: htdocs/luci-static/resources/view/fchomo/global.js:515 #: htdocs/luci-static/resources/view/fchomo/node.js:281 -#: htdocs/luci-static/resources/view/fchomo/node.js:1669 -#: htdocs/luci-static/resources/view/fchomo/node.js:1810 +#: htdocs/luci-static/resources/view/fchomo/node.js:1688 +#: htdocs/luci-static/resources/view/fchomo/node.js:1829 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:383 msgid "In seconds. %s will be used if empty." msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:701 -#: htdocs/luci-static/resources/view/fchomo/node.js:941 +#: htdocs/luci-static/resources/fchomo/listeners.js:738 +#: htdocs/luci-static/resources/view/fchomo/node.js:960 msgid "" "In the order of one Padding-Length and one Padding-" "Interval, infinite concatenation." @@ -1532,7 +1546,7 @@ msgstr "" msgid "Info" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1602 +#: htdocs/luci-static/resources/view/fchomo/node.js:1621 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:279 msgid "Inline" msgstr "" @@ -1543,27 +1557,27 @@ msgstr "" #: htdocs/luci-static/resources/fchomo.js:52 #: htdocs/luci-static/resources/fchomo.js:59 -#: htdocs/luci-static/resources/fchomo.js:171 -#: htdocs/luci-static/resources/fchomo.js:365 -#: htdocs/luci-static/resources/view/fchomo/node.js:1759 +#: htdocs/luci-static/resources/fchomo.js:172 +#: htdocs/luci-static/resources/fchomo.js:366 +#: htdocs/luci-static/resources/view/fchomo/node.js:1778 msgid "Keep default" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1356 +#: htdocs/luci-static/resources/view/fchomo/node.js:1375 msgid "Keep-alive period" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:285 -#: htdocs/luci-static/resources/view/fchomo/node.js:386 +#: htdocs/luci-static/resources/fchomo/listeners.js:296 +#: htdocs/luci-static/resources/view/fchomo/node.js:397 msgid "Key" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:932 -#: htdocs/luci-static/resources/view/fchomo/node.js:1108 +#: htdocs/luci-static/resources/fchomo/listeners.js:975 +#: htdocs/luci-static/resources/view/fchomo/node.js:1127 msgid "Key path" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:720 +#: htdocs/luci-static/resources/fchomo/listeners.js:757 msgid "Keypairs" msgstr "" @@ -1575,23 +1589,23 @@ msgstr "" #: htdocs/luci-static/resources/view/fchomo/client.js:1719 #: htdocs/luci-static/resources/view/fchomo/client.js:1775 #: htdocs/luci-static/resources/view/fchomo/node.js:230 -#: htdocs/luci-static/resources/view/fchomo/node.js:1590 -#: htdocs/luci-static/resources/view/fchomo/node.js:1878 +#: htdocs/luci-static/resources/view/fchomo/node.js:1609 +#: htdocs/luci-static/resources/view/fchomo/node.js:1897 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:259 msgid "Label" msgstr "" #: htdocs/luci-static/resources/view/fchomo/client.js:1114 -#: htdocs/luci-static/resources/view/fchomo/node.js:1823 +#: htdocs/luci-static/resources/view/fchomo/node.js:1842 msgid "Lazy" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:425 -#: htdocs/luci-static/resources/view/fchomo/node.js:457 +#: htdocs/luci-static/resources/fchomo/listeners.js:436 +#: htdocs/luci-static/resources/view/fchomo/node.js:468 msgid "Legacy" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:514 +#: htdocs/luci-static/resources/fchomo/listeners.js:543 msgid "" "Legacy protocol support (VMess MD5 Authentication) is provided for " "compatibility purposes only, use of alterId > 1 is not recommended." @@ -1601,8 +1615,8 @@ msgstr "" msgid "Less compatibility and sometimes better performance." msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:913 -#: htdocs/luci-static/resources/view/fchomo/node.js:1027 +#: htdocs/luci-static/resources/fchomo/listeners.js:956 +#: htdocs/luci-static/resources/view/fchomo/node.js:1046 msgid "List of supported application level protocols, in order of preference." msgstr "" @@ -1627,22 +1641,22 @@ msgstr "" msgid "Listen ports" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:232 +#: htdocs/luci-static/resources/fchomo.js:233 msgid "Load balance" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1600 +#: htdocs/luci-static/resources/view/fchomo/node.js:1619 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:277 msgid "Local" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:698 -#: htdocs/luci-static/resources/view/fchomo/node.js:741 +#: htdocs/luci-static/resources/view/fchomo/node.js:716 +#: htdocs/luci-static/resources/view/fchomo/node.js:759 msgid "Local IPv6 address" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:690 -#: htdocs/luci-static/resources/view/fchomo/node.js:733 +#: htdocs/luci-static/resources/view/fchomo/node.js:708 +#: htdocs/luci-static/resources/view/fchomo/node.js:751 msgid "Local address" msgstr "" @@ -1662,32 +1676,32 @@ msgstr "" msgid "Log level" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:360 -#: htdocs/luci-static/resources/fchomo/listeners.js:361 -#: htdocs/luci-static/resources/fchomo/listeners.js:362 -#: htdocs/luci-static/resources/fchomo/listeners.js:367 -#: htdocs/luci-static/resources/view/fchomo/node.js:410 -#: htdocs/luci-static/resources/view/fchomo/node.js:411 -#: htdocs/luci-static/resources/view/fchomo/node.js:412 -#: htdocs/luci-static/resources/view/fchomo/node.js:417 +#: htdocs/luci-static/resources/fchomo/listeners.js:371 +#: htdocs/luci-static/resources/fchomo/listeners.js:372 +#: htdocs/luci-static/resources/fchomo/listeners.js:373 +#: htdocs/luci-static/resources/fchomo/listeners.js:378 +#: htdocs/luci-static/resources/view/fchomo/node.js:421 +#: htdocs/luci-static/resources/view/fchomo/node.js:422 +#: htdocs/luci-static/resources/view/fchomo/node.js:423 +#: htdocs/luci-static/resources/view/fchomo/node.js:428 msgid "Low-entropy data stream" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:440 +#: htdocs/luci-static/resources/fchomo.js:441 msgid "Lowercase only" msgstr "" #: htdocs/luci-static/resources/view/fchomo/global.js:502 -#: htdocs/luci-static/resources/view/fchomo/node.js:704 -#: htdocs/luci-static/resources/view/fchomo/node.js:787 +#: htdocs/luci-static/resources/view/fchomo/node.js:722 +#: htdocs/luci-static/resources/view/fchomo/node.js:805 msgid "MTU" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:201 +#: htdocs/luci-static/resources/fchomo.js:202 msgid "Masque" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:207 +#: htdocs/luci-static/resources/fchomo/listeners.js:218 msgid "Masquerade" msgstr "" @@ -1719,24 +1733,24 @@ msgstr "" msgid "Match rule set." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1273 +#: htdocs/luci-static/resources/view/fchomo/node.js:1292 msgid "Max Early Data" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:450 -#: htdocs/luci-static/resources/view/fchomo/node.js:547 +#: htdocs/luci-static/resources/fchomo/listeners.js:479 +#: htdocs/luci-static/resources/view/fchomo/node.js:565 msgid "Max UDP relay packet size" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:1131 +#: htdocs/luci-static/resources/fchomo/listeners.js:1174 msgid "Max buffered posts" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1331 +#: htdocs/luci-static/resources/view/fchomo/node.js:1350 msgid "Max concurrency" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1336 +#: htdocs/luci-static/resources/view/fchomo/node.js:1355 msgid "Max connections" msgstr "" @@ -1749,32 +1763,32 @@ msgstr "" msgid "Max download speed" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:1142 -#: htdocs/luci-static/resources/view/fchomo/node.js:1313 +#: htdocs/luci-static/resources/fchomo/listeners.js:1185 +#: htdocs/luci-static/resources/view/fchomo/node.js:1332 msgid "Max each POST bytes" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:574 +#: htdocs/luci-static/resources/view/fchomo/node.js:592 msgid "Max open streams" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:220 +#: htdocs/luci-static/resources/fchomo/listeners.js:231 msgid "Max realms" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:226 +#: htdocs/luci-static/resources/fchomo/listeners.js:237 msgid "Max realms per client IP" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1346 +#: htdocs/luci-static/resources/view/fchomo/node.js:1365 msgid "Max request times" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1351 +#: htdocs/luci-static/resources/view/fchomo/node.js:1370 msgid "Max reusable seconds" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1341 +#: htdocs/luci-static/resources/view/fchomo/node.js:1360 msgid "Max reuse times" msgstr "" @@ -1783,35 +1797,35 @@ msgstr "" msgid "Max upload speed" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1377 -#: htdocs/luci-static/resources/view/fchomo/node.js:1397 +#: htdocs/luci-static/resources/view/fchomo/node.js:1396 +#: htdocs/luci-static/resources/view/fchomo/node.js:1416 msgid "Maximum connections" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1395 +#: htdocs/luci-static/resources/view/fchomo/node.js:1414 msgid "" "Maximum multiplexed streams in a connection before opening a new connection." "
Conflict with %s and %s." msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:390 -#: htdocs/luci-static/resources/view/fchomo/node.js:429 +#: htdocs/luci-static/resources/fchomo/listeners.js:401 +#: htdocs/luci-static/resources/view/fchomo/node.js:440 msgid "Maximum padding rate" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:398 -#: htdocs/luci-static/resources/view/fchomo/node.js:437 +#: htdocs/luci-static/resources/fchomo/listeners.js:409 +#: htdocs/luci-static/resources/view/fchomo/node.js:448 msgid "" "Maximum padding rate must be greater than or equal to the minimum padding " "rate." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1394 +#: htdocs/luci-static/resources/view/fchomo/node.js:1413 msgid "Maximum streams" msgstr "" #: htdocs/luci-static/resources/fchomo.js:157 -#: htdocs/luci-static/resources/fchomo.js:191 +#: htdocs/luci-static/resources/fchomo.js:192 msgid "Mieru" msgstr "" @@ -1827,26 +1841,26 @@ msgstr "" msgid "Mihomo server" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:618 +#: htdocs/luci-static/resources/view/fchomo/node.js:636 msgid "Min of idle sessions to keep" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1319 +#: htdocs/luci-static/resources/view/fchomo/node.js:1338 msgid "Min posts interval" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1386 +#: htdocs/luci-static/resources/view/fchomo/node.js:1405 msgid "" "Minimum multiplexed streams in a connection before opening a new connection." msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:383 -#: htdocs/luci-static/resources/view/fchomo/node.js:422 +#: htdocs/luci-static/resources/fchomo/listeners.js:394 +#: htdocs/luci-static/resources/view/fchomo/node.js:433 msgid "Minimum padding rate" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1385 -#: htdocs/luci-static/resources/view/fchomo/node.js:1397 +#: htdocs/luci-static/resources/view/fchomo/node.js:1404 +#: htdocs/luci-static/resources/view/fchomo/node.js:1416 msgid "Minimum streams" msgstr "" @@ -1863,7 +1877,7 @@ msgstr "" msgid "Mixed port" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1363 +#: htdocs/luci-static/resources/view/fchomo/node.js:1382 msgid "Multiplex" msgstr "" @@ -1872,7 +1886,7 @@ msgstr "" msgid "Multiplex fields" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:363 +#: htdocs/luci-static/resources/view/fchomo/node.js:374 msgid "Multiplexing" msgstr "" @@ -1881,11 +1895,11 @@ msgstr "" msgid "NOT" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:574 +#: htdocs/luci-static/resources/fchomo/listeners.js:611 msgid "Name of the Proxy group as outbound." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1675 +#: htdocs/luci-static/resources/view/fchomo/node.js:1694 msgid "Name of the Proxy group to download provider." msgstr "" @@ -1893,23 +1907,23 @@ msgstr "" msgid "Name of the Proxy group to download rule set." msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:568 +#: htdocs/luci-static/resources/fchomo/listeners.js:605 msgid "Name of the Sub rule used for inbound matching." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:531 +#: htdocs/luci-static/resources/view/fchomo/node.js:549 msgid "Native UDP" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:382 +#: htdocs/luci-static/resources/fchomo.js:383 msgid "Native appearance" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:600 +#: htdocs/luci-static/resources/fchomo/listeners.js:637 msgid "Network type" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1761 +#: htdocs/luci-static/resources/view/fchomo/node.js:1780 msgid "No" msgstr "" @@ -1917,7 +1931,7 @@ msgstr "" msgid "No Authentication IP ranges" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:1126 +#: htdocs/luci-static/resources/fchomo/listeners.js:1169 msgid "No SSE header" msgstr "" @@ -1925,16 +1939,16 @@ msgstr "" msgid "No add'l params" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1303 +#: htdocs/luci-static/resources/view/fchomo/node.js:1322 msgid "No gRPC header" msgstr "" #: htdocs/luci-static/resources/view/fchomo/client.js:1115 -#: htdocs/luci-static/resources/view/fchomo/node.js:1824 +#: htdocs/luci-static/resources/view/fchomo/node.js:1843 msgid "No testing is performed when this provider node is not in use." msgstr "" -#: htdocs/luci-static/resources/fchomo.js:687 +#: htdocs/luci-static/resources/fchomo.js:688 msgid "No valid %s found." msgstr "" @@ -1949,17 +1963,17 @@ msgid "Node" msgstr "" #: htdocs/luci-static/resources/view/fchomo/client.js:1160 -#: htdocs/luci-static/resources/view/fchomo/node.js:1844 +#: htdocs/luci-static/resources/view/fchomo/node.js:1863 msgid "Node exclude filter" msgstr "" #: htdocs/luci-static/resources/view/fchomo/client.js:1165 -#: htdocs/luci-static/resources/view/fchomo/node.js:1851 +#: htdocs/luci-static/resources/view/fchomo/node.js:1870 msgid "Node exclude type" msgstr "" #: htdocs/luci-static/resources/view/fchomo/client.js:1155 -#: htdocs/luci-static/resources/view/fchomo/node.js:1838 +#: htdocs/luci-static/resources/view/fchomo/node.js:1857 msgid "Node filter" msgstr "" @@ -1967,7 +1981,7 @@ msgstr "" msgid "Node switch tolerance" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:409 +#: htdocs/luci-static/resources/fchomo.js:410 msgid "None" msgstr "" @@ -1975,39 +1989,49 @@ msgstr "" msgid "Not Installed" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:1205 +#: htdocs/luci-static/resources/fchomo.js:1206 msgid "Not Running" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:483 +#: htdocs/luci-static/resources/view/fchomo/node.js:494 msgid "OFF" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:485 +#: htdocs/luci-static/resources/view/fchomo/node.js:496 msgid "ON" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:538 -#: htdocs/luci-static/resources/view/fchomo/node.js:816 +#: htdocs/luci-static/resources/fchomo/listeners.js:567 +#: htdocs/luci-static/resources/view/fchomo/node.js:834 msgid "Obfs Mode" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:199 -#: htdocs/luci-static/resources/view/fchomo/node.js:304 +#: htdocs/luci-static/resources/fchomo/listeners.js:213 +#: htdocs/luci-static/resources/view/fchomo/node.js:318 +msgid "Obfuscate maximum packet size" +msgstr "" + +#: htdocs/luci-static/resources/fchomo/listeners.js:208 +#: htdocs/luci-static/resources/view/fchomo/node.js:313 +msgid "Obfuscate minimum packet size" +msgstr "" + +#: htdocs/luci-static/resources/fchomo/listeners.js:200 +#: htdocs/luci-static/resources/view/fchomo/node.js:305 msgid "Obfuscate password" msgstr "" #: htdocs/luci-static/resources/fchomo/listeners.js:193 -#: htdocs/luci-static/resources/fchomo/listeners.js:358 +#: htdocs/luci-static/resources/fchomo/listeners.js:369 #: htdocs/luci-static/resources/view/fchomo/node.js:298 -#: htdocs/luci-static/resources/view/fchomo/node.js:408 +#: htdocs/luci-static/resources/view/fchomo/node.js:419 msgid "Obfuscate type" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:359 -#: htdocs/luci-static/resources/fchomo/listeners.js:360 -#: htdocs/luci-static/resources/view/fchomo/node.js:409 -#: htdocs/luci-static/resources/view/fchomo/node.js:410 +#: htdocs/luci-static/resources/fchomo/listeners.js:370 +#: htdocs/luci-static/resources/fchomo/listeners.js:371 +#: htdocs/luci-static/resources/view/fchomo/node.js:420 +#: htdocs/luci-static/resources/view/fchomo/node.js:421 msgid "Obfuscated as %s" msgstr "" @@ -2015,8 +2039,12 @@ msgstr "" msgid "One or more numbers in the range 0-63 separated by commas" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:367 -#: htdocs/luci-static/resources/view/fchomo/node.js:417 +#: htdocs/luci-static/resources/fchomo/listeners.js:896 +msgid "Only applicable when %s are used as a frontend." +msgstr "" + +#: htdocs/luci-static/resources/fchomo/listeners.js:378 +#: htdocs/luci-static/resources/view/fchomo/node.js:428 msgid "Only applies to the %s." msgstr "" @@ -2024,7 +2052,7 @@ msgstr "" msgid "Only process traffic from specific interfaces. Leave empty for all." msgstr "" -#: htdocs/luci-static/resources/fchomo.js:1199 +#: htdocs/luci-static/resources/fchomo.js:1200 msgid "Open Dashboard" msgstr "" @@ -2038,11 +2066,11 @@ msgid "Override destination" msgstr "" #: htdocs/luci-static/resources/view/fchomo/client.js:1010 -#: htdocs/luci-static/resources/view/fchomo/node.js:1586 +#: htdocs/luci-static/resources/view/fchomo/node.js:1605 msgid "Override fields" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:523 +#: htdocs/luci-static/resources/view/fchomo/node.js:541 msgid "Override the IP address of the server that DNS response." msgstr "" @@ -2058,7 +2086,7 @@ msgstr "" msgid "Override the existing ECS in original request." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1135 +#: htdocs/luci-static/resources/view/fchomo/node.js:1154 msgid "Overrides the domain name used for HTTPS record queries." msgstr "" @@ -2066,47 +2094,47 @@ msgstr "" msgid "Overview" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1230 +#: htdocs/luci-static/resources/view/fchomo/node.js:1249 msgid "POST" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1231 +#: htdocs/luci-static/resources/view/fchomo/node.js:1250 msgid "PUT" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:667 +#: htdocs/luci-static/resources/view/fchomo/node.js:685 msgid "Packet encoding" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1308 +#: htdocs/luci-static/resources/view/fchomo/node.js:1327 msgid "Padding bytes" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:494 +#: htdocs/luci-static/resources/fchomo/listeners.js:523 msgid "Padding scheme" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:699 -#: htdocs/luci-static/resources/view/fchomo/node.js:939 +#: htdocs/luci-static/resources/fchomo/listeners.js:736 +#: htdocs/luci-static/resources/view/fchomo/node.js:958 msgid "Paddings" msgstr "" #: htdocs/luci-static/resources/fchomo/listeners.js:166 -#: htdocs/luci-static/resources/fchomo/listeners.js:252 -#: htdocs/luci-static/resources/fchomo/listeners.js:551 +#: htdocs/luci-static/resources/fchomo/listeners.js:263 +#: htdocs/luci-static/resources/fchomo/listeners.js:588 #: htdocs/luci-static/resources/view/fchomo/node.js:262 -#: htdocs/luci-static/resources/view/fchomo/node.js:341 -#: htdocs/luci-static/resources/view/fchomo/node.js:831 +#: htdocs/luci-static/resources/view/fchomo/node.js:352 +#: htdocs/luci-static/resources/view/fchomo/node.js:849 msgid "Password" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:639 -#: htdocs/luci-static/resources/view/fchomo/node.js:1650 +#: htdocs/luci-static/resources/fchomo/listeners.js:676 +#: htdocs/luci-static/resources/view/fchomo/node.js:1669 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:364 msgid "Payload" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:755 +#: htdocs/luci-static/resources/view/fchomo/node.js:773 msgid "Peer pubkic key" msgstr "" @@ -2116,11 +2144,11 @@ msgid "" "it is not needed." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:782 +#: htdocs/luci-static/resources/view/fchomo/node.js:800 msgid "Periodically sends data packets to maintain connection persistence." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:781 +#: htdocs/luci-static/resources/view/fchomo/node.js:799 msgid "Persistent keepalive" msgstr "" @@ -2141,8 +2169,8 @@ msgid "" "standards." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1623 -#: htdocs/luci-static/resources/view/fchomo/node.js:1649 +#: htdocs/luci-static/resources/view/fchomo/node.js:1642 +#: htdocs/luci-static/resources/view/fchomo/node.js:1668 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:337 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:363 msgid "" @@ -2156,26 +2184,27 @@ msgstr "" #: htdocs/luci-static/resources/view/fchomo/client.js:1445 #: htdocs/luci-static/resources/view/fchomo/client.js:1697 #: htdocs/luci-static/resources/view/fchomo/client.js:1749 -#: htdocs/luci-static/resources/view/fchomo/node.js:1493 +#: htdocs/luci-static/resources/view/fchomo/node.js:1512 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:154 msgid "Please type %s fields of mihomo config.
" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:530 -#: htdocs/luci-static/resources/view/fchomo/node.js:805 +#: htdocs/luci-static/resources/fchomo/listeners.js:559 +#: htdocs/luci-static/resources/view/fchomo/node.js:823 msgid "Plugin" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:538 -#: htdocs/luci-static/resources/fchomo/listeners.js:544 -#: htdocs/luci-static/resources/fchomo/listeners.js:551 -#: htdocs/luci-static/resources/fchomo/listeners.js:557 -#: htdocs/luci-static/resources/view/fchomo/node.js:816 -#: htdocs/luci-static/resources/view/fchomo/node.js:823 -#: htdocs/luci-static/resources/view/fchomo/node.js:831 -#: htdocs/luci-static/resources/view/fchomo/node.js:837 -#: htdocs/luci-static/resources/view/fchomo/node.js:845 -#: htdocs/luci-static/resources/view/fchomo/node.js:851 +#: htdocs/luci-static/resources/fchomo/listeners.js:567 +#: htdocs/luci-static/resources/fchomo/listeners.js:574 +#: htdocs/luci-static/resources/fchomo/listeners.js:581 +#: htdocs/luci-static/resources/fchomo/listeners.js:588 +#: htdocs/luci-static/resources/fchomo/listeners.js:594 +#: htdocs/luci-static/resources/view/fchomo/node.js:834 +#: htdocs/luci-static/resources/view/fchomo/node.js:841 +#: htdocs/luci-static/resources/view/fchomo/node.js:849 +#: htdocs/luci-static/resources/view/fchomo/node.js:855 +#: htdocs/luci-static/resources/view/fchomo/node.js:863 +#: htdocs/luci-static/resources/view/fchomo/node.js:869 msgid "Plugin:" msgstr "" @@ -2183,7 +2212,7 @@ msgstr "" msgid "Port" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:1436 +#: htdocs/luci-static/resources/fchomo.js:1437 msgid "Port %s alrealy exists!" msgstr "" @@ -2191,7 +2220,7 @@ msgstr "" msgid "Port hop interval" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:351 +#: htdocs/luci-static/resources/view/fchomo/node.js:362 msgid "Port range" msgstr "" @@ -2204,22 +2233,23 @@ msgstr "" msgid "Ports pool" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:214 -#: htdocs/luci-static/resources/view/fchomo/node.js:500 -#: htdocs/luci-static/resources/view/fchomo/node.js:762 +#: htdocs/luci-static/resources/fchomo/listeners.js:225 +#: htdocs/luci-static/resources/fchomo/listeners.js:455 +#: htdocs/luci-static/resources/view/fchomo/node.js:511 +#: htdocs/luci-static/resources/view/fchomo/node.js:780 msgid "Pre-shared key" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:837 -#: htdocs/luci-static/resources/view/fchomo/node.js:974 +#: htdocs/luci-static/resources/fchomo/listeners.js:874 +#: htdocs/luci-static/resources/view/fchomo/node.js:993 msgid "Pre-shared key of rendezvous server" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:175 +#: htdocs/luci-static/resources/fchomo.js:176 msgid "Prefer IPv4" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:176 +#: htdocs/luci-static/resources/fchomo.js:177 msgid "Prefer IPv6" msgstr "" @@ -2230,23 +2260,23 @@ msgstr "" #: htdocs/luci-static/resources/view/fchomo/global.js:736 #: htdocs/luci-static/resources/view/fchomo/global.js:753 -#: htdocs/luci-static/resources/view/fchomo/node.js:1457 -#: htdocs/luci-static/resources/view/fchomo/node.js:1463 -#: htdocs/luci-static/resources/view/fchomo/node.js:1773 -#: htdocs/luci-static/resources/view/fchomo/node.js:1780 +#: htdocs/luci-static/resources/view/fchomo/node.js:1476 +#: htdocs/luci-static/resources/view/fchomo/node.js:1482 +#: htdocs/luci-static/resources/view/fchomo/node.js:1792 +#: htdocs/luci-static/resources/view/fchomo/node.js:1799 msgid "Priority: Proxy Node > Global." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:313 +#: htdocs/luci-static/resources/view/fchomo/node.js:324 msgid "Priv-key" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:317 +#: htdocs/luci-static/resources/view/fchomo/node.js:328 msgid "Priv-key passphrase" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:675 -#: htdocs/luci-static/resources/view/fchomo/node.js:747 +#: htdocs/luci-static/resources/view/fchomo/node.js:693 +#: htdocs/luci-static/resources/view/fchomo/node.js:765 msgid "Private key" msgstr "" @@ -2255,28 +2285,28 @@ msgid "Process matching mode" msgstr "" #: htdocs/luci-static/resources/view/fchomo/global.js:684 -#: htdocs/luci-static/resources/view/fchomo/node.js:1369 +#: htdocs/luci-static/resources/view/fchomo/node.js:1388 msgid "Protocol" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:662 +#: htdocs/luci-static/resources/view/fchomo/node.js:680 msgid "Protocol parameter. Enable length block encryption." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:656 +#: htdocs/luci-static/resources/view/fchomo/node.js:674 msgid "" "Protocol parameter. Will waste traffic randomly if enabled (enabled by " "default in v2ray and cannot be disabled)." msgstr "" #: htdocs/luci-static/resources/view/fchomo/client.js:1055 -#: htdocs/luci-static/resources/view/fchomo/node.js:1476 -#: htdocs/luci-static/resources/view/fchomo/node.js:1485 -#: htdocs/luci-static/resources/view/fchomo/node.js:1889 +#: htdocs/luci-static/resources/view/fchomo/node.js:1495 +#: htdocs/luci-static/resources/view/fchomo/node.js:1504 +#: htdocs/luci-static/resources/view/fchomo/node.js:1908 msgid "Provider" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1656 +#: htdocs/luci-static/resources/view/fchomo/node.js:1675 msgid "Provider URL" msgstr "" @@ -2299,19 +2329,19 @@ msgid "Proxy MAC-s" msgstr "" #: htdocs/luci-static/resources/view/fchomo/node.js:208 -#: htdocs/luci-static/resources/view/fchomo/node.js:1888 +#: htdocs/luci-static/resources/view/fchomo/node.js:1907 msgid "Proxy Node" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1864 -#: htdocs/luci-static/resources/view/fchomo/node.js:1873 +#: htdocs/luci-static/resources/view/fchomo/node.js:1883 +#: htdocs/luci-static/resources/view/fchomo/node.js:1892 msgid "Proxy chain" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:573 +#: htdocs/luci-static/resources/fchomo/listeners.js:610 #: htdocs/luci-static/resources/view/fchomo/client.js:783 #: htdocs/luci-static/resources/view/fchomo/client.js:1543 -#: htdocs/luci-static/resources/view/fchomo/node.js:1674 +#: htdocs/luci-static/resources/view/fchomo/node.js:1693 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:388 msgid "Proxy group" msgstr "" @@ -2328,8 +2358,8 @@ msgstr "" msgid "Proxy routerself" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:532 -#: htdocs/luci-static/resources/view/fchomo/node.js:727 +#: htdocs/luci-static/resources/view/fchomo/node.js:550 +#: htdocs/luci-static/resources/view/fchomo/node.js:745 msgid "QUIC" msgstr "" @@ -2338,44 +2368,44 @@ msgstr "" msgid "Quick Reload" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:1020 -#: htdocs/luci-static/resources/view/fchomo/node.js:1149 +#: htdocs/luci-static/resources/fchomo/listeners.js:1063 +#: htdocs/luci-static/resources/view/fchomo/node.js:1168 msgid "REALITY" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1164 +#: htdocs/luci-static/resources/view/fchomo/node.js:1183 msgid "REALITY X25519MLKEM768 PQC support" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:1057 +#: htdocs/luci-static/resources/fchomo/listeners.js:1100 msgid "REALITY certificate issued to" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:1025 +#: htdocs/luci-static/resources/fchomo/listeners.js:1068 msgid "REALITY handshake server" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:1032 +#: htdocs/luci-static/resources/fchomo/listeners.js:1075 msgid "REALITY private key" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:1047 -#: htdocs/luci-static/resources/view/fchomo/node.js:1154 +#: htdocs/luci-static/resources/fchomo/listeners.js:1090 +#: htdocs/luci-static/resources/view/fchomo/node.js:1173 msgid "REALITY public key" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:1051 -#: htdocs/luci-static/resources/view/fchomo/node.js:1159 +#: htdocs/luci-static/resources/fchomo/listeners.js:1094 +#: htdocs/luci-static/resources/view/fchomo/node.js:1178 msgid "REALITY short ID" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:670 -#: htdocs/luci-static/resources/fchomo/listeners.js:689 -#: htdocs/luci-static/resources/view/fchomo/node.js:929 +#: htdocs/luci-static/resources/fchomo/listeners.js:707 +#: htdocs/luci-static/resources/fchomo/listeners.js:726 +#: htdocs/luci-static/resources/view/fchomo/node.js:948 msgid "RTT" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:374 +#: htdocs/luci-static/resources/fchomo.js:375 msgid "Random" msgstr "" @@ -2383,21 +2413,21 @@ msgstr "" msgid "Random will be used if empty." msgstr "" -#: htdocs/luci-static/resources/fchomo.js:384 +#: htdocs/luci-static/resources/fchomo.js:385 msgid "Randomized traffic characteristics" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:826 -#: htdocs/luci-static/resources/view/fchomo/node.js:963 +#: htdocs/luci-static/resources/fchomo/listeners.js:863 +#: htdocs/luci-static/resources/view/fchomo/node.js:982 msgid "Realm" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:842 -#: htdocs/luci-static/resources/view/fchomo/node.js:979 +#: htdocs/luci-static/resources/fchomo/listeners.js:879 +#: htdocs/luci-static/resources/view/fchomo/node.js:998 msgid "Realm ID" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:237 +#: htdocs/luci-static/resources/fchomo/listeners.js:248 msgid "Realm name pattern" msgstr "" @@ -2421,7 +2451,7 @@ msgstr "" msgid "Refresh every %s seconds." msgstr "" -#: htdocs/luci-static/resources/fchomo.js:1192 +#: htdocs/luci-static/resources/fchomo.js:1193 #: htdocs/luci-static/resources/view/fchomo/client.js:927 #: htdocs/luci-static/resources/view/fchomo/global.js:193 #: htdocs/luci-static/resources/view/fchomo/server.js:45 @@ -2432,69 +2462,69 @@ msgstr "" msgid "Reload All" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1601 +#: htdocs/luci-static/resources/view/fchomo/node.js:1620 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:278 msgid "Remote" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:710 -#: htdocs/luci-static/resources/view/fchomo/node.js:793 +#: htdocs/luci-static/resources/view/fchomo/node.js:728 +#: htdocs/luci-static/resources/view/fchomo/node.js:811 msgid "Remote DNS resolve" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:1357 +#: htdocs/luci-static/resources/fchomo.js:1358 msgid "Remove" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:1362 -#: htdocs/luci-static/resources/view/fchomo/node.js:1577 -#: htdocs/luci-static/resources/view/fchomo/node.js:1579 +#: htdocs/luci-static/resources/fchomo.js:1363 +#: htdocs/luci-static/resources/view/fchomo/node.js:1596 +#: htdocs/luci-static/resources/view/fchomo/node.js:1598 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:251 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:253 msgid "Remove idles" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:831 -#: htdocs/luci-static/resources/view/fchomo/node.js:968 +#: htdocs/luci-static/resources/fchomo/listeners.js:868 +#: htdocs/luci-static/resources/view/fchomo/node.js:987 msgid "Rendezvous server" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1703 +#: htdocs/luci-static/resources/view/fchomo/node.js:1722 msgid "Replace name" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1704 +#: htdocs/luci-static/resources/view/fchomo/node.js:1723 msgid "Replace node name." msgstr "" -#: htdocs/luci-static/resources/fchomo.js:358 +#: htdocs/luci-static/resources/fchomo.js:359 msgid "Request" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:1105 -#: htdocs/luci-static/resources/view/fchomo/node.js:1237 -#: htdocs/luci-static/resources/view/fchomo/node.js:1244 +#: htdocs/luci-static/resources/fchomo/listeners.js:1148 +#: htdocs/luci-static/resources/view/fchomo/node.js:1256 +#: htdocs/luci-static/resources/view/fchomo/node.js:1263 msgid "Request path" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:567 +#: htdocs/luci-static/resources/view/fchomo/node.js:585 msgid "Request timeout" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:361 +#: htdocs/luci-static/resources/fchomo.js:362 msgid "Require and verify" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:359 +#: htdocs/luci-static/resources/fchomo.js:360 msgid "Require any" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:392 -#: htdocs/luci-static/resources/view/fchomo/node.js:1165 +#: htdocs/luci-static/resources/fchomo.js:393 +#: htdocs/luci-static/resources/view/fchomo/node.js:1184 msgid "Requires server support." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:776 +#: htdocs/luci-static/resources/view/fchomo/node.js:794 msgid "Reserved field bytes" msgstr "" @@ -2502,7 +2532,7 @@ msgstr "" msgid "Resources management" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:851 +#: htdocs/luci-static/resources/view/fchomo/node.js:869 msgid "Restls script" msgstr "" @@ -2516,12 +2546,12 @@ msgid "" "Returns the string input for icon in the API to display in this proxy group." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:484 +#: htdocs/luci-static/resources/view/fchomo/node.js:495 msgid "Reuse HTTP connections to reduce RTT for each connection establishment." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:481 -#: htdocs/luci-static/resources/view/fchomo/node.js:485 +#: htdocs/luci-static/resources/view/fchomo/node.js:492 +#: htdocs/luci-static/resources/view/fchomo/node.js:496 msgid "Reusing a single tunnel to carry multiple target connections within it." msgstr "" @@ -2538,8 +2568,8 @@ msgstr "" msgid "Routing GFW" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1462 -#: htdocs/luci-static/resources/view/fchomo/node.js:1779 +#: htdocs/luci-static/resources/view/fchomo/node.js:1481 +#: htdocs/luci-static/resources/view/fchomo/node.js:1798 msgid "Routing mark" msgstr "" @@ -2599,11 +2629,11 @@ msgstr "" msgid "Ruleset-URI-Scheme" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:1205 +#: htdocs/luci-static/resources/fchomo.js:1206 msgid "Running" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:240 +#: htdocs/luci-static/resources/fchomo.js:241 msgid "SMTP" msgstr "" @@ -2611,20 +2641,20 @@ msgstr "" msgid "SOCKS" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:188 +#: htdocs/luci-static/resources/fchomo.js:189 msgid "SOCKS5" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:204 +#: htdocs/luci-static/resources/fchomo.js:205 msgid "SSH" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:241 +#: htdocs/luci-static/resources/fchomo.js:242 msgid "STUN" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:848 -#: htdocs/luci-static/resources/view/fchomo/node.js:985 +#: htdocs/luci-static/resources/fchomo/listeners.js:885 +#: htdocs/luci-static/resources/view/fchomo/node.js:1004 msgid "STUN servers" msgstr "" @@ -2632,7 +2662,7 @@ msgstr "" msgid "SUB-RULE" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:886 +#: htdocs/luci-static/resources/view/fchomo/node.js:905 msgid "SUoT version" msgstr "" @@ -2641,11 +2671,11 @@ msgstr "" msgid "Salamander" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:181 +#: htdocs/luci-static/resources/fchomo.js:182 msgid "Same dstaddr requests. Same node" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:182 +#: htdocs/luci-static/resources/fchomo.js:183 msgid "Same srcaddr and dstaddr requests. Same node" msgstr "" @@ -2653,7 +2683,7 @@ msgstr "" msgid "Segment maximum size" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:229 +#: htdocs/luci-static/resources/fchomo.js:230 msgid "Select" msgstr "" @@ -2661,18 +2691,18 @@ msgstr "" msgid "Select Dashboard" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:398 +#: htdocs/luci-static/resources/fchomo.js:399 msgid "Send padding randomly 0-3333 bytes with 50% probability." msgstr "" -#: htdocs/luci-static/resources/fchomo.js:387 #: htdocs/luci-static/resources/fchomo.js:388 +#: htdocs/luci-static/resources/fchomo.js:389 msgid "Send random ticket of 300s-600s duration for client 0-RTT reuse." msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:670 -#: htdocs/luci-static/resources/fchomo/listeners.js:918 -#: htdocs/luci-static/resources/fchomo/listeners.js:933 +#: htdocs/luci-static/resources/fchomo/listeners.js:707 +#: htdocs/luci-static/resources/fchomo/listeners.js:961 +#: htdocs/luci-static/resources/fchomo/listeners.js:976 #: htdocs/luci-static/resources/view/fchomo/server.js:58 #: root/usr/share/luci/menu.d/luci-app-fchomo.json:62 msgid "Server" @@ -2682,9 +2712,9 @@ msgstr "" msgid "Server address" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:1099 -#: htdocs/luci-static/resources/view/fchomo/node.js:1216 -#: htdocs/luci-static/resources/view/fchomo/node.js:1222 +#: htdocs/luci-static/resources/fchomo/listeners.js:1142 +#: htdocs/luci-static/resources/view/fchomo/node.js:1235 +#: htdocs/luci-static/resources/view/fchomo/node.js:1241 msgid "Server hostname" msgstr "" @@ -2697,26 +2727,26 @@ msgid "Service status" msgstr "" #: htdocs/luci-static/resources/fchomo.js:156 -#: htdocs/luci-static/resources/fchomo.js:189 +#: htdocs/luci-static/resources/fchomo.js:190 msgid "Shadowsocks" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:476 -#: htdocs/luci-static/resources/view/fchomo/node.js:586 +#: htdocs/luci-static/resources/fchomo/listeners.js:505 +#: htdocs/luci-static/resources/view/fchomo/node.js:604 msgid "Shadowsocks chipher" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:471 -#: htdocs/luci-static/resources/view/fchomo/node.js:581 +#: htdocs/luci-static/resources/fchomo/listeners.js:500 +#: htdocs/luci-static/resources/view/fchomo/node.js:599 msgid "Shadowsocks encrypt" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:484 -#: htdocs/luci-static/resources/view/fchomo/node.js:594 +#: htdocs/luci-static/resources/fchomo/listeners.js:513 +#: htdocs/luci-static/resources/view/fchomo/node.js:612 msgid "Shadowsocks password" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1417 +#: htdocs/luci-static/resources/view/fchomo/node.js:1436 msgid "Show connections in the dashboard for breaking connections easier." msgstr "" @@ -2724,18 +2754,18 @@ msgstr "" msgid "Silent" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:180 +#: htdocs/luci-static/resources/fchomo.js:181 msgid "Simple round-robin all nodes" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1662 +#: htdocs/luci-static/resources/view/fchomo/node.js:1681 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:376 msgid "Size limit" msgstr "" #: htdocs/luci-static/resources/view/fchomo/client.js:1576 -#: htdocs/luci-static/resources/view/fchomo/node.js:1086 -#: htdocs/luci-static/resources/view/fchomo/node.js:1754 +#: htdocs/luci-static/resources/view/fchomo/node.js:1105 +#: htdocs/luci-static/resources/view/fchomo/node.js:1773 msgid "Skip cert verify" msgstr "" @@ -2751,7 +2781,8 @@ msgstr "" msgid "Skiped sniffing src address" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:193 +#: htdocs/luci-static/resources/fchomo.js:159 +#: htdocs/luci-static/resources/fchomo.js:194 msgid "Snell" msgstr "" @@ -2767,7 +2798,7 @@ msgstr "" msgid "Sniffer settings" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:430 +#: htdocs/luci-static/resources/fchomo.js:431 msgid "Specify a ID" msgstr "" @@ -2786,11 +2817,11 @@ msgstr "" msgid "Standard" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:244 +#: htdocs/luci-static/resources/fchomo.js:245 msgid "Steam Client" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:245 +#: htdocs/luci-static/resources/fchomo.js:246 msgid "Steam P2P" msgstr "" @@ -2799,7 +2830,7 @@ msgstr "" msgid "Strategy" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:567 +#: htdocs/luci-static/resources/fchomo/listeners.js:604 #: htdocs/luci-static/resources/view/fchomo/client.js:1303 #: htdocs/luci-static/resources/view/fchomo/client.js:1312 msgid "Sub rule" @@ -2809,7 +2840,7 @@ msgstr "" msgid "Sub rule group" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:690 +#: htdocs/luci-static/resources/fchomo.js:691 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:223 msgid "Successfully imported %s %s of total %s." msgstr "" @@ -2818,12 +2849,12 @@ msgstr "" msgid "Successfully updated." msgstr "" -#: htdocs/luci-static/resources/fchomo.js:1707 +#: htdocs/luci-static/resources/fchomo.js:1708 msgid "Successfully uploaded." msgstr "" #: htdocs/luci-static/resources/fchomo.js:158 -#: htdocs/luci-static/resources/fchomo.js:192 +#: htdocs/luci-static/resources/fchomo.js:193 msgid "Sudoku" msgstr "" @@ -2847,15 +2878,16 @@ msgstr "" #: htdocs/luci-static/resources/fchomo.js:160 #: htdocs/luci-static/resources/fchomo.js:161 #: htdocs/luci-static/resources/fchomo.js:162 -#: htdocs/luci-static/resources/fchomo.js:187 -#: htdocs/luci-static/resources/fchomo.js:192 +#: htdocs/luci-static/resources/fchomo.js:163 +#: htdocs/luci-static/resources/fchomo.js:188 #: htdocs/luci-static/resources/fchomo.js:193 #: htdocs/luci-static/resources/fchomo.js:194 #: htdocs/luci-static/resources/fchomo.js:195 #: htdocs/luci-static/resources/fchomo.js:196 #: htdocs/luci-static/resources/fchomo.js:197 -#: htdocs/luci-static/resources/fchomo.js:204 -#: htdocs/luci-static/resources/fchomo/listeners.js:601 +#: htdocs/luci-static/resources/fchomo.js:198 +#: htdocs/luci-static/resources/fchomo.js:205 +#: htdocs/luci-static/resources/fchomo/listeners.js:638 #: htdocs/luci-static/resources/view/fchomo/client.js:589 #: htdocs/luci-static/resources/view/fchomo/client.js:679 msgid "TCP" @@ -2865,7 +2897,7 @@ msgstr "" msgid "TCP concurrency" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1410 +#: htdocs/luci-static/resources/view/fchomo/node.js:1429 msgid "TCP only" msgstr "" @@ -2881,37 +2913,37 @@ msgstr "" #: htdocs/luci-static/resources/fchomo.js:155 #: htdocs/luci-static/resources/fchomo.js:156 #: htdocs/luci-static/resources/fchomo.js:157 -#: htdocs/luci-static/resources/fchomo.js:165 #: htdocs/luci-static/resources/fchomo.js:166 #: htdocs/luci-static/resources/fchomo.js:167 -#: htdocs/luci-static/resources/fchomo.js:186 -#: htdocs/luci-static/resources/fchomo.js:188 +#: htdocs/luci-static/resources/fchomo.js:168 +#: htdocs/luci-static/resources/fchomo.js:187 #: htdocs/luci-static/resources/fchomo.js:189 -#: htdocs/luci-static/resources/fchomo.js:191 -#: htdocs/luci-static/resources/fchomo.js:202 +#: htdocs/luci-static/resources/fchomo.js:190 +#: htdocs/luci-static/resources/fchomo.js:192 +#: htdocs/luci-static/resources/fchomo.js:203 msgid "TCP/UDP" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1441 -#: htdocs/luci-static/resources/view/fchomo/node.js:1721 +#: htdocs/luci-static/resources/view/fchomo/node.js:1460 +#: htdocs/luci-static/resources/view/fchomo/node.js:1740 msgid "TFO" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:540 -#: htdocs/luci-static/resources/fchomo/listeners.js:858 +#: htdocs/luci-static/resources/fchomo/listeners.js:569 +#: htdocs/luci-static/resources/fchomo/listeners.js:901 #: htdocs/luci-static/resources/view/fchomo/global.js:529 -#: htdocs/luci-static/resources/view/fchomo/node.js:465 -#: htdocs/luci-static/resources/view/fchomo/node.js:818 -#: htdocs/luci-static/resources/view/fchomo/node.js:995 +#: htdocs/luci-static/resources/view/fchomo/node.js:476 +#: htdocs/luci-static/resources/view/fchomo/node.js:836 +#: htdocs/luci-static/resources/view/fchomo/node.js:1014 msgid "TLS" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:912 -#: htdocs/luci-static/resources/view/fchomo/node.js:1026 +#: htdocs/luci-static/resources/fchomo/listeners.js:955 +#: htdocs/luci-static/resources/view/fchomo/node.js:1045 msgid "TLS ALPN" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1020 +#: htdocs/luci-static/resources/view/fchomo/node.js:1039 msgid "TLS SNI" msgstr "" @@ -2920,16 +2952,16 @@ msgstr "" msgid "TLS fields" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:163 -#: htdocs/luci-static/resources/fchomo.js:200 +#: htdocs/luci-static/resources/fchomo.js:164 +#: htdocs/luci-static/resources/fchomo.js:201 msgid "TUIC" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:242 +#: htdocs/luci-static/resources/fchomo.js:243 msgid "TURN" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:523 +#: htdocs/luci-static/resources/fchomo/listeners.js:552 msgid "Target address" msgstr "" @@ -2938,39 +2970,39 @@ msgid "" "Tell the client to use the BBR flow control algorithm instead of Hysteria CC." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:691 -#: htdocs/luci-static/resources/view/fchomo/node.js:699 +#: htdocs/luci-static/resources/view/fchomo/node.js:709 +#: htdocs/luci-static/resources/view/fchomo/node.js:717 msgid "The %s address used by local machine in the Cloudflare WARP network." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:734 -#: htdocs/luci-static/resources/view/fchomo/node.js:742 +#: htdocs/luci-static/resources/view/fchomo/node.js:752 +#: htdocs/luci-static/resources/view/fchomo/node.js:760 msgid "The %s address used by local machine in the Wireguard network." msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:933 -#: htdocs/luci-static/resources/view/fchomo/node.js:1109 +#: htdocs/luci-static/resources/fchomo/listeners.js:976 +#: htdocs/luci-static/resources/view/fchomo/node.js:1128 msgid "The %s private key, in PEM format." msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:918 -#: htdocs/luci-static/resources/fchomo/listeners.js:956 +#: htdocs/luci-static/resources/fchomo/listeners.js:961 +#: htdocs/luci-static/resources/fchomo/listeners.js:999 #: htdocs/luci-static/resources/view/fchomo/global.js:550 -#: htdocs/luci-static/resources/view/fchomo/node.js:1095 +#: htdocs/luci-static/resources/view/fchomo/node.js:1114 msgid "The %s public key, in PEM format." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1129 +#: htdocs/luci-static/resources/view/fchomo/node.js:1148 msgid "" "The ECH parameter of the HTTPS record for the domain. Leave empty to resolve " "via DNS." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:387 +#: htdocs/luci-static/resources/view/fchomo/node.js:398 msgid "The ED25519 available private key or UUID provided by Sudoku server." msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:286 +#: htdocs/luci-static/resources/fchomo/listeners.js:297 msgid "The ED25519 master public key or UUID generated by Sudoku." msgstr "" @@ -2978,8 +3010,8 @@ msgstr "" msgid "The default value is 2:00 every day." msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:702 -#: htdocs/luci-static/resources/view/fchomo/node.js:942 +#: htdocs/luci-static/resources/fchomo/listeners.js:739 +#: htdocs/luci-static/resources/view/fchomo/node.js:961 msgid "" "The first padding must have a probability of 100% and at least 35 bytes." msgstr "" @@ -2994,25 +3026,25 @@ msgstr "" msgid "The matching %s will be deemed as poisoned." msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:700 -#: htdocs/luci-static/resources/view/fchomo/node.js:940 +#: htdocs/luci-static/resources/fchomo/listeners.js:737 +#: htdocs/luci-static/resources/view/fchomo/node.js:959 msgid "The server and client can set different padding parameters." msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:1014 +#: htdocs/luci-static/resources/fchomo/listeners.js:1057 #: htdocs/luci-static/resources/view/fchomo/global.js:594 msgid "This ECH parameter needs to be added to the HTTPS record of the domain." msgstr "" #: htdocs/luci-static/resources/view/fchomo/client.js:1579 -#: htdocs/luci-static/resources/view/fchomo/node.js:1089 -#: htdocs/luci-static/resources/view/fchomo/node.js:1757 +#: htdocs/luci-static/resources/view/fchomo/node.js:1108 +#: htdocs/luci-static/resources/view/fchomo/node.js:1776 msgid "" "This is DANGEROUS, your traffic is almost like " "PLAIN TEXT! Use at your own risk!" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:537 +#: htdocs/luci-static/resources/view/fchomo/node.js:555 msgid "" "This is the TUIC port of the SUoT protocol, designed to provide a QUIC " "stream based UDP relay mode that TUIC does not provide." @@ -3041,23 +3073,23 @@ msgstr "" msgid "Tproxy port" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:274 -#: htdocs/luci-static/resources/view/fchomo/node.js:379 +#: htdocs/luci-static/resources/fchomo/listeners.js:285 +#: htdocs/luci-static/resources/view/fchomo/node.js:390 msgid "Traffic pattern" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1916 +#: htdocs/luci-static/resources/view/fchomo/node.js:1935 msgid "Transit proxy group" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1922 +#: htdocs/luci-static/resources/view/fchomo/node.js:1941 msgid "Transit proxy node" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:262 -#: htdocs/luci-static/resources/fchomo/listeners.js:1065 -#: htdocs/luci-static/resources/view/fchomo/node.js:356 -#: htdocs/luci-static/resources/view/fchomo/node.js:1171 +#: htdocs/luci-static/resources/fchomo/listeners.js:273 +#: htdocs/luci-static/resources/fchomo/listeners.js:1108 +#: htdocs/luci-static/resources/view/fchomo/node.js:367 +#: htdocs/luci-static/resources/view/fchomo/node.js:1190 msgid "Transport" msgstr "" @@ -3066,8 +3098,8 @@ msgstr "" msgid "Transport fields" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:1070 -#: htdocs/luci-static/resources/view/fchomo/node.js:1176 +#: htdocs/luci-static/resources/fchomo/listeners.js:1113 +#: htdocs/luci-static/resources/view/fchomo/node.js:1195 msgid "Transport type" msgstr "" @@ -3075,17 +3107,17 @@ msgstr "" msgid "Treat the destination IP as the source IP." msgstr "" -#: htdocs/luci-static/resources/fchomo.js:161 -#: htdocs/luci-static/resources/fchomo.js:196 +#: htdocs/luci-static/resources/fchomo.js:162 +#: htdocs/luci-static/resources/fchomo.js:197 msgid "Trojan" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:166 -#: htdocs/luci-static/resources/fchomo.js:202 +#: htdocs/luci-static/resources/fchomo.js:167 +#: htdocs/luci-static/resources/fchomo.js:203 msgid "TrustTunnel" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:232 +#: htdocs/luci-static/resources/fchomo/listeners.js:243 msgid "Trusted proxy header" msgstr "" @@ -3105,7 +3137,7 @@ msgstr "" msgid "Tun stack." msgstr "" -#: htdocs/luci-static/resources/fchomo.js:167 +#: htdocs/luci-static/resources/fchomo.js:168 msgid "Tunnel" msgstr "" @@ -3116,24 +3148,24 @@ msgstr "" #: htdocs/luci-static/resources/view/fchomo/client.js:842 #: htdocs/luci-static/resources/view/fchomo/client.js:1028 #: htdocs/luci-static/resources/view/fchomo/node.js:239 -#: htdocs/luci-static/resources/view/fchomo/node.js:1599 -#: htdocs/luci-static/resources/view/fchomo/node.js:1887 +#: htdocs/luci-static/resources/view/fchomo/node.js:1618 +#: htdocs/luci-static/resources/view/fchomo/node.js:1906 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:276 msgid "Type" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:163 #: htdocs/luci-static/resources/fchomo.js:164 -#: htdocs/luci-static/resources/fchomo.js:199 +#: htdocs/luci-static/resources/fchomo.js:165 #: htdocs/luci-static/resources/fchomo.js:200 #: htdocs/luci-static/resources/fchomo.js:201 -#: htdocs/luci-static/resources/fchomo.js:203 -#: htdocs/luci-static/resources/fchomo/listeners.js:602 -#: htdocs/luci-static/resources/fchomo/listeners.js:607 +#: htdocs/luci-static/resources/fchomo.js:202 +#: htdocs/luci-static/resources/fchomo.js:204 +#: htdocs/luci-static/resources/fchomo/listeners.js:639 +#: htdocs/luci-static/resources/fchomo/listeners.js:644 #: htdocs/luci-static/resources/view/fchomo/client.js:588 #: htdocs/luci-static/resources/view/fchomo/client.js:678 -#: htdocs/luci-static/resources/view/fchomo/node.js:875 -#: htdocs/luci-static/resources/view/fchomo/node.js:1731 +#: htdocs/luci-static/resources/view/fchomo/node.js:893 +#: htdocs/luci-static/resources/view/fchomo/node.js:1750 msgid "UDP" msgstr "" @@ -3141,42 +3173,42 @@ msgstr "" msgid "UDP NAT expiration time" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:536 +#: htdocs/luci-static/resources/view/fchomo/node.js:554 msgid "UDP over stream" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:542 +#: htdocs/luci-static/resources/view/fchomo/node.js:560 msgid "UDP over stream version" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:529 +#: htdocs/luci-static/resources/view/fchomo/node.js:547 msgid "UDP packet relay mode." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:528 +#: htdocs/luci-static/resources/view/fchomo/node.js:546 msgid "UDP relay mode" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:361 -#: htdocs/luci-static/resources/fchomo/listeners.js:362 -#: htdocs/luci-static/resources/view/fchomo/node.js:411 -#: htdocs/luci-static/resources/view/fchomo/node.js:412 +#: htdocs/luci-static/resources/fchomo/listeners.js:372 +#: htdocs/luci-static/resources/fchomo/listeners.js:373 +#: htdocs/luci-static/resources/view/fchomo/node.js:422 +#: htdocs/luci-static/resources/view/fchomo/node.js:423 msgid "UP: %s; DOWN: %s" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:231 +#: htdocs/luci-static/resources/fchomo.js:232 msgid "URL test" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:283 -#: htdocs/luci-static/resources/fchomo/listeners.js:444 -#: htdocs/luci-static/resources/fchomo/listeners.js:499 -#: htdocs/luci-static/resources/view/fchomo/node.js:516 -#: htdocs/luci-static/resources/view/fchomo/node.js:625 +#: htdocs/luci-static/resources/fchomo/listeners.js:294 +#: htdocs/luci-static/resources/fchomo/listeners.js:473 +#: htdocs/luci-static/resources/fchomo/listeners.js:528 +#: htdocs/luci-static/resources/view/fchomo/node.js:534 +#: htdocs/luci-static/resources/view/fchomo/node.js:643 msgid "UUID" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:1250 +#: htdocs/luci-static/resources/fchomo.js:1251 msgid "Unable to download unsupported type: %s" msgstr "" @@ -3201,8 +3233,8 @@ msgstr "" msgid "Unknown error: %s" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:880 -#: htdocs/luci-static/resources/view/fchomo/node.js:1736 +#: htdocs/luci-static/resources/view/fchomo/node.js:899 +#: htdocs/luci-static/resources/view/fchomo/node.js:1755 msgid "UoT" msgstr "" @@ -3210,22 +3242,22 @@ msgstr "" msgid "Update failed." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1668 +#: htdocs/luci-static/resources/view/fchomo/node.js:1687 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:382 msgid "Update interval" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1428 +#: htdocs/luci-static/resources/view/fchomo/node.js:1447 msgid "Upload bandwidth" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1429 +#: htdocs/luci-static/resources/view/fchomo/node.js:1448 msgid "Upload bandwidth in Mbps." msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:924 -#: htdocs/luci-static/resources/fchomo/listeners.js:964 -#: htdocs/luci-static/resources/view/fchomo/node.js:1100 +#: htdocs/luci-static/resources/fchomo/listeners.js:967 +#: htdocs/luci-static/resources/fchomo/listeners.js:1007 +#: htdocs/luci-static/resources/view/fchomo/node.js:1119 msgid "Upload certificate" msgstr "" @@ -3233,17 +3265,17 @@ msgstr "" msgid "Upload initial package" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:939 -#: htdocs/luci-static/resources/view/fchomo/node.js:1114 +#: htdocs/luci-static/resources/fchomo/listeners.js:982 +#: htdocs/luci-static/resources/view/fchomo/node.js:1133 msgid "Upload key" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:927 -#: htdocs/luci-static/resources/fchomo/listeners.js:942 -#: htdocs/luci-static/resources/fchomo/listeners.js:967 +#: htdocs/luci-static/resources/fchomo/listeners.js:970 +#: htdocs/luci-static/resources/fchomo/listeners.js:985 +#: htdocs/luci-static/resources/fchomo/listeners.js:1010 #: htdocs/luci-static/resources/view/fchomo/global.js:306 -#: htdocs/luci-static/resources/view/fchomo/node.js:1103 -#: htdocs/luci-static/resources/view/fchomo/node.js:1117 +#: htdocs/luci-static/resources/view/fchomo/node.js:1122 +#: htdocs/luci-static/resources/view/fchomo/node.js:1136 msgid "Upload..." msgstr "" @@ -3267,7 +3299,7 @@ msgstr "" msgid "Used to resolve the domain of the Proxy node." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1021 +#: htdocs/luci-static/resources/view/fchomo/node.js:1040 msgid "Used to verify the hostname on the returned certificates." msgstr "" @@ -3275,7 +3307,7 @@ msgstr "" msgid "User Authentication" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:269 +#: htdocs/luci-static/resources/fchomo/listeners.js:280 msgid "User-hint is mandatory" msgstr "" @@ -3288,41 +3320,42 @@ msgstr "" msgid "Users filter mode" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1285 +#: htdocs/luci-static/resources/view/fchomo/node.js:1304 msgid "V2ray HTTPUpgrade" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1290 +#: htdocs/luci-static/resources/view/fchomo/node.js:1309 msgid "V2ray HTTPUpgrade fast open" msgstr "" +#: htdocs/luci-static/resources/fchomo.js:161 +#: htdocs/luci-static/resources/fchomo.js:196 +msgid "VLESS" +msgstr "" + #: htdocs/luci-static/resources/fchomo.js:160 #: htdocs/luci-static/resources/fchomo.js:195 -msgid "VLESS" -msgstr "" - -#: htdocs/luci-static/resources/fchomo.js:159 -#: htdocs/luci-static/resources/fchomo.js:194 msgid "VMess" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1605 -#: htdocs/luci-static/resources/view/fchomo/node.js:1893 +#: htdocs/luci-static/resources/view/fchomo/node.js:1624 +#: htdocs/luci-static/resources/view/fchomo/node.js:1912 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:319 msgid "Value" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:360 +#: htdocs/luci-static/resources/fchomo.js:361 msgid "Verify if given" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:557 -#: htdocs/luci-static/resources/view/fchomo/node.js:507 -#: htdocs/luci-static/resources/view/fchomo/node.js:837 +#: htdocs/luci-static/resources/fchomo/listeners.js:462 +#: htdocs/luci-static/resources/fchomo/listeners.js:594 +#: htdocs/luci-static/resources/view/fchomo/node.js:518 +#: htdocs/luci-static/resources/view/fchomo/node.js:855 msgid "Version" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:845 +#: htdocs/luci-static/resources/view/fchomo/node.js:863 msgid "Version hint" msgstr "" @@ -3331,7 +3364,7 @@ msgstr "" msgid "Vless Encryption fields" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:397 +#: htdocs/luci-static/resources/fchomo.js:398 msgid "Wait a random 0-111 milliseconds with 75% probability." msgstr "" @@ -3339,16 +3372,16 @@ msgstr "" msgid "Warning" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:429 -#: htdocs/luci-static/resources/fchomo/listeners.js:1072 -#: htdocs/luci-static/resources/fchomo/listeners.js:1081 -#: htdocs/luci-static/resources/fchomo/listeners.js:1088 -#: htdocs/luci-static/resources/view/fchomo/node.js:461 -#: htdocs/luci-static/resources/view/fchomo/node.js:490 -#: htdocs/luci-static/resources/view/fchomo/node.js:1181 -#: htdocs/luci-static/resources/view/fchomo/node.js:1192 -#: htdocs/luci-static/resources/view/fchomo/node.js:1199 -#: htdocs/luci-static/resources/view/fchomo/node.js:1205 +#: htdocs/luci-static/resources/fchomo/listeners.js:440 +#: htdocs/luci-static/resources/fchomo/listeners.js:1115 +#: htdocs/luci-static/resources/fchomo/listeners.js:1124 +#: htdocs/luci-static/resources/fchomo/listeners.js:1131 +#: htdocs/luci-static/resources/view/fchomo/node.js:472 +#: htdocs/luci-static/resources/view/fchomo/node.js:501 +#: htdocs/luci-static/resources/view/fchomo/node.js:1200 +#: htdocs/luci-static/resources/view/fchomo/node.js:1211 +#: htdocs/luci-static/resources/view/fchomo/node.js:1218 +#: htdocs/luci-static/resources/view/fchomo/node.js:1224 msgid "WebSocket" msgstr "" @@ -3360,52 +3393,52 @@ msgstr "" msgid "White list" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:203 +#: htdocs/luci-static/resources/fchomo.js:204 msgid "WireGuard" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:756 +#: htdocs/luci-static/resources/view/fchomo/node.js:774 msgid "WireGuard peer public key." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:763 +#: htdocs/luci-static/resources/view/fchomo/node.js:781 msgid "WireGuard pre-shared key." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:748 +#: htdocs/luci-static/resources/view/fchomo/node.js:766 msgid "WireGuard requires base64-encoded private keys." msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:1073 -#: htdocs/luci-static/resources/fchomo/listeners.js:1082 -#: htdocs/luci-static/resources/view/fchomo/node.js:1182 -#: htdocs/luci-static/resources/view/fchomo/node.js:1200 +#: htdocs/luci-static/resources/fchomo/listeners.js:1116 +#: htdocs/luci-static/resources/fchomo/listeners.js:1125 +#: htdocs/luci-static/resources/view/fchomo/node.js:1201 +#: htdocs/luci-static/resources/view/fchomo/node.js:1219 msgid "XHTTP" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:1118 -#: htdocs/luci-static/resources/view/fchomo/node.js:1295 +#: htdocs/luci-static/resources/fchomo/listeners.js:1161 +#: htdocs/luci-static/resources/view/fchomo/node.js:1314 msgid "XHTTP mode" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1326 +#: htdocs/luci-static/resources/view/fchomo/node.js:1345 msgid "XMUX" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1331 -#: htdocs/luci-static/resources/view/fchomo/node.js:1336 -#: htdocs/luci-static/resources/view/fchomo/node.js:1341 -#: htdocs/luci-static/resources/view/fchomo/node.js:1346 -#: htdocs/luci-static/resources/view/fchomo/node.js:1351 -#: htdocs/luci-static/resources/view/fchomo/node.js:1356 +#: htdocs/luci-static/resources/view/fchomo/node.js:1350 +#: htdocs/luci-static/resources/view/fchomo/node.js:1355 +#: htdocs/luci-static/resources/view/fchomo/node.js:1360 +#: htdocs/luci-static/resources/view/fchomo/node.js:1365 +#: htdocs/luci-static/resources/view/fchomo/node.js:1370 +#: htdocs/luci-static/resources/view/fchomo/node.js:1375 msgid "XMUX:" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:661 +#: htdocs/luci-static/resources/fchomo/listeners.js:698 msgid "XOR mode" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:670 +#: htdocs/luci-static/resources/view/fchomo/node.js:688 msgid "Xudp (Xray-core)" msgstr "" @@ -3413,7 +3446,7 @@ msgstr "" msgid "Yaml text" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1760 +#: htdocs/luci-static/resources/view/fchomo/node.js:1779 msgid "Yes" msgstr "" @@ -3421,27 +3454,27 @@ msgstr "" msgid "YouTube" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:1689 +#: htdocs/luci-static/resources/fchomo.js:1690 msgid "Your %s was successfully uploaded. Size: %sB." msgstr "" -#: htdocs/luci-static/resources/fchomo.js:333 -#: htdocs/luci-static/resources/fchomo.js:346 -#: htdocs/luci-static/resources/fchomo.js:351 -#: htdocs/luci-static/resources/view/fchomo/node.js:650 +#: htdocs/luci-static/resources/fchomo.js:334 +#: htdocs/luci-static/resources/fchomo.js:347 +#: htdocs/luci-static/resources/fchomo.js:352 +#: htdocs/luci-static/resources/view/fchomo/node.js:668 msgid "aes-128-gcm" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:334 +#: htdocs/luci-static/resources/fchomo.js:335 msgid "aes-192-gcm" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:335 -#: htdocs/luci-static/resources/fchomo.js:352 +#: htdocs/luci-static/resources/fchomo.js:336 +#: htdocs/luci-static/resources/fchomo.js:353 msgid "aes-256-gcm" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:647 +#: htdocs/luci-static/resources/view/fchomo/node.js:665 msgid "auto" msgstr "" @@ -3449,19 +3482,19 @@ msgstr "" msgid "bbr" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:929 -#: htdocs/luci-static/resources/fchomo/listeners.js:969 -#: htdocs/luci-static/resources/view/fchomo/node.js:1105 +#: htdocs/luci-static/resources/fchomo/listeners.js:972 +#: htdocs/luci-static/resources/fchomo/listeners.js:1012 +#: htdocs/luci-static/resources/view/fchomo/node.js:1124 msgid "certificate" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:336 -#: htdocs/luci-static/resources/fchomo.js:347 -#: htdocs/luci-static/resources/fchomo.js:353 +#: htdocs/luci-static/resources/fchomo.js:337 +#: htdocs/luci-static/resources/fchomo.js:348 +#: htdocs/luci-static/resources/fchomo.js:354 msgid "chacha20-ietf-poly1305" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:651 +#: htdocs/luci-static/resources/view/fchomo/node.js:669 msgid "chacha20-poly1305" msgstr "" @@ -3469,8 +3502,8 @@ msgstr "" msgid "cubic" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:613 -#: htdocs/luci-static/resources/fchomo/listeners.js:644 +#: htdocs/luci-static/resources/fchomo/listeners.js:650 +#: htdocs/luci-static/resources/fchomo/listeners.js:681 msgid "decryption" msgstr "" @@ -3478,41 +3511,41 @@ msgstr "" msgid "dnsmasq selects upstream on its own. (may affect CDN accuracy)" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1748 +#: htdocs/luci-static/resources/view/fchomo/node.js:1767 msgid "down" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:648 -#: htdocs/luci-static/resources/view/fchomo/node.js:894 -#: htdocs/luci-static/resources/view/fchomo/node.js:917 +#: htdocs/luci-static/resources/fchomo/listeners.js:685 +#: htdocs/luci-static/resources/view/fchomo/node.js:913 +#: htdocs/luci-static/resources/view/fchomo/node.js:936 msgid "encryption" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:413 -#: htdocs/luci-static/resources/view/fchomo/node.js:445 +#: htdocs/luci-static/resources/fchomo/listeners.js:424 +#: htdocs/luci-static/resources/view/fchomo/node.js:456 msgid "false = bandwidth optimized downlink; true = pure Sudoku downlink." msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:1071 -#: htdocs/luci-static/resources/fchomo/listeners.js:1080 -#: htdocs/luci-static/resources/fchomo/listeners.js:1087 -#: htdocs/luci-static/resources/view/fchomo/node.js:1180 -#: htdocs/luci-static/resources/view/fchomo/node.js:1191 -#: htdocs/luci-static/resources/view/fchomo/node.js:1198 -#: htdocs/luci-static/resources/view/fchomo/node.js:1204 +#: htdocs/luci-static/resources/fchomo/listeners.js:1114 +#: htdocs/luci-static/resources/fchomo/listeners.js:1123 +#: htdocs/luci-static/resources/fchomo/listeners.js:1130 +#: htdocs/luci-static/resources/view/fchomo/node.js:1199 +#: htdocs/luci-static/resources/view/fchomo/node.js:1210 +#: htdocs/luci-static/resources/view/fchomo/node.js:1217 +#: htdocs/luci-static/resources/view/fchomo/node.js:1223 msgid "gRPC" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1261 +#: htdocs/luci-static/resources/view/fchomo/node.js:1280 msgid "gRPC User-Agent" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1266 +#: htdocs/luci-static/resources/view/fchomo/node.js:1285 msgid "gRPC ping interval" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:1112 -#: htdocs/luci-static/resources/view/fchomo/node.js:1257 +#: htdocs/luci-static/resources/fchomo/listeners.js:1155 +#: htdocs/luci-static/resources/view/fchomo/node.js:1276 msgid "gRPC service name" msgstr "" @@ -3520,11 +3553,11 @@ msgstr "" msgid "gVisor" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1373 +#: htdocs/luci-static/resources/view/fchomo/node.js:1392 msgid "h2mux" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:813 +#: htdocs/luci-static/resources/fchomo/listeners.js:850 msgid "least one keypair required" msgstr "" @@ -3538,17 +3571,17 @@ msgstr "" #: htdocs/luci-static/resources/view/fchomo/client.js:1480 #: htdocs/luci-static/resources/view/fchomo/client.js:1711 #: htdocs/luci-static/resources/view/fchomo/client.js:1767 -#: htdocs/luci-static/resources/view/fchomo/node.js:1571 +#: htdocs/luci-static/resources/view/fchomo/node.js:1590 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:239 msgid "mihomo config" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:379 +#: htdocs/luci-static/resources/fchomo.js:380 msgid "mlkem768x25519plus" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1445 -#: htdocs/luci-static/resources/view/fchomo/node.js:1726 +#: htdocs/luci-static/resources/view/fchomo/node.js:1464 +#: htdocs/luci-static/resources/view/fchomo/node.js:1745 msgid "mpTCP" msgstr "" @@ -3560,20 +3593,20 @@ msgstr "" msgid "no-resolve" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:1424 -#: htdocs/luci-static/resources/fchomo.js:1519 -#: htdocs/luci-static/resources/fchomo.js:1554 -#: htdocs/luci-static/resources/fchomo.js:1582 +#: htdocs/luci-static/resources/fchomo.js:1425 +#: htdocs/luci-static/resources/fchomo.js:1520 +#: htdocs/luci-static/resources/fchomo.js:1555 +#: htdocs/luci-static/resources/fchomo.js:1583 msgid "non-empty value" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:331 -#: htdocs/luci-static/resources/fchomo.js:345 -#: htdocs/luci-static/resources/fchomo.js:357 -#: htdocs/luci-static/resources/fchomo/listeners.js:531 -#: htdocs/luci-static/resources/view/fchomo/node.js:648 -#: htdocs/luci-static/resources/view/fchomo/node.js:668 -#: htdocs/luci-static/resources/view/fchomo/node.js:806 +#: htdocs/luci-static/resources/fchomo.js:332 +#: htdocs/luci-static/resources/fchomo.js:346 +#: htdocs/luci-static/resources/fchomo.js:358 +#: htdocs/luci-static/resources/fchomo/listeners.js:560 +#: htdocs/luci-static/resources/view/fchomo/node.js:666 +#: htdocs/luci-static/resources/view/fchomo/node.js:686 +#: htdocs/luci-static/resources/view/fchomo/node.js:824 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:315 msgid "none" msgstr "" @@ -3586,45 +3619,45 @@ msgstr "" msgid "not included \",\"" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:217 -#: htdocs/luci-static/resources/fchomo/listeners.js:569 -#: htdocs/luci-static/resources/fchomo/listeners.js:570 +#: htdocs/luci-static/resources/fchomo.js:218 +#: htdocs/luci-static/resources/fchomo/listeners.js:606 +#: htdocs/luci-static/resources/fchomo/listeners.js:607 msgid "null" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:532 -#: htdocs/luci-static/resources/view/fchomo/node.js:807 +#: htdocs/luci-static/resources/fchomo/listeners.js:561 +#: htdocs/luci-static/resources/view/fchomo/node.js:825 msgid "obfs-simple" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:492 +#: htdocs/luci-static/resources/view/fchomo/node.js:503 msgid "only applies when %s is %s." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:490 +#: htdocs/luci-static/resources/view/fchomo/node.js:501 msgid "only applies when %s is not %s." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1706 +#: htdocs/luci-static/resources/view/fchomo/node.js:1725 msgid "override.proxy-name" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:669 +#: htdocs/luci-static/resources/view/fchomo/node.js:687 msgid "packet addr (v2ray-core v5+)" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:1122 -#: htdocs/luci-static/resources/view/fchomo/node.js:1299 +#: htdocs/luci-static/resources/fchomo/listeners.js:1165 +#: htdocs/luci-static/resources/view/fchomo/node.js:1318 msgid "packet-up" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:427 -#: htdocs/luci-static/resources/view/fchomo/node.js:459 +#: htdocs/luci-static/resources/fchomo/listeners.js:438 +#: htdocs/luci-static/resources/view/fchomo/node.js:470 msgid "poll" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:944 -#: htdocs/luci-static/resources/view/fchomo/node.js:1119 +#: htdocs/luci-static/resources/fchomo/listeners.js:987 +#: htdocs/luci-static/resources/view/fchomo/node.js:1138 msgid "private key" msgstr "" @@ -3637,7 +3670,7 @@ msgstr "" msgid "requires front-end adaptation using the API." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:811 +#: htdocs/luci-static/resources/view/fchomo/node.js:829 msgid "restls" msgstr "" @@ -3645,17 +3678,17 @@ msgstr "" msgid "rule-set" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:533 -#: htdocs/luci-static/resources/view/fchomo/node.js:810 +#: htdocs/luci-static/resources/fchomo/listeners.js:562 +#: htdocs/luci-static/resources/view/fchomo/node.js:828 msgid "shadow-tls" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1371 +#: htdocs/luci-static/resources/view/fchomo/node.js:1390 msgid "smux" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:426 -#: htdocs/luci-static/resources/view/fchomo/node.js:458 +#: htdocs/luci-static/resources/fchomo/listeners.js:437 +#: htdocs/luci-static/resources/view/fchomo/node.js:469 msgid "split-stream" msgstr "" @@ -3663,25 +3696,25 @@ msgstr "" msgid "src" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:1120 -#: htdocs/luci-static/resources/view/fchomo/node.js:1297 +#: htdocs/luci-static/resources/fchomo/listeners.js:1163 +#: htdocs/luci-static/resources/view/fchomo/node.js:1316 msgid "stream-one" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:1121 -#: htdocs/luci-static/resources/view/fchomo/node.js:1298 +#: htdocs/luci-static/resources/fchomo/listeners.js:1164 +#: htdocs/luci-static/resources/view/fchomo/node.js:1317 msgid "stream-up" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:1137 +#: htdocs/luci-static/resources/fchomo/listeners.js:1180 msgid "stream-up server seconds" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:492 +#: htdocs/luci-static/resources/view/fchomo/node.js:503 msgid "stream/poll/auto" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:282 +#: htdocs/luci-static/resources/fchomo/listeners.js:293 msgid "sudoku-keypair" msgstr "" @@ -3689,87 +3722,100 @@ msgstr "" msgid "unchecked" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:443 +#: htdocs/luci-static/resources/fchomo.js:444 msgid "unique UCI identifier" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:446 +#: htdocs/luci-static/resources/fchomo.js:447 msgid "unique identifier" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:1591 +#: htdocs/luci-static/resources/fchomo.js:1592 msgid "unique value" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1742 +#: htdocs/luci-static/resources/view/fchomo/node.js:1761 msgid "up" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:558 -#: htdocs/luci-static/resources/view/fchomo/node.js:508 -#: htdocs/luci-static/resources/view/fchomo/node.js:543 -#: htdocs/luci-static/resources/view/fchomo/node.js:838 -#: htdocs/luci-static/resources/view/fchomo/node.js:887 +#: htdocs/luci-static/resources/fchomo/listeners.js:463 +#: htdocs/luci-static/resources/fchomo/listeners.js:595 +#: htdocs/luci-static/resources/view/fchomo/node.js:519 +#: htdocs/luci-static/resources/view/fchomo/node.js:561 +#: htdocs/luci-static/resources/view/fchomo/node.js:856 +#: htdocs/luci-static/resources/view/fchomo/node.js:906 msgid "v1" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:559 -#: htdocs/luci-static/resources/view/fchomo/node.js:509 -#: htdocs/luci-static/resources/view/fchomo/node.js:839 -#: htdocs/luci-static/resources/view/fchomo/node.js:888 +#: htdocs/luci-static/resources/fchomo/listeners.js:464 +#: htdocs/luci-static/resources/fchomo/listeners.js:596 +#: htdocs/luci-static/resources/view/fchomo/node.js:520 +#: htdocs/luci-static/resources/view/fchomo/node.js:857 +#: htdocs/luci-static/resources/view/fchomo/node.js:907 msgid "v2" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:560 -#: htdocs/luci-static/resources/view/fchomo/node.js:510 -#: htdocs/luci-static/resources/view/fchomo/node.js:840 +#: htdocs/luci-static/resources/fchomo/listeners.js:465 +#: htdocs/luci-static/resources/fchomo/listeners.js:597 +#: htdocs/luci-static/resources/view/fchomo/node.js:521 +#: htdocs/luci-static/resources/view/fchomo/node.js:858 msgid "v3" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:1471 -#: htdocs/luci-static/resources/fchomo.js:1474 +#: htdocs/luci-static/resources/fchomo/listeners.js:466 +#: htdocs/luci-static/resources/view/fchomo/node.js:522 +msgid "v4" +msgstr "" + +#: htdocs/luci-static/resources/fchomo/listeners.js:467 +#: htdocs/luci-static/resources/view/fchomo/node.js:523 +msgid "v5" +msgstr "" + +#: htdocs/luci-static/resources/fchomo.js:1472 +#: htdocs/luci-static/resources/fchomo.js:1475 msgid "valid JSON format" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1079 +#: htdocs/luci-static/resources/view/fchomo/node.js:1098 msgid "valid SHA256 string with %d characters" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:1496 -#: htdocs/luci-static/resources/fchomo.js:1499 +#: htdocs/luci-static/resources/fchomo.js:1497 +#: htdocs/luci-static/resources/fchomo.js:1500 msgid "valid URL" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:1509 +#: htdocs/luci-static/resources/fchomo.js:1510 msgid "valid base64 key with %d characters" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:1569 -#: htdocs/luci-static/resources/fchomo.js:1575 +#: htdocs/luci-static/resources/fchomo.js:1570 +#: htdocs/luci-static/resources/fchomo.js:1576 msgid "valid format: 2x, 2p, 4v" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:1556 +#: htdocs/luci-static/resources/fchomo.js:1557 msgid "valid key length with %d characters" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:1434 +#: htdocs/luci-static/resources/fchomo.js:1435 msgid "valid port value" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:1484 +#: htdocs/luci-static/resources/fchomo.js:1485 msgid "valid uuid" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:403 +#: htdocs/luci-static/resources/fchomo.js:404 msgid "vless-mlkem768" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:402 +#: htdocs/luci-static/resources/fchomo.js:403 msgid "vless-x25519" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:337 +#: htdocs/luci-static/resources/fchomo.js:338 msgid "xchacha20-ietf-poly1305" msgstr "" @@ -3777,7 +3823,7 @@ msgstr "" msgid "yacd-meta" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1372 +#: htdocs/luci-static/resources/view/fchomo/node.js:1391 msgid "yamux" msgstr "" @@ -3785,10 +3831,10 @@ msgstr "" msgid "zashboard" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:649 +#: htdocs/luci-static/resources/view/fchomo/node.js:667 msgid "zero" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:1252 +#: htdocs/luci-static/resources/fchomo.js:1253 msgid "🡇" msgstr "" diff --git a/luci-app-fchomo/po/zh_Hans/fchomo.po b/luci-app-fchomo/po/zh_Hans/fchomo.po index 34347f97..ba9907a6 100644 --- a/luci-app-fchomo/po/zh_Hans/fchomo.po +++ b/luci-app-fchomo/po/zh_Hans/fchomo.po @@ -12,30 +12,30 @@ msgstr "" msgid "%s log" msgstr "%s 日志" -#: htdocs/luci-static/resources/fchomo.js:240 #: htdocs/luci-static/resources/fchomo.js:241 #: htdocs/luci-static/resources/fchomo.js:242 #: htdocs/luci-static/resources/fchomo.js:243 #: htdocs/luci-static/resources/fchomo.js:244 #: htdocs/luci-static/resources/fchomo.js:245 +#: htdocs/luci-static/resources/fchomo.js:246 msgid "%s ports" msgstr "%s 端口" -#: htdocs/luci-static/resources/fchomo.js:605 -#: htdocs/luci-static/resources/fchomo.js:608 +#: htdocs/luci-static/resources/fchomo.js:606 +#: htdocs/luci-static/resources/fchomo.js:609 #: htdocs/luci-static/resources/view/fchomo/client.js:315 msgid "(Imported)" msgstr "(已导入)" -#: htdocs/luci-static/resources/fchomo/listeners.js:947 -#: htdocs/luci-static/resources/fchomo/listeners.js:955 -#: htdocs/luci-static/resources/fchomo/listeners.js:964 +#: htdocs/luci-static/resources/fchomo/listeners.js:990 +#: htdocs/luci-static/resources/fchomo/listeners.js:998 +#: htdocs/luci-static/resources/fchomo/listeners.js:1007 #: htdocs/luci-static/resources/view/fchomo/global.js:543 #: htdocs/luci-static/resources/view/fchomo/global.js:549 -#: htdocs/luci-static/resources/view/fchomo/node.js:1094 -#: htdocs/luci-static/resources/view/fchomo/node.js:1100 -#: htdocs/luci-static/resources/view/fchomo/node.js:1108 -#: htdocs/luci-static/resources/view/fchomo/node.js:1114 +#: htdocs/luci-static/resources/view/fchomo/node.js:1113 +#: htdocs/luci-static/resources/view/fchomo/node.js:1119 +#: htdocs/luci-static/resources/view/fchomo/node.js:1127 +#: htdocs/luci-static/resources/view/fchomo/node.js:1133 msgid "(mTLS)" msgstr "" @@ -46,19 +46,19 @@ msgstr "" #: htdocs/luci-static/resources/view/fchomo/client.js:1056 #: htdocs/luci-static/resources/view/fchomo/client.js:1057 #: htdocs/luci-static/resources/view/fchomo/client.js:1278 -#: htdocs/luci-static/resources/view/fchomo/node.js:1897 -#: htdocs/luci-static/resources/view/fchomo/node.js:1903 -#: htdocs/luci-static/resources/view/fchomo/node.js:1917 -#: htdocs/luci-static/resources/view/fchomo/node.js:1923 +#: htdocs/luci-static/resources/view/fchomo/node.js:1916 +#: htdocs/luci-static/resources/view/fchomo/node.js:1922 +#: htdocs/luci-static/resources/view/fchomo/node.js:1936 +#: htdocs/luci-static/resources/view/fchomo/node.js:1942 msgid "-- Please choose --" msgstr "-- 请选择 --" -#: htdocs/luci-static/resources/fchomo.js:392 +#: htdocs/luci-static/resources/fchomo.js:393 msgid "0-RTT reuse." msgstr "0-RTT 重用。" -#: htdocs/luci-static/resources/fchomo.js:389 -#: htdocs/luci-static/resources/fchomo.js:393 +#: htdocs/luci-static/resources/fchomo.js:390 +#: htdocs/luci-static/resources/fchomo.js:394 msgid "1-RTT only." msgstr "仅限 1-RTT。" @@ -66,15 +66,15 @@ msgstr "仅限 1-RTT。" msgid "163Music" msgstr "网抑云" -#: htdocs/luci-static/resources/fchomo.js:339 +#: htdocs/luci-static/resources/fchomo.js:340 msgid "2022-blake3-aes-128-gcm" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:340 +#: htdocs/luci-static/resources/fchomo.js:341 msgid "2022-blake3-aes-256-gcm" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:341 +#: htdocs/luci-static/resources/fchomo.js:342 msgid "2022-blake3-chacha20-poly1305" msgstr "" @@ -82,16 +82,16 @@ msgstr "" msgid "0 or 1 only." msgstr "仅限 01。" -#: htdocs/luci-static/resources/fchomo/listeners.js:925 -#: htdocs/luci-static/resources/fchomo/listeners.js:940 -#: htdocs/luci-static/resources/fchomo/listeners.js:965 -#: htdocs/luci-static/resources/view/fchomo/node.js:1101 -#: htdocs/luci-static/resources/view/fchomo/node.js:1115 +#: htdocs/luci-static/resources/fchomo/listeners.js:968 +#: htdocs/luci-static/resources/fchomo/listeners.js:983 +#: htdocs/luci-static/resources/fchomo/listeners.js:1008 +#: htdocs/luci-static/resources/view/fchomo/node.js:1120 +#: htdocs/luci-static/resources/view/fchomo/node.js:1134 msgid "Save your configuration before uploading files!" msgstr "上传文件前请先保存配置!" -#: htdocs/luci-static/resources/fchomo/listeners.js:275 -#: htdocs/luci-static/resources/view/fchomo/node.js:380 +#: htdocs/luci-static/resources/fchomo/listeners.js:286 +#: htdocs/luci-static/resources/view/fchomo/node.js:391 msgid "" "A base64 string is used to fine-tune network behavior.
Please refer to " "the document" msgid "All allowed" msgstr "允许所有" -#: htdocs/luci-static/resources/fchomo.js:237 +#: htdocs/luci-static/resources/fchomo.js:238 msgid "All ports" msgstr "所有端口" @@ -255,7 +255,11 @@ msgid "" msgstr "" "允许从私有网络访问。
要从公共网站访问私有网络上的 API,则必须启用。" -#: htdocs/luci-static/resources/view/fchomo/node.js:769 +#: htdocs/luci-static/resources/fchomo/listeners.js:895 +msgid "Allow insecure connections" +msgstr "允许不安全的连接" + +#: htdocs/luci-static/resources/view/fchomo/node.js:787 msgid "Allowed IPs" msgstr "允许的 IP" @@ -267,13 +271,13 @@ msgstr "已是最新版本。" msgid "Already in updating." msgstr "已在更新中。" -#: htdocs/luci-static/resources/fchomo/listeners.js:513 -#: htdocs/luci-static/resources/view/fchomo/node.js:639 +#: htdocs/luci-static/resources/fchomo/listeners.js:542 +#: htdocs/luci-static/resources/view/fchomo/node.js:657 msgid "Alter ID" msgstr "额外 ID" -#: htdocs/luci-static/resources/fchomo.js:162 -#: htdocs/luci-static/resources/fchomo.js:197 +#: htdocs/luci-static/resources/fchomo.js:163 +#: htdocs/luci-static/resources/fchomo.js:198 msgid "AnyTLS" msgstr "" @@ -290,20 +294,20 @@ msgstr "作为 dnsmasq 的最优先上游" msgid "As the TOP upstream of dnsmasq." msgstr "作为 dnsmasq 的最优先上游。" -#: htdocs/luci-static/resources/fchomo/listeners.js:463 +#: htdocs/luci-static/resources/fchomo/listeners.js:492 msgid "Auth timeout" msgstr "认证超时" -#: htdocs/luci-static/resources/view/fchomo/node.js:661 +#: htdocs/luci-static/resources/view/fchomo/node.js:679 msgid "Authenticated length" msgstr "认证长度" -#: htdocs/luci-static/resources/fchomo/listeners.js:428 -#: htdocs/luci-static/resources/fchomo/listeners.js:1119 +#: htdocs/luci-static/resources/fchomo/listeners.js:439 +#: htdocs/luci-static/resources/fchomo/listeners.js:1162 #: htdocs/luci-static/resources/view/fchomo/global.js:402 -#: htdocs/luci-static/resources/view/fchomo/node.js:460 -#: htdocs/luci-static/resources/view/fchomo/node.js:484 -#: htdocs/luci-static/resources/view/fchomo/node.js:1296 +#: htdocs/luci-static/resources/view/fchomo/node.js:471 +#: htdocs/luci-static/resources/view/fchomo/node.js:495 +#: htdocs/luci-static/resources/view/fchomo/node.js:1315 msgid "Auto" msgstr "自动" @@ -319,8 +323,8 @@ msgstr "自动更新" msgid "Auto update resources." msgstr "自动更新资源文件。" -#: htdocs/luci-static/resources/fchomo/listeners.js:591 -#: htdocs/luci-static/resources/view/fchomo/node.js:866 +#: htdocs/luci-static/resources/fchomo/listeners.js:628 +#: htdocs/luci-static/resources/view/fchomo/node.js:884 msgid "BBR profile" msgstr "BBR 配置文件" @@ -328,11 +332,11 @@ msgstr "BBR 配置文件" msgid "Baidu" msgstr "百度" -#: htdocs/luci-static/resources/view/fchomo/node.js:676 +#: htdocs/luci-static/resources/view/fchomo/node.js:694 msgid "Base64 encoded ECDSA private key on the NIST P-256 curve." msgstr "基于 NIST P-256 曲线的 Base64 编码 ECDSA 私钥。" -#: htdocs/luci-static/resources/view/fchomo/node.js:684 +#: htdocs/luci-static/resources/view/fchomo/node.js:702 msgid "Base64 encoded ECDSA public key on the NIST P-256 curve." msgstr "基于 NIST P-256 曲线的 Base64 编码 ECDSA 公钥。" @@ -354,13 +358,13 @@ msgid "Binary mrs" msgstr "二进制 mrs" #: htdocs/luci-static/resources/view/fchomo/global.js:734 -#: htdocs/luci-static/resources/view/fchomo/node.js:1455 -#: htdocs/luci-static/resources/view/fchomo/node.js:1771 +#: htdocs/luci-static/resources/view/fchomo/node.js:1474 +#: htdocs/luci-static/resources/view/fchomo/node.js:1790 msgid "Bind interface" msgstr "绑定接口" -#: htdocs/luci-static/resources/view/fchomo/node.js:1456 -#: htdocs/luci-static/resources/view/fchomo/node.js:1772 +#: htdocs/luci-static/resources/view/fchomo/node.js:1475 +#: htdocs/luci-static/resources/view/fchomo/node.js:1791 msgid "Bind outbound interface.
" msgstr "绑定出站接口。
" @@ -398,14 +402,14 @@ msgstr "绕过 CN 流量" msgid "Bypass DSCP" msgstr "绕过 DSCP" -#: htdocs/luci-static/resources/fchomo/listeners.js:426 -#: htdocs/luci-static/resources/fchomo/listeners.js:427 -#: htdocs/luci-static/resources/fchomo/listeners.js:428 -#: htdocs/luci-static/resources/fchomo/listeners.js:429 -#: htdocs/luci-static/resources/view/fchomo/node.js:458 -#: htdocs/luci-static/resources/view/fchomo/node.js:459 -#: htdocs/luci-static/resources/view/fchomo/node.js:460 -#: htdocs/luci-static/resources/view/fchomo/node.js:461 +#: htdocs/luci-static/resources/fchomo/listeners.js:437 +#: htdocs/luci-static/resources/fchomo/listeners.js:438 +#: htdocs/luci-static/resources/fchomo/listeners.js:439 +#: htdocs/luci-static/resources/fchomo/listeners.js:440 +#: htdocs/luci-static/resources/view/fchomo/node.js:469 +#: htdocs/luci-static/resources/view/fchomo/node.js:470 +#: htdocs/luci-static/resources/view/fchomo/node.js:471 +#: htdocs/luci-static/resources/view/fchomo/node.js:472 msgid "CDN support" msgstr "CDN 支持" @@ -421,21 +425,21 @@ msgstr "CORS 允许私有网络" msgid "CORS allowed origins, * will be used if empty." msgstr "CORS 允许的来源,留空则使用 *。" -#: htdocs/luci-static/resources/fchomo.js:721 +#: htdocs/luci-static/resources/fchomo.js:722 msgid "Cancel" msgstr "取消" -#: htdocs/luci-static/resources/view/fchomo/node.js:1073 +#: htdocs/luci-static/resources/view/fchomo/node.js:1092 msgid "Cert fingerprint" msgstr "证书指纹" -#: htdocs/luci-static/resources/view/fchomo/node.js:1074 +#: htdocs/luci-static/resources/view/fchomo/node.js:1093 msgid "" "Certificate fingerprint. Used to implement SSL Pinning and prevent MitM." msgstr "证书指纹。用于实现 SSL证书固定 并防止 MitM。" -#: htdocs/luci-static/resources/fchomo/listeners.js:917 -#: htdocs/luci-static/resources/view/fchomo/node.js:1094 +#: htdocs/luci-static/resources/fchomo/listeners.js:960 +#: htdocs/luci-static/resources/view/fchomo/node.js:1113 msgid "Certificate path" msgstr "证书路径" @@ -464,16 +468,16 @@ msgstr "大陆 IPv6 库版本" msgid "China list version" msgstr "大陆域名列表版本" -#: htdocs/luci-static/resources/fchomo/listeners.js:244 -#: htdocs/luci-static/resources/fchomo/listeners.js:342 -#: htdocs/luci-static/resources/view/fchomo/node.js:333 -#: htdocs/luci-static/resources/view/fchomo/node.js:392 -#: htdocs/luci-static/resources/view/fchomo/node.js:645 +#: htdocs/luci-static/resources/fchomo/listeners.js:255 +#: htdocs/luci-static/resources/fchomo/listeners.js:353 +#: htdocs/luci-static/resources/view/fchomo/node.js:344 +#: htdocs/luci-static/resources/view/fchomo/node.js:403 +#: htdocs/luci-static/resources/view/fchomo/node.js:663 msgid "Chipher" msgstr "加密方法" -#: htdocs/luci-static/resources/fchomo/listeners.js:351 -#: htdocs/luci-static/resources/view/fchomo/node.js:401 +#: htdocs/luci-static/resources/fchomo/listeners.js:362 +#: htdocs/luci-static/resources/view/fchomo/node.js:412 msgid "Chipher must be enabled if obfuscate downlink is disabled." msgstr "如果下行链路混淆功能被禁用,则必须启用加密。" @@ -489,29 +493,29 @@ msgstr "" "点击
此处下载" "最新的初始包。" -#: htdocs/luci-static/resources/fchomo/listeners.js:689 -#: htdocs/luci-static/resources/fchomo/listeners.js:956 +#: htdocs/luci-static/resources/fchomo/listeners.js:726 +#: htdocs/luci-static/resources/fchomo/listeners.js:999 #: htdocs/luci-static/resources/view/fchomo/global.js:550 -#: htdocs/luci-static/resources/view/fchomo/node.js:929 -#: htdocs/luci-static/resources/view/fchomo/node.js:1095 -#: htdocs/luci-static/resources/view/fchomo/node.js:1109 +#: htdocs/luci-static/resources/view/fchomo/node.js:948 +#: htdocs/luci-static/resources/view/fchomo/node.js:1114 +#: htdocs/luci-static/resources/view/fchomo/node.js:1128 #: root/usr/share/luci/menu.d/luci-app-fchomo.json:22 msgid "Client" msgstr "客户端" -#: htdocs/luci-static/resources/fchomo/listeners.js:955 +#: htdocs/luci-static/resources/fchomo/listeners.js:998 msgid "Client Auth Certificate path" msgstr "客户端认证证书路径" -#: htdocs/luci-static/resources/fchomo/listeners.js:947 +#: htdocs/luci-static/resources/fchomo/listeners.js:990 msgid "Client Auth type" msgstr "客户端认证类型" -#: htdocs/luci-static/resources/view/fchomo/node.js:1140 +#: htdocs/luci-static/resources/view/fchomo/node.js:1159 msgid "Client fingerprint" msgstr "客户端指纹" -#: htdocs/luci-static/resources/fchomo/listeners.js:338 +#: htdocs/luci-static/resources/fchomo/listeners.js:349 msgid "Client key" msgstr "客户端密钥" @@ -523,21 +527,21 @@ msgstr "客户端状态" msgid "Collecting data..." msgstr "收集数据中..." -#: htdocs/luci-static/resources/fchomo.js:238 #: htdocs/luci-static/resources/fchomo.js:239 +#: htdocs/luci-static/resources/fchomo.js:240 msgid "Common ports (bypass P2P traffic)" msgstr "常用端口(绕过 P2P 流量)" -#: htdocs/luci-static/resources/fchomo.js:1368 +#: htdocs/luci-static/resources/fchomo.js:1369 msgid "Complete" msgstr "完成" -#: htdocs/luci-static/resources/view/fchomo/node.js:1715 +#: htdocs/luci-static/resources/view/fchomo/node.js:1734 msgid "Configuration Items" msgstr "配置项" -#: htdocs/luci-static/resources/fchomo/listeners.js:583 -#: htdocs/luci-static/resources/view/fchomo/node.js:858 +#: htdocs/luci-static/resources/fchomo/listeners.js:620 +#: htdocs/luci-static/resources/view/fchomo/node.js:876 msgid "Congestion controller" msgstr "拥塞控制器" @@ -545,23 +549,27 @@ msgstr "拥塞控制器" msgid "Connection check" msgstr "连接检查" +#: htdocs/luci-static/resources/view/fchomo/node.js:528 +msgid "Connection reuse" +msgstr "连接复用" + #: htdocs/luci-static/resources/fchomo.js:61 msgid "Conservative" msgstr "保守" -#: htdocs/luci-static/resources/fchomo.js:590 +#: htdocs/luci-static/resources/fchomo.js:591 msgid "Content copied to clipboard!" msgstr "内容已复制到剪贴板!" #: htdocs/luci-static/resources/view/fchomo/client.js:670 -#: htdocs/luci-static/resources/view/fchomo/node.js:1625 -#: htdocs/luci-static/resources/view/fchomo/node.js:1651 +#: htdocs/luci-static/resources/view/fchomo/node.js:1644 +#: htdocs/luci-static/resources/view/fchomo/node.js:1670 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:339 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:365 msgid "Content will not be verified, Please make sure you enter it correctly." msgstr "内容将不会被验证,请确保输入正确。" -#: htdocs/luci-static/resources/view/fchomo/node.js:1624 +#: htdocs/luci-static/resources/view/fchomo/node.js:1643 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:338 msgid "Contents" msgstr "内容" @@ -570,7 +578,7 @@ msgstr "内容" msgid "Contents have been saved." msgstr "" -#: htdocs/luci-static/resources/fchomo.js:592 +#: htdocs/luci-static/resources/fchomo.js:593 msgid "Copy" msgstr "复制" @@ -586,7 +594,7 @@ msgstr "Cron 表达式" msgid "Custom Direct List" msgstr "自定义直连列表" -#: htdocs/luci-static/resources/view/fchomo/node.js:1686 +#: htdocs/luci-static/resources/view/fchomo/node.js:1705 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:400 msgid "Custom HTTP header." msgstr "自定义 HTTP header。" @@ -595,8 +603,8 @@ msgstr "自定义 HTTP header。" msgid "Custom Proxy List" msgstr "自定义代理列表" -#: htdocs/luci-static/resources/fchomo/listeners.js:366 -#: htdocs/luci-static/resources/view/fchomo/node.js:416 +#: htdocs/luci-static/resources/fchomo/listeners.js:377 +#: htdocs/luci-static/resources/view/fchomo/node.js:427 msgid "Custom byte layout" msgstr "自定义字节布局" @@ -605,7 +613,7 @@ msgid "" "Custom internal hosts. Support yaml or json format." msgstr "自定义内部 hosts。支持 yamljson 格式。" -#: htdocs/luci-static/resources/fchomo.js:186 +#: htdocs/luci-static/resources/fchomo.js:187 msgid "DIRECT" msgstr "" @@ -621,8 +629,8 @@ msgstr " DNS 端口" #: htdocs/luci-static/resources/view/fchomo/client.js:873 #: htdocs/luci-static/resources/view/fchomo/client.js:1428 #: htdocs/luci-static/resources/view/fchomo/client.js:1437 -#: htdocs/luci-static/resources/view/fchomo/node.js:716 -#: htdocs/luci-static/resources/view/fchomo/node.js:799 +#: htdocs/luci-static/resources/view/fchomo/node.js:734 +#: htdocs/luci-static/resources/view/fchomo/node.js:817 msgid "DNS server" msgstr "DNS 服务器" @@ -650,15 +658,15 @@ msgstr "默认 DNS(由 WAN 下发)" msgid "Default DNS server" msgstr "默认 DNS 服务器" -#: htdocs/luci-static/resources/view/fchomo/node.js:770 +#: htdocs/luci-static/resources/view/fchomo/node.js:788 msgid "Destination addresses allowed to be forwarded via Wireguard." msgstr "允许通过 WireGuard 转发的目的地址" -#: htdocs/luci-static/resources/view/fchomo/node.js:1896 +#: htdocs/luci-static/resources/view/fchomo/node.js:1915 msgid "Destination provider" msgstr "落地供应商" -#: htdocs/luci-static/resources/view/fchomo/node.js:1902 +#: htdocs/luci-static/resources/view/fchomo/node.js:1921 msgid "Destination proxy node" msgstr "落地代理节点" @@ -666,8 +674,8 @@ msgstr "落地代理节点" msgid "Dial fields" msgstr "拨号字段" -#: htdocs/luci-static/resources/view/fchomo/node.js:1909 -#: htdocs/luci-static/resources/view/fchomo/node.js:1929 +#: htdocs/luci-static/resources/view/fchomo/node.js:1928 +#: htdocs/luci-static/resources/view/fchomo/node.js:1948 msgid "Different chain head/tail" msgstr "不同的链头/链尾" @@ -705,7 +713,7 @@ msgstr "禁用 quic-go 的 通用分段卸载(GSO)" msgid "Disable ICMP Forwarding" msgstr "禁用 ICMP 转发" -#: htdocs/luci-static/resources/view/fchomo/node.js:1014 +#: htdocs/luci-static/resources/view/fchomo/node.js:1033 msgid "Disable SNI" msgstr "禁用 SNI" @@ -733,46 +741,46 @@ msgstr "" msgid "Domain" msgstr "域名" -#: htdocs/luci-static/resources/view/fchomo/node.js:1015 +#: htdocs/luci-static/resources/view/fchomo/node.js:1034 msgid "Donot send server name in ClientHello." msgstr "不要在 ClientHello 中发送服务器名称。" #: htdocs/luci-static/resources/view/fchomo/client.js:1577 -#: htdocs/luci-static/resources/view/fchomo/node.js:1087 -#: htdocs/luci-static/resources/view/fchomo/node.js:1755 +#: htdocs/luci-static/resources/view/fchomo/node.js:1106 +#: htdocs/luci-static/resources/view/fchomo/node.js:1774 msgid "Donot verifying server certificate." msgstr "不验证服务器证书。" -#: htdocs/luci-static/resources/view/fchomo/node.js:1434 +#: htdocs/luci-static/resources/view/fchomo/node.js:1453 msgid "Download bandwidth" msgstr "下载带宽" -#: htdocs/luci-static/resources/view/fchomo/node.js:1435 +#: htdocs/luci-static/resources/view/fchomo/node.js:1454 msgid "Download bandwidth in Mbps." msgstr "下载带宽(单位:Mbps)。" -#: htdocs/luci-static/resources/fchomo.js:1247 +#: htdocs/luci-static/resources/fchomo.js:1248 msgid "Download failed: %s" msgstr "下载失败: %s" -#: htdocs/luci-static/resources/fchomo.js:1245 +#: htdocs/luci-static/resources/fchomo.js:1246 msgid "Download successful." msgstr "下载成功。" -#: htdocs/luci-static/resources/fchomo.js:172 +#: htdocs/luci-static/resources/fchomo.js:173 msgid "Dual stack" msgstr "双栈" -#: htdocs/luci-static/resources/view/fchomo/node.js:1134 +#: htdocs/luci-static/resources/view/fchomo/node.js:1153 msgid "ECH HTTPS record query servername" msgstr "ECH HTTPS 记录查询域名" -#: htdocs/luci-static/resources/fchomo/listeners.js:1013 -#: htdocs/luci-static/resources/view/fchomo/node.js:1128 +#: htdocs/luci-static/resources/fchomo/listeners.js:1056 +#: htdocs/luci-static/resources/view/fchomo/node.js:1147 msgid "ECH config" msgstr "ECH 配置" -#: htdocs/luci-static/resources/fchomo/listeners.js:972 +#: htdocs/luci-static/resources/fchomo/listeners.js:1015 msgid "ECH key" msgstr "ECH 密钥" @@ -788,11 +796,11 @@ msgstr "" msgid "ETag support" msgstr "ETag 支持" -#: htdocs/luci-static/resources/view/fchomo/node.js:1274 +#: htdocs/luci-static/resources/view/fchomo/node.js:1293 msgid "Early Data first packet length limit." msgstr "前置数据长度阈值" -#: htdocs/luci-static/resources/view/fchomo/node.js:1280 +#: htdocs/luci-static/resources/view/fchomo/node.js:1299 msgid "Early Data header name" msgstr "前置数据标头" @@ -808,12 +816,12 @@ msgstr "编辑节点" msgid "Edit ruleset" msgstr "编辑规则集" -#: htdocs/luci-static/resources/view/fchomo/node.js:1622 +#: htdocs/luci-static/resources/view/fchomo/node.js:1641 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:336 msgid "Editer" msgstr "编辑器" -#: htdocs/luci-static/resources/fchomo.js:383 +#: htdocs/luci-static/resources/fchomo.js:384 msgid "Eliminate encryption header characteristics" msgstr "消除加密头特征" @@ -828,15 +836,15 @@ msgstr "消除加密头特征" #: htdocs/luci-static/resources/view/fchomo/global.js:401 #: htdocs/luci-static/resources/view/fchomo/global.js:680 #: htdocs/luci-static/resources/view/fchomo/node.js:235 -#: htdocs/luci-static/resources/view/fchomo/node.js:1595 -#: htdocs/luci-static/resources/view/fchomo/node.js:1794 -#: htdocs/luci-static/resources/view/fchomo/node.js:1883 +#: htdocs/luci-static/resources/view/fchomo/node.js:1614 +#: htdocs/luci-static/resources/view/fchomo/node.js:1813 +#: htdocs/luci-static/resources/view/fchomo/node.js:1902 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:264 #: htdocs/luci-static/resources/view/fchomo/server.js:49 msgid "Enable" msgstr "启用" -#: htdocs/luci-static/resources/view/fchomo/node.js:554 +#: htdocs/luci-static/resources/view/fchomo/node.js:572 msgid "" "Enable 0-RTT QUIC connection handshake on the client side. This is not " "impacting much on the performance, as the protocol is fully multiplexed.
强烈建议禁用此功能,因为它容易受到重放攻击。" -#: htdocs/luci-static/resources/view/fchomo/node.js:553 +#: htdocs/luci-static/resources/view/fchomo/node.js:571 msgid "Enable 0-RTT handshake" msgstr "启用 0-RTT 握手" @@ -857,53 +865,53 @@ msgstr "" "为出站连接启用 IP4P 转换" -#: htdocs/luci-static/resources/view/fchomo/node.js:1122 +#: htdocs/luci-static/resources/view/fchomo/node.js:1141 msgid "Enable ECH" msgstr "启用 ECH" -#: htdocs/luci-static/resources/view/fchomo/node.js:1422 +#: htdocs/luci-static/resources/view/fchomo/node.js:1441 msgid "Enable TCP Brutal" msgstr "启用 TCP Brutal" -#: htdocs/luci-static/resources/view/fchomo/node.js:1423 +#: htdocs/luci-static/resources/view/fchomo/node.js:1442 msgid "Enable TCP Brutal congestion control algorithm" msgstr "启用 TCP Brutal 拥塞控制算法。" -#: htdocs/luci-static/resources/view/fchomo/node.js:1411 +#: htdocs/luci-static/resources/view/fchomo/node.js:1430 msgid "Enable multiplexing only for TCP." msgstr "仅为 TCP 启用多路复用。" -#: htdocs/luci-static/resources/fchomo/listeners.js:412 -#: htdocs/luci-static/resources/view/fchomo/node.js:444 +#: htdocs/luci-static/resources/fchomo/listeners.js:423 +#: htdocs/luci-static/resources/view/fchomo/node.js:455 msgid "Enable obfuscate for downlink" msgstr "启用下行链路混淆" -#: htdocs/luci-static/resources/view/fchomo/node.js:1405 +#: htdocs/luci-static/resources/view/fchomo/node.js:1424 msgid "Enable padding" msgstr "启用填充" -#: htdocs/luci-static/resources/view/fchomo/node.js:1416 +#: htdocs/luci-static/resources/view/fchomo/node.js:1435 msgid "Enable statistic" msgstr "启用统计" -#: htdocs/luci-static/resources/view/fchomo/node.js:881 -#: htdocs/luci-static/resources/view/fchomo/node.js:1737 +#: htdocs/luci-static/resources/view/fchomo/node.js:900 +#: htdocs/luci-static/resources/view/fchomo/node.js:1756 msgid "" "Enable the SUoT protocol, requires server support. Conflict with Multiplex." msgstr "启用 SUoT 协议,需要服务端支持。与多路复用冲突。" -#: htdocs/luci-static/resources/fchomo/listeners.js:200 -#: htdocs/luci-static/resources/view/fchomo/node.js:305 +#: htdocs/luci-static/resources/fchomo/listeners.js:201 +#: htdocs/luci-static/resources/view/fchomo/node.js:306 msgid "" "Enabling obfuscation will make the server incompatible with standard QUIC " "connections, losing the ability to masquerade with HTTP/3." msgstr "启用混淆将使服务器与标准的 QUIC 连接不兼容,失去 HTTP/3 伪装的能力。" -#: htdocs/luci-static/resources/fchomo/listeners.js:652 +#: htdocs/luci-static/resources/fchomo/listeners.js:689 msgid "Encryption method" msgstr "加密方法" -#: htdocs/luci-static/resources/view/fchomo/node.js:683 +#: htdocs/luci-static/resources/view/fchomo/node.js:701 msgid "Endpoint pubkic key" msgstr "端点公钥" @@ -926,7 +934,7 @@ msgid "" "if empty." msgstr "超过此限制将会触发强制健康检查。留空则使用 5。" -#: htdocs/luci-static/resources/view/fchomo/node.js:1852 +#: htdocs/luci-static/resources/view/fchomo/node.js:1871 msgid "Exclude matched node types." msgstr "排除匹配的节点类型。" @@ -939,7 +947,7 @@ msgstr "" "rel=\"noreferrer noopener\">此处。" #: htdocs/luci-static/resources/view/fchomo/client.js:1161 -#: htdocs/luci-static/resources/view/fchomo/node.js:1845 +#: htdocs/luci-static/resources/view/fchomo/node.js:1864 msgid "Exclude nodes that meet keywords or regexps." msgstr "排除匹配关键词或表达式的节点。" @@ -948,66 +956,66 @@ msgid "Expand/Collapse result" msgstr "展开/收起 结果" #: htdocs/luci-static/resources/view/fchomo/client.js:1121 -#: htdocs/luci-static/resources/view/fchomo/node.js:1830 +#: htdocs/luci-static/resources/view/fchomo/node.js:1849 msgid "Expected HTTP code. 204 will be used if empty." msgstr "预期的 HTTP code。留空则使用 204。" #: htdocs/luci-static/resources/view/fchomo/client.js:1123 -#: htdocs/luci-static/resources/view/fchomo/node.js:1832 +#: htdocs/luci-static/resources/view/fchomo/node.js:1851 msgid "Expected status" msgstr "预期状态" -#: htdocs/luci-static/resources/fchomo.js:440 -#: htdocs/luci-static/resources/fchomo.js:443 -#: htdocs/luci-static/resources/fchomo.js:446 -#: htdocs/luci-static/resources/fchomo.js:1385 -#: htdocs/luci-static/resources/fchomo.js:1393 -#: htdocs/luci-static/resources/fchomo.js:1401 -#: htdocs/luci-static/resources/fchomo.js:1424 -#: htdocs/luci-static/resources/fchomo.js:1427 -#: htdocs/luci-static/resources/fchomo.js:1434 -#: htdocs/luci-static/resources/fchomo.js:1450 -#: htdocs/luci-static/resources/fchomo.js:1459 -#: htdocs/luci-static/resources/fchomo.js:1471 -#: htdocs/luci-static/resources/fchomo.js:1474 -#: htdocs/luci-static/resources/fchomo.js:1484 -#: htdocs/luci-static/resources/fchomo.js:1496 -#: htdocs/luci-static/resources/fchomo.js:1499 -#: htdocs/luci-static/resources/fchomo.js:1509 -#: htdocs/luci-static/resources/fchomo.js:1519 -#: htdocs/luci-static/resources/fchomo.js:1554 -#: htdocs/luci-static/resources/fchomo.js:1556 -#: htdocs/luci-static/resources/fchomo.js:1569 -#: htdocs/luci-static/resources/fchomo.js:1575 -#: htdocs/luci-static/resources/fchomo.js:1582 -#: htdocs/luci-static/resources/fchomo.js:1591 -#: htdocs/luci-static/resources/fchomo/listeners.js:351 -#: htdocs/luci-static/resources/fchomo/listeners.js:398 -#: htdocs/luci-static/resources/fchomo/listeners.js:681 -#: htdocs/luci-static/resources/fchomo/listeners.js:712 -#: htdocs/luci-static/resources/fchomo/listeners.js:813 +#: htdocs/luci-static/resources/fchomo.js:441 +#: htdocs/luci-static/resources/fchomo.js:444 +#: htdocs/luci-static/resources/fchomo.js:447 +#: htdocs/luci-static/resources/fchomo.js:1386 +#: htdocs/luci-static/resources/fchomo.js:1394 +#: htdocs/luci-static/resources/fchomo.js:1402 +#: htdocs/luci-static/resources/fchomo.js:1425 +#: htdocs/luci-static/resources/fchomo.js:1428 +#: htdocs/luci-static/resources/fchomo.js:1435 +#: htdocs/luci-static/resources/fchomo.js:1451 +#: htdocs/luci-static/resources/fchomo.js:1460 +#: htdocs/luci-static/resources/fchomo.js:1472 +#: htdocs/luci-static/resources/fchomo.js:1475 +#: htdocs/luci-static/resources/fchomo.js:1485 +#: htdocs/luci-static/resources/fchomo.js:1497 +#: htdocs/luci-static/resources/fchomo.js:1500 +#: htdocs/luci-static/resources/fchomo.js:1510 +#: htdocs/luci-static/resources/fchomo.js:1520 +#: htdocs/luci-static/resources/fchomo.js:1555 +#: htdocs/luci-static/resources/fchomo.js:1557 +#: htdocs/luci-static/resources/fchomo.js:1570 +#: htdocs/luci-static/resources/fchomo.js:1576 +#: htdocs/luci-static/resources/fchomo.js:1583 +#: htdocs/luci-static/resources/fchomo.js:1592 +#: htdocs/luci-static/resources/fchomo/listeners.js:362 +#: htdocs/luci-static/resources/fchomo/listeners.js:409 +#: htdocs/luci-static/resources/fchomo/listeners.js:718 +#: htdocs/luci-static/resources/fchomo/listeners.js:749 +#: htdocs/luci-static/resources/fchomo/listeners.js:850 #: htdocs/luci-static/resources/view/fchomo/client.js:68 #: htdocs/luci-static/resources/view/fchomo/client.js:1018 #: htdocs/luci-static/resources/view/fchomo/client.js:1508 #: htdocs/luci-static/resources/view/fchomo/global.js:880 -#: htdocs/luci-static/resources/view/fchomo/node.js:401 -#: htdocs/luci-static/resources/view/fchomo/node.js:437 -#: htdocs/luci-static/resources/view/fchomo/node.js:490 -#: htdocs/luci-static/resources/view/fchomo/node.js:492 -#: htdocs/luci-static/resources/view/fchomo/node.js:952 -#: htdocs/luci-static/resources/view/fchomo/node.js:1079 -#: htdocs/luci-static/resources/view/fchomo/node.js:1909 -#: htdocs/luci-static/resources/view/fchomo/node.js:1929 +#: htdocs/luci-static/resources/view/fchomo/node.js:412 +#: htdocs/luci-static/resources/view/fchomo/node.js:448 +#: htdocs/luci-static/resources/view/fchomo/node.js:501 +#: htdocs/luci-static/resources/view/fchomo/node.js:503 +#: htdocs/luci-static/resources/view/fchomo/node.js:971 +#: htdocs/luci-static/resources/view/fchomo/node.js:1098 +#: htdocs/luci-static/resources/view/fchomo/node.js:1928 +#: htdocs/luci-static/resources/view/fchomo/node.js:1948 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:291 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:305 msgid "Expecting: %s" msgstr "请输入:%s" -#: htdocs/luci-static/resources/fchomo/listeners.js:1080 -#: htdocs/luci-static/resources/fchomo/listeners.js:1087 -#: htdocs/luci-static/resources/view/fchomo/node.js:1189 -#: htdocs/luci-static/resources/view/fchomo/node.js:1196 -#: htdocs/luci-static/resources/view/fchomo/node.js:1204 +#: htdocs/luci-static/resources/fchomo/listeners.js:1123 +#: htdocs/luci-static/resources/fchomo/listeners.js:1130 +#: htdocs/luci-static/resources/view/fchomo/node.js:1208 +#: htdocs/luci-static/resources/view/fchomo/node.js:1215 +#: htdocs/luci-static/resources/view/fchomo/node.js:1223 msgid "Expecting: only support %s." msgstr "请输入:仅支援 %s." @@ -1026,24 +1034,24 @@ msgstr "实验性" msgid "Factor" msgstr "条件" -#: htdocs/luci-static/resources/fchomo.js:1326 +#: htdocs/luci-static/resources/fchomo.js:1327 msgid "Failed to execute \"/etc/init.d/fchomo %s %s\" reason: %s" msgstr "无法执行 \"/etc/init.d/fchomo %s %s\" 原因: %s" -#: htdocs/luci-static/resources/fchomo.js:1279 +#: htdocs/luci-static/resources/fchomo.js:1280 msgid "Failed to generate %s, error: %s." msgstr "生成 %s 失败,错误:%s。" -#: htdocs/luci-static/resources/fchomo.js:1691 +#: htdocs/luci-static/resources/fchomo.js:1692 msgid "Failed to upload %s, error: %s." msgstr "上传 %s 失败,错误:%s。" -#: htdocs/luci-static/resources/fchomo.js:1710 +#: htdocs/luci-static/resources/fchomo.js:1711 msgid "Failed to upload, error: %s." msgstr "上传失败,错误:%s。" -#: htdocs/luci-static/resources/fchomo.js:230 -#: htdocs/luci-static/resources/fchomo/listeners.js:437 +#: htdocs/luci-static/resources/fchomo.js:231 +#: htdocs/luci-static/resources/fchomo/listeners.js:448 msgid "Fallback" msgstr "自动回退" @@ -1057,7 +1065,7 @@ msgid "Fallback filter" msgstr "後備过滤器" #: htdocs/luci-static/resources/view/fchomo/client.js:1156 -#: htdocs/luci-static/resources/view/fchomo/node.js:1839 +#: htdocs/luci-static/resources/view/fchomo/node.js:1858 msgid "Filter nodes that meet keywords or regexps." msgstr "过滤匹配关键字或表达式的节点。" @@ -1086,8 +1094,8 @@ msgstr "兜底 DNS 服务器 (用于已被投毒污染的域名)" msgid "Firewall" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:505 -#: htdocs/luci-static/resources/view/fchomo/node.js:631 +#: htdocs/luci-static/resources/fchomo/listeners.js:534 +#: htdocs/luci-static/resources/view/fchomo/node.js:649 msgid "Flow" msgstr "流控" @@ -1100,8 +1108,8 @@ msgstr "" "noopener\">%s." #: htdocs/luci-static/resources/view/fchomo/client.js:1122 -#: htdocs/luci-static/resources/view/fchomo/node.js:1705 -#: htdocs/luci-static/resources/view/fchomo/node.js:1831 +#: htdocs/luci-static/resources/view/fchomo/node.js:1724 +#: htdocs/luci-static/resources/view/fchomo/node.js:1850 msgid "" "For format see %s." @@ -1109,8 +1117,8 @@ msgstr "" "格式请参阅 %s." -#: htdocs/luci-static/resources/view/fchomo/node.js:711 -#: htdocs/luci-static/resources/view/fchomo/node.js:794 +#: htdocs/luci-static/resources/view/fchomo/node.js:729 +#: htdocs/luci-static/resources/view/fchomo/node.js:812 msgid "Force DNS remote resolution." msgstr "强制 DNS 远程解析。" @@ -1129,7 +1137,7 @@ msgstr "格式" msgid "FullCombo Shark!" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1229 +#: htdocs/luci-static/resources/view/fchomo/node.js:1248 msgid "GET" msgstr "" @@ -1137,6 +1145,11 @@ msgstr "" msgid "GFW list version" msgstr "GFW 域名列表版本" +#: htdocs/luci-static/resources/fchomo/listeners.js:196 +#: htdocs/luci-static/resources/view/fchomo/node.js:301 +msgid "Gecko" +msgstr "" + #: htdocs/luci-static/resources/view/fchomo/global.js:388 msgid "General" msgstr "常规" @@ -1144,7 +1157,7 @@ msgstr "常规" #: htdocs/luci-static/resources/fchomo/listeners.js:119 #: htdocs/luci-static/resources/view/fchomo/client.js:1009 #: htdocs/luci-static/resources/view/fchomo/node.js:222 -#: htdocs/luci-static/resources/view/fchomo/node.js:1585 +#: htdocs/luci-static/resources/view/fchomo/node.js:1604 msgid "General fields" msgstr "常规字段" @@ -1152,15 +1165,15 @@ msgstr "常规字段" msgid "General settings" msgstr "常规设置" -#: htdocs/luci-static/resources/fchomo.js:541 -#: htdocs/luci-static/resources/fchomo.js:543 -#: htdocs/luci-static/resources/fchomo.js:557 -#: htdocs/luci-static/resources/fchomo.js:559 -#: htdocs/luci-static/resources/fchomo/listeners.js:329 -#: htdocs/luci-static/resources/fchomo/listeners.js:373 -#: htdocs/luci-static/resources/fchomo/listeners.js:375 -#: htdocs/luci-static/resources/fchomo/listeners.js:785 -#: htdocs/luci-static/resources/fchomo/listeners.js:1005 +#: htdocs/luci-static/resources/fchomo.js:542 +#: htdocs/luci-static/resources/fchomo.js:544 +#: htdocs/luci-static/resources/fchomo.js:558 +#: htdocs/luci-static/resources/fchomo.js:560 +#: htdocs/luci-static/resources/fchomo/listeners.js:340 +#: htdocs/luci-static/resources/fchomo/listeners.js:384 +#: htdocs/luci-static/resources/fchomo/listeners.js:386 +#: htdocs/luci-static/resources/fchomo/listeners.js:822 +#: htdocs/luci-static/resources/fchomo/listeners.js:1048 #: htdocs/luci-static/resources/view/fchomo/global.js:587 msgid "Generate" msgstr "生成" @@ -1204,7 +1217,7 @@ msgstr "全局" msgid "Global Authentication" msgstr "全局认证" -#: htdocs/luci-static/resources/view/fchomo/node.js:655 +#: htdocs/luci-static/resources/view/fchomo/node.js:673 msgid "Global padding" msgstr "全局填充" @@ -1212,7 +1225,7 @@ msgstr "全局填充" msgid "Google" msgstr "谷歌" -#: htdocs/luci-static/resources/fchomo.js:243 +#: htdocs/luci-static/resources/fchomo.js:244 msgid "Google FCM" msgstr "谷歌 FCM" @@ -1225,49 +1238,49 @@ msgid "Group" msgstr "组" #: htdocs/luci-static/resources/fchomo.js:153 -#: htdocs/luci-static/resources/fchomo.js:187 -#: htdocs/luci-static/resources/fchomo/listeners.js:539 -#: htdocs/luci-static/resources/view/fchomo/node.js:817 -#: htdocs/luci-static/resources/view/fchomo/node.js:1178 -#: htdocs/luci-static/resources/view/fchomo/node.js:1189 -#: htdocs/luci-static/resources/view/fchomo/node.js:1196 +#: htdocs/luci-static/resources/fchomo.js:188 +#: htdocs/luci-static/resources/fchomo/listeners.js:568 +#: htdocs/luci-static/resources/view/fchomo/node.js:835 +#: htdocs/luci-static/resources/view/fchomo/node.js:1197 +#: htdocs/luci-static/resources/view/fchomo/node.js:1208 +#: htdocs/luci-static/resources/view/fchomo/node.js:1215 msgid "HTTP" msgstr "" #: htdocs/luci-static/resources/view/fchomo/node.js:268 -#: htdocs/luci-static/resources/view/fchomo/node.js:1251 -#: htdocs/luci-static/resources/view/fchomo/node.js:1685 +#: htdocs/luci-static/resources/view/fchomo/node.js:1270 +#: htdocs/luci-static/resources/view/fchomo/node.js:1704 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:399 msgid "HTTP header" msgstr "HTTP header" -#: htdocs/luci-static/resources/fchomo/listeners.js:418 -#: htdocs/luci-static/resources/view/fchomo/node.js:450 +#: htdocs/luci-static/resources/fchomo/listeners.js:429 +#: htdocs/luci-static/resources/view/fchomo/node.js:461 msgid "HTTP mask" msgstr "HTTP 伪装" -#: htdocs/luci-static/resources/fchomo/listeners.js:423 -#: htdocs/luci-static/resources/view/fchomo/node.js:455 -#: htdocs/luci-static/resources/view/fchomo/node.js:490 -#: htdocs/luci-static/resources/view/fchomo/node.js:492 +#: htdocs/luci-static/resources/fchomo/listeners.js:434 +#: htdocs/luci-static/resources/view/fchomo/node.js:466 +#: htdocs/luci-static/resources/view/fchomo/node.js:501 +#: htdocs/luci-static/resources/view/fchomo/node.js:503 msgid "HTTP mask mode" msgstr "HTTP 伪装模式" -#: htdocs/luci-static/resources/view/fchomo/node.js:480 +#: htdocs/luci-static/resources/view/fchomo/node.js:491 msgid "HTTP mask multiplex" msgstr "HTTP 伪装多路复用" -#: htdocs/luci-static/resources/view/fchomo/node.js:465 -#: htdocs/luci-static/resources/view/fchomo/node.js:470 +#: htdocs/luci-static/resources/view/fchomo/node.js:476 +#: htdocs/luci-static/resources/view/fchomo/node.js:481 msgid "HTTP mask: %s" msgstr "HTTP 伪装: %s" -#: htdocs/luci-static/resources/view/fchomo/node.js:1228 +#: htdocs/luci-static/resources/view/fchomo/node.js:1247 msgid "HTTP request method" msgstr "HTTP 请求方法" -#: htdocs/luci-static/resources/fchomo/listeners.js:433 -#: htdocs/luci-static/resources/view/fchomo/node.js:476 +#: htdocs/luci-static/resources/fchomo/listeners.js:444 +#: htdocs/luci-static/resources/view/fchomo/node.js:487 msgid "HTTP root path" msgstr "HTTP 根路径" @@ -1275,15 +1288,15 @@ msgstr "HTTP 根路径" msgid "HTTP/3" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:208 +#: htdocs/luci-static/resources/fchomo/listeners.js:219 msgid "" "HTTP3 server behavior when authentication fails.
A 404 page will be " "returned if empty." msgstr "身份验证失败时的 HTTP3 服务器响应。默认返回 404 页面。" -#: htdocs/luci-static/resources/view/fchomo/node.js:1179 -#: htdocs/luci-static/resources/view/fchomo/node.js:1190 -#: htdocs/luci-static/resources/view/fchomo/node.js:1197 +#: htdocs/luci-static/resources/view/fchomo/node.js:1198 +#: htdocs/luci-static/resources/view/fchomo/node.js:1209 +#: htdocs/luci-static/resources/view/fchomo/node.js:1216 msgid "HTTPUpgrade" msgstr "" @@ -1291,52 +1304,52 @@ msgstr "" msgid "Handle domain" msgstr "处理域名" -#: htdocs/luci-static/resources/view/fchomo/node.js:372 +#: htdocs/luci-static/resources/view/fchomo/node.js:383 msgid "Handshake mode" msgstr "握手模式" -#: htdocs/luci-static/resources/fchomo/listeners.js:544 +#: htdocs/luci-static/resources/fchomo/listeners.js:581 msgid "Handshake target that supports TLS 1.3" msgstr "握手目标 (支援 TLS 1.3)" -#: htdocs/luci-static/resources/fchomo/listeners.js:405 +#: htdocs/luci-static/resources/fchomo/listeners.js:416 msgid "Handshake timeout" msgstr "握手超时" -#: htdocs/luci-static/resources/fchomo/listeners.js:233 +#: htdocs/luci-static/resources/fchomo/listeners.js:244 msgid "Header to read real client IP from (e.g. X-Forwarded-For)" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:722 +#: htdocs/luci-static/resources/view/fchomo/node.js:740 msgid "Health check" msgstr "健康检查" #: htdocs/luci-static/resources/view/fchomo/client.js:1091 -#: htdocs/luci-static/resources/view/fchomo/node.js:1799 +#: htdocs/luci-static/resources/view/fchomo/node.js:1818 msgid "Health check URL" msgstr "健康检查 URL" #: htdocs/luci-static/resources/view/fchomo/client.js:1120 -#: htdocs/luci-static/resources/view/fchomo/node.js:1829 +#: htdocs/luci-static/resources/view/fchomo/node.js:1848 msgid "Health check expected status" msgstr "健康检查预期状态" #: htdocs/luci-static/resources/view/fchomo/client.js:1100 -#: htdocs/luci-static/resources/view/fchomo/node.js:1809 +#: htdocs/luci-static/resources/view/fchomo/node.js:1828 msgid "Health check interval" msgstr "健康检查间隔" #: htdocs/luci-static/resources/view/fchomo/client.js:1107 -#: htdocs/luci-static/resources/view/fchomo/node.js:1816 +#: htdocs/luci-static/resources/view/fchomo/node.js:1835 msgid "Health check timeout" msgstr "健康检查超时" #: htdocs/luci-static/resources/view/fchomo/client.js:1011 -#: htdocs/luci-static/resources/view/fchomo/node.js:1587 +#: htdocs/luci-static/resources/view/fchomo/node.js:1606 msgid "Health fields" msgstr "健康字段" -#: htdocs/luci-static/resources/view/fchomo/node.js:560 +#: htdocs/luci-static/resources/view/fchomo/node.js:578 msgid "Heartbeat interval" msgstr "心跳间隔" @@ -1344,19 +1357,20 @@ msgstr "心跳间隔" msgid "Hidden" msgstr "隐藏" -#: htdocs/luci-static/resources/view/fchomo/node.js:823 +#: htdocs/luci-static/resources/fchomo/listeners.js:574 +#: htdocs/luci-static/resources/view/fchomo/node.js:841 msgid "Host that supports TLS 1.3" msgstr "主机名称 (支援 TLS 1.3)" -#: htdocs/luci-static/resources/view/fchomo/node.js:327 +#: htdocs/luci-static/resources/view/fchomo/node.js:338 msgid "Host-key" msgstr "主机密钥" -#: htdocs/luci-static/resources/view/fchomo/node.js:322 +#: htdocs/luci-static/resources/view/fchomo/node.js:333 msgid "Host-key algorithms" msgstr "主机密钥算法" -#: htdocs/luci-static/resources/view/fchomo/node.js:470 +#: htdocs/luci-static/resources/view/fchomo/node.js:481 msgid "Host/SNI override" msgstr "主机/SNI 覆盖" @@ -1365,12 +1379,12 @@ msgstr "主机/SNI 覆盖" msgid "Hosts" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:164 -#: htdocs/luci-static/resources/fchomo.js:199 +#: htdocs/luci-static/resources/fchomo.js:165 +#: htdocs/luci-static/resources/fchomo.js:200 msgid "Hysteria2" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:165 +#: htdocs/luci-static/resources/fchomo.js:166 msgid "Hysteria2 Realm" msgstr "Hysteria2 Realm" @@ -1388,20 +1402,20 @@ msgstr "" msgid "IP CIDR" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:522 +#: htdocs/luci-static/resources/view/fchomo/node.js:540 msgid "IP override" msgstr "IP 覆写" -#: htdocs/luci-static/resources/view/fchomo/node.js:1467 -#: htdocs/luci-static/resources/view/fchomo/node.js:1785 +#: htdocs/luci-static/resources/view/fchomo/node.js:1486 +#: htdocs/luci-static/resources/view/fchomo/node.js:1804 msgid "IP version" msgstr "IP 版本" -#: htdocs/luci-static/resources/fchomo.js:173 +#: htdocs/luci-static/resources/fchomo.js:174 msgid "IPv4 only" msgstr "仅 IPv4" -#: htdocs/luci-static/resources/fchomo.js:174 +#: htdocs/luci-static/resources/fchomo.js:175 msgid "IPv6 only" msgstr "仅 IPv6" @@ -1414,19 +1428,19 @@ msgstr "IPv6 支持" msgid "Icon" msgstr "图标" -#: htdocs/luci-static/resources/view/fchomo/node.js:604 +#: htdocs/luci-static/resources/view/fchomo/node.js:622 msgid "Idle session check interval" msgstr "闲置会话检查间隔" -#: htdocs/luci-static/resources/view/fchomo/node.js:611 +#: htdocs/luci-static/resources/view/fchomo/node.js:629 msgid "Idle session timeout" msgstr "闲置会话超时" -#: htdocs/luci-static/resources/fchomo/listeners.js:456 +#: htdocs/luci-static/resources/fchomo/listeners.js:485 msgid "Idle timeout" msgstr "闲置超时" -#: htdocs/luci-static/resources/fchomo.js:1427 +#: htdocs/luci-static/resources/fchomo.js:1428 msgid "If All ports is selected, uncheck others" msgstr "如果选择了“所有端口”,则取消选中“其他”" @@ -1438,7 +1452,7 @@ msgstr "如果选择了“阻止”,则取消选中“其他”" msgid "Ignore client bandwidth" msgstr "忽略客户端带宽" -#: htdocs/luci-static/resources/fchomo.js:726 +#: htdocs/luci-static/resources/fchomo.js:727 msgid "Import" msgstr "导入" @@ -1454,8 +1468,8 @@ msgstr "导入" #: htdocs/luci-static/resources/view/fchomo/client.js:1713 #: htdocs/luci-static/resources/view/fchomo/client.js:1748 #: htdocs/luci-static/resources/view/fchomo/client.js:1769 -#: htdocs/luci-static/resources/view/fchomo/node.js:1492 -#: htdocs/luci-static/resources/view/fchomo/node.js:1573 +#: htdocs/luci-static/resources/view/fchomo/node.js:1511 +#: htdocs/luci-static/resources/view/fchomo/node.js:1592 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:153 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:241 msgid "Import mihomo config" @@ -1471,37 +1485,37 @@ msgstr "导入规则集链接" #: htdocs/luci-static/resources/fchomo/listeners.js:182 #: htdocs/luci-static/resources/view/fchomo/node.js:287 #: htdocs/luci-static/resources/view/fchomo/node.js:293 -#: htdocs/luci-static/resources/view/fchomo/node.js:1743 -#: htdocs/luci-static/resources/view/fchomo/node.js:1749 +#: htdocs/luci-static/resources/view/fchomo/node.js:1762 +#: htdocs/luci-static/resources/view/fchomo/node.js:1768 msgid "In Mbps." msgstr "单位为 Mbps。" -#: htdocs/luci-static/resources/view/fchomo/node.js:1663 +#: htdocs/luci-static/resources/view/fchomo/node.js:1682 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:377 msgid "In bytes. %s will be used if empty." msgstr "单位为字节。留空则使用 %s。" -#: htdocs/luci-static/resources/view/fchomo/node.js:561 -#: htdocs/luci-static/resources/view/fchomo/node.js:568 +#: htdocs/luci-static/resources/view/fchomo/node.js:579 +#: htdocs/luci-static/resources/view/fchomo/node.js:586 msgid "In millisecond." msgstr "单位为毫秒。" #: htdocs/luci-static/resources/view/fchomo/client.js:1108 #: htdocs/luci-static/resources/view/fchomo/client.js:1137 -#: htdocs/luci-static/resources/view/fchomo/node.js:1817 +#: htdocs/luci-static/resources/view/fchomo/node.js:1836 msgid "In millisecond. %s will be used if empty." msgstr "单位为毫秒。留空则使用 %s。" -#: htdocs/luci-static/resources/view/fchomo/node.js:1320 +#: htdocs/luci-static/resources/view/fchomo/node.js:1339 msgid "In milliseconds." msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:406 -#: htdocs/luci-static/resources/fchomo/listeners.js:457 -#: htdocs/luci-static/resources/fchomo/listeners.js:464 -#: htdocs/luci-static/resources/view/fchomo/node.js:605 -#: htdocs/luci-static/resources/view/fchomo/node.js:612 -#: htdocs/luci-static/resources/view/fchomo/node.js:1267 +#: htdocs/luci-static/resources/fchomo/listeners.js:417 +#: htdocs/luci-static/resources/fchomo/listeners.js:486 +#: htdocs/luci-static/resources/fchomo/listeners.js:493 +#: htdocs/luci-static/resources/view/fchomo/node.js:623 +#: htdocs/luci-static/resources/view/fchomo/node.js:630 +#: htdocs/luci-static/resources/view/fchomo/node.js:1286 msgid "In seconds." msgstr "单位为秒。" @@ -1510,14 +1524,14 @@ msgstr "单位为秒。" #: htdocs/luci-static/resources/view/fchomo/global.js:430 #: htdocs/luci-static/resources/view/fchomo/global.js:515 #: htdocs/luci-static/resources/view/fchomo/node.js:281 -#: htdocs/luci-static/resources/view/fchomo/node.js:1669 -#: htdocs/luci-static/resources/view/fchomo/node.js:1810 +#: htdocs/luci-static/resources/view/fchomo/node.js:1688 +#: htdocs/luci-static/resources/view/fchomo/node.js:1829 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:383 msgid "In seconds. %s will be used if empty." msgstr "单位为秒。留空则使用 %s。" -#: htdocs/luci-static/resources/fchomo/listeners.js:701 -#: htdocs/luci-static/resources/view/fchomo/node.js:941 +#: htdocs/luci-static/resources/fchomo/listeners.js:738 +#: htdocs/luci-static/resources/view/fchomo/node.js:960 msgid "" "In the order of one Padding-Length and one Padding-" "Interval, infinite concatenation." @@ -1559,7 +1573,7 @@ msgstr "引入所有代理节点。" msgid "Info" msgstr "信息" -#: htdocs/luci-static/resources/view/fchomo/node.js:1602 +#: htdocs/luci-static/resources/view/fchomo/node.js:1621 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:279 msgid "Inline" msgstr "内嵌" @@ -1570,27 +1584,27 @@ msgstr "接口控制" #: htdocs/luci-static/resources/fchomo.js:52 #: htdocs/luci-static/resources/fchomo.js:59 -#: htdocs/luci-static/resources/fchomo.js:171 -#: htdocs/luci-static/resources/fchomo.js:365 -#: htdocs/luci-static/resources/view/fchomo/node.js:1759 +#: htdocs/luci-static/resources/fchomo.js:172 +#: htdocs/luci-static/resources/fchomo.js:366 +#: htdocs/luci-static/resources/view/fchomo/node.js:1778 msgid "Keep default" msgstr "保持缺省" -#: htdocs/luci-static/resources/view/fchomo/node.js:1356 +#: htdocs/luci-static/resources/view/fchomo/node.js:1375 msgid "Keep-alive period" msgstr "Keep-alive 周期" -#: htdocs/luci-static/resources/fchomo/listeners.js:285 -#: htdocs/luci-static/resources/view/fchomo/node.js:386 +#: htdocs/luci-static/resources/fchomo/listeners.js:296 +#: htdocs/luci-static/resources/view/fchomo/node.js:397 msgid "Key" msgstr "密钥" -#: htdocs/luci-static/resources/fchomo/listeners.js:932 -#: htdocs/luci-static/resources/view/fchomo/node.js:1108 +#: htdocs/luci-static/resources/fchomo/listeners.js:975 +#: htdocs/luci-static/resources/view/fchomo/node.js:1127 msgid "Key path" msgstr "证书路径" -#: htdocs/luci-static/resources/fchomo/listeners.js:720 +#: htdocs/luci-static/resources/fchomo/listeners.js:757 msgid "Keypairs" msgstr "密钥对" @@ -1602,23 +1616,23 @@ msgstr "密钥对" #: htdocs/luci-static/resources/view/fchomo/client.js:1719 #: htdocs/luci-static/resources/view/fchomo/client.js:1775 #: htdocs/luci-static/resources/view/fchomo/node.js:230 -#: htdocs/luci-static/resources/view/fchomo/node.js:1590 -#: htdocs/luci-static/resources/view/fchomo/node.js:1878 +#: htdocs/luci-static/resources/view/fchomo/node.js:1609 +#: htdocs/luci-static/resources/view/fchomo/node.js:1897 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:259 msgid "Label" msgstr "标签" #: htdocs/luci-static/resources/view/fchomo/client.js:1114 -#: htdocs/luci-static/resources/view/fchomo/node.js:1823 +#: htdocs/luci-static/resources/view/fchomo/node.js:1842 msgid "Lazy" msgstr "懒惰状态" -#: htdocs/luci-static/resources/fchomo/listeners.js:425 -#: htdocs/luci-static/resources/view/fchomo/node.js:457 +#: htdocs/luci-static/resources/fchomo/listeners.js:436 +#: htdocs/luci-static/resources/view/fchomo/node.js:468 msgid "Legacy" msgstr "传统" -#: htdocs/luci-static/resources/fchomo/listeners.js:514 +#: htdocs/luci-static/resources/fchomo/listeners.js:543 msgid "" "Legacy protocol support (VMess MD5 Authentication) is provided for " "compatibility purposes only, use of alterId > 1 is not recommended." @@ -1630,8 +1644,8 @@ msgstr "" msgid "Less compatibility and sometimes better performance." msgstr "有时性能更好。" -#: htdocs/luci-static/resources/fchomo/listeners.js:913 -#: htdocs/luci-static/resources/view/fchomo/node.js:1027 +#: htdocs/luci-static/resources/fchomo/listeners.js:956 +#: htdocs/luci-static/resources/view/fchomo/node.js:1046 msgid "List of supported application level protocols, in order of preference." msgstr "支持的应用层协议协商列表,按顺序排列。" @@ -1656,22 +1670,22 @@ msgstr "监听端口" msgid "Listen ports" msgstr "监听端口" -#: htdocs/luci-static/resources/fchomo.js:232 +#: htdocs/luci-static/resources/fchomo.js:233 msgid "Load balance" msgstr "负载均衡" -#: htdocs/luci-static/resources/view/fchomo/node.js:1600 +#: htdocs/luci-static/resources/view/fchomo/node.js:1619 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:277 msgid "Local" msgstr "本地" -#: htdocs/luci-static/resources/view/fchomo/node.js:698 -#: htdocs/luci-static/resources/view/fchomo/node.js:741 +#: htdocs/luci-static/resources/view/fchomo/node.js:716 +#: htdocs/luci-static/resources/view/fchomo/node.js:759 msgid "Local IPv6 address" msgstr "本地 IPv6 地址" -#: htdocs/luci-static/resources/view/fchomo/node.js:690 -#: htdocs/luci-static/resources/view/fchomo/node.js:733 +#: htdocs/luci-static/resources/view/fchomo/node.js:708 +#: htdocs/luci-static/resources/view/fchomo/node.js:751 msgid "Local address" msgstr "本地地址" @@ -1691,32 +1705,32 @@ msgstr "日志为空。" msgid "Log level" msgstr "日志等级" -#: htdocs/luci-static/resources/fchomo/listeners.js:360 -#: htdocs/luci-static/resources/fchomo/listeners.js:361 -#: htdocs/luci-static/resources/fchomo/listeners.js:362 -#: htdocs/luci-static/resources/fchomo/listeners.js:367 -#: htdocs/luci-static/resources/view/fchomo/node.js:410 -#: htdocs/luci-static/resources/view/fchomo/node.js:411 -#: htdocs/luci-static/resources/view/fchomo/node.js:412 -#: htdocs/luci-static/resources/view/fchomo/node.js:417 +#: htdocs/luci-static/resources/fchomo/listeners.js:371 +#: htdocs/luci-static/resources/fchomo/listeners.js:372 +#: htdocs/luci-static/resources/fchomo/listeners.js:373 +#: htdocs/luci-static/resources/fchomo/listeners.js:378 +#: htdocs/luci-static/resources/view/fchomo/node.js:421 +#: htdocs/luci-static/resources/view/fchomo/node.js:422 +#: htdocs/luci-static/resources/view/fchomo/node.js:423 +#: htdocs/luci-static/resources/view/fchomo/node.js:428 msgid "Low-entropy data stream" msgstr "低熵数据流" -#: htdocs/luci-static/resources/fchomo.js:440 +#: htdocs/luci-static/resources/fchomo.js:441 msgid "Lowercase only" msgstr "仅限小写" #: htdocs/luci-static/resources/view/fchomo/global.js:502 -#: htdocs/luci-static/resources/view/fchomo/node.js:704 -#: htdocs/luci-static/resources/view/fchomo/node.js:787 +#: htdocs/luci-static/resources/view/fchomo/node.js:722 +#: htdocs/luci-static/resources/view/fchomo/node.js:805 msgid "MTU" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:201 +#: htdocs/luci-static/resources/fchomo.js:202 msgid "Masque" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:207 +#: htdocs/luci-static/resources/fchomo/listeners.js:218 msgid "Masquerade" msgstr "伪装" @@ -1748,24 +1762,24 @@ msgstr "匹配响应通过 ipcidr
" msgid "Match rule set." msgstr "匹配规则集。" -#: htdocs/luci-static/resources/view/fchomo/node.js:1273 +#: htdocs/luci-static/resources/view/fchomo/node.js:1292 msgid "Max Early Data" msgstr "前置数据最大值" -#: htdocs/luci-static/resources/fchomo/listeners.js:450 -#: htdocs/luci-static/resources/view/fchomo/node.js:547 +#: htdocs/luci-static/resources/fchomo/listeners.js:479 +#: htdocs/luci-static/resources/view/fchomo/node.js:565 msgid "Max UDP relay packet size" msgstr "UDP 中继数据包最大尺寸" -#: htdocs/luci-static/resources/fchomo/listeners.js:1131 +#: htdocs/luci-static/resources/fchomo/listeners.js:1174 msgid "Max buffered posts" msgstr "POST 最大缓冲" -#: htdocs/luci-static/resources/view/fchomo/node.js:1331 +#: htdocs/luci-static/resources/view/fchomo/node.js:1350 msgid "Max concurrency" msgstr "最大并发" -#: htdocs/luci-static/resources/view/fchomo/node.js:1336 +#: htdocs/luci-static/resources/view/fchomo/node.js:1355 msgid "Max connections" msgstr "最大连接数" @@ -1778,32 +1792,32 @@ msgstr "最大失败次数" msgid "Max download speed" msgstr "最大下载速度" -#: htdocs/luci-static/resources/fchomo/listeners.js:1142 -#: htdocs/luci-static/resources/view/fchomo/node.js:1313 +#: htdocs/luci-static/resources/fchomo/listeners.js:1185 +#: htdocs/luci-static/resources/view/fchomo/node.js:1332 msgid "Max each POST bytes" msgstr "POST 最大字节数" -#: htdocs/luci-static/resources/view/fchomo/node.js:574 +#: htdocs/luci-static/resources/view/fchomo/node.js:592 msgid "Max open streams" msgstr "限制打开流的数量" -#: htdocs/luci-static/resources/fchomo/listeners.js:220 +#: htdocs/luci-static/resources/fchomo/listeners.js:231 msgid "Max realms" msgstr "最大 Realms 总数" -#: htdocs/luci-static/resources/fchomo/listeners.js:226 +#: htdocs/luci-static/resources/fchomo/listeners.js:237 msgid "Max realms per client IP" msgstr "每客户端 IP 最大 Realms 总数" -#: htdocs/luci-static/resources/view/fchomo/node.js:1346 +#: htdocs/luci-static/resources/view/fchomo/node.js:1365 msgid "Max request times" msgstr "最大请求次数" -#: htdocs/luci-static/resources/view/fchomo/node.js:1351 +#: htdocs/luci-static/resources/view/fchomo/node.js:1370 msgid "Max reusable seconds" msgstr "最大可复用秒数" -#: htdocs/luci-static/resources/view/fchomo/node.js:1341 +#: htdocs/luci-static/resources/view/fchomo/node.js:1360 msgid "Max reuse times" msgstr "最大复用次数" @@ -1812,12 +1826,12 @@ msgstr "最大复用次数" msgid "Max upload speed" msgstr "最大上传速度" -#: htdocs/luci-static/resources/view/fchomo/node.js:1377 -#: htdocs/luci-static/resources/view/fchomo/node.js:1397 +#: htdocs/luci-static/resources/view/fchomo/node.js:1396 +#: htdocs/luci-static/resources/view/fchomo/node.js:1416 msgid "Maximum connections" msgstr "最大连接数" -#: htdocs/luci-static/resources/view/fchomo/node.js:1395 +#: htdocs/luci-static/resources/view/fchomo/node.js:1414 msgid "" "Maximum multiplexed streams in a connection before opening a new connection." "
Conflict with %s and %s." @@ -1825,24 +1839,24 @@ msgstr "" "在打开新连接之前,连接中的最大多路复用流数量。
%s 和 " "%s 冲突。" -#: htdocs/luci-static/resources/fchomo/listeners.js:390 -#: htdocs/luci-static/resources/view/fchomo/node.js:429 +#: htdocs/luci-static/resources/fchomo/listeners.js:401 +#: htdocs/luci-static/resources/view/fchomo/node.js:440 msgid "Maximum padding rate" msgstr "最大填充率" -#: htdocs/luci-static/resources/fchomo/listeners.js:398 -#: htdocs/luci-static/resources/view/fchomo/node.js:437 +#: htdocs/luci-static/resources/fchomo/listeners.js:409 +#: htdocs/luci-static/resources/view/fchomo/node.js:448 msgid "" "Maximum padding rate must be greater than or equal to the minimum padding " "rate." msgstr "最大填充率必须大于等于最小填充率。" -#: htdocs/luci-static/resources/view/fchomo/node.js:1394 +#: htdocs/luci-static/resources/view/fchomo/node.js:1413 msgid "Maximum streams" msgstr "最大流数量" #: htdocs/luci-static/resources/fchomo.js:157 -#: htdocs/luci-static/resources/fchomo.js:191 +#: htdocs/luci-static/resources/fchomo.js:192 msgid "Mieru" msgstr "" @@ -1858,26 +1872,26 @@ msgstr "Mihomo 客户端" msgid "Mihomo server" msgstr "Mihomo 服务端" -#: htdocs/luci-static/resources/view/fchomo/node.js:618 +#: htdocs/luci-static/resources/view/fchomo/node.js:636 msgid "Min of idle sessions to keep" msgstr "要保留的最少闲置会话数" -#: htdocs/luci-static/resources/view/fchomo/node.js:1319 +#: htdocs/luci-static/resources/view/fchomo/node.js:1338 msgid "Min posts interval" msgstr "POST 请求最小间隔时间" -#: htdocs/luci-static/resources/view/fchomo/node.js:1386 +#: htdocs/luci-static/resources/view/fchomo/node.js:1405 msgid "" "Minimum multiplexed streams in a connection before opening a new connection." msgstr "在打开新连接之前,连接中的最小多路复用流数量。" -#: htdocs/luci-static/resources/fchomo/listeners.js:383 -#: htdocs/luci-static/resources/view/fchomo/node.js:422 +#: htdocs/luci-static/resources/fchomo/listeners.js:394 +#: htdocs/luci-static/resources/view/fchomo/node.js:433 msgid "Minimum padding rate" msgstr "最小填充率" -#: htdocs/luci-static/resources/view/fchomo/node.js:1385 -#: htdocs/luci-static/resources/view/fchomo/node.js:1397 +#: htdocs/luci-static/resources/view/fchomo/node.js:1404 +#: htdocs/luci-static/resources/view/fchomo/node.js:1416 msgid "Minimum streams" msgstr "最小流数量" @@ -1894,7 +1908,7 @@ msgstr "混合 系统 TCP 栈和 gVisor UDP 栈。" msgid "Mixed port" msgstr "混合端口" -#: htdocs/luci-static/resources/view/fchomo/node.js:1363 +#: htdocs/luci-static/resources/view/fchomo/node.js:1382 msgid "Multiplex" msgstr "多路复用" @@ -1903,7 +1917,7 @@ msgstr "多路复用" msgid "Multiplex fields" msgstr "多路复用字段" -#: htdocs/luci-static/resources/view/fchomo/node.js:363 +#: htdocs/luci-static/resources/view/fchomo/node.js:374 msgid "Multiplexing" msgstr "多路复用" @@ -1912,11 +1926,11 @@ msgstr "多路复用" msgid "NOT" msgstr "NOT" -#: htdocs/luci-static/resources/fchomo/listeners.js:574 +#: htdocs/luci-static/resources/fchomo/listeners.js:611 msgid "Name of the Proxy group as outbound." msgstr "出站代理组的名称。" -#: htdocs/luci-static/resources/view/fchomo/node.js:1675 +#: htdocs/luci-static/resources/view/fchomo/node.js:1694 msgid "Name of the Proxy group to download provider." msgstr "用于下载供应商订阅的代理组名称。" @@ -1924,23 +1938,23 @@ msgstr "用于下载供应商订阅的代理组名称。" msgid "Name of the Proxy group to download rule set." msgstr "用于下载规则集订阅的代理组名称。" -#: htdocs/luci-static/resources/fchomo/listeners.js:568 +#: htdocs/luci-static/resources/fchomo/listeners.js:605 msgid "Name of the Sub rule used for inbound matching." msgstr "用于入站匹配的子规则名称。" -#: htdocs/luci-static/resources/view/fchomo/node.js:531 +#: htdocs/luci-static/resources/view/fchomo/node.js:549 msgid "Native UDP" msgstr "原生 UDP" -#: htdocs/luci-static/resources/fchomo.js:382 +#: htdocs/luci-static/resources/fchomo.js:383 msgid "Native appearance" msgstr "原生外观" -#: htdocs/luci-static/resources/fchomo/listeners.js:600 +#: htdocs/luci-static/resources/fchomo/listeners.js:637 msgid "Network type" msgstr "网络类型" -#: htdocs/luci-static/resources/view/fchomo/node.js:1761 +#: htdocs/luci-static/resources/view/fchomo/node.js:1780 msgid "No" msgstr "" @@ -1948,7 +1962,7 @@ msgstr "" msgid "No Authentication IP ranges" msgstr "无需认证的 IP 范围" -#: htdocs/luci-static/resources/fchomo/listeners.js:1126 +#: htdocs/luci-static/resources/fchomo/listeners.js:1169 msgid "No SSE header" msgstr "无 SSE header" @@ -1956,16 +1970,16 @@ msgstr "无 SSE header" msgid "No add'l params" msgstr "无附加参数" -#: htdocs/luci-static/resources/view/fchomo/node.js:1303 +#: htdocs/luci-static/resources/view/fchomo/node.js:1322 msgid "No gRPC header" msgstr "无 gRPC header" #: htdocs/luci-static/resources/view/fchomo/client.js:1115 -#: htdocs/luci-static/resources/view/fchomo/node.js:1824 +#: htdocs/luci-static/resources/view/fchomo/node.js:1843 msgid "No testing is performed when this provider node is not in use." msgstr "当此供应商的节点未使用时,不执行任何测试。" -#: htdocs/luci-static/resources/fchomo.js:687 +#: htdocs/luci-static/resources/fchomo.js:688 msgid "No valid %s found." msgstr "未找到有效的%s。" @@ -1980,17 +1994,17 @@ msgid "Node" msgstr "节点" #: htdocs/luci-static/resources/view/fchomo/client.js:1160 -#: htdocs/luci-static/resources/view/fchomo/node.js:1844 +#: htdocs/luci-static/resources/view/fchomo/node.js:1863 msgid "Node exclude filter" msgstr "排除节点" #: htdocs/luci-static/resources/view/fchomo/client.js:1165 -#: htdocs/luci-static/resources/view/fchomo/node.js:1851 +#: htdocs/luci-static/resources/view/fchomo/node.js:1870 msgid "Node exclude type" msgstr "排除节点类型" #: htdocs/luci-static/resources/view/fchomo/client.js:1155 -#: htdocs/luci-static/resources/view/fchomo/node.js:1838 +#: htdocs/luci-static/resources/view/fchomo/node.js:1857 msgid "Node filter" msgstr "过滤节点" @@ -1998,7 +2012,7 @@ msgstr "过滤节点" msgid "Node switch tolerance" msgstr "节点切换容差" -#: htdocs/luci-static/resources/fchomo.js:409 +#: htdocs/luci-static/resources/fchomo.js:410 msgid "None" msgstr "无" @@ -2006,39 +2020,49 @@ msgstr "无" msgid "Not Installed" msgstr "未安装" -#: htdocs/luci-static/resources/fchomo.js:1205 +#: htdocs/luci-static/resources/fchomo.js:1206 msgid "Not Running" msgstr "未在运行" -#: htdocs/luci-static/resources/view/fchomo/node.js:483 +#: htdocs/luci-static/resources/view/fchomo/node.js:494 msgid "OFF" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:485 +#: htdocs/luci-static/resources/view/fchomo/node.js:496 msgid "ON" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:538 -#: htdocs/luci-static/resources/view/fchomo/node.js:816 +#: htdocs/luci-static/resources/fchomo/listeners.js:567 +#: htdocs/luci-static/resources/view/fchomo/node.js:834 msgid "Obfs Mode" msgstr "Obfs 模式" -#: htdocs/luci-static/resources/fchomo/listeners.js:199 -#: htdocs/luci-static/resources/view/fchomo/node.js:304 +#: htdocs/luci-static/resources/fchomo/listeners.js:213 +#: htdocs/luci-static/resources/view/fchomo/node.js:318 +msgid "Obfuscate maximum packet size" +msgstr "混淆最大数据包大小" + +#: htdocs/luci-static/resources/fchomo/listeners.js:208 +#: htdocs/luci-static/resources/view/fchomo/node.js:313 +msgid "Obfuscate minimum packet size" +msgstr "混淆最小数据包大小" + +#: htdocs/luci-static/resources/fchomo/listeners.js:200 +#: htdocs/luci-static/resources/view/fchomo/node.js:305 msgid "Obfuscate password" msgstr "混淆密码" #: htdocs/luci-static/resources/fchomo/listeners.js:193 -#: htdocs/luci-static/resources/fchomo/listeners.js:358 +#: htdocs/luci-static/resources/fchomo/listeners.js:369 #: htdocs/luci-static/resources/view/fchomo/node.js:298 -#: htdocs/luci-static/resources/view/fchomo/node.js:408 +#: htdocs/luci-static/resources/view/fchomo/node.js:419 msgid "Obfuscate type" msgstr "混淆类型" -#: htdocs/luci-static/resources/fchomo/listeners.js:359 -#: htdocs/luci-static/resources/fchomo/listeners.js:360 -#: htdocs/luci-static/resources/view/fchomo/node.js:409 -#: htdocs/luci-static/resources/view/fchomo/node.js:410 +#: htdocs/luci-static/resources/fchomo/listeners.js:370 +#: htdocs/luci-static/resources/fchomo/listeners.js:371 +#: htdocs/luci-static/resources/view/fchomo/node.js:420 +#: htdocs/luci-static/resources/view/fchomo/node.js:421 msgid "Obfuscated as %s" msgstr "混淆为%s" @@ -2046,8 +2070,12 @@ msgstr "混淆为%s" msgid "One or more numbers in the range 0-63 separated by commas" msgstr "0-63 范围内的一个或多个数字,以逗号分隔" -#: htdocs/luci-static/resources/fchomo/listeners.js:367 -#: htdocs/luci-static/resources/view/fchomo/node.js:417 +#: htdocs/luci-static/resources/fchomo/listeners.js:896 +msgid "Only applicable when %s are used as a frontend." +msgstr "仅当 %s 用作前端时适用。" + +#: htdocs/luci-static/resources/fchomo/listeners.js:378 +#: htdocs/luci-static/resources/view/fchomo/node.js:428 msgid "Only applies to the %s." msgstr "只对%s生效。" @@ -2055,7 +2083,7 @@ msgstr "只对%s生效。" msgid "Only process traffic from specific interfaces. Leave empty for all." msgstr "只处理来自指定接口的流量。留空表示全部。" -#: htdocs/luci-static/resources/fchomo.js:1199 +#: htdocs/luci-static/resources/fchomo.js:1200 msgid "Open Dashboard" msgstr "打开面板" @@ -2069,11 +2097,11 @@ msgid "Override destination" msgstr "覆盖目标地址" #: htdocs/luci-static/resources/view/fchomo/client.js:1010 -#: htdocs/luci-static/resources/view/fchomo/node.js:1586 +#: htdocs/luci-static/resources/view/fchomo/node.js:1605 msgid "Override fields" msgstr "覆盖字段" -#: htdocs/luci-static/resources/view/fchomo/node.js:523 +#: htdocs/luci-static/resources/view/fchomo/node.js:541 msgid "Override the IP address of the server that DNS response." msgstr "覆盖 DNS 回应的服务器的 IP 地址。" @@ -2089,7 +2117,7 @@ msgstr "使用嗅探到的域名覆盖连接目标。" msgid "Override the existing ECS in original request." msgstr "覆盖原始请求中已有的 ECS。" -#: htdocs/luci-static/resources/view/fchomo/node.js:1135 +#: htdocs/luci-static/resources/view/fchomo/node.js:1154 msgid "Overrides the domain name used for HTTPS record queries." msgstr "覆盖用于 HTTPS 记录查询的域名。" @@ -2097,47 +2125,47 @@ msgstr "覆盖用于 HTTPS 记录查询的域名。" msgid "Overview" msgstr "概览" -#: htdocs/luci-static/resources/view/fchomo/node.js:1230 +#: htdocs/luci-static/resources/view/fchomo/node.js:1249 msgid "POST" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1231 +#: htdocs/luci-static/resources/view/fchomo/node.js:1250 msgid "PUT" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:667 +#: htdocs/luci-static/resources/view/fchomo/node.js:685 msgid "Packet encoding" msgstr "数据包编码" -#: htdocs/luci-static/resources/view/fchomo/node.js:1308 +#: htdocs/luci-static/resources/view/fchomo/node.js:1327 msgid "Padding bytes" msgstr "填充字节" -#: htdocs/luci-static/resources/fchomo/listeners.js:494 +#: htdocs/luci-static/resources/fchomo/listeners.js:523 msgid "Padding scheme" msgstr "填充方案" -#: htdocs/luci-static/resources/fchomo/listeners.js:699 -#: htdocs/luci-static/resources/view/fchomo/node.js:939 +#: htdocs/luci-static/resources/fchomo/listeners.js:736 +#: htdocs/luci-static/resources/view/fchomo/node.js:958 msgid "Paddings" msgstr "填充 (Paddings)" #: htdocs/luci-static/resources/fchomo/listeners.js:166 -#: htdocs/luci-static/resources/fchomo/listeners.js:252 -#: htdocs/luci-static/resources/fchomo/listeners.js:551 +#: htdocs/luci-static/resources/fchomo/listeners.js:263 +#: htdocs/luci-static/resources/fchomo/listeners.js:588 #: htdocs/luci-static/resources/view/fchomo/node.js:262 -#: htdocs/luci-static/resources/view/fchomo/node.js:341 -#: htdocs/luci-static/resources/view/fchomo/node.js:831 +#: htdocs/luci-static/resources/view/fchomo/node.js:352 +#: htdocs/luci-static/resources/view/fchomo/node.js:849 msgid "Password" msgstr "密码" -#: htdocs/luci-static/resources/fchomo/listeners.js:639 -#: htdocs/luci-static/resources/view/fchomo/node.js:1650 +#: htdocs/luci-static/resources/fchomo/listeners.js:676 +#: htdocs/luci-static/resources/view/fchomo/node.js:1669 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:364 msgid "Payload" msgstr "Payload" -#: htdocs/luci-static/resources/view/fchomo/node.js:755 +#: htdocs/luci-static/resources/view/fchomo/node.js:773 msgid "Peer pubkic key" msgstr "对端公钥" @@ -2147,11 +2175,11 @@ msgid "" "it is not needed." msgstr "性能可能会略有下降,建议仅在需要时开启。" -#: htdocs/luci-static/resources/view/fchomo/node.js:782 +#: htdocs/luci-static/resources/view/fchomo/node.js:800 msgid "Periodically sends data packets to maintain connection persistence." msgstr "定期发送数据包以维持连接持久性。" -#: htdocs/luci-static/resources/view/fchomo/node.js:781 +#: htdocs/luci-static/resources/view/fchomo/node.js:799 msgid "Persistent keepalive" msgstr "持久连接" @@ -2174,8 +2202,8 @@ msgid "" "standards." msgstr "链接格式标准请参考
%s。" -#: htdocs/luci-static/resources/view/fchomo/node.js:1623 -#: htdocs/luci-static/resources/view/fchomo/node.js:1649 +#: htdocs/luci-static/resources/view/fchomo/node.js:1642 +#: htdocs/luci-static/resources/view/fchomo/node.js:1668 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:337 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:363 msgid "" @@ -2190,26 +2218,27 @@ msgstr "" #: htdocs/luci-static/resources/view/fchomo/client.js:1445 #: htdocs/luci-static/resources/view/fchomo/client.js:1697 #: htdocs/luci-static/resources/view/fchomo/client.js:1749 -#: htdocs/luci-static/resources/view/fchomo/node.js:1493 +#: htdocs/luci-static/resources/view/fchomo/node.js:1512 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:154 msgid "Please type %s fields of mihomo config.
" msgstr "请输入 mihomo 配置的 %s 字段。
" -#: htdocs/luci-static/resources/fchomo/listeners.js:530 -#: htdocs/luci-static/resources/view/fchomo/node.js:805 +#: htdocs/luci-static/resources/fchomo/listeners.js:559 +#: htdocs/luci-static/resources/view/fchomo/node.js:823 msgid "Plugin" msgstr "插件" -#: htdocs/luci-static/resources/fchomo/listeners.js:538 -#: htdocs/luci-static/resources/fchomo/listeners.js:544 -#: htdocs/luci-static/resources/fchomo/listeners.js:551 -#: htdocs/luci-static/resources/fchomo/listeners.js:557 -#: htdocs/luci-static/resources/view/fchomo/node.js:816 -#: htdocs/luci-static/resources/view/fchomo/node.js:823 -#: htdocs/luci-static/resources/view/fchomo/node.js:831 -#: htdocs/luci-static/resources/view/fchomo/node.js:837 -#: htdocs/luci-static/resources/view/fchomo/node.js:845 -#: htdocs/luci-static/resources/view/fchomo/node.js:851 +#: htdocs/luci-static/resources/fchomo/listeners.js:567 +#: htdocs/luci-static/resources/fchomo/listeners.js:574 +#: htdocs/luci-static/resources/fchomo/listeners.js:581 +#: htdocs/luci-static/resources/fchomo/listeners.js:588 +#: htdocs/luci-static/resources/fchomo/listeners.js:594 +#: htdocs/luci-static/resources/view/fchomo/node.js:834 +#: htdocs/luci-static/resources/view/fchomo/node.js:841 +#: htdocs/luci-static/resources/view/fchomo/node.js:849 +#: htdocs/luci-static/resources/view/fchomo/node.js:855 +#: htdocs/luci-static/resources/view/fchomo/node.js:863 +#: htdocs/luci-static/resources/view/fchomo/node.js:869 msgid "Plugin:" msgstr "插件:" @@ -2217,7 +2246,7 @@ msgstr "插件:" msgid "Port" msgstr "端口" -#: htdocs/luci-static/resources/fchomo.js:1436 +#: htdocs/luci-static/resources/fchomo.js:1437 msgid "Port %s alrealy exists!" msgstr "端口 %s 已存在!" @@ -2225,7 +2254,7 @@ msgstr "端口 %s 已存在!" msgid "Port hop interval" msgstr "端口跳跃间隔" -#: htdocs/luci-static/resources/view/fchomo/node.js:351 +#: htdocs/luci-static/resources/view/fchomo/node.js:362 msgid "Port range" msgstr "端口范围" @@ -2238,22 +2267,23 @@ msgstr "端口" msgid "Ports pool" msgstr "端口池" -#: htdocs/luci-static/resources/fchomo/listeners.js:214 -#: htdocs/luci-static/resources/view/fchomo/node.js:500 -#: htdocs/luci-static/resources/view/fchomo/node.js:762 +#: htdocs/luci-static/resources/fchomo/listeners.js:225 +#: htdocs/luci-static/resources/fchomo/listeners.js:455 +#: htdocs/luci-static/resources/view/fchomo/node.js:511 +#: htdocs/luci-static/resources/view/fchomo/node.js:780 msgid "Pre-shared key" msgstr "预共享密钥" -#: htdocs/luci-static/resources/fchomo/listeners.js:837 -#: htdocs/luci-static/resources/view/fchomo/node.js:974 +#: htdocs/luci-static/resources/fchomo/listeners.js:874 +#: htdocs/luci-static/resources/view/fchomo/node.js:993 msgid "Pre-shared key of rendezvous server" msgstr "牵线服务器的预共享密钥" -#: htdocs/luci-static/resources/fchomo.js:175 +#: htdocs/luci-static/resources/fchomo.js:176 msgid "Prefer IPv4" msgstr "优先 IPv4" -#: htdocs/luci-static/resources/fchomo.js:176 +#: htdocs/luci-static/resources/fchomo.js:177 msgid "Prefer IPv6" msgstr "优先 IPv6" @@ -2264,23 +2294,23 @@ msgstr "防止某些情况下的 ICMP 环回问题。Ping 不会显示实际延 #: htdocs/luci-static/resources/view/fchomo/global.js:736 #: htdocs/luci-static/resources/view/fchomo/global.js:753 -#: htdocs/luci-static/resources/view/fchomo/node.js:1457 -#: htdocs/luci-static/resources/view/fchomo/node.js:1463 -#: htdocs/luci-static/resources/view/fchomo/node.js:1773 -#: htdocs/luci-static/resources/view/fchomo/node.js:1780 +#: htdocs/luci-static/resources/view/fchomo/node.js:1476 +#: htdocs/luci-static/resources/view/fchomo/node.js:1482 +#: htdocs/luci-static/resources/view/fchomo/node.js:1792 +#: htdocs/luci-static/resources/view/fchomo/node.js:1799 msgid "Priority: Proxy Node > Global." msgstr "优先级: 代理节点 > 全局。" -#: htdocs/luci-static/resources/view/fchomo/node.js:313 +#: htdocs/luci-static/resources/view/fchomo/node.js:324 msgid "Priv-key" msgstr "密钥" -#: htdocs/luci-static/resources/view/fchomo/node.js:317 +#: htdocs/luci-static/resources/view/fchomo/node.js:328 msgid "Priv-key passphrase" msgstr "密钥密码" -#: htdocs/luci-static/resources/view/fchomo/node.js:675 -#: htdocs/luci-static/resources/view/fchomo/node.js:747 +#: htdocs/luci-static/resources/view/fchomo/node.js:693 +#: htdocs/luci-static/resources/view/fchomo/node.js:765 msgid "Private key" msgstr "私钥" @@ -2289,28 +2319,28 @@ msgid "Process matching mode" msgstr "进程匹配模式" #: htdocs/luci-static/resources/view/fchomo/global.js:684 -#: htdocs/luci-static/resources/view/fchomo/node.js:1369 +#: htdocs/luci-static/resources/view/fchomo/node.js:1388 msgid "Protocol" msgstr "协议" -#: htdocs/luci-static/resources/view/fchomo/node.js:662 +#: htdocs/luci-static/resources/view/fchomo/node.js:680 msgid "Protocol parameter. Enable length block encryption." msgstr "协议参数。启用长度块加密。" -#: htdocs/luci-static/resources/view/fchomo/node.js:656 +#: htdocs/luci-static/resources/view/fchomo/node.js:674 msgid "" "Protocol parameter. Will waste traffic randomly if enabled (enabled by " "default in v2ray and cannot be disabled)." msgstr "协议参数。 如启用会随机浪费流量(在 v2ray 中默认启用并且无法禁用)。" #: htdocs/luci-static/resources/view/fchomo/client.js:1055 -#: htdocs/luci-static/resources/view/fchomo/node.js:1476 -#: htdocs/luci-static/resources/view/fchomo/node.js:1485 -#: htdocs/luci-static/resources/view/fchomo/node.js:1889 +#: htdocs/luci-static/resources/view/fchomo/node.js:1495 +#: htdocs/luci-static/resources/view/fchomo/node.js:1504 +#: htdocs/luci-static/resources/view/fchomo/node.js:1908 msgid "Provider" msgstr "供应商" -#: htdocs/luci-static/resources/view/fchomo/node.js:1656 +#: htdocs/luci-static/resources/view/fchomo/node.js:1675 msgid "Provider URL" msgstr "供应商订阅 URL" @@ -2333,19 +2363,19 @@ msgid "Proxy MAC-s" msgstr "代理 MAC 地址" #: htdocs/luci-static/resources/view/fchomo/node.js:208 -#: htdocs/luci-static/resources/view/fchomo/node.js:1888 +#: htdocs/luci-static/resources/view/fchomo/node.js:1907 msgid "Proxy Node" msgstr "代理节点" -#: htdocs/luci-static/resources/view/fchomo/node.js:1864 -#: htdocs/luci-static/resources/view/fchomo/node.js:1873 +#: htdocs/luci-static/resources/view/fchomo/node.js:1883 +#: htdocs/luci-static/resources/view/fchomo/node.js:1892 msgid "Proxy chain" msgstr "代理链" -#: htdocs/luci-static/resources/fchomo/listeners.js:573 +#: htdocs/luci-static/resources/fchomo/listeners.js:610 #: htdocs/luci-static/resources/view/fchomo/client.js:783 #: htdocs/luci-static/resources/view/fchomo/client.js:1543 -#: htdocs/luci-static/resources/view/fchomo/node.js:1674 +#: htdocs/luci-static/resources/view/fchomo/node.js:1693 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:388 msgid "Proxy group" msgstr "代理组" @@ -2362,8 +2392,8 @@ msgstr "代理模式" msgid "Proxy routerself" msgstr "代理路由器自身" -#: htdocs/luci-static/resources/view/fchomo/node.js:532 -#: htdocs/luci-static/resources/view/fchomo/node.js:727 +#: htdocs/luci-static/resources/view/fchomo/node.js:550 +#: htdocs/luci-static/resources/view/fchomo/node.js:745 msgid "QUIC" msgstr "" @@ -2372,44 +2402,44 @@ msgstr "" msgid "Quick Reload" msgstr "快速重载" -#: htdocs/luci-static/resources/fchomo/listeners.js:1020 -#: htdocs/luci-static/resources/view/fchomo/node.js:1149 +#: htdocs/luci-static/resources/fchomo/listeners.js:1063 +#: htdocs/luci-static/resources/view/fchomo/node.js:1168 msgid "REALITY" msgstr "REALITY" -#: htdocs/luci-static/resources/view/fchomo/node.js:1164 +#: htdocs/luci-static/resources/view/fchomo/node.js:1183 msgid "REALITY X25519MLKEM768 PQC support" msgstr "REALITY X25519MLKEM768 后量子加密支持" -#: htdocs/luci-static/resources/fchomo/listeners.js:1057 +#: htdocs/luci-static/resources/fchomo/listeners.js:1100 msgid "REALITY certificate issued to" msgstr "REALITY 证书颁发给" -#: htdocs/luci-static/resources/fchomo/listeners.js:1025 +#: htdocs/luci-static/resources/fchomo/listeners.js:1068 msgid "REALITY handshake server" msgstr "REALITY 握手服务器" -#: htdocs/luci-static/resources/fchomo/listeners.js:1032 +#: htdocs/luci-static/resources/fchomo/listeners.js:1075 msgid "REALITY private key" msgstr "REALITY 私钥" -#: htdocs/luci-static/resources/fchomo/listeners.js:1047 -#: htdocs/luci-static/resources/view/fchomo/node.js:1154 +#: htdocs/luci-static/resources/fchomo/listeners.js:1090 +#: htdocs/luci-static/resources/view/fchomo/node.js:1173 msgid "REALITY public key" msgstr "REALITY 公钥" -#: htdocs/luci-static/resources/fchomo/listeners.js:1051 -#: htdocs/luci-static/resources/view/fchomo/node.js:1159 +#: htdocs/luci-static/resources/fchomo/listeners.js:1094 +#: htdocs/luci-static/resources/view/fchomo/node.js:1178 msgid "REALITY short ID" msgstr "REALITY 标识符" -#: htdocs/luci-static/resources/fchomo/listeners.js:670 -#: htdocs/luci-static/resources/fchomo/listeners.js:689 -#: htdocs/luci-static/resources/view/fchomo/node.js:929 +#: htdocs/luci-static/resources/fchomo/listeners.js:707 +#: htdocs/luci-static/resources/fchomo/listeners.js:726 +#: htdocs/luci-static/resources/view/fchomo/node.js:948 msgid "RTT" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:374 +#: htdocs/luci-static/resources/fchomo.js:375 msgid "Random" msgstr "随机" @@ -2417,21 +2447,21 @@ msgstr "随机" msgid "Random will be used if empty." msgstr "留空将使用随机令牌。" -#: htdocs/luci-static/resources/fchomo.js:384 +#: htdocs/luci-static/resources/fchomo.js:385 msgid "Randomized traffic characteristics" msgstr "随机化流量特征" -#: htdocs/luci-static/resources/fchomo/listeners.js:826 -#: htdocs/luci-static/resources/view/fchomo/node.js:963 +#: htdocs/luci-static/resources/fchomo/listeners.js:863 +#: htdocs/luci-static/resources/view/fchomo/node.js:982 msgid "Realm" msgstr "Realm" -#: htdocs/luci-static/resources/fchomo/listeners.js:842 -#: htdocs/luci-static/resources/view/fchomo/node.js:979 +#: htdocs/luci-static/resources/fchomo/listeners.js:879 +#: htdocs/luci-static/resources/view/fchomo/node.js:998 msgid "Realm ID" msgstr "Realm ID" -#: htdocs/luci-static/resources/fchomo/listeners.js:237 +#: htdocs/luci-static/resources/fchomo/listeners.js:248 msgid "Realm name pattern" msgstr "Realm 名称模式" @@ -2455,7 +2485,7 @@ msgstr "Redirect TCP + Tun UDP" msgid "Refresh every %s seconds." msgstr "每 %s 秒刷新。" -#: htdocs/luci-static/resources/fchomo.js:1192 +#: htdocs/luci-static/resources/fchomo.js:1193 #: htdocs/luci-static/resources/view/fchomo/client.js:927 #: htdocs/luci-static/resources/view/fchomo/global.js:193 #: htdocs/luci-static/resources/view/fchomo/server.js:45 @@ -2466,69 +2496,69 @@ msgstr "重载" msgid "Reload All" msgstr "重载所有" -#: htdocs/luci-static/resources/view/fchomo/node.js:1601 +#: htdocs/luci-static/resources/view/fchomo/node.js:1620 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:278 msgid "Remote" msgstr "远程" -#: htdocs/luci-static/resources/view/fchomo/node.js:710 -#: htdocs/luci-static/resources/view/fchomo/node.js:793 +#: htdocs/luci-static/resources/view/fchomo/node.js:728 +#: htdocs/luci-static/resources/view/fchomo/node.js:811 msgid "Remote DNS resolve" msgstr "远程 DNS 解析" -#: htdocs/luci-static/resources/fchomo.js:1357 +#: htdocs/luci-static/resources/fchomo.js:1358 msgid "Remove" msgstr "移除" -#: htdocs/luci-static/resources/fchomo.js:1362 -#: htdocs/luci-static/resources/view/fchomo/node.js:1577 -#: htdocs/luci-static/resources/view/fchomo/node.js:1579 +#: htdocs/luci-static/resources/fchomo.js:1363 +#: htdocs/luci-static/resources/view/fchomo/node.js:1596 +#: htdocs/luci-static/resources/view/fchomo/node.js:1598 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:251 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:253 msgid "Remove idles" msgstr "移除闲置" -#: htdocs/luci-static/resources/fchomo/listeners.js:831 -#: htdocs/luci-static/resources/view/fchomo/node.js:968 +#: htdocs/luci-static/resources/fchomo/listeners.js:868 +#: htdocs/luci-static/resources/view/fchomo/node.js:987 msgid "Rendezvous server" msgstr "牵线服务器" -#: htdocs/luci-static/resources/view/fchomo/node.js:1703 +#: htdocs/luci-static/resources/view/fchomo/node.js:1722 msgid "Replace name" msgstr "名称替换" -#: htdocs/luci-static/resources/view/fchomo/node.js:1704 +#: htdocs/luci-static/resources/view/fchomo/node.js:1723 msgid "Replace node name." msgstr "替换节点名称" -#: htdocs/luci-static/resources/fchomo.js:358 +#: htdocs/luci-static/resources/fchomo.js:359 msgid "Request" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:1105 -#: htdocs/luci-static/resources/view/fchomo/node.js:1237 -#: htdocs/luci-static/resources/view/fchomo/node.js:1244 +#: htdocs/luci-static/resources/fchomo/listeners.js:1148 +#: htdocs/luci-static/resources/view/fchomo/node.js:1256 +#: htdocs/luci-static/resources/view/fchomo/node.js:1263 msgid "Request path" msgstr "请求路径" -#: htdocs/luci-static/resources/view/fchomo/node.js:567 +#: htdocs/luci-static/resources/view/fchomo/node.js:585 msgid "Request timeout" msgstr "请求超时" -#: htdocs/luci-static/resources/fchomo.js:361 +#: htdocs/luci-static/resources/fchomo.js:362 msgid "Require and verify" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:359 +#: htdocs/luci-static/resources/fchomo.js:360 msgid "Require any" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:392 -#: htdocs/luci-static/resources/view/fchomo/node.js:1165 +#: htdocs/luci-static/resources/fchomo.js:393 +#: htdocs/luci-static/resources/view/fchomo/node.js:1184 msgid "Requires server support." msgstr "需要服务器支持。" -#: htdocs/luci-static/resources/view/fchomo/node.js:776 +#: htdocs/luci-static/resources/view/fchomo/node.js:794 msgid "Reserved field bytes" msgstr "保留字段字节" @@ -2536,7 +2566,7 @@ msgstr "保留字段字节" msgid "Resources management" msgstr "资源管理" -#: htdocs/luci-static/resources/view/fchomo/node.js:851 +#: htdocs/luci-static/resources/view/fchomo/node.js:869 msgid "Restls script" msgstr "Restls 剧本" @@ -2550,12 +2580,12 @@ msgid "" "Returns the string input for icon in the API to display in this proxy group." msgstr "在 API 返回 icon 所输入的字符串,以在该代理组显示。" -#: htdocs/luci-static/resources/view/fchomo/node.js:484 +#: htdocs/luci-static/resources/view/fchomo/node.js:495 msgid "Reuse HTTP connections to reduce RTT for each connection establishment." msgstr "重用 HTTP 连接以减少每次建立连接的 RTT。" -#: htdocs/luci-static/resources/view/fchomo/node.js:481 -#: htdocs/luci-static/resources/view/fchomo/node.js:485 +#: htdocs/luci-static/resources/view/fchomo/node.js:492 +#: htdocs/luci-static/resources/view/fchomo/node.js:496 msgid "Reusing a single tunnel to carry multiple target connections within it." msgstr "复用单条隧道使其内部承载多条目标连线。" @@ -2572,8 +2602,8 @@ msgstr "路由 DSCP" msgid "Routing GFW" msgstr "路由 GFW 流量" -#: htdocs/luci-static/resources/view/fchomo/node.js:1462 -#: htdocs/luci-static/resources/view/fchomo/node.js:1779 +#: htdocs/luci-static/resources/view/fchomo/node.js:1481 +#: htdocs/luci-static/resources/view/fchomo/node.js:1798 msgid "Routing mark" msgstr "路由标记" @@ -2633,11 +2663,11 @@ msgstr "规则集" msgid "Ruleset-URI-Scheme" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:1205 +#: htdocs/luci-static/resources/fchomo.js:1206 msgid "Running" msgstr "正在运行" -#: htdocs/luci-static/resources/fchomo.js:240 +#: htdocs/luci-static/resources/fchomo.js:241 msgid "SMTP" msgstr "" @@ -2645,20 +2675,20 @@ msgstr "" msgid "SOCKS" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:188 +#: htdocs/luci-static/resources/fchomo.js:189 msgid "SOCKS5" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:204 +#: htdocs/luci-static/resources/fchomo.js:205 msgid "SSH" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:241 +#: htdocs/luci-static/resources/fchomo.js:242 msgid "STUN" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:848 -#: htdocs/luci-static/resources/view/fchomo/node.js:985 +#: htdocs/luci-static/resources/fchomo/listeners.js:885 +#: htdocs/luci-static/resources/view/fchomo/node.js:1004 msgid "STUN servers" msgstr "STUN 服务器" @@ -2666,7 +2696,7 @@ msgstr "STUN 服务器" msgid "SUB-RULE" msgstr "SUB-RULE" -#: htdocs/luci-static/resources/view/fchomo/node.js:886 +#: htdocs/luci-static/resources/view/fchomo/node.js:905 msgid "SUoT version" msgstr "SUoT 版本" @@ -2675,11 +2705,11 @@ msgstr "SUoT 版本" msgid "Salamander" msgstr "Salamander" -#: htdocs/luci-static/resources/fchomo.js:181 +#: htdocs/luci-static/resources/fchomo.js:182 msgid "Same dstaddr requests. Same node" msgstr "相同 目标地址 请求。相同节点" -#: htdocs/luci-static/resources/fchomo.js:182 +#: htdocs/luci-static/resources/fchomo.js:183 msgid "Same srcaddr and dstaddr requests. Same node" msgstr "相同 来源地址 和 目标地址 请求。相同节点" @@ -2687,7 +2717,7 @@ msgstr "相同 来源地址 和 目标地址 请求。相同节点" msgid "Segment maximum size" msgstr "分段最大尺寸" -#: htdocs/luci-static/resources/fchomo.js:229 +#: htdocs/luci-static/resources/fchomo.js:230 msgid "Select" msgstr "手动选择" @@ -2695,18 +2725,18 @@ msgstr "手动选择" msgid "Select Dashboard" msgstr "选择面板" -#: htdocs/luci-static/resources/fchomo.js:398 +#: htdocs/luci-static/resources/fchomo.js:399 msgid "Send padding randomly 0-3333 bytes with 50% probability." msgstr "以 50% 的概率发送随机 0-3333 字节的填充。" -#: htdocs/luci-static/resources/fchomo.js:387 #: htdocs/luci-static/resources/fchomo.js:388 +#: htdocs/luci-static/resources/fchomo.js:389 msgid "Send random ticket of 300s-600s duration for client 0-RTT reuse." msgstr "发送 300-600 秒的随机票证,以供客户端 0-RTT 重用。" -#: htdocs/luci-static/resources/fchomo/listeners.js:670 -#: htdocs/luci-static/resources/fchomo/listeners.js:918 -#: htdocs/luci-static/resources/fchomo/listeners.js:933 +#: htdocs/luci-static/resources/fchomo/listeners.js:707 +#: htdocs/luci-static/resources/fchomo/listeners.js:961 +#: htdocs/luci-static/resources/fchomo/listeners.js:976 #: htdocs/luci-static/resources/view/fchomo/server.js:58 #: root/usr/share/luci/menu.d/luci-app-fchomo.json:62 msgid "Server" @@ -2716,9 +2746,9 @@ msgstr "服务端" msgid "Server address" msgstr "服务器地址" -#: htdocs/luci-static/resources/fchomo/listeners.js:1099 -#: htdocs/luci-static/resources/view/fchomo/node.js:1216 -#: htdocs/luci-static/resources/view/fchomo/node.js:1222 +#: htdocs/luci-static/resources/fchomo/listeners.js:1142 +#: htdocs/luci-static/resources/view/fchomo/node.js:1235 +#: htdocs/luci-static/resources/view/fchomo/node.js:1241 msgid "Server hostname" msgstr "服务器主机名称" @@ -2731,26 +2761,26 @@ msgid "Service status" msgstr "服务状态" #: htdocs/luci-static/resources/fchomo.js:156 -#: htdocs/luci-static/resources/fchomo.js:189 +#: htdocs/luci-static/resources/fchomo.js:190 msgid "Shadowsocks" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:476 -#: htdocs/luci-static/resources/view/fchomo/node.js:586 +#: htdocs/luci-static/resources/fchomo/listeners.js:505 +#: htdocs/luci-static/resources/view/fchomo/node.js:604 msgid "Shadowsocks chipher" msgstr "Shadowsocks 加密方法" -#: htdocs/luci-static/resources/fchomo/listeners.js:471 -#: htdocs/luci-static/resources/view/fchomo/node.js:581 +#: htdocs/luci-static/resources/fchomo/listeners.js:500 +#: htdocs/luci-static/resources/view/fchomo/node.js:599 msgid "Shadowsocks encrypt" msgstr "Shadowsocks 加密" -#: htdocs/luci-static/resources/fchomo/listeners.js:484 -#: htdocs/luci-static/resources/view/fchomo/node.js:594 +#: htdocs/luci-static/resources/fchomo/listeners.js:513 +#: htdocs/luci-static/resources/view/fchomo/node.js:612 msgid "Shadowsocks password" msgstr "Shadowsocks 密码" -#: htdocs/luci-static/resources/view/fchomo/node.js:1417 +#: htdocs/luci-static/resources/view/fchomo/node.js:1436 msgid "Show connections in the dashboard for breaking connections easier." msgstr "在面板中显示连接以便于打断连接。" @@ -2758,18 +2788,18 @@ msgstr "在面板中显示连接以便于打断连接。" msgid "Silent" msgstr "静音" -#: htdocs/luci-static/resources/fchomo.js:180 +#: htdocs/luci-static/resources/fchomo.js:181 msgid "Simple round-robin all nodes" msgstr "简单轮替所有节点" -#: htdocs/luci-static/resources/view/fchomo/node.js:1662 +#: htdocs/luci-static/resources/view/fchomo/node.js:1681 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:376 msgid "Size limit" msgstr "大小限制" #: htdocs/luci-static/resources/view/fchomo/client.js:1576 -#: htdocs/luci-static/resources/view/fchomo/node.js:1086 -#: htdocs/luci-static/resources/view/fchomo/node.js:1754 +#: htdocs/luci-static/resources/view/fchomo/node.js:1105 +#: htdocs/luci-static/resources/view/fchomo/node.js:1773 msgid "Skip cert verify" msgstr "跳过证书验证" @@ -2785,7 +2815,8 @@ msgstr "跳过嗅探目标地址" msgid "Skiped sniffing src address" msgstr "跳过嗅探来源地址" -#: htdocs/luci-static/resources/fchomo.js:193 +#: htdocs/luci-static/resources/fchomo.js:159 +#: htdocs/luci-static/resources/fchomo.js:194 msgid "Snell" msgstr "" @@ -2801,7 +2832,7 @@ msgstr "嗅探器" msgid "Sniffer settings" msgstr "嗅探器设置" -#: htdocs/luci-static/resources/fchomo.js:430 +#: htdocs/luci-static/resources/fchomo.js:431 msgid "Specify a ID" msgstr "指定一个ID" @@ -2820,11 +2851,11 @@ msgstr "堆栈" msgid "Standard" msgstr "标准" -#: htdocs/luci-static/resources/fchomo.js:244 +#: htdocs/luci-static/resources/fchomo.js:245 msgid "Steam Client" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:245 +#: htdocs/luci-static/resources/fchomo.js:246 msgid "Steam P2P" msgstr "" @@ -2833,7 +2864,7 @@ msgstr "" msgid "Strategy" msgstr "策略" -#: htdocs/luci-static/resources/fchomo/listeners.js:567 +#: htdocs/luci-static/resources/fchomo/listeners.js:604 #: htdocs/luci-static/resources/view/fchomo/client.js:1303 #: htdocs/luci-static/resources/view/fchomo/client.js:1312 msgid "Sub rule" @@ -2843,7 +2874,7 @@ msgstr "子规则" msgid "Sub rule group" msgstr "子规则组" -#: htdocs/luci-static/resources/fchomo.js:690 +#: htdocs/luci-static/resources/fchomo.js:691 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:223 msgid "Successfully imported %s %s of total %s." msgstr "已成功导入 %s 个%s (共 %s 个)。" @@ -2852,12 +2883,12 @@ msgstr "已成功导入 %s 个%s (共 %s 个)。" msgid "Successfully updated." msgstr "更新成功。" -#: htdocs/luci-static/resources/fchomo.js:1707 +#: htdocs/luci-static/resources/fchomo.js:1708 msgid "Successfully uploaded." msgstr "已成功上传。" #: htdocs/luci-static/resources/fchomo.js:158 -#: htdocs/luci-static/resources/fchomo.js:192 +#: htdocs/luci-static/resources/fchomo.js:193 msgid "Sudoku" msgstr "" @@ -2883,15 +2914,16 @@ msgstr "系统 DNS" #: htdocs/luci-static/resources/fchomo.js:160 #: htdocs/luci-static/resources/fchomo.js:161 #: htdocs/luci-static/resources/fchomo.js:162 -#: htdocs/luci-static/resources/fchomo.js:187 -#: htdocs/luci-static/resources/fchomo.js:192 +#: htdocs/luci-static/resources/fchomo.js:163 +#: htdocs/luci-static/resources/fchomo.js:188 #: htdocs/luci-static/resources/fchomo.js:193 #: htdocs/luci-static/resources/fchomo.js:194 #: htdocs/luci-static/resources/fchomo.js:195 #: htdocs/luci-static/resources/fchomo.js:196 #: htdocs/luci-static/resources/fchomo.js:197 -#: htdocs/luci-static/resources/fchomo.js:204 -#: htdocs/luci-static/resources/fchomo/listeners.js:601 +#: htdocs/luci-static/resources/fchomo.js:198 +#: htdocs/luci-static/resources/fchomo.js:205 +#: htdocs/luci-static/resources/fchomo/listeners.js:638 #: htdocs/luci-static/resources/view/fchomo/client.js:589 #: htdocs/luci-static/resources/view/fchomo/client.js:679 msgid "TCP" @@ -2901,7 +2933,7 @@ msgstr "TCP" msgid "TCP concurrency" msgstr "TCP 并发" -#: htdocs/luci-static/resources/view/fchomo/node.js:1410 +#: htdocs/luci-static/resources/view/fchomo/node.js:1429 msgid "TCP only" msgstr "仅 TCP" @@ -2917,37 +2949,37 @@ msgstr "TCP-Keep-Alive 间隔" #: htdocs/luci-static/resources/fchomo.js:155 #: htdocs/luci-static/resources/fchomo.js:156 #: htdocs/luci-static/resources/fchomo.js:157 -#: htdocs/luci-static/resources/fchomo.js:165 #: htdocs/luci-static/resources/fchomo.js:166 #: htdocs/luci-static/resources/fchomo.js:167 -#: htdocs/luci-static/resources/fchomo.js:186 -#: htdocs/luci-static/resources/fchomo.js:188 +#: htdocs/luci-static/resources/fchomo.js:168 +#: htdocs/luci-static/resources/fchomo.js:187 #: htdocs/luci-static/resources/fchomo.js:189 -#: htdocs/luci-static/resources/fchomo.js:191 -#: htdocs/luci-static/resources/fchomo.js:202 +#: htdocs/luci-static/resources/fchomo.js:190 +#: htdocs/luci-static/resources/fchomo.js:192 +#: htdocs/luci-static/resources/fchomo.js:203 msgid "TCP/UDP" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1441 -#: htdocs/luci-static/resources/view/fchomo/node.js:1721 +#: htdocs/luci-static/resources/view/fchomo/node.js:1460 +#: htdocs/luci-static/resources/view/fchomo/node.js:1740 msgid "TFO" msgstr "TCP 快速打开 (TFO)" -#: htdocs/luci-static/resources/fchomo/listeners.js:540 -#: htdocs/luci-static/resources/fchomo/listeners.js:858 +#: htdocs/luci-static/resources/fchomo/listeners.js:569 +#: htdocs/luci-static/resources/fchomo/listeners.js:901 #: htdocs/luci-static/resources/view/fchomo/global.js:529 -#: htdocs/luci-static/resources/view/fchomo/node.js:465 -#: htdocs/luci-static/resources/view/fchomo/node.js:818 -#: htdocs/luci-static/resources/view/fchomo/node.js:995 +#: htdocs/luci-static/resources/view/fchomo/node.js:476 +#: htdocs/luci-static/resources/view/fchomo/node.js:836 +#: htdocs/luci-static/resources/view/fchomo/node.js:1014 msgid "TLS" msgstr "TLS" -#: htdocs/luci-static/resources/fchomo/listeners.js:912 -#: htdocs/luci-static/resources/view/fchomo/node.js:1026 +#: htdocs/luci-static/resources/fchomo/listeners.js:955 +#: htdocs/luci-static/resources/view/fchomo/node.js:1045 msgid "TLS ALPN" msgstr "TLS ALPN" -#: htdocs/luci-static/resources/view/fchomo/node.js:1020 +#: htdocs/luci-static/resources/view/fchomo/node.js:1039 msgid "TLS SNI" msgstr "" @@ -2956,16 +2988,16 @@ msgstr "" msgid "TLS fields" msgstr "TLS字段" -#: htdocs/luci-static/resources/fchomo.js:163 -#: htdocs/luci-static/resources/fchomo.js:200 +#: htdocs/luci-static/resources/fchomo.js:164 +#: htdocs/luci-static/resources/fchomo.js:201 msgid "TUIC" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:242 +#: htdocs/luci-static/resources/fchomo.js:243 msgid "TURN" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:523 +#: htdocs/luci-static/resources/fchomo/listeners.js:552 msgid "Target address" msgstr "目标地址" @@ -2974,39 +3006,39 @@ msgid "" "Tell the client to use the BBR flow control algorithm instead of Hysteria CC." msgstr "让客户端使用 BBR 流控算法。" -#: htdocs/luci-static/resources/view/fchomo/node.js:691 -#: htdocs/luci-static/resources/view/fchomo/node.js:699 +#: htdocs/luci-static/resources/view/fchomo/node.js:709 +#: htdocs/luci-static/resources/view/fchomo/node.js:717 msgid "The %s address used by local machine in the Cloudflare WARP network." msgstr "Cloudflare WARP 网络中使用的本机 %s 地址。" -#: htdocs/luci-static/resources/view/fchomo/node.js:734 -#: htdocs/luci-static/resources/view/fchomo/node.js:742 +#: htdocs/luci-static/resources/view/fchomo/node.js:752 +#: htdocs/luci-static/resources/view/fchomo/node.js:760 msgid "The %s address used by local machine in the Wireguard network." msgstr "WireGuard 网络中使用的本机 %s 地址。" -#: htdocs/luci-static/resources/fchomo/listeners.js:933 -#: htdocs/luci-static/resources/view/fchomo/node.js:1109 +#: htdocs/luci-static/resources/fchomo/listeners.js:976 +#: htdocs/luci-static/resources/view/fchomo/node.js:1128 msgid "The %s private key, in PEM format." msgstr "%s私钥,需要 PEM 格式。" -#: htdocs/luci-static/resources/fchomo/listeners.js:918 -#: htdocs/luci-static/resources/fchomo/listeners.js:956 +#: htdocs/luci-static/resources/fchomo/listeners.js:961 +#: htdocs/luci-static/resources/fchomo/listeners.js:999 #: htdocs/luci-static/resources/view/fchomo/global.js:550 -#: htdocs/luci-static/resources/view/fchomo/node.js:1095 +#: htdocs/luci-static/resources/view/fchomo/node.js:1114 msgid "The %s public key, in PEM format." msgstr "%s公钥,需要 PEM 格式。" -#: htdocs/luci-static/resources/view/fchomo/node.js:1129 +#: htdocs/luci-static/resources/view/fchomo/node.js:1148 msgid "" "The ECH parameter of the HTTPS record for the domain. Leave empty to resolve " "via DNS." msgstr "域名的 HTTPS 记录的 ECH 参数。留空则通过 DNS 解析。" -#: htdocs/luci-static/resources/view/fchomo/node.js:387 +#: htdocs/luci-static/resources/view/fchomo/node.js:398 msgid "The ED25519 available private key or UUID provided by Sudoku server." msgstr "Sudoku 服务器提供的 ED25519 可用私钥 或 UUID。" -#: htdocs/luci-static/resources/fchomo/listeners.js:286 +#: htdocs/luci-static/resources/fchomo/listeners.js:297 msgid "The ED25519 master public key or UUID generated by Sudoku." msgstr "Sudoku 生成的 ED25519 主公钥 或 UUID。" @@ -3014,8 +3046,8 @@ msgstr "Sudoku 生成的 ED25519 主公钥 或 UUID。" msgid "The default value is 2:00 every day." msgstr "默认值为每天 2:00。" -#: htdocs/luci-static/resources/fchomo/listeners.js:702 -#: htdocs/luci-static/resources/view/fchomo/node.js:942 +#: htdocs/luci-static/resources/fchomo/listeners.js:739 +#: htdocs/luci-static/resources/view/fchomo/node.js:961 msgid "" "The first padding must have a probability of 100% and at least 35 bytes." msgstr "首个填充必须为 100% 的概率并且至少 35 字节。" @@ -3030,26 +3062,26 @@ msgstr "匹配 %s 的将被视为未被投毒污染。" msgid "The matching %s will be deemed as poisoned." msgstr "匹配 %s 的将被视为已被投毒污染。" -#: htdocs/luci-static/resources/fchomo/listeners.js:700 -#: htdocs/luci-static/resources/view/fchomo/node.js:940 +#: htdocs/luci-static/resources/fchomo/listeners.js:737 +#: htdocs/luci-static/resources/view/fchomo/node.js:959 msgid "The server and client can set different padding parameters." msgstr "服务器和客户端可以设置不同的填充参数。" -#: htdocs/luci-static/resources/fchomo/listeners.js:1014 +#: htdocs/luci-static/resources/fchomo/listeners.js:1057 #: htdocs/luci-static/resources/view/fchomo/global.js:594 msgid "This ECH parameter needs to be added to the HTTPS record of the domain." msgstr "此 ECH 参数需要添加到域名的 HTTPS 记录中。" #: htdocs/luci-static/resources/view/fchomo/client.js:1579 -#: htdocs/luci-static/resources/view/fchomo/node.js:1089 -#: htdocs/luci-static/resources/view/fchomo/node.js:1757 +#: htdocs/luci-static/resources/view/fchomo/node.js:1108 +#: htdocs/luci-static/resources/view/fchomo/node.js:1776 msgid "" "This is DANGEROUS, your traffic is almost like " "PLAIN TEXT! Use at your own risk!" msgstr "" "这是危险行为,您的流量将几乎等同于明文!使用风险自负!" -#: htdocs/luci-static/resources/view/fchomo/node.js:537 +#: htdocs/luci-static/resources/view/fchomo/node.js:555 msgid "" "This is the TUIC port of the SUoT protocol, designed to provide a QUIC " "stream based UDP relay mode that TUIC does not provide." @@ -3081,23 +3113,23 @@ msgstr "Tproxy Fwmark/fwmask" msgid "Tproxy port" msgstr "Tproxy 端口" -#: htdocs/luci-static/resources/fchomo/listeners.js:274 -#: htdocs/luci-static/resources/view/fchomo/node.js:379 +#: htdocs/luci-static/resources/fchomo/listeners.js:285 +#: htdocs/luci-static/resources/view/fchomo/node.js:390 msgid "Traffic pattern" msgstr "流量模式" -#: htdocs/luci-static/resources/view/fchomo/node.js:1916 +#: htdocs/luci-static/resources/view/fchomo/node.js:1935 msgid "Transit proxy group" msgstr "中转代理组" -#: htdocs/luci-static/resources/view/fchomo/node.js:1922 +#: htdocs/luci-static/resources/view/fchomo/node.js:1941 msgid "Transit proxy node" msgstr "中转代理节点" -#: htdocs/luci-static/resources/fchomo/listeners.js:262 -#: htdocs/luci-static/resources/fchomo/listeners.js:1065 -#: htdocs/luci-static/resources/view/fchomo/node.js:356 -#: htdocs/luci-static/resources/view/fchomo/node.js:1171 +#: htdocs/luci-static/resources/fchomo/listeners.js:273 +#: htdocs/luci-static/resources/fchomo/listeners.js:1108 +#: htdocs/luci-static/resources/view/fchomo/node.js:367 +#: htdocs/luci-static/resources/view/fchomo/node.js:1190 msgid "Transport" msgstr "传输层" @@ -3106,8 +3138,8 @@ msgstr "传输层" msgid "Transport fields" msgstr "传输层字段" -#: htdocs/luci-static/resources/fchomo/listeners.js:1070 -#: htdocs/luci-static/resources/view/fchomo/node.js:1176 +#: htdocs/luci-static/resources/fchomo/listeners.js:1113 +#: htdocs/luci-static/resources/view/fchomo/node.js:1195 msgid "Transport type" msgstr "传输层类型" @@ -3115,17 +3147,17 @@ msgstr "传输层类型" msgid "Treat the destination IP as the source IP." msgstr "将 目标 IP 视为 来源 IP。" -#: htdocs/luci-static/resources/fchomo.js:161 -#: htdocs/luci-static/resources/fchomo.js:196 +#: htdocs/luci-static/resources/fchomo.js:162 +#: htdocs/luci-static/resources/fchomo.js:197 msgid "Trojan" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:166 -#: htdocs/luci-static/resources/fchomo.js:202 +#: htdocs/luci-static/resources/fchomo.js:167 +#: htdocs/luci-static/resources/fchomo.js:203 msgid "TrustTunnel" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:232 +#: htdocs/luci-static/resources/fchomo/listeners.js:243 msgid "Trusted proxy header" msgstr "可信代理 Header" @@ -3145,7 +3177,7 @@ msgstr "Tun 设置" msgid "Tun stack." msgstr "Tun 堆栈" -#: htdocs/luci-static/resources/fchomo.js:167 +#: htdocs/luci-static/resources/fchomo.js:168 msgid "Tunnel" msgstr "" @@ -3156,24 +3188,24 @@ msgstr "" #: htdocs/luci-static/resources/view/fchomo/client.js:842 #: htdocs/luci-static/resources/view/fchomo/client.js:1028 #: htdocs/luci-static/resources/view/fchomo/node.js:239 -#: htdocs/luci-static/resources/view/fchomo/node.js:1599 -#: htdocs/luci-static/resources/view/fchomo/node.js:1887 +#: htdocs/luci-static/resources/view/fchomo/node.js:1618 +#: htdocs/luci-static/resources/view/fchomo/node.js:1906 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:276 msgid "Type" msgstr "类型" -#: htdocs/luci-static/resources/fchomo.js:163 #: htdocs/luci-static/resources/fchomo.js:164 -#: htdocs/luci-static/resources/fchomo.js:199 +#: htdocs/luci-static/resources/fchomo.js:165 #: htdocs/luci-static/resources/fchomo.js:200 #: htdocs/luci-static/resources/fchomo.js:201 -#: htdocs/luci-static/resources/fchomo.js:203 -#: htdocs/luci-static/resources/fchomo/listeners.js:602 -#: htdocs/luci-static/resources/fchomo/listeners.js:607 +#: htdocs/luci-static/resources/fchomo.js:202 +#: htdocs/luci-static/resources/fchomo.js:204 +#: htdocs/luci-static/resources/fchomo/listeners.js:639 +#: htdocs/luci-static/resources/fchomo/listeners.js:644 #: htdocs/luci-static/resources/view/fchomo/client.js:588 #: htdocs/luci-static/resources/view/fchomo/client.js:678 -#: htdocs/luci-static/resources/view/fchomo/node.js:875 -#: htdocs/luci-static/resources/view/fchomo/node.js:1731 +#: htdocs/luci-static/resources/view/fchomo/node.js:893 +#: htdocs/luci-static/resources/view/fchomo/node.js:1750 msgid "UDP" msgstr "UDP" @@ -3181,42 +3213,42 @@ msgstr "UDP" msgid "UDP NAT expiration time" msgstr "UDP NAT 过期时间" -#: htdocs/luci-static/resources/view/fchomo/node.js:536 +#: htdocs/luci-static/resources/view/fchomo/node.js:554 msgid "UDP over stream" msgstr "UDP over stream" -#: htdocs/luci-static/resources/view/fchomo/node.js:542 +#: htdocs/luci-static/resources/view/fchomo/node.js:560 msgid "UDP over stream version" msgstr "UDP over stream 版本" -#: htdocs/luci-static/resources/view/fchomo/node.js:529 +#: htdocs/luci-static/resources/view/fchomo/node.js:547 msgid "UDP packet relay mode." msgstr "UDP 包中继模式。" -#: htdocs/luci-static/resources/view/fchomo/node.js:528 +#: htdocs/luci-static/resources/view/fchomo/node.js:546 msgid "UDP relay mode" msgstr "UDP 中继模式" -#: htdocs/luci-static/resources/fchomo/listeners.js:361 -#: htdocs/luci-static/resources/fchomo/listeners.js:362 -#: htdocs/luci-static/resources/view/fchomo/node.js:411 -#: htdocs/luci-static/resources/view/fchomo/node.js:412 +#: htdocs/luci-static/resources/fchomo/listeners.js:372 +#: htdocs/luci-static/resources/fchomo/listeners.js:373 +#: htdocs/luci-static/resources/view/fchomo/node.js:422 +#: htdocs/luci-static/resources/view/fchomo/node.js:423 msgid "UP: %s; DOWN: %s" msgstr "上传: %s; 下载: %s" -#: htdocs/luci-static/resources/fchomo.js:231 +#: htdocs/luci-static/resources/fchomo.js:232 msgid "URL test" msgstr "自动选择" -#: htdocs/luci-static/resources/fchomo/listeners.js:283 -#: htdocs/luci-static/resources/fchomo/listeners.js:444 -#: htdocs/luci-static/resources/fchomo/listeners.js:499 -#: htdocs/luci-static/resources/view/fchomo/node.js:516 -#: htdocs/luci-static/resources/view/fchomo/node.js:625 +#: htdocs/luci-static/resources/fchomo/listeners.js:294 +#: htdocs/luci-static/resources/fchomo/listeners.js:473 +#: htdocs/luci-static/resources/fchomo/listeners.js:528 +#: htdocs/luci-static/resources/view/fchomo/node.js:534 +#: htdocs/luci-static/resources/view/fchomo/node.js:643 msgid "UUID" msgstr "UUID" -#: htdocs/luci-static/resources/fchomo.js:1250 +#: htdocs/luci-static/resources/fchomo.js:1251 msgid "Unable to download unsupported type: %s" msgstr "无法下载不支持的类型: %s" @@ -3241,8 +3273,8 @@ msgstr "未知错误。" msgid "Unknown error: %s" msgstr "未知错误:%s" -#: htdocs/luci-static/resources/view/fchomo/node.js:880 -#: htdocs/luci-static/resources/view/fchomo/node.js:1736 +#: htdocs/luci-static/resources/view/fchomo/node.js:899 +#: htdocs/luci-static/resources/view/fchomo/node.js:1755 msgid "UoT" msgstr "UDP over TCP (UoT)" @@ -3250,22 +3282,22 @@ msgstr "UDP over TCP (UoT)" msgid "Update failed." msgstr "更新失败。" -#: htdocs/luci-static/resources/view/fchomo/node.js:1668 +#: htdocs/luci-static/resources/view/fchomo/node.js:1687 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:382 msgid "Update interval" msgstr "更新间隔" -#: htdocs/luci-static/resources/view/fchomo/node.js:1428 +#: htdocs/luci-static/resources/view/fchomo/node.js:1447 msgid "Upload bandwidth" msgstr "上传带宽" -#: htdocs/luci-static/resources/view/fchomo/node.js:1429 +#: htdocs/luci-static/resources/view/fchomo/node.js:1448 msgid "Upload bandwidth in Mbps." msgstr "上传带宽(单位:Mbps)。" -#: htdocs/luci-static/resources/fchomo/listeners.js:924 -#: htdocs/luci-static/resources/fchomo/listeners.js:964 -#: htdocs/luci-static/resources/view/fchomo/node.js:1100 +#: htdocs/luci-static/resources/fchomo/listeners.js:967 +#: htdocs/luci-static/resources/fchomo/listeners.js:1007 +#: htdocs/luci-static/resources/view/fchomo/node.js:1119 msgid "Upload certificate" msgstr "上传证书" @@ -3273,17 +3305,17 @@ msgstr "上传证书" msgid "Upload initial package" msgstr "上传初始资源包" -#: htdocs/luci-static/resources/fchomo/listeners.js:939 -#: htdocs/luci-static/resources/view/fchomo/node.js:1114 +#: htdocs/luci-static/resources/fchomo/listeners.js:982 +#: htdocs/luci-static/resources/view/fchomo/node.js:1133 msgid "Upload key" msgstr "上传密钥" -#: htdocs/luci-static/resources/fchomo/listeners.js:927 -#: htdocs/luci-static/resources/fchomo/listeners.js:942 -#: htdocs/luci-static/resources/fchomo/listeners.js:967 +#: htdocs/luci-static/resources/fchomo/listeners.js:970 +#: htdocs/luci-static/resources/fchomo/listeners.js:985 +#: htdocs/luci-static/resources/fchomo/listeners.js:1010 #: htdocs/luci-static/resources/view/fchomo/global.js:306 -#: htdocs/luci-static/resources/view/fchomo/node.js:1103 -#: htdocs/luci-static/resources/view/fchomo/node.js:1117 +#: htdocs/luci-static/resources/view/fchomo/node.js:1122 +#: htdocs/luci-static/resources/view/fchomo/node.js:1136 msgid "Upload..." msgstr "上传..." @@ -3307,7 +3339,7 @@ msgstr "用于解析 DNS 服务器的域名。必须是 IP。" msgid "Used to resolve the domain of the Proxy node." msgstr "用于解析代理节点的域名。" -#: htdocs/luci-static/resources/view/fchomo/node.js:1021 +#: htdocs/luci-static/resources/view/fchomo/node.js:1040 msgid "Used to verify the hostname on the returned certificates." msgstr "用于验证返回的证书上的主机名。" @@ -3315,7 +3347,7 @@ msgstr "用于验证返回的证书上的主机名。" msgid "User Authentication" msgstr "用户认证" -#: htdocs/luci-static/resources/fchomo/listeners.js:269 +#: htdocs/luci-static/resources/fchomo/listeners.js:280 msgid "User-hint is mandatory" msgstr "User-hint 是必填项" @@ -3328,41 +3360,42 @@ msgstr "用户名" msgid "Users filter mode" msgstr "使用者过滤模式" -#: htdocs/luci-static/resources/view/fchomo/node.js:1285 +#: htdocs/luci-static/resources/view/fchomo/node.js:1304 msgid "V2ray HTTPUpgrade" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1290 +#: htdocs/luci-static/resources/view/fchomo/node.js:1309 msgid "V2ray HTTPUpgrade fast open" msgstr "" +#: htdocs/luci-static/resources/fchomo.js:161 +#: htdocs/luci-static/resources/fchomo.js:196 +msgid "VLESS" +msgstr "" + #: htdocs/luci-static/resources/fchomo.js:160 #: htdocs/luci-static/resources/fchomo.js:195 -msgid "VLESS" -msgstr "" - -#: htdocs/luci-static/resources/fchomo.js:159 -#: htdocs/luci-static/resources/fchomo.js:194 msgid "VMess" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1605 -#: htdocs/luci-static/resources/view/fchomo/node.js:1893 +#: htdocs/luci-static/resources/view/fchomo/node.js:1624 +#: htdocs/luci-static/resources/view/fchomo/node.js:1912 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:319 msgid "Value" msgstr "可视化值" -#: htdocs/luci-static/resources/fchomo.js:360 +#: htdocs/luci-static/resources/fchomo.js:361 msgid "Verify if given" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:557 -#: htdocs/luci-static/resources/view/fchomo/node.js:507 -#: htdocs/luci-static/resources/view/fchomo/node.js:837 +#: htdocs/luci-static/resources/fchomo/listeners.js:462 +#: htdocs/luci-static/resources/fchomo/listeners.js:594 +#: htdocs/luci-static/resources/view/fchomo/node.js:518 +#: htdocs/luci-static/resources/view/fchomo/node.js:855 msgid "Version" msgstr "版本" -#: htdocs/luci-static/resources/view/fchomo/node.js:845 +#: htdocs/luci-static/resources/view/fchomo/node.js:863 msgid "Version hint" msgstr "" @@ -3371,7 +3404,7 @@ msgstr "" msgid "Vless Encryption fields" msgstr "Vless Encryption 字段" -#: htdocs/luci-static/resources/fchomo.js:397 +#: htdocs/luci-static/resources/fchomo.js:398 msgid "Wait a random 0-111 milliseconds with 75% probability." msgstr "以 75% 的概率等待随机 0-111 毫秒。" @@ -3379,16 +3412,16 @@ msgstr "以 75% 的概率等待随机 0-111 毫秒。" msgid "Warning" msgstr "警告" -#: htdocs/luci-static/resources/fchomo/listeners.js:429 -#: htdocs/luci-static/resources/fchomo/listeners.js:1072 -#: htdocs/luci-static/resources/fchomo/listeners.js:1081 -#: htdocs/luci-static/resources/fchomo/listeners.js:1088 -#: htdocs/luci-static/resources/view/fchomo/node.js:461 -#: htdocs/luci-static/resources/view/fchomo/node.js:490 -#: htdocs/luci-static/resources/view/fchomo/node.js:1181 -#: htdocs/luci-static/resources/view/fchomo/node.js:1192 -#: htdocs/luci-static/resources/view/fchomo/node.js:1199 -#: htdocs/luci-static/resources/view/fchomo/node.js:1205 +#: htdocs/luci-static/resources/fchomo/listeners.js:440 +#: htdocs/luci-static/resources/fchomo/listeners.js:1115 +#: htdocs/luci-static/resources/fchomo/listeners.js:1124 +#: htdocs/luci-static/resources/fchomo/listeners.js:1131 +#: htdocs/luci-static/resources/view/fchomo/node.js:472 +#: htdocs/luci-static/resources/view/fchomo/node.js:501 +#: htdocs/luci-static/resources/view/fchomo/node.js:1200 +#: htdocs/luci-static/resources/view/fchomo/node.js:1211 +#: htdocs/luci-static/resources/view/fchomo/node.js:1218 +#: htdocs/luci-static/resources/view/fchomo/node.js:1224 msgid "WebSocket" msgstr "" @@ -3400,52 +3433,52 @@ msgstr "用作服务端时,HomeProxy 是更好的选择。" msgid "White list" msgstr "白名单" -#: htdocs/luci-static/resources/fchomo.js:203 +#: htdocs/luci-static/resources/fchomo.js:204 msgid "WireGuard" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:756 +#: htdocs/luci-static/resources/view/fchomo/node.js:774 msgid "WireGuard peer public key." msgstr "WireGuard 对端公钥。" -#: htdocs/luci-static/resources/view/fchomo/node.js:763 +#: htdocs/luci-static/resources/view/fchomo/node.js:781 msgid "WireGuard pre-shared key." msgstr "WireGuard 预共享密钥。" -#: htdocs/luci-static/resources/view/fchomo/node.js:748 +#: htdocs/luci-static/resources/view/fchomo/node.js:766 msgid "WireGuard requires base64-encoded private keys." msgstr "WireGuard 要求 base64 编码的私钥。" -#: htdocs/luci-static/resources/fchomo/listeners.js:1073 -#: htdocs/luci-static/resources/fchomo/listeners.js:1082 -#: htdocs/luci-static/resources/view/fchomo/node.js:1182 -#: htdocs/luci-static/resources/view/fchomo/node.js:1200 +#: htdocs/luci-static/resources/fchomo/listeners.js:1116 +#: htdocs/luci-static/resources/fchomo/listeners.js:1125 +#: htdocs/luci-static/resources/view/fchomo/node.js:1201 +#: htdocs/luci-static/resources/view/fchomo/node.js:1219 msgid "XHTTP" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:1118 -#: htdocs/luci-static/resources/view/fchomo/node.js:1295 +#: htdocs/luci-static/resources/fchomo/listeners.js:1161 +#: htdocs/luci-static/resources/view/fchomo/node.js:1314 msgid "XHTTP mode" msgstr "XHTTP 模式" -#: htdocs/luci-static/resources/view/fchomo/node.js:1326 +#: htdocs/luci-static/resources/view/fchomo/node.js:1345 msgid "XMUX" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1331 -#: htdocs/luci-static/resources/view/fchomo/node.js:1336 -#: htdocs/luci-static/resources/view/fchomo/node.js:1341 -#: htdocs/luci-static/resources/view/fchomo/node.js:1346 -#: htdocs/luci-static/resources/view/fchomo/node.js:1351 -#: htdocs/luci-static/resources/view/fchomo/node.js:1356 +#: htdocs/luci-static/resources/view/fchomo/node.js:1350 +#: htdocs/luci-static/resources/view/fchomo/node.js:1355 +#: htdocs/luci-static/resources/view/fchomo/node.js:1360 +#: htdocs/luci-static/resources/view/fchomo/node.js:1365 +#: htdocs/luci-static/resources/view/fchomo/node.js:1370 +#: htdocs/luci-static/resources/view/fchomo/node.js:1375 msgid "XMUX:" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:661 +#: htdocs/luci-static/resources/fchomo/listeners.js:698 msgid "XOR mode" msgstr "XOR 模式" -#: htdocs/luci-static/resources/view/fchomo/node.js:670 +#: htdocs/luci-static/resources/view/fchomo/node.js:688 msgid "Xudp (Xray-core)" msgstr "" @@ -3453,7 +3486,7 @@ msgstr "" msgid "Yaml text" msgstr "Yaml 格式文本" -#: htdocs/luci-static/resources/view/fchomo/node.js:1760 +#: htdocs/luci-static/resources/view/fchomo/node.js:1779 msgid "Yes" msgstr "" @@ -3461,27 +3494,27 @@ msgstr "" msgid "YouTube" msgstr "油管" -#: htdocs/luci-static/resources/fchomo.js:1689 +#: htdocs/luci-static/resources/fchomo.js:1690 msgid "Your %s was successfully uploaded. Size: %sB." msgstr "您的 %s 已成功上传。大小:%sB。" -#: htdocs/luci-static/resources/fchomo.js:333 -#: htdocs/luci-static/resources/fchomo.js:346 -#: htdocs/luci-static/resources/fchomo.js:351 -#: htdocs/luci-static/resources/view/fchomo/node.js:650 +#: htdocs/luci-static/resources/fchomo.js:334 +#: htdocs/luci-static/resources/fchomo.js:347 +#: htdocs/luci-static/resources/fchomo.js:352 +#: htdocs/luci-static/resources/view/fchomo/node.js:668 msgid "aes-128-gcm" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:334 +#: htdocs/luci-static/resources/fchomo.js:335 msgid "aes-192-gcm" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:335 -#: htdocs/luci-static/resources/fchomo.js:352 +#: htdocs/luci-static/resources/fchomo.js:336 +#: htdocs/luci-static/resources/fchomo.js:353 msgid "aes-256-gcm" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:647 +#: htdocs/luci-static/resources/view/fchomo/node.js:665 msgid "auto" msgstr "自动" @@ -3489,19 +3522,19 @@ msgstr "自动" msgid "bbr" msgstr "bbr" -#: htdocs/luci-static/resources/fchomo/listeners.js:929 -#: htdocs/luci-static/resources/fchomo/listeners.js:969 -#: htdocs/luci-static/resources/view/fchomo/node.js:1105 +#: htdocs/luci-static/resources/fchomo/listeners.js:972 +#: htdocs/luci-static/resources/fchomo/listeners.js:1012 +#: htdocs/luci-static/resources/view/fchomo/node.js:1124 msgid "certificate" msgstr "证书" -#: htdocs/luci-static/resources/fchomo.js:336 -#: htdocs/luci-static/resources/fchomo.js:347 -#: htdocs/luci-static/resources/fchomo.js:353 +#: htdocs/luci-static/resources/fchomo.js:337 +#: htdocs/luci-static/resources/fchomo.js:348 +#: htdocs/luci-static/resources/fchomo.js:354 msgid "chacha20-ietf-poly1305" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:651 +#: htdocs/luci-static/resources/view/fchomo/node.js:669 msgid "chacha20-poly1305" msgstr "" @@ -3509,8 +3542,8 @@ msgstr "" msgid "cubic" msgstr "cubic" -#: htdocs/luci-static/resources/fchomo/listeners.js:613 -#: htdocs/luci-static/resources/fchomo/listeners.js:644 +#: htdocs/luci-static/resources/fchomo/listeners.js:650 +#: htdocs/luci-static/resources/fchomo/listeners.js:681 msgid "decryption" msgstr "decryption" @@ -3518,41 +3551,41 @@ msgstr "decryption" msgid "dnsmasq selects upstream on its own. (may affect CDN accuracy)" msgstr "dnsmasq 自行选择上游服务器。 (可能影响 CDN 准确性)" -#: htdocs/luci-static/resources/view/fchomo/node.js:1748 +#: htdocs/luci-static/resources/view/fchomo/node.js:1767 msgid "down" msgstr "Hysteria 下载速率" -#: htdocs/luci-static/resources/fchomo/listeners.js:648 -#: htdocs/luci-static/resources/view/fchomo/node.js:894 -#: htdocs/luci-static/resources/view/fchomo/node.js:917 +#: htdocs/luci-static/resources/fchomo/listeners.js:685 +#: htdocs/luci-static/resources/view/fchomo/node.js:913 +#: htdocs/luci-static/resources/view/fchomo/node.js:936 msgid "encryption" msgstr "encryption" -#: htdocs/luci-static/resources/fchomo/listeners.js:413 -#: htdocs/luci-static/resources/view/fchomo/node.js:445 +#: htdocs/luci-static/resources/fchomo/listeners.js:424 +#: htdocs/luci-static/resources/view/fchomo/node.js:456 msgid "false = bandwidth optimized downlink; true = pure Sudoku downlink." msgstr "false = 带宽优化下行 true = 纯 Sudoku 下行。" -#: htdocs/luci-static/resources/fchomo/listeners.js:1071 -#: htdocs/luci-static/resources/fchomo/listeners.js:1080 -#: htdocs/luci-static/resources/fchomo/listeners.js:1087 -#: htdocs/luci-static/resources/view/fchomo/node.js:1180 -#: htdocs/luci-static/resources/view/fchomo/node.js:1191 -#: htdocs/luci-static/resources/view/fchomo/node.js:1198 -#: htdocs/luci-static/resources/view/fchomo/node.js:1204 +#: htdocs/luci-static/resources/fchomo/listeners.js:1114 +#: htdocs/luci-static/resources/fchomo/listeners.js:1123 +#: htdocs/luci-static/resources/fchomo/listeners.js:1130 +#: htdocs/luci-static/resources/view/fchomo/node.js:1199 +#: htdocs/luci-static/resources/view/fchomo/node.js:1210 +#: htdocs/luci-static/resources/view/fchomo/node.js:1217 +#: htdocs/luci-static/resources/view/fchomo/node.js:1223 msgid "gRPC" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1261 +#: htdocs/luci-static/resources/view/fchomo/node.js:1280 msgid "gRPC User-Agent" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1266 +#: htdocs/luci-static/resources/view/fchomo/node.js:1285 msgid "gRPC ping interval" msgstr "gRPC ping 间隔" -#: htdocs/luci-static/resources/fchomo/listeners.js:1112 -#: htdocs/luci-static/resources/view/fchomo/node.js:1257 +#: htdocs/luci-static/resources/fchomo/listeners.js:1155 +#: htdocs/luci-static/resources/view/fchomo/node.js:1276 msgid "gRPC service name" msgstr "gRPC 服务名称" @@ -3560,11 +3593,11 @@ msgstr "gRPC 服务名称" msgid "gVisor" msgstr "gVisor" -#: htdocs/luci-static/resources/view/fchomo/node.js:1373 +#: htdocs/luci-static/resources/view/fchomo/node.js:1392 msgid "h2mux" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:813 +#: htdocs/luci-static/resources/fchomo/listeners.js:850 msgid "least one keypair required" msgstr "至少需要一对密钥" @@ -3578,17 +3611,17 @@ msgstr "metacubexd" #: htdocs/luci-static/resources/view/fchomo/client.js:1480 #: htdocs/luci-static/resources/view/fchomo/client.js:1711 #: htdocs/luci-static/resources/view/fchomo/client.js:1767 -#: htdocs/luci-static/resources/view/fchomo/node.js:1571 +#: htdocs/luci-static/resources/view/fchomo/node.js:1590 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:239 msgid "mihomo config" msgstr "mihomo 配置" -#: htdocs/luci-static/resources/fchomo.js:379 +#: htdocs/luci-static/resources/fchomo.js:380 msgid "mlkem768x25519plus" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1445 -#: htdocs/luci-static/resources/view/fchomo/node.js:1726 +#: htdocs/luci-static/resources/view/fchomo/node.js:1464 +#: htdocs/luci-static/resources/view/fchomo/node.js:1745 msgid "mpTCP" msgstr "多路径 TCP (mpTCP)" @@ -3600,20 +3633,20 @@ msgstr "new_reno" msgid "no-resolve" msgstr "no-resolve" -#: htdocs/luci-static/resources/fchomo.js:1424 -#: htdocs/luci-static/resources/fchomo.js:1519 -#: htdocs/luci-static/resources/fchomo.js:1554 -#: htdocs/luci-static/resources/fchomo.js:1582 +#: htdocs/luci-static/resources/fchomo.js:1425 +#: htdocs/luci-static/resources/fchomo.js:1520 +#: htdocs/luci-static/resources/fchomo.js:1555 +#: htdocs/luci-static/resources/fchomo.js:1583 msgid "non-empty value" msgstr "非空值" -#: htdocs/luci-static/resources/fchomo.js:331 -#: htdocs/luci-static/resources/fchomo.js:345 -#: htdocs/luci-static/resources/fchomo.js:357 -#: htdocs/luci-static/resources/fchomo/listeners.js:531 -#: htdocs/luci-static/resources/view/fchomo/node.js:648 -#: htdocs/luci-static/resources/view/fchomo/node.js:668 -#: htdocs/luci-static/resources/view/fchomo/node.js:806 +#: htdocs/luci-static/resources/fchomo.js:332 +#: htdocs/luci-static/resources/fchomo.js:346 +#: htdocs/luci-static/resources/fchomo.js:358 +#: htdocs/luci-static/resources/fchomo/listeners.js:560 +#: htdocs/luci-static/resources/view/fchomo/node.js:666 +#: htdocs/luci-static/resources/view/fchomo/node.js:686 +#: htdocs/luci-static/resources/view/fchomo/node.js:824 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:315 msgid "none" msgstr "无" @@ -3626,45 +3659,45 @@ msgstr "未找到" msgid "not included \",\"" msgstr "不包含 \",\"" -#: htdocs/luci-static/resources/fchomo.js:217 -#: htdocs/luci-static/resources/fchomo/listeners.js:569 -#: htdocs/luci-static/resources/fchomo/listeners.js:570 +#: htdocs/luci-static/resources/fchomo.js:218 +#: htdocs/luci-static/resources/fchomo/listeners.js:606 +#: htdocs/luci-static/resources/fchomo/listeners.js:607 msgid "null" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:532 -#: htdocs/luci-static/resources/view/fchomo/node.js:807 +#: htdocs/luci-static/resources/fchomo/listeners.js:561 +#: htdocs/luci-static/resources/view/fchomo/node.js:825 msgid "obfs-simple" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:492 +#: htdocs/luci-static/resources/view/fchomo/node.js:503 msgid "only applies when %s is %s." msgstr "仅当 %s 为 %s 时适用。" -#: htdocs/luci-static/resources/view/fchomo/node.js:490 +#: htdocs/luci-static/resources/view/fchomo/node.js:501 msgid "only applies when %s is not %s." msgstr "仅当 %s 不为 %s 时适用。" -#: htdocs/luci-static/resources/view/fchomo/node.js:1706 +#: htdocs/luci-static/resources/view/fchomo/node.js:1725 msgid "override.proxy-name" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:669 +#: htdocs/luci-static/resources/view/fchomo/node.js:687 msgid "packet addr (v2ray-core v5+)" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:1122 -#: htdocs/luci-static/resources/view/fchomo/node.js:1299 +#: htdocs/luci-static/resources/fchomo/listeners.js:1165 +#: htdocs/luci-static/resources/view/fchomo/node.js:1318 msgid "packet-up" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:427 -#: htdocs/luci-static/resources/view/fchomo/node.js:459 +#: htdocs/luci-static/resources/fchomo/listeners.js:438 +#: htdocs/luci-static/resources/view/fchomo/node.js:470 msgid "poll" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:944 -#: htdocs/luci-static/resources/view/fchomo/node.js:1119 +#: htdocs/luci-static/resources/fchomo/listeners.js:987 +#: htdocs/luci-static/resources/view/fchomo/node.js:1138 msgid "private key" msgstr "私钥" @@ -3677,7 +3710,7 @@ msgstr "razord-meta" msgid "requires front-end adaptation using the API." msgstr "需要使用 API 的前端适配。" -#: htdocs/luci-static/resources/view/fchomo/node.js:811 +#: htdocs/luci-static/resources/view/fchomo/node.js:829 msgid "restls" msgstr "" @@ -3685,17 +3718,17 @@ msgstr "" msgid "rule-set" msgstr "规则集" -#: htdocs/luci-static/resources/fchomo/listeners.js:533 -#: htdocs/luci-static/resources/view/fchomo/node.js:810 +#: htdocs/luci-static/resources/fchomo/listeners.js:562 +#: htdocs/luci-static/resources/view/fchomo/node.js:828 msgid "shadow-tls" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1371 +#: htdocs/luci-static/resources/view/fchomo/node.js:1390 msgid "smux" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:426 -#: htdocs/luci-static/resources/view/fchomo/node.js:458 +#: htdocs/luci-static/resources/fchomo/listeners.js:437 +#: htdocs/luci-static/resources/view/fchomo/node.js:469 msgid "split-stream" msgstr "" @@ -3703,25 +3736,25 @@ msgstr "" msgid "src" msgstr "src" -#: htdocs/luci-static/resources/fchomo/listeners.js:1120 -#: htdocs/luci-static/resources/view/fchomo/node.js:1297 +#: htdocs/luci-static/resources/fchomo/listeners.js:1163 +#: htdocs/luci-static/resources/view/fchomo/node.js:1316 msgid "stream-one" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:1121 -#: htdocs/luci-static/resources/view/fchomo/node.js:1298 +#: htdocs/luci-static/resources/fchomo/listeners.js:1164 +#: htdocs/luci-static/resources/view/fchomo/node.js:1317 msgid "stream-up" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:1137 +#: htdocs/luci-static/resources/fchomo/listeners.js:1180 msgid "stream-up server seconds" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:492 +#: htdocs/luci-static/resources/view/fchomo/node.js:503 msgid "stream/poll/auto" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:282 +#: htdocs/luci-static/resources/fchomo/listeners.js:293 msgid "sudoku-keypair" msgstr "" @@ -3729,87 +3762,100 @@ msgstr "" msgid "unchecked" msgstr "未检查" -#: htdocs/luci-static/resources/fchomo.js:443 +#: htdocs/luci-static/resources/fchomo.js:444 msgid "unique UCI identifier" msgstr "独立 UCI 标识" -#: htdocs/luci-static/resources/fchomo.js:446 +#: htdocs/luci-static/resources/fchomo.js:447 msgid "unique identifier" msgstr "独立标识" -#: htdocs/luci-static/resources/fchomo.js:1591 +#: htdocs/luci-static/resources/fchomo.js:1592 msgid "unique value" msgstr "独立值" -#: htdocs/luci-static/resources/view/fchomo/node.js:1742 +#: htdocs/luci-static/resources/view/fchomo/node.js:1761 msgid "up" msgstr "Hysteria 上传速率" -#: htdocs/luci-static/resources/fchomo/listeners.js:558 -#: htdocs/luci-static/resources/view/fchomo/node.js:508 -#: htdocs/luci-static/resources/view/fchomo/node.js:543 -#: htdocs/luci-static/resources/view/fchomo/node.js:838 -#: htdocs/luci-static/resources/view/fchomo/node.js:887 +#: htdocs/luci-static/resources/fchomo/listeners.js:463 +#: htdocs/luci-static/resources/fchomo/listeners.js:595 +#: htdocs/luci-static/resources/view/fchomo/node.js:519 +#: htdocs/luci-static/resources/view/fchomo/node.js:561 +#: htdocs/luci-static/resources/view/fchomo/node.js:856 +#: htdocs/luci-static/resources/view/fchomo/node.js:906 msgid "v1" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:559 -#: htdocs/luci-static/resources/view/fchomo/node.js:509 -#: htdocs/luci-static/resources/view/fchomo/node.js:839 -#: htdocs/luci-static/resources/view/fchomo/node.js:888 +#: htdocs/luci-static/resources/fchomo/listeners.js:464 +#: htdocs/luci-static/resources/fchomo/listeners.js:596 +#: htdocs/luci-static/resources/view/fchomo/node.js:520 +#: htdocs/luci-static/resources/view/fchomo/node.js:857 +#: htdocs/luci-static/resources/view/fchomo/node.js:907 msgid "v2" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:560 -#: htdocs/luci-static/resources/view/fchomo/node.js:510 -#: htdocs/luci-static/resources/view/fchomo/node.js:840 +#: htdocs/luci-static/resources/fchomo/listeners.js:465 +#: htdocs/luci-static/resources/fchomo/listeners.js:597 +#: htdocs/luci-static/resources/view/fchomo/node.js:521 +#: htdocs/luci-static/resources/view/fchomo/node.js:858 msgid "v3" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:1471 -#: htdocs/luci-static/resources/fchomo.js:1474 +#: htdocs/luci-static/resources/fchomo/listeners.js:466 +#: htdocs/luci-static/resources/view/fchomo/node.js:522 +msgid "v4" +msgstr "" + +#: htdocs/luci-static/resources/fchomo/listeners.js:467 +#: htdocs/luci-static/resources/view/fchomo/node.js:523 +msgid "v5" +msgstr "" + +#: htdocs/luci-static/resources/fchomo.js:1472 +#: htdocs/luci-static/resources/fchomo.js:1475 msgid "valid JSON format" msgstr "有效的 JSON 格式" -#: htdocs/luci-static/resources/view/fchomo/node.js:1079 +#: htdocs/luci-static/resources/view/fchomo/node.js:1098 msgid "valid SHA256 string with %d characters" msgstr "包含 %d 个字符的有效 SHA256 字符串" -#: htdocs/luci-static/resources/fchomo.js:1496 -#: htdocs/luci-static/resources/fchomo.js:1499 +#: htdocs/luci-static/resources/fchomo.js:1497 +#: htdocs/luci-static/resources/fchomo.js:1500 msgid "valid URL" msgstr "有效网址" -#: htdocs/luci-static/resources/fchomo.js:1509 +#: htdocs/luci-static/resources/fchomo.js:1510 msgid "valid base64 key with %d characters" msgstr "包含 %d 个字符的有效 base64 密钥" -#: htdocs/luci-static/resources/fchomo.js:1569 -#: htdocs/luci-static/resources/fchomo.js:1575 +#: htdocs/luci-static/resources/fchomo.js:1570 +#: htdocs/luci-static/resources/fchomo.js:1576 msgid "valid format: 2x, 2p, 4v" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:1556 +#: htdocs/luci-static/resources/fchomo.js:1557 msgid "valid key length with %d characters" msgstr "包含 %d 个字符的有效密钥" -#: htdocs/luci-static/resources/fchomo.js:1434 +#: htdocs/luci-static/resources/fchomo.js:1435 msgid "valid port value" msgstr "有效端口值" -#: htdocs/luci-static/resources/fchomo.js:1484 +#: htdocs/luci-static/resources/fchomo.js:1485 msgid "valid uuid" msgstr "有效 uuid" -#: htdocs/luci-static/resources/fchomo.js:403 +#: htdocs/luci-static/resources/fchomo.js:404 msgid "vless-mlkem768" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:402 +#: htdocs/luci-static/resources/fchomo.js:403 msgid "vless-x25519" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:337 +#: htdocs/luci-static/resources/fchomo.js:338 msgid "xchacha20-ietf-poly1305" msgstr "" @@ -3817,7 +3863,7 @@ msgstr "" msgid "yacd-meta" msgstr "yacd-meta" -#: htdocs/luci-static/resources/view/fchomo/node.js:1372 +#: htdocs/luci-static/resources/view/fchomo/node.js:1391 msgid "yamux" msgstr "" @@ -3825,11 +3871,11 @@ msgstr "" msgid "zashboard" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:649 +#: htdocs/luci-static/resources/view/fchomo/node.js:667 msgid "zero" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:1252 +#: htdocs/luci-static/resources/fchomo.js:1253 msgid "🡇" msgstr "" diff --git a/luci-app-fchomo/po/zh_Hant/fchomo.po b/luci-app-fchomo/po/zh_Hant/fchomo.po index f11a3186..f7fda319 100644 --- a/luci-app-fchomo/po/zh_Hant/fchomo.po +++ b/luci-app-fchomo/po/zh_Hant/fchomo.po @@ -12,30 +12,30 @@ msgstr "" msgid "%s log" msgstr "%s 日誌" -#: htdocs/luci-static/resources/fchomo.js:240 #: htdocs/luci-static/resources/fchomo.js:241 #: htdocs/luci-static/resources/fchomo.js:242 #: htdocs/luci-static/resources/fchomo.js:243 #: htdocs/luci-static/resources/fchomo.js:244 #: htdocs/luci-static/resources/fchomo.js:245 +#: htdocs/luci-static/resources/fchomo.js:246 msgid "%s ports" msgstr "%s 連接埠" -#: htdocs/luci-static/resources/fchomo.js:605 -#: htdocs/luci-static/resources/fchomo.js:608 +#: htdocs/luci-static/resources/fchomo.js:606 +#: htdocs/luci-static/resources/fchomo.js:609 #: htdocs/luci-static/resources/view/fchomo/client.js:315 msgid "(Imported)" msgstr "(已導入)" -#: htdocs/luci-static/resources/fchomo/listeners.js:947 -#: htdocs/luci-static/resources/fchomo/listeners.js:955 -#: htdocs/luci-static/resources/fchomo/listeners.js:964 +#: htdocs/luci-static/resources/fchomo/listeners.js:990 +#: htdocs/luci-static/resources/fchomo/listeners.js:998 +#: htdocs/luci-static/resources/fchomo/listeners.js:1007 #: htdocs/luci-static/resources/view/fchomo/global.js:543 #: htdocs/luci-static/resources/view/fchomo/global.js:549 -#: htdocs/luci-static/resources/view/fchomo/node.js:1094 -#: htdocs/luci-static/resources/view/fchomo/node.js:1100 -#: htdocs/luci-static/resources/view/fchomo/node.js:1108 -#: htdocs/luci-static/resources/view/fchomo/node.js:1114 +#: htdocs/luci-static/resources/view/fchomo/node.js:1113 +#: htdocs/luci-static/resources/view/fchomo/node.js:1119 +#: htdocs/luci-static/resources/view/fchomo/node.js:1127 +#: htdocs/luci-static/resources/view/fchomo/node.js:1133 msgid "(mTLS)" msgstr "" @@ -46,19 +46,19 @@ msgstr "" #: htdocs/luci-static/resources/view/fchomo/client.js:1056 #: htdocs/luci-static/resources/view/fchomo/client.js:1057 #: htdocs/luci-static/resources/view/fchomo/client.js:1278 -#: htdocs/luci-static/resources/view/fchomo/node.js:1897 -#: htdocs/luci-static/resources/view/fchomo/node.js:1903 -#: htdocs/luci-static/resources/view/fchomo/node.js:1917 -#: htdocs/luci-static/resources/view/fchomo/node.js:1923 +#: htdocs/luci-static/resources/view/fchomo/node.js:1916 +#: htdocs/luci-static/resources/view/fchomo/node.js:1922 +#: htdocs/luci-static/resources/view/fchomo/node.js:1936 +#: htdocs/luci-static/resources/view/fchomo/node.js:1942 msgid "-- Please choose --" msgstr "-- 請選擇 --" -#: htdocs/luci-static/resources/fchomo.js:392 +#: htdocs/luci-static/resources/fchomo.js:393 msgid "0-RTT reuse." msgstr "0-RTT 重用。" -#: htdocs/luci-static/resources/fchomo.js:389 -#: htdocs/luci-static/resources/fchomo.js:393 +#: htdocs/luci-static/resources/fchomo.js:390 +#: htdocs/luci-static/resources/fchomo.js:394 msgid "1-RTT only." msgstr "僅限 1-RTT。" @@ -66,15 +66,15 @@ msgstr "僅限 1-RTT。" msgid "163Music" msgstr "網易雲音樂" -#: htdocs/luci-static/resources/fchomo.js:339 +#: htdocs/luci-static/resources/fchomo.js:340 msgid "2022-blake3-aes-128-gcm" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:340 +#: htdocs/luci-static/resources/fchomo.js:341 msgid "2022-blake3-aes-256-gcm" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:341 +#: htdocs/luci-static/resources/fchomo.js:342 msgid "2022-blake3-chacha20-poly1305" msgstr "" @@ -82,16 +82,16 @@ msgstr "" msgid "0 or 1 only." msgstr "僅限 01。" -#: htdocs/luci-static/resources/fchomo/listeners.js:925 -#: htdocs/luci-static/resources/fchomo/listeners.js:940 -#: htdocs/luci-static/resources/fchomo/listeners.js:965 -#: htdocs/luci-static/resources/view/fchomo/node.js:1101 -#: htdocs/luci-static/resources/view/fchomo/node.js:1115 +#: htdocs/luci-static/resources/fchomo/listeners.js:968 +#: htdocs/luci-static/resources/fchomo/listeners.js:983 +#: htdocs/luci-static/resources/fchomo/listeners.js:1008 +#: htdocs/luci-static/resources/view/fchomo/node.js:1120 +#: htdocs/luci-static/resources/view/fchomo/node.js:1134 msgid "Save your configuration before uploading files!" msgstr "上傳文件前請先保存配置!" -#: htdocs/luci-static/resources/fchomo/listeners.js:275 -#: htdocs/luci-static/resources/view/fchomo/node.js:380 +#: htdocs/luci-static/resources/fchomo/listeners.js:286 +#: htdocs/luci-static/resources/view/fchomo/node.js:391 msgid "" "A base64 string is used to fine-tune network behavior.
Please refer to " "the document" msgid "All allowed" msgstr "允許所有" -#: htdocs/luci-static/resources/fchomo.js:237 +#: htdocs/luci-static/resources/fchomo.js:238 msgid "All ports" msgstr "所有連接埠" @@ -255,7 +255,11 @@ msgid "" msgstr "" "允許從私有網路訪問。
要從公共網站訪問私有網路上的 API,則必須啟用。" -#: htdocs/luci-static/resources/view/fchomo/node.js:769 +#: htdocs/luci-static/resources/fchomo/listeners.js:895 +msgid "Allow insecure connections" +msgstr "允許不安全的連線" + +#: htdocs/luci-static/resources/view/fchomo/node.js:787 msgid "Allowed IPs" msgstr "允許的 IP" @@ -267,13 +271,13 @@ msgstr "已是最新版本。" msgid "Already in updating." msgstr "已在更新中。" -#: htdocs/luci-static/resources/fchomo/listeners.js:513 -#: htdocs/luci-static/resources/view/fchomo/node.js:639 +#: htdocs/luci-static/resources/fchomo/listeners.js:542 +#: htdocs/luci-static/resources/view/fchomo/node.js:657 msgid "Alter ID" msgstr "額外 ID" -#: htdocs/luci-static/resources/fchomo.js:162 -#: htdocs/luci-static/resources/fchomo.js:197 +#: htdocs/luci-static/resources/fchomo.js:163 +#: htdocs/luci-static/resources/fchomo.js:198 msgid "AnyTLS" msgstr "" @@ -290,20 +294,20 @@ msgstr "作為 dnsmasq 的最優先上游" msgid "As the TOP upstream of dnsmasq." msgstr "作為 dnsmasq 的最優先上游。" -#: htdocs/luci-static/resources/fchomo/listeners.js:463 +#: htdocs/luci-static/resources/fchomo/listeners.js:492 msgid "Auth timeout" msgstr "認證超時" -#: htdocs/luci-static/resources/view/fchomo/node.js:661 +#: htdocs/luci-static/resources/view/fchomo/node.js:679 msgid "Authenticated length" msgstr "認證長度" -#: htdocs/luci-static/resources/fchomo/listeners.js:428 -#: htdocs/luci-static/resources/fchomo/listeners.js:1119 +#: htdocs/luci-static/resources/fchomo/listeners.js:439 +#: htdocs/luci-static/resources/fchomo/listeners.js:1162 #: htdocs/luci-static/resources/view/fchomo/global.js:402 -#: htdocs/luci-static/resources/view/fchomo/node.js:460 -#: htdocs/luci-static/resources/view/fchomo/node.js:484 -#: htdocs/luci-static/resources/view/fchomo/node.js:1296 +#: htdocs/luci-static/resources/view/fchomo/node.js:471 +#: htdocs/luci-static/resources/view/fchomo/node.js:495 +#: htdocs/luci-static/resources/view/fchomo/node.js:1315 msgid "Auto" msgstr "自動" @@ -319,8 +323,8 @@ msgstr "自動更新" msgid "Auto update resources." msgstr "自動更新資源文件。" -#: htdocs/luci-static/resources/fchomo/listeners.js:591 -#: htdocs/luci-static/resources/view/fchomo/node.js:866 +#: htdocs/luci-static/resources/fchomo/listeners.js:628 +#: htdocs/luci-static/resources/view/fchomo/node.js:884 msgid "BBR profile" msgstr "BBR 設定檔" @@ -328,11 +332,11 @@ msgstr "BBR 設定檔" msgid "Baidu" msgstr "百度" -#: htdocs/luci-static/resources/view/fchomo/node.js:676 +#: htdocs/luci-static/resources/view/fchomo/node.js:694 msgid "Base64 encoded ECDSA private key on the NIST P-256 curve." msgstr "基於 NIST P-256 曲線的 Base64 編碼 ECDSA 私鑰。" -#: htdocs/luci-static/resources/view/fchomo/node.js:684 +#: htdocs/luci-static/resources/view/fchomo/node.js:702 msgid "Base64 encoded ECDSA public key on the NIST P-256 curve." msgstr "基於 NIST P-256 曲線的 Base64 編碼 ECDSA 公鑰。" @@ -354,13 +358,13 @@ msgid "Binary mrs" msgstr "二進位 mrs" #: htdocs/luci-static/resources/view/fchomo/global.js:734 -#: htdocs/luci-static/resources/view/fchomo/node.js:1455 -#: htdocs/luci-static/resources/view/fchomo/node.js:1771 +#: htdocs/luci-static/resources/view/fchomo/node.js:1474 +#: htdocs/luci-static/resources/view/fchomo/node.js:1790 msgid "Bind interface" msgstr "綁定介面" -#: htdocs/luci-static/resources/view/fchomo/node.js:1456 -#: htdocs/luci-static/resources/view/fchomo/node.js:1772 +#: htdocs/luci-static/resources/view/fchomo/node.js:1475 +#: htdocs/luci-static/resources/view/fchomo/node.js:1791 msgid "Bind outbound interface.
" msgstr "綁定出站介面。
" @@ -398,14 +402,14 @@ msgstr "繞過 CN 流量" msgid "Bypass DSCP" msgstr "繞過 DSCP" -#: htdocs/luci-static/resources/fchomo/listeners.js:426 -#: htdocs/luci-static/resources/fchomo/listeners.js:427 -#: htdocs/luci-static/resources/fchomo/listeners.js:428 -#: htdocs/luci-static/resources/fchomo/listeners.js:429 -#: htdocs/luci-static/resources/view/fchomo/node.js:458 -#: htdocs/luci-static/resources/view/fchomo/node.js:459 -#: htdocs/luci-static/resources/view/fchomo/node.js:460 -#: htdocs/luci-static/resources/view/fchomo/node.js:461 +#: htdocs/luci-static/resources/fchomo/listeners.js:437 +#: htdocs/luci-static/resources/fchomo/listeners.js:438 +#: htdocs/luci-static/resources/fchomo/listeners.js:439 +#: htdocs/luci-static/resources/fchomo/listeners.js:440 +#: htdocs/luci-static/resources/view/fchomo/node.js:469 +#: htdocs/luci-static/resources/view/fchomo/node.js:470 +#: htdocs/luci-static/resources/view/fchomo/node.js:471 +#: htdocs/luci-static/resources/view/fchomo/node.js:472 msgid "CDN support" msgstr "CDN 支援" @@ -421,21 +425,21 @@ msgstr "CORS 允許私有網路" msgid "CORS allowed origins, * will be used if empty." msgstr "CORS 允許的來源,留空則使用 *。" -#: htdocs/luci-static/resources/fchomo.js:721 +#: htdocs/luci-static/resources/fchomo.js:722 msgid "Cancel" msgstr "取消" -#: htdocs/luci-static/resources/view/fchomo/node.js:1073 +#: htdocs/luci-static/resources/view/fchomo/node.js:1092 msgid "Cert fingerprint" msgstr "憑證指紋" -#: htdocs/luci-static/resources/view/fchomo/node.js:1074 +#: htdocs/luci-static/resources/view/fchomo/node.js:1093 msgid "" "Certificate fingerprint. Used to implement SSL Pinning and prevent MitM." msgstr "憑證指紋。用於實現 SSL憑證固定 並防止 MitM。" -#: htdocs/luci-static/resources/fchomo/listeners.js:917 -#: htdocs/luci-static/resources/view/fchomo/node.js:1094 +#: htdocs/luci-static/resources/fchomo/listeners.js:960 +#: htdocs/luci-static/resources/view/fchomo/node.js:1113 msgid "Certificate path" msgstr "憑證路徑" @@ -464,16 +468,16 @@ msgstr "大陸 IPv6 庫版本" msgid "China list version" msgstr "大陸網域清單版本" -#: htdocs/luci-static/resources/fchomo/listeners.js:244 -#: htdocs/luci-static/resources/fchomo/listeners.js:342 -#: htdocs/luci-static/resources/view/fchomo/node.js:333 -#: htdocs/luci-static/resources/view/fchomo/node.js:392 -#: htdocs/luci-static/resources/view/fchomo/node.js:645 +#: htdocs/luci-static/resources/fchomo/listeners.js:255 +#: htdocs/luci-static/resources/fchomo/listeners.js:353 +#: htdocs/luci-static/resources/view/fchomo/node.js:344 +#: htdocs/luci-static/resources/view/fchomo/node.js:403 +#: htdocs/luci-static/resources/view/fchomo/node.js:663 msgid "Chipher" msgstr "加密方法" -#: htdocs/luci-static/resources/fchomo/listeners.js:351 -#: htdocs/luci-static/resources/view/fchomo/node.js:401 +#: htdocs/luci-static/resources/fchomo/listeners.js:362 +#: htdocs/luci-static/resources/view/fchomo/node.js:412 msgid "Chipher must be enabled if obfuscate downlink is disabled." msgstr "如果下行鏈路混淆功能已停用,則必須啟用加密。" @@ -489,29 +493,29 @@ msgstr "" "點擊
此處下載" "最新的初始包。" -#: htdocs/luci-static/resources/fchomo/listeners.js:689 -#: htdocs/luci-static/resources/fchomo/listeners.js:956 +#: htdocs/luci-static/resources/fchomo/listeners.js:726 +#: htdocs/luci-static/resources/fchomo/listeners.js:999 #: htdocs/luci-static/resources/view/fchomo/global.js:550 -#: htdocs/luci-static/resources/view/fchomo/node.js:929 -#: htdocs/luci-static/resources/view/fchomo/node.js:1095 -#: htdocs/luci-static/resources/view/fchomo/node.js:1109 +#: htdocs/luci-static/resources/view/fchomo/node.js:948 +#: htdocs/luci-static/resources/view/fchomo/node.js:1114 +#: htdocs/luci-static/resources/view/fchomo/node.js:1128 #: root/usr/share/luci/menu.d/luci-app-fchomo.json:22 msgid "Client" msgstr "客戶端" -#: htdocs/luci-static/resources/fchomo/listeners.js:955 +#: htdocs/luci-static/resources/fchomo/listeners.js:998 msgid "Client Auth Certificate path" msgstr "客戶端認證憑證路徑" -#: htdocs/luci-static/resources/fchomo/listeners.js:947 +#: htdocs/luci-static/resources/fchomo/listeners.js:990 msgid "Client Auth type" msgstr "客戶端認證類型" -#: htdocs/luci-static/resources/view/fchomo/node.js:1140 +#: htdocs/luci-static/resources/view/fchomo/node.js:1159 msgid "Client fingerprint" msgstr "客戶端指紋" -#: htdocs/luci-static/resources/fchomo/listeners.js:338 +#: htdocs/luci-static/resources/fchomo/listeners.js:349 msgid "Client key" msgstr "客戶端密鑰" @@ -523,21 +527,21 @@ msgstr "客戶端狀態" msgid "Collecting data..." msgstr "收集資料中..." -#: htdocs/luci-static/resources/fchomo.js:238 #: htdocs/luci-static/resources/fchomo.js:239 +#: htdocs/luci-static/resources/fchomo.js:240 msgid "Common ports (bypass P2P traffic)" msgstr "常用連接埠(繞過 P2P 流量)" -#: htdocs/luci-static/resources/fchomo.js:1368 +#: htdocs/luci-static/resources/fchomo.js:1369 msgid "Complete" msgstr "完成" -#: htdocs/luci-static/resources/view/fchomo/node.js:1715 +#: htdocs/luci-static/resources/view/fchomo/node.js:1734 msgid "Configuration Items" msgstr "配置項" -#: htdocs/luci-static/resources/fchomo/listeners.js:583 -#: htdocs/luci-static/resources/view/fchomo/node.js:858 +#: htdocs/luci-static/resources/fchomo/listeners.js:620 +#: htdocs/luci-static/resources/view/fchomo/node.js:876 msgid "Congestion controller" msgstr "擁塞控制器" @@ -545,23 +549,27 @@ msgstr "擁塞控制器" msgid "Connection check" msgstr "連接檢查" +#: htdocs/luci-static/resources/view/fchomo/node.js:528 +msgid "Connection reuse" +msgstr "連接重用" + #: htdocs/luci-static/resources/fchomo.js:61 msgid "Conservative" msgstr "保守" -#: htdocs/luci-static/resources/fchomo.js:590 +#: htdocs/luci-static/resources/fchomo.js:591 msgid "Content copied to clipboard!" msgstr "內容已複製到剪貼簿!" #: htdocs/luci-static/resources/view/fchomo/client.js:670 -#: htdocs/luci-static/resources/view/fchomo/node.js:1625 -#: htdocs/luci-static/resources/view/fchomo/node.js:1651 +#: htdocs/luci-static/resources/view/fchomo/node.js:1644 +#: htdocs/luci-static/resources/view/fchomo/node.js:1670 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:339 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:365 msgid "Content will not be verified, Please make sure you enter it correctly." msgstr "內容將不會被驗證,請確保輸入正確。" -#: htdocs/luci-static/resources/view/fchomo/node.js:1624 +#: htdocs/luci-static/resources/view/fchomo/node.js:1643 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:338 msgid "Contents" msgstr "內容" @@ -570,7 +578,7 @@ msgstr "內容" msgid "Contents have been saved." msgstr "" -#: htdocs/luci-static/resources/fchomo.js:592 +#: htdocs/luci-static/resources/fchomo.js:593 msgid "Copy" msgstr "複製" @@ -586,7 +594,7 @@ msgstr "Cron 表達式" msgid "Custom Direct List" msgstr "自訂直連清單" -#: htdocs/luci-static/resources/view/fchomo/node.js:1686 +#: htdocs/luci-static/resources/view/fchomo/node.js:1705 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:400 msgid "Custom HTTP header." msgstr "自訂 HTTP header。" @@ -595,8 +603,8 @@ msgstr "自訂 HTTP header。" msgid "Custom Proxy List" msgstr "自訂代理清單" -#: htdocs/luci-static/resources/fchomo/listeners.js:366 -#: htdocs/luci-static/resources/view/fchomo/node.js:416 +#: htdocs/luci-static/resources/fchomo/listeners.js:377 +#: htdocs/luci-static/resources/view/fchomo/node.js:427 msgid "Custom byte layout" msgstr "自訂位元組佈局" @@ -605,7 +613,7 @@ msgid "" "Custom internal hosts. Support yaml or json format." msgstr "自訂內部 hosts。支援 yamljson 格式。" -#: htdocs/luci-static/resources/fchomo.js:186 +#: htdocs/luci-static/resources/fchomo.js:187 msgid "DIRECT" msgstr "" @@ -621,8 +629,8 @@ msgstr " DNS 連接埠" #: htdocs/luci-static/resources/view/fchomo/client.js:873 #: htdocs/luci-static/resources/view/fchomo/client.js:1428 #: htdocs/luci-static/resources/view/fchomo/client.js:1437 -#: htdocs/luci-static/resources/view/fchomo/node.js:716 -#: htdocs/luci-static/resources/view/fchomo/node.js:799 +#: htdocs/luci-static/resources/view/fchomo/node.js:734 +#: htdocs/luci-static/resources/view/fchomo/node.js:817 msgid "DNS server" msgstr "DNS 伺服器" @@ -650,15 +658,15 @@ msgstr "預設 DNS(由 WAN 下發)" msgid "Default DNS server" msgstr "預設 DNS 伺服器" -#: htdocs/luci-static/resources/view/fchomo/node.js:770 +#: htdocs/luci-static/resources/view/fchomo/node.js:788 msgid "Destination addresses allowed to be forwarded via Wireguard." msgstr "允許通過 WireGuard 轉發的目的位址" -#: htdocs/luci-static/resources/view/fchomo/node.js:1896 +#: htdocs/luci-static/resources/view/fchomo/node.js:1915 msgid "Destination provider" msgstr "落地供應商" -#: htdocs/luci-static/resources/view/fchomo/node.js:1902 +#: htdocs/luci-static/resources/view/fchomo/node.js:1921 msgid "Destination proxy node" msgstr "落地代理節點" @@ -666,8 +674,8 @@ msgstr "落地代理節點" msgid "Dial fields" msgstr "撥號欄位" -#: htdocs/luci-static/resources/view/fchomo/node.js:1909 -#: htdocs/luci-static/resources/view/fchomo/node.js:1929 +#: htdocs/luci-static/resources/view/fchomo/node.js:1928 +#: htdocs/luci-static/resources/view/fchomo/node.js:1948 msgid "Different chain head/tail" msgstr "不同的鏈頭/鏈尾" @@ -705,7 +713,7 @@ msgstr "停用 quic-go 的 通用分段卸載(GSO)" msgid "Disable ICMP Forwarding" msgstr "禁用 ICMP 轉發" -#: htdocs/luci-static/resources/view/fchomo/node.js:1014 +#: htdocs/luci-static/resources/view/fchomo/node.js:1033 msgid "Disable SNI" msgstr "停用 SNI" @@ -733,46 +741,46 @@ msgstr "" msgid "Domain" msgstr "網域" -#: htdocs/luci-static/resources/view/fchomo/node.js:1015 +#: htdocs/luci-static/resources/view/fchomo/node.js:1034 msgid "Donot send server name in ClientHello." msgstr "不要在 ClientHello 中傳送伺服器名稱。" #: htdocs/luci-static/resources/view/fchomo/client.js:1577 -#: htdocs/luci-static/resources/view/fchomo/node.js:1087 -#: htdocs/luci-static/resources/view/fchomo/node.js:1755 +#: htdocs/luci-static/resources/view/fchomo/node.js:1106 +#: htdocs/luci-static/resources/view/fchomo/node.js:1774 msgid "Donot verifying server certificate." msgstr "不驗證伺服器憑證。" -#: htdocs/luci-static/resources/view/fchomo/node.js:1434 +#: htdocs/luci-static/resources/view/fchomo/node.js:1453 msgid "Download bandwidth" msgstr "下載頻寬" -#: htdocs/luci-static/resources/view/fchomo/node.js:1435 +#: htdocs/luci-static/resources/view/fchomo/node.js:1454 msgid "Download bandwidth in Mbps." msgstr "下載頻寬(單位:Mbps)。" -#: htdocs/luci-static/resources/fchomo.js:1247 +#: htdocs/luci-static/resources/fchomo.js:1248 msgid "Download failed: %s" msgstr "下載失敗: %s" -#: htdocs/luci-static/resources/fchomo.js:1245 +#: htdocs/luci-static/resources/fchomo.js:1246 msgid "Download successful." msgstr "下載成功。" -#: htdocs/luci-static/resources/fchomo.js:172 +#: htdocs/luci-static/resources/fchomo.js:173 msgid "Dual stack" msgstr "雙棧" -#: htdocs/luci-static/resources/view/fchomo/node.js:1134 +#: htdocs/luci-static/resources/view/fchomo/node.js:1153 msgid "ECH HTTPS record query servername" msgstr "ECH HTTPS 記錄查詢網域" -#: htdocs/luci-static/resources/fchomo/listeners.js:1013 -#: htdocs/luci-static/resources/view/fchomo/node.js:1128 +#: htdocs/luci-static/resources/fchomo/listeners.js:1056 +#: htdocs/luci-static/resources/view/fchomo/node.js:1147 msgid "ECH config" msgstr "ECH 配置" -#: htdocs/luci-static/resources/fchomo/listeners.js:972 +#: htdocs/luci-static/resources/fchomo/listeners.js:1015 msgid "ECH key" msgstr "ECH 密鑰" @@ -788,11 +796,11 @@ msgstr "" msgid "ETag support" msgstr "ETag 支援" -#: htdocs/luci-static/resources/view/fchomo/node.js:1274 +#: htdocs/luci-static/resources/view/fchomo/node.js:1293 msgid "Early Data first packet length limit." msgstr "前置數據長度閾值" -#: htdocs/luci-static/resources/view/fchomo/node.js:1280 +#: htdocs/luci-static/resources/view/fchomo/node.js:1299 msgid "Early Data header name" msgstr "前置數據標頭" @@ -808,12 +816,12 @@ msgstr "編輯節點" msgid "Edit ruleset" msgstr "編輯規則集" -#: htdocs/luci-static/resources/view/fchomo/node.js:1622 +#: htdocs/luci-static/resources/view/fchomo/node.js:1641 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:336 msgid "Editer" msgstr "編輯器" -#: htdocs/luci-static/resources/fchomo.js:383 +#: htdocs/luci-static/resources/fchomo.js:384 msgid "Eliminate encryption header characteristics" msgstr "消除加密頭特徵" @@ -828,15 +836,15 @@ msgstr "消除加密頭特徵" #: htdocs/luci-static/resources/view/fchomo/global.js:401 #: htdocs/luci-static/resources/view/fchomo/global.js:680 #: htdocs/luci-static/resources/view/fchomo/node.js:235 -#: htdocs/luci-static/resources/view/fchomo/node.js:1595 -#: htdocs/luci-static/resources/view/fchomo/node.js:1794 -#: htdocs/luci-static/resources/view/fchomo/node.js:1883 +#: htdocs/luci-static/resources/view/fchomo/node.js:1614 +#: htdocs/luci-static/resources/view/fchomo/node.js:1813 +#: htdocs/luci-static/resources/view/fchomo/node.js:1902 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:264 #: htdocs/luci-static/resources/view/fchomo/server.js:49 msgid "Enable" msgstr "啟用" -#: htdocs/luci-static/resources/view/fchomo/node.js:554 +#: htdocs/luci-static/resources/view/fchomo/node.js:572 msgid "" "Enable 0-RTT QUIC connection handshake on the client side. This is not " "impacting much on the performance, as the protocol is fully multiplexed.
強烈建議停用此功能,因為它容易受到重放攻擊。" -#: htdocs/luci-static/resources/view/fchomo/node.js:553 +#: htdocs/luci-static/resources/view/fchomo/node.js:571 msgid "Enable 0-RTT handshake" msgstr "啟用 0-RTT 握手" @@ -857,53 +865,53 @@ msgstr "" "為出站連線啟用 IP4P 轉換" -#: htdocs/luci-static/resources/view/fchomo/node.js:1122 +#: htdocs/luci-static/resources/view/fchomo/node.js:1141 msgid "Enable ECH" msgstr "啟用 ECH" -#: htdocs/luci-static/resources/view/fchomo/node.js:1422 +#: htdocs/luci-static/resources/view/fchomo/node.js:1441 msgid "Enable TCP Brutal" msgstr "啟用 TCP Brutal" -#: htdocs/luci-static/resources/view/fchomo/node.js:1423 +#: htdocs/luci-static/resources/view/fchomo/node.js:1442 msgid "Enable TCP Brutal congestion control algorithm" msgstr "啟用 TCP Brutal 擁塞控制演算法。" -#: htdocs/luci-static/resources/view/fchomo/node.js:1411 +#: htdocs/luci-static/resources/view/fchomo/node.js:1430 msgid "Enable multiplexing only for TCP." msgstr "僅為 TCP 啟用多路復用。" -#: htdocs/luci-static/resources/fchomo/listeners.js:412 -#: htdocs/luci-static/resources/view/fchomo/node.js:444 +#: htdocs/luci-static/resources/fchomo/listeners.js:423 +#: htdocs/luci-static/resources/view/fchomo/node.js:455 msgid "Enable obfuscate for downlink" msgstr "啟用下行鏈路混淆" -#: htdocs/luci-static/resources/view/fchomo/node.js:1405 +#: htdocs/luci-static/resources/view/fchomo/node.js:1424 msgid "Enable padding" msgstr "啟用填充" -#: htdocs/luci-static/resources/view/fchomo/node.js:1416 +#: htdocs/luci-static/resources/view/fchomo/node.js:1435 msgid "Enable statistic" msgstr "啟用統計" -#: htdocs/luci-static/resources/view/fchomo/node.js:881 -#: htdocs/luci-static/resources/view/fchomo/node.js:1737 +#: htdocs/luci-static/resources/view/fchomo/node.js:900 +#: htdocs/luci-static/resources/view/fchomo/node.js:1756 msgid "" "Enable the SUoT protocol, requires server support. Conflict with Multiplex." msgstr "啟用 SUoT 協議,需要服務端支援。與多路復用衝突。" -#: htdocs/luci-static/resources/fchomo/listeners.js:200 -#: htdocs/luci-static/resources/view/fchomo/node.js:305 +#: htdocs/luci-static/resources/fchomo/listeners.js:201 +#: htdocs/luci-static/resources/view/fchomo/node.js:306 msgid "" "Enabling obfuscation will make the server incompatible with standard QUIC " "connections, losing the ability to masquerade with HTTP/3." msgstr "啟用混淆將使伺服器與標準的 QUIC 連線不相容,失去 HTTP/3 偽裝的能力。" -#: htdocs/luci-static/resources/fchomo/listeners.js:652 +#: htdocs/luci-static/resources/fchomo/listeners.js:689 msgid "Encryption method" msgstr "加密方法" -#: htdocs/luci-static/resources/view/fchomo/node.js:683 +#: htdocs/luci-static/resources/view/fchomo/node.js:701 msgid "Endpoint pubkic key" msgstr "端點公鑰" @@ -926,7 +934,7 @@ msgid "" "if empty." msgstr "超過此限制將會觸發強制健康檢查。留空則使用 5。" -#: htdocs/luci-static/resources/view/fchomo/node.js:1852 +#: htdocs/luci-static/resources/view/fchomo/node.js:1871 msgid "Exclude matched node types." msgstr "排除匹配的節點類型。" @@ -939,7 +947,7 @@ msgstr "" "rel=\"noreferrer noopener\">此處。" #: htdocs/luci-static/resources/view/fchomo/client.js:1161 -#: htdocs/luci-static/resources/view/fchomo/node.js:1845 +#: htdocs/luci-static/resources/view/fchomo/node.js:1864 msgid "Exclude nodes that meet keywords or regexps." msgstr "排除匹配關鍵字或表達式的節點。" @@ -948,66 +956,66 @@ msgid "Expand/Collapse result" msgstr "展開/收起 結果" #: htdocs/luci-static/resources/view/fchomo/client.js:1121 -#: htdocs/luci-static/resources/view/fchomo/node.js:1830 +#: htdocs/luci-static/resources/view/fchomo/node.js:1849 msgid "Expected HTTP code. 204 will be used if empty." msgstr "預期的 HTTP code。留空則使用 204。" #: htdocs/luci-static/resources/view/fchomo/client.js:1123 -#: htdocs/luci-static/resources/view/fchomo/node.js:1832 +#: htdocs/luci-static/resources/view/fchomo/node.js:1851 msgid "Expected status" msgstr "預期狀態" -#: htdocs/luci-static/resources/fchomo.js:440 -#: htdocs/luci-static/resources/fchomo.js:443 -#: htdocs/luci-static/resources/fchomo.js:446 -#: htdocs/luci-static/resources/fchomo.js:1385 -#: htdocs/luci-static/resources/fchomo.js:1393 -#: htdocs/luci-static/resources/fchomo.js:1401 -#: htdocs/luci-static/resources/fchomo.js:1424 -#: htdocs/luci-static/resources/fchomo.js:1427 -#: htdocs/luci-static/resources/fchomo.js:1434 -#: htdocs/luci-static/resources/fchomo.js:1450 -#: htdocs/luci-static/resources/fchomo.js:1459 -#: htdocs/luci-static/resources/fchomo.js:1471 -#: htdocs/luci-static/resources/fchomo.js:1474 -#: htdocs/luci-static/resources/fchomo.js:1484 -#: htdocs/luci-static/resources/fchomo.js:1496 -#: htdocs/luci-static/resources/fchomo.js:1499 -#: htdocs/luci-static/resources/fchomo.js:1509 -#: htdocs/luci-static/resources/fchomo.js:1519 -#: htdocs/luci-static/resources/fchomo.js:1554 -#: htdocs/luci-static/resources/fchomo.js:1556 -#: htdocs/luci-static/resources/fchomo.js:1569 -#: htdocs/luci-static/resources/fchomo.js:1575 -#: htdocs/luci-static/resources/fchomo.js:1582 -#: htdocs/luci-static/resources/fchomo.js:1591 -#: htdocs/luci-static/resources/fchomo/listeners.js:351 -#: htdocs/luci-static/resources/fchomo/listeners.js:398 -#: htdocs/luci-static/resources/fchomo/listeners.js:681 -#: htdocs/luci-static/resources/fchomo/listeners.js:712 -#: htdocs/luci-static/resources/fchomo/listeners.js:813 +#: htdocs/luci-static/resources/fchomo.js:441 +#: htdocs/luci-static/resources/fchomo.js:444 +#: htdocs/luci-static/resources/fchomo.js:447 +#: htdocs/luci-static/resources/fchomo.js:1386 +#: htdocs/luci-static/resources/fchomo.js:1394 +#: htdocs/luci-static/resources/fchomo.js:1402 +#: htdocs/luci-static/resources/fchomo.js:1425 +#: htdocs/luci-static/resources/fchomo.js:1428 +#: htdocs/luci-static/resources/fchomo.js:1435 +#: htdocs/luci-static/resources/fchomo.js:1451 +#: htdocs/luci-static/resources/fchomo.js:1460 +#: htdocs/luci-static/resources/fchomo.js:1472 +#: htdocs/luci-static/resources/fchomo.js:1475 +#: htdocs/luci-static/resources/fchomo.js:1485 +#: htdocs/luci-static/resources/fchomo.js:1497 +#: htdocs/luci-static/resources/fchomo.js:1500 +#: htdocs/luci-static/resources/fchomo.js:1510 +#: htdocs/luci-static/resources/fchomo.js:1520 +#: htdocs/luci-static/resources/fchomo.js:1555 +#: htdocs/luci-static/resources/fchomo.js:1557 +#: htdocs/luci-static/resources/fchomo.js:1570 +#: htdocs/luci-static/resources/fchomo.js:1576 +#: htdocs/luci-static/resources/fchomo.js:1583 +#: htdocs/luci-static/resources/fchomo.js:1592 +#: htdocs/luci-static/resources/fchomo/listeners.js:362 +#: htdocs/luci-static/resources/fchomo/listeners.js:409 +#: htdocs/luci-static/resources/fchomo/listeners.js:718 +#: htdocs/luci-static/resources/fchomo/listeners.js:749 +#: htdocs/luci-static/resources/fchomo/listeners.js:850 #: htdocs/luci-static/resources/view/fchomo/client.js:68 #: htdocs/luci-static/resources/view/fchomo/client.js:1018 #: htdocs/luci-static/resources/view/fchomo/client.js:1508 #: htdocs/luci-static/resources/view/fchomo/global.js:880 -#: htdocs/luci-static/resources/view/fchomo/node.js:401 -#: htdocs/luci-static/resources/view/fchomo/node.js:437 -#: htdocs/luci-static/resources/view/fchomo/node.js:490 -#: htdocs/luci-static/resources/view/fchomo/node.js:492 -#: htdocs/luci-static/resources/view/fchomo/node.js:952 -#: htdocs/luci-static/resources/view/fchomo/node.js:1079 -#: htdocs/luci-static/resources/view/fchomo/node.js:1909 -#: htdocs/luci-static/resources/view/fchomo/node.js:1929 +#: htdocs/luci-static/resources/view/fchomo/node.js:412 +#: htdocs/luci-static/resources/view/fchomo/node.js:448 +#: htdocs/luci-static/resources/view/fchomo/node.js:501 +#: htdocs/luci-static/resources/view/fchomo/node.js:503 +#: htdocs/luci-static/resources/view/fchomo/node.js:971 +#: htdocs/luci-static/resources/view/fchomo/node.js:1098 +#: htdocs/luci-static/resources/view/fchomo/node.js:1928 +#: htdocs/luci-static/resources/view/fchomo/node.js:1948 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:291 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:305 msgid "Expecting: %s" msgstr "請輸入:%s" -#: htdocs/luci-static/resources/fchomo/listeners.js:1080 -#: htdocs/luci-static/resources/fchomo/listeners.js:1087 -#: htdocs/luci-static/resources/view/fchomo/node.js:1189 -#: htdocs/luci-static/resources/view/fchomo/node.js:1196 -#: htdocs/luci-static/resources/view/fchomo/node.js:1204 +#: htdocs/luci-static/resources/fchomo/listeners.js:1123 +#: htdocs/luci-static/resources/fchomo/listeners.js:1130 +#: htdocs/luci-static/resources/view/fchomo/node.js:1208 +#: htdocs/luci-static/resources/view/fchomo/node.js:1215 +#: htdocs/luci-static/resources/view/fchomo/node.js:1223 msgid "Expecting: only support %s." msgstr "請輸入:僅支援 %s." @@ -1026,24 +1034,24 @@ msgstr "實驗性" msgid "Factor" msgstr "條件" -#: htdocs/luci-static/resources/fchomo.js:1326 +#: htdocs/luci-static/resources/fchomo.js:1327 msgid "Failed to execute \"/etc/init.d/fchomo %s %s\" reason: %s" msgstr "無法執行 \"/etc/init.d/fchomo %s %s\" 原因: %s" -#: htdocs/luci-static/resources/fchomo.js:1279 +#: htdocs/luci-static/resources/fchomo.js:1280 msgid "Failed to generate %s, error: %s." msgstr "生成 %s 失敗,錯誤:%s。" -#: htdocs/luci-static/resources/fchomo.js:1691 +#: htdocs/luci-static/resources/fchomo.js:1692 msgid "Failed to upload %s, error: %s." msgstr "上傳 %s 失敗,錯誤:%s。" -#: htdocs/luci-static/resources/fchomo.js:1710 +#: htdocs/luci-static/resources/fchomo.js:1711 msgid "Failed to upload, error: %s." msgstr "上傳失敗,錯誤:%s。" -#: htdocs/luci-static/resources/fchomo.js:230 -#: htdocs/luci-static/resources/fchomo/listeners.js:437 +#: htdocs/luci-static/resources/fchomo.js:231 +#: htdocs/luci-static/resources/fchomo/listeners.js:448 msgid "Fallback" msgstr "自動回退" @@ -1057,7 +1065,7 @@ msgid "Fallback filter" msgstr "後備過濾器" #: htdocs/luci-static/resources/view/fchomo/client.js:1156 -#: htdocs/luci-static/resources/view/fchomo/node.js:1839 +#: htdocs/luci-static/resources/view/fchomo/node.js:1858 msgid "Filter nodes that meet keywords or regexps." msgstr "過濾匹配關鍵字或表達式的節點。" @@ -1086,8 +1094,8 @@ msgstr "兜底 DNS 伺服器 (用於已被投毒汙染的網域)" msgid "Firewall" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:505 -#: htdocs/luci-static/resources/view/fchomo/node.js:631 +#: htdocs/luci-static/resources/fchomo/listeners.js:534 +#: htdocs/luci-static/resources/view/fchomo/node.js:649 msgid "Flow" msgstr "流控" @@ -1100,8 +1108,8 @@ msgstr "" "noopener\">%s." #: htdocs/luci-static/resources/view/fchomo/client.js:1122 -#: htdocs/luci-static/resources/view/fchomo/node.js:1705 -#: htdocs/luci-static/resources/view/fchomo/node.js:1831 +#: htdocs/luci-static/resources/view/fchomo/node.js:1724 +#: htdocs/luci-static/resources/view/fchomo/node.js:1850 msgid "" "For format see %s." @@ -1109,8 +1117,8 @@ msgstr "" "格式請參閱 %s." -#: htdocs/luci-static/resources/view/fchomo/node.js:711 -#: htdocs/luci-static/resources/view/fchomo/node.js:794 +#: htdocs/luci-static/resources/view/fchomo/node.js:729 +#: htdocs/luci-static/resources/view/fchomo/node.js:812 msgid "Force DNS remote resolution." msgstr "強制 DNS 遠端解析。" @@ -1129,7 +1137,7 @@ msgstr "格式" msgid "FullCombo Shark!" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1229 +#: htdocs/luci-static/resources/view/fchomo/node.js:1248 msgid "GET" msgstr "" @@ -1137,6 +1145,11 @@ msgstr "" msgid "GFW list version" msgstr "GFW 網域清單版本" +#: htdocs/luci-static/resources/fchomo/listeners.js:196 +#: htdocs/luci-static/resources/view/fchomo/node.js:301 +msgid "Gecko" +msgstr "" + #: htdocs/luci-static/resources/view/fchomo/global.js:388 msgid "General" msgstr "常規" @@ -1144,7 +1157,7 @@ msgstr "常規" #: htdocs/luci-static/resources/fchomo/listeners.js:119 #: htdocs/luci-static/resources/view/fchomo/client.js:1009 #: htdocs/luci-static/resources/view/fchomo/node.js:222 -#: htdocs/luci-static/resources/view/fchomo/node.js:1585 +#: htdocs/luci-static/resources/view/fchomo/node.js:1604 msgid "General fields" msgstr "常規欄位" @@ -1152,15 +1165,15 @@ msgstr "常規欄位" msgid "General settings" msgstr "常規設定" -#: htdocs/luci-static/resources/fchomo.js:541 -#: htdocs/luci-static/resources/fchomo.js:543 -#: htdocs/luci-static/resources/fchomo.js:557 -#: htdocs/luci-static/resources/fchomo.js:559 -#: htdocs/luci-static/resources/fchomo/listeners.js:329 -#: htdocs/luci-static/resources/fchomo/listeners.js:373 -#: htdocs/luci-static/resources/fchomo/listeners.js:375 -#: htdocs/luci-static/resources/fchomo/listeners.js:785 -#: htdocs/luci-static/resources/fchomo/listeners.js:1005 +#: htdocs/luci-static/resources/fchomo.js:542 +#: htdocs/luci-static/resources/fchomo.js:544 +#: htdocs/luci-static/resources/fchomo.js:558 +#: htdocs/luci-static/resources/fchomo.js:560 +#: htdocs/luci-static/resources/fchomo/listeners.js:340 +#: htdocs/luci-static/resources/fchomo/listeners.js:384 +#: htdocs/luci-static/resources/fchomo/listeners.js:386 +#: htdocs/luci-static/resources/fchomo/listeners.js:822 +#: htdocs/luci-static/resources/fchomo/listeners.js:1048 #: htdocs/luci-static/resources/view/fchomo/global.js:587 msgid "Generate" msgstr "生成" @@ -1204,7 +1217,7 @@ msgstr "全域" msgid "Global Authentication" msgstr "全域認證" -#: htdocs/luci-static/resources/view/fchomo/node.js:655 +#: htdocs/luci-static/resources/view/fchomo/node.js:673 msgid "Global padding" msgstr "全域填充" @@ -1212,7 +1225,7 @@ msgstr "全域填充" msgid "Google" msgstr "Google" -#: htdocs/luci-static/resources/fchomo.js:243 +#: htdocs/luci-static/resources/fchomo.js:244 msgid "Google FCM" msgstr "" @@ -1225,49 +1238,49 @@ msgid "Group" msgstr "組" #: htdocs/luci-static/resources/fchomo.js:153 -#: htdocs/luci-static/resources/fchomo.js:187 -#: htdocs/luci-static/resources/fchomo/listeners.js:539 -#: htdocs/luci-static/resources/view/fchomo/node.js:817 -#: htdocs/luci-static/resources/view/fchomo/node.js:1178 -#: htdocs/luci-static/resources/view/fchomo/node.js:1189 -#: htdocs/luci-static/resources/view/fchomo/node.js:1196 +#: htdocs/luci-static/resources/fchomo.js:188 +#: htdocs/luci-static/resources/fchomo/listeners.js:568 +#: htdocs/luci-static/resources/view/fchomo/node.js:835 +#: htdocs/luci-static/resources/view/fchomo/node.js:1197 +#: htdocs/luci-static/resources/view/fchomo/node.js:1208 +#: htdocs/luci-static/resources/view/fchomo/node.js:1215 msgid "HTTP" msgstr "" #: htdocs/luci-static/resources/view/fchomo/node.js:268 -#: htdocs/luci-static/resources/view/fchomo/node.js:1251 -#: htdocs/luci-static/resources/view/fchomo/node.js:1685 +#: htdocs/luci-static/resources/view/fchomo/node.js:1270 +#: htdocs/luci-static/resources/view/fchomo/node.js:1704 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:399 msgid "HTTP header" msgstr "HTTP header" -#: htdocs/luci-static/resources/fchomo/listeners.js:418 -#: htdocs/luci-static/resources/view/fchomo/node.js:450 +#: htdocs/luci-static/resources/fchomo/listeners.js:429 +#: htdocs/luci-static/resources/view/fchomo/node.js:461 msgid "HTTP mask" msgstr "HTTP 偽裝" -#: htdocs/luci-static/resources/fchomo/listeners.js:423 -#: htdocs/luci-static/resources/view/fchomo/node.js:455 -#: htdocs/luci-static/resources/view/fchomo/node.js:490 -#: htdocs/luci-static/resources/view/fchomo/node.js:492 +#: htdocs/luci-static/resources/fchomo/listeners.js:434 +#: htdocs/luci-static/resources/view/fchomo/node.js:466 +#: htdocs/luci-static/resources/view/fchomo/node.js:501 +#: htdocs/luci-static/resources/view/fchomo/node.js:503 msgid "HTTP mask mode" msgstr "HTTP 偽裝模式" -#: htdocs/luci-static/resources/view/fchomo/node.js:480 +#: htdocs/luci-static/resources/view/fchomo/node.js:491 msgid "HTTP mask multiplex" msgstr "HTTP 偽裝多路復用" -#: htdocs/luci-static/resources/view/fchomo/node.js:465 -#: htdocs/luci-static/resources/view/fchomo/node.js:470 +#: htdocs/luci-static/resources/view/fchomo/node.js:476 +#: htdocs/luci-static/resources/view/fchomo/node.js:481 msgid "HTTP mask: %s" msgstr "HTTP 偽裝: %s" -#: htdocs/luci-static/resources/view/fchomo/node.js:1228 +#: htdocs/luci-static/resources/view/fchomo/node.js:1247 msgid "HTTP request method" msgstr "HTTP 請求方法" -#: htdocs/luci-static/resources/fchomo/listeners.js:433 -#: htdocs/luci-static/resources/view/fchomo/node.js:476 +#: htdocs/luci-static/resources/fchomo/listeners.js:444 +#: htdocs/luci-static/resources/view/fchomo/node.js:487 msgid "HTTP root path" msgstr "HTTP 根路徑" @@ -1275,15 +1288,15 @@ msgstr "HTTP 根路徑" msgid "HTTP/3" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:208 +#: htdocs/luci-static/resources/fchomo/listeners.js:219 msgid "" "HTTP3 server behavior when authentication fails.
A 404 page will be " "returned if empty." msgstr "身份驗證失敗時的 HTTP3 伺服器回應。預設回傳 404 頁面。" -#: htdocs/luci-static/resources/view/fchomo/node.js:1179 -#: htdocs/luci-static/resources/view/fchomo/node.js:1190 -#: htdocs/luci-static/resources/view/fchomo/node.js:1197 +#: htdocs/luci-static/resources/view/fchomo/node.js:1198 +#: htdocs/luci-static/resources/view/fchomo/node.js:1209 +#: htdocs/luci-static/resources/view/fchomo/node.js:1216 msgid "HTTPUpgrade" msgstr "" @@ -1291,52 +1304,52 @@ msgstr "" msgid "Handle domain" msgstr "處理網域" -#: htdocs/luci-static/resources/view/fchomo/node.js:372 +#: htdocs/luci-static/resources/view/fchomo/node.js:383 msgid "Handshake mode" msgstr "握手模式" -#: htdocs/luci-static/resources/fchomo/listeners.js:544 +#: htdocs/luci-static/resources/fchomo/listeners.js:581 msgid "Handshake target that supports TLS 1.3" msgstr "握手目標 (支援 TLS 1.3)" -#: htdocs/luci-static/resources/fchomo/listeners.js:405 +#: htdocs/luci-static/resources/fchomo/listeners.js:416 msgid "Handshake timeout" msgstr "握手超時" -#: htdocs/luci-static/resources/fchomo/listeners.js:233 +#: htdocs/luci-static/resources/fchomo/listeners.js:244 msgid "Header to read real client IP from (e.g. X-Forwarded-For)" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:722 +#: htdocs/luci-static/resources/view/fchomo/node.js:740 msgid "Health check" msgstr "健康檢查" #: htdocs/luci-static/resources/view/fchomo/client.js:1091 -#: htdocs/luci-static/resources/view/fchomo/node.js:1799 +#: htdocs/luci-static/resources/view/fchomo/node.js:1818 msgid "Health check URL" msgstr "健康檢查 URL" #: htdocs/luci-static/resources/view/fchomo/client.js:1120 -#: htdocs/luci-static/resources/view/fchomo/node.js:1829 +#: htdocs/luci-static/resources/view/fchomo/node.js:1848 msgid "Health check expected status" msgstr "健康檢查预期状态" #: htdocs/luci-static/resources/view/fchomo/client.js:1100 -#: htdocs/luci-static/resources/view/fchomo/node.js:1809 +#: htdocs/luci-static/resources/view/fchomo/node.js:1828 msgid "Health check interval" msgstr "健康檢查間隔" #: htdocs/luci-static/resources/view/fchomo/client.js:1107 -#: htdocs/luci-static/resources/view/fchomo/node.js:1816 +#: htdocs/luci-static/resources/view/fchomo/node.js:1835 msgid "Health check timeout" msgstr "健康檢查超时" #: htdocs/luci-static/resources/view/fchomo/client.js:1011 -#: htdocs/luci-static/resources/view/fchomo/node.js:1587 +#: htdocs/luci-static/resources/view/fchomo/node.js:1606 msgid "Health fields" msgstr "健康欄位" -#: htdocs/luci-static/resources/view/fchomo/node.js:560 +#: htdocs/luci-static/resources/view/fchomo/node.js:578 msgid "Heartbeat interval" msgstr "心跳間隔" @@ -1344,19 +1357,20 @@ msgstr "心跳間隔" msgid "Hidden" msgstr "隱藏" -#: htdocs/luci-static/resources/view/fchomo/node.js:823 +#: htdocs/luci-static/resources/fchomo/listeners.js:574 +#: htdocs/luci-static/resources/view/fchomo/node.js:841 msgid "Host that supports TLS 1.3" msgstr "主機名稱 (支援 TLS 1.3)" -#: htdocs/luci-static/resources/view/fchomo/node.js:327 +#: htdocs/luci-static/resources/view/fchomo/node.js:338 msgid "Host-key" msgstr "主機金鑰" -#: htdocs/luci-static/resources/view/fchomo/node.js:322 +#: htdocs/luci-static/resources/view/fchomo/node.js:333 msgid "Host-key algorithms" msgstr "主機金鑰演算法" -#: htdocs/luci-static/resources/view/fchomo/node.js:470 +#: htdocs/luci-static/resources/view/fchomo/node.js:481 msgid "Host/SNI override" msgstr "主機/SNI 覆蓋" @@ -1365,12 +1379,12 @@ msgstr "主機/SNI 覆蓋" msgid "Hosts" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:164 -#: htdocs/luci-static/resources/fchomo.js:199 +#: htdocs/luci-static/resources/fchomo.js:165 +#: htdocs/luci-static/resources/fchomo.js:200 msgid "Hysteria2" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:165 +#: htdocs/luci-static/resources/fchomo.js:166 msgid "Hysteria2 Realm" msgstr "Hysteria2 Realm" @@ -1388,20 +1402,20 @@ msgstr "" msgid "IP CIDR" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:522 +#: htdocs/luci-static/resources/view/fchomo/node.js:540 msgid "IP override" msgstr "IP 覆寫" -#: htdocs/luci-static/resources/view/fchomo/node.js:1467 -#: htdocs/luci-static/resources/view/fchomo/node.js:1785 +#: htdocs/luci-static/resources/view/fchomo/node.js:1486 +#: htdocs/luci-static/resources/view/fchomo/node.js:1804 msgid "IP version" msgstr "IP 版本" -#: htdocs/luci-static/resources/fchomo.js:173 +#: htdocs/luci-static/resources/fchomo.js:174 msgid "IPv4 only" msgstr "僅 IPv4" -#: htdocs/luci-static/resources/fchomo.js:174 +#: htdocs/luci-static/resources/fchomo.js:175 msgid "IPv6 only" msgstr "僅 IPv6" @@ -1414,19 +1428,19 @@ msgstr "IPv6 支援" msgid "Icon" msgstr "圖標" -#: htdocs/luci-static/resources/view/fchomo/node.js:604 +#: htdocs/luci-static/resources/view/fchomo/node.js:622 msgid "Idle session check interval" msgstr "閒置會話檢查間隔" -#: htdocs/luci-static/resources/view/fchomo/node.js:611 +#: htdocs/luci-static/resources/view/fchomo/node.js:629 msgid "Idle session timeout" msgstr "閒置會話逾時" -#: htdocs/luci-static/resources/fchomo/listeners.js:456 +#: htdocs/luci-static/resources/fchomo/listeners.js:485 msgid "Idle timeout" msgstr "閒置逾時" -#: htdocs/luci-static/resources/fchomo.js:1427 +#: htdocs/luci-static/resources/fchomo.js:1428 msgid "If All ports is selected, uncheck others" msgstr "如果選擇了“所有連接埠”,則取消選取“其他”" @@ -1438,7 +1452,7 @@ msgstr "如果選擇了“封鎖”,則取消選取“其他”" msgid "Ignore client bandwidth" msgstr "忽略客戶端頻寬" -#: htdocs/luci-static/resources/fchomo.js:726 +#: htdocs/luci-static/resources/fchomo.js:727 msgid "Import" msgstr "導入" @@ -1454,8 +1468,8 @@ msgstr "導入" #: htdocs/luci-static/resources/view/fchomo/client.js:1713 #: htdocs/luci-static/resources/view/fchomo/client.js:1748 #: htdocs/luci-static/resources/view/fchomo/client.js:1769 -#: htdocs/luci-static/resources/view/fchomo/node.js:1492 -#: htdocs/luci-static/resources/view/fchomo/node.js:1573 +#: htdocs/luci-static/resources/view/fchomo/node.js:1511 +#: htdocs/luci-static/resources/view/fchomo/node.js:1592 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:153 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:241 msgid "Import mihomo config" @@ -1471,37 +1485,37 @@ msgstr "導入規則集連結" #: htdocs/luci-static/resources/fchomo/listeners.js:182 #: htdocs/luci-static/resources/view/fchomo/node.js:287 #: htdocs/luci-static/resources/view/fchomo/node.js:293 -#: htdocs/luci-static/resources/view/fchomo/node.js:1743 -#: htdocs/luci-static/resources/view/fchomo/node.js:1749 +#: htdocs/luci-static/resources/view/fchomo/node.js:1762 +#: htdocs/luci-static/resources/view/fchomo/node.js:1768 msgid "In Mbps." msgstr "單位為 Mbps。" -#: htdocs/luci-static/resources/view/fchomo/node.js:1663 +#: htdocs/luci-static/resources/view/fchomo/node.js:1682 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:377 msgid "In bytes. %s will be used if empty." msgstr "單位為位元組。留空則使用 %s。" -#: htdocs/luci-static/resources/view/fchomo/node.js:561 -#: htdocs/luci-static/resources/view/fchomo/node.js:568 +#: htdocs/luci-static/resources/view/fchomo/node.js:579 +#: htdocs/luci-static/resources/view/fchomo/node.js:586 msgid "In millisecond." msgstr "單位為毫秒。" #: htdocs/luci-static/resources/view/fchomo/client.js:1108 #: htdocs/luci-static/resources/view/fchomo/client.js:1137 -#: htdocs/luci-static/resources/view/fchomo/node.js:1817 +#: htdocs/luci-static/resources/view/fchomo/node.js:1836 msgid "In millisecond. %s will be used if empty." msgstr "單位為毫秒。留空則使用 %s。" -#: htdocs/luci-static/resources/view/fchomo/node.js:1320 +#: htdocs/luci-static/resources/view/fchomo/node.js:1339 msgid "In milliseconds." msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:406 -#: htdocs/luci-static/resources/fchomo/listeners.js:457 -#: htdocs/luci-static/resources/fchomo/listeners.js:464 -#: htdocs/luci-static/resources/view/fchomo/node.js:605 -#: htdocs/luci-static/resources/view/fchomo/node.js:612 -#: htdocs/luci-static/resources/view/fchomo/node.js:1267 +#: htdocs/luci-static/resources/fchomo/listeners.js:417 +#: htdocs/luci-static/resources/fchomo/listeners.js:486 +#: htdocs/luci-static/resources/fchomo/listeners.js:493 +#: htdocs/luci-static/resources/view/fchomo/node.js:623 +#: htdocs/luci-static/resources/view/fchomo/node.js:630 +#: htdocs/luci-static/resources/view/fchomo/node.js:1286 msgid "In seconds." msgstr "單位為秒。" @@ -1510,14 +1524,14 @@ msgstr "單位為秒。" #: htdocs/luci-static/resources/view/fchomo/global.js:430 #: htdocs/luci-static/resources/view/fchomo/global.js:515 #: htdocs/luci-static/resources/view/fchomo/node.js:281 -#: htdocs/luci-static/resources/view/fchomo/node.js:1669 -#: htdocs/luci-static/resources/view/fchomo/node.js:1810 +#: htdocs/luci-static/resources/view/fchomo/node.js:1688 +#: htdocs/luci-static/resources/view/fchomo/node.js:1829 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:383 msgid "In seconds. %s will be used if empty." msgstr "單位為秒。留空則使用 %s。" -#: htdocs/luci-static/resources/fchomo/listeners.js:701 -#: htdocs/luci-static/resources/view/fchomo/node.js:941 +#: htdocs/luci-static/resources/fchomo/listeners.js:738 +#: htdocs/luci-static/resources/view/fchomo/node.js:960 msgid "" "In the order of one Padding-Length and one Padding-" "Interval, infinite concatenation." @@ -1559,7 +1573,7 @@ msgstr "引入所有代理節點。" msgid "Info" msgstr "訊息" -#: htdocs/luci-static/resources/view/fchomo/node.js:1602 +#: htdocs/luci-static/resources/view/fchomo/node.js:1621 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:279 msgid "Inline" msgstr "內嵌" @@ -1570,27 +1584,27 @@ msgstr "介面控制" #: htdocs/luci-static/resources/fchomo.js:52 #: htdocs/luci-static/resources/fchomo.js:59 -#: htdocs/luci-static/resources/fchomo.js:171 -#: htdocs/luci-static/resources/fchomo.js:365 -#: htdocs/luci-static/resources/view/fchomo/node.js:1759 +#: htdocs/luci-static/resources/fchomo.js:172 +#: htdocs/luci-static/resources/fchomo.js:366 +#: htdocs/luci-static/resources/view/fchomo/node.js:1778 msgid "Keep default" msgstr "保持預設" -#: htdocs/luci-static/resources/view/fchomo/node.js:1356 +#: htdocs/luci-static/resources/view/fchomo/node.js:1375 msgid "Keep-alive period" msgstr "Keep-alive 週期" -#: htdocs/luci-static/resources/fchomo/listeners.js:285 -#: htdocs/luci-static/resources/view/fchomo/node.js:386 +#: htdocs/luci-static/resources/fchomo/listeners.js:296 +#: htdocs/luci-static/resources/view/fchomo/node.js:397 msgid "Key" msgstr "密鑰" -#: htdocs/luci-static/resources/fchomo/listeners.js:932 -#: htdocs/luci-static/resources/view/fchomo/node.js:1108 +#: htdocs/luci-static/resources/fchomo/listeners.js:975 +#: htdocs/luci-static/resources/view/fchomo/node.js:1127 msgid "Key path" msgstr "憑證路徑" -#: htdocs/luci-static/resources/fchomo/listeners.js:720 +#: htdocs/luci-static/resources/fchomo/listeners.js:757 msgid "Keypairs" msgstr "密鑰對" @@ -1602,23 +1616,23 @@ msgstr "密鑰對" #: htdocs/luci-static/resources/view/fchomo/client.js:1719 #: htdocs/luci-static/resources/view/fchomo/client.js:1775 #: htdocs/luci-static/resources/view/fchomo/node.js:230 -#: htdocs/luci-static/resources/view/fchomo/node.js:1590 -#: htdocs/luci-static/resources/view/fchomo/node.js:1878 +#: htdocs/luci-static/resources/view/fchomo/node.js:1609 +#: htdocs/luci-static/resources/view/fchomo/node.js:1897 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:259 msgid "Label" msgstr "標籤" #: htdocs/luci-static/resources/view/fchomo/client.js:1114 -#: htdocs/luci-static/resources/view/fchomo/node.js:1823 +#: htdocs/luci-static/resources/view/fchomo/node.js:1842 msgid "Lazy" msgstr "懶惰狀態" -#: htdocs/luci-static/resources/fchomo/listeners.js:425 -#: htdocs/luci-static/resources/view/fchomo/node.js:457 +#: htdocs/luci-static/resources/fchomo/listeners.js:436 +#: htdocs/luci-static/resources/view/fchomo/node.js:468 msgid "Legacy" msgstr "傳統" -#: htdocs/luci-static/resources/fchomo/listeners.js:514 +#: htdocs/luci-static/resources/fchomo/listeners.js:543 msgid "" "Legacy protocol support (VMess MD5 Authentication) is provided for " "compatibility purposes only, use of alterId > 1 is not recommended." @@ -1630,8 +1644,8 @@ msgstr "" msgid "Less compatibility and sometimes better performance." msgstr "有時效能較好。" -#: htdocs/luci-static/resources/fchomo/listeners.js:913 -#: htdocs/luci-static/resources/view/fchomo/node.js:1027 +#: htdocs/luci-static/resources/fchomo/listeners.js:956 +#: htdocs/luci-static/resources/view/fchomo/node.js:1046 msgid "List of supported application level protocols, in order of preference." msgstr "支援的應用層協議協商清單,依序排列。" @@ -1656,22 +1670,22 @@ msgstr "監聽埠" msgid "Listen ports" msgstr "監聽埠" -#: htdocs/luci-static/resources/fchomo.js:232 +#: htdocs/luci-static/resources/fchomo.js:233 msgid "Load balance" msgstr "負載均衡" -#: htdocs/luci-static/resources/view/fchomo/node.js:1600 +#: htdocs/luci-static/resources/view/fchomo/node.js:1619 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:277 msgid "Local" msgstr "本地" -#: htdocs/luci-static/resources/view/fchomo/node.js:698 -#: htdocs/luci-static/resources/view/fchomo/node.js:741 +#: htdocs/luci-static/resources/view/fchomo/node.js:716 +#: htdocs/luci-static/resources/view/fchomo/node.js:759 msgid "Local IPv6 address" msgstr "本地 IPv6 位址" -#: htdocs/luci-static/resources/view/fchomo/node.js:690 -#: htdocs/luci-static/resources/view/fchomo/node.js:733 +#: htdocs/luci-static/resources/view/fchomo/node.js:708 +#: htdocs/luci-static/resources/view/fchomo/node.js:751 msgid "Local address" msgstr "本地位址" @@ -1691,32 +1705,32 @@ msgstr "日誌為空。" msgid "Log level" msgstr "日誌等級" -#: htdocs/luci-static/resources/fchomo/listeners.js:360 -#: htdocs/luci-static/resources/fchomo/listeners.js:361 -#: htdocs/luci-static/resources/fchomo/listeners.js:362 -#: htdocs/luci-static/resources/fchomo/listeners.js:367 -#: htdocs/luci-static/resources/view/fchomo/node.js:410 -#: htdocs/luci-static/resources/view/fchomo/node.js:411 -#: htdocs/luci-static/resources/view/fchomo/node.js:412 -#: htdocs/luci-static/resources/view/fchomo/node.js:417 +#: htdocs/luci-static/resources/fchomo/listeners.js:371 +#: htdocs/luci-static/resources/fchomo/listeners.js:372 +#: htdocs/luci-static/resources/fchomo/listeners.js:373 +#: htdocs/luci-static/resources/fchomo/listeners.js:378 +#: htdocs/luci-static/resources/view/fchomo/node.js:421 +#: htdocs/luci-static/resources/view/fchomo/node.js:422 +#: htdocs/luci-static/resources/view/fchomo/node.js:423 +#: htdocs/luci-static/resources/view/fchomo/node.js:428 msgid "Low-entropy data stream" msgstr "低熵資料流" -#: htdocs/luci-static/resources/fchomo.js:440 +#: htdocs/luci-static/resources/fchomo.js:441 msgid "Lowercase only" msgstr "僅限小寫" #: htdocs/luci-static/resources/view/fchomo/global.js:502 -#: htdocs/luci-static/resources/view/fchomo/node.js:704 -#: htdocs/luci-static/resources/view/fchomo/node.js:787 +#: htdocs/luci-static/resources/view/fchomo/node.js:722 +#: htdocs/luci-static/resources/view/fchomo/node.js:805 msgid "MTU" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:201 +#: htdocs/luci-static/resources/fchomo.js:202 msgid "Masque" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:207 +#: htdocs/luci-static/resources/fchomo/listeners.js:218 msgid "Masquerade" msgstr "偽裝" @@ -1748,24 +1762,24 @@ msgstr "匹配回應通過 ipcidr
" msgid "Match rule set." msgstr "匹配規則集。" -#: htdocs/luci-static/resources/view/fchomo/node.js:1273 +#: htdocs/luci-static/resources/view/fchomo/node.js:1292 msgid "Max Early Data" msgstr "前置數據最大值" -#: htdocs/luci-static/resources/fchomo/listeners.js:450 -#: htdocs/luci-static/resources/view/fchomo/node.js:547 +#: htdocs/luci-static/resources/fchomo/listeners.js:479 +#: htdocs/luci-static/resources/view/fchomo/node.js:565 msgid "Max UDP relay packet size" msgstr "UDP 中繼數據包最大尺寸" -#: htdocs/luci-static/resources/fchomo/listeners.js:1131 +#: htdocs/luci-static/resources/fchomo/listeners.js:1174 msgid "Max buffered posts" msgstr "POST 最大緩衝" -#: htdocs/luci-static/resources/view/fchomo/node.js:1331 +#: htdocs/luci-static/resources/view/fchomo/node.js:1350 msgid "Max concurrency" msgstr "最大並發" -#: htdocs/luci-static/resources/view/fchomo/node.js:1336 +#: htdocs/luci-static/resources/view/fchomo/node.js:1355 msgid "Max connections" msgstr "最大連線數" @@ -1778,32 +1792,32 @@ msgstr "最大失敗次數" msgid "Max download speed" msgstr "最大下載速度" -#: htdocs/luci-static/resources/fchomo/listeners.js:1142 -#: htdocs/luci-static/resources/view/fchomo/node.js:1313 +#: htdocs/luci-static/resources/fchomo/listeners.js:1185 +#: htdocs/luci-static/resources/view/fchomo/node.js:1332 msgid "Max each POST bytes" msgstr "POST 最大位元組數" -#: htdocs/luci-static/resources/view/fchomo/node.js:574 +#: htdocs/luci-static/resources/view/fchomo/node.js:592 msgid "Max open streams" msgstr "限制打開流的數量" -#: htdocs/luci-static/resources/fchomo/listeners.js:220 +#: htdocs/luci-static/resources/fchomo/listeners.js:231 msgid "Max realms" msgstr "最大 Realms 數量" -#: htdocs/luci-static/resources/fchomo/listeners.js:226 +#: htdocs/luci-static/resources/fchomo/listeners.js:237 msgid "Max realms per client IP" msgstr "每客戶端 IP 最大 Realms 數量" -#: htdocs/luci-static/resources/view/fchomo/node.js:1346 +#: htdocs/luci-static/resources/view/fchomo/node.js:1365 msgid "Max request times" msgstr "最大請求次數" -#: htdocs/luci-static/resources/view/fchomo/node.js:1351 +#: htdocs/luci-static/resources/view/fchomo/node.js:1370 msgid "Max reusable seconds" msgstr "最大可重用秒數" -#: htdocs/luci-static/resources/view/fchomo/node.js:1341 +#: htdocs/luci-static/resources/view/fchomo/node.js:1360 msgid "Max reuse times" msgstr "最大重用次數" @@ -1812,12 +1826,12 @@ msgstr "最大重用次數" msgid "Max upload speed" msgstr "最大上傳速度" -#: htdocs/luci-static/resources/view/fchomo/node.js:1377 -#: htdocs/luci-static/resources/view/fchomo/node.js:1397 +#: htdocs/luci-static/resources/view/fchomo/node.js:1396 +#: htdocs/luci-static/resources/view/fchomo/node.js:1416 msgid "Maximum connections" msgstr "最大連線數" -#: htdocs/luci-static/resources/view/fchomo/node.js:1395 +#: htdocs/luci-static/resources/view/fchomo/node.js:1414 msgid "" "Maximum multiplexed streams in a connection before opening a new connection." "
Conflict with %s and %s." @@ -1825,24 +1839,24 @@ msgstr "" "在開啟新連線之前,連線中的最大多路復用流數量。
%s 和 " "%s 衝突。" -#: htdocs/luci-static/resources/fchomo/listeners.js:390 -#: htdocs/luci-static/resources/view/fchomo/node.js:429 +#: htdocs/luci-static/resources/fchomo/listeners.js:401 +#: htdocs/luci-static/resources/view/fchomo/node.js:440 msgid "Maximum padding rate" msgstr "最大填充率" -#: htdocs/luci-static/resources/fchomo/listeners.js:398 -#: htdocs/luci-static/resources/view/fchomo/node.js:437 +#: htdocs/luci-static/resources/fchomo/listeners.js:409 +#: htdocs/luci-static/resources/view/fchomo/node.js:448 msgid "" "Maximum padding rate must be greater than or equal to the minimum padding " "rate." msgstr "最大填充率必須大於等于最小填充率。" -#: htdocs/luci-static/resources/view/fchomo/node.js:1394 +#: htdocs/luci-static/resources/view/fchomo/node.js:1413 msgid "Maximum streams" msgstr "最大流數量" #: htdocs/luci-static/resources/fchomo.js:157 -#: htdocs/luci-static/resources/fchomo.js:191 +#: htdocs/luci-static/resources/fchomo.js:192 msgid "Mieru" msgstr "" @@ -1858,26 +1872,26 @@ msgstr "Mihomo 客戶端" msgid "Mihomo server" msgstr "Mihomo 服務端" -#: htdocs/luci-static/resources/view/fchomo/node.js:618 +#: htdocs/luci-static/resources/view/fchomo/node.js:636 msgid "Min of idle sessions to keep" msgstr "要保留的最少閒置會話數" -#: htdocs/luci-static/resources/view/fchomo/node.js:1319 +#: htdocs/luci-static/resources/view/fchomo/node.js:1338 msgid "Min posts interval" msgstr "POST 請求最小間隔時間" -#: htdocs/luci-static/resources/view/fchomo/node.js:1386 +#: htdocs/luci-static/resources/view/fchomo/node.js:1405 msgid "" "Minimum multiplexed streams in a connection before opening a new connection." msgstr "在開啟新連線之前,連線中的最小多路復用流數量。" -#: htdocs/luci-static/resources/fchomo/listeners.js:383 -#: htdocs/luci-static/resources/view/fchomo/node.js:422 +#: htdocs/luci-static/resources/fchomo/listeners.js:394 +#: htdocs/luci-static/resources/view/fchomo/node.js:433 msgid "Minimum padding rate" msgstr "最小填充率" -#: htdocs/luci-static/resources/view/fchomo/node.js:1385 -#: htdocs/luci-static/resources/view/fchomo/node.js:1397 +#: htdocs/luci-static/resources/view/fchomo/node.js:1404 +#: htdocs/luci-static/resources/view/fchomo/node.js:1416 msgid "Minimum streams" msgstr "最小流數量" @@ -1894,7 +1908,7 @@ msgstr "混合 系統 TCP 堆栈和 gVisor UDP 堆栈 msgid "Mixed port" msgstr "混合連接埠" -#: htdocs/luci-static/resources/view/fchomo/node.js:1363 +#: htdocs/luci-static/resources/view/fchomo/node.js:1382 msgid "Multiplex" msgstr "多路復用" @@ -1903,7 +1917,7 @@ msgstr "多路復用" msgid "Multiplex fields" msgstr "多路復用欄位" -#: htdocs/luci-static/resources/view/fchomo/node.js:363 +#: htdocs/luci-static/resources/view/fchomo/node.js:374 msgid "Multiplexing" msgstr "多路復用" @@ -1912,11 +1926,11 @@ msgstr "多路復用" msgid "NOT" msgstr "NOT" -#: htdocs/luci-static/resources/fchomo/listeners.js:574 +#: htdocs/luci-static/resources/fchomo/listeners.js:611 msgid "Name of the Proxy group as outbound." msgstr "出站代理組的名稱。" -#: htdocs/luci-static/resources/view/fchomo/node.js:1675 +#: htdocs/luci-static/resources/view/fchomo/node.js:1694 msgid "Name of the Proxy group to download provider." msgstr "用於下載供應商訂閱的代理組名稱。" @@ -1924,23 +1938,23 @@ msgstr "用於下載供應商訂閱的代理組名稱。" msgid "Name of the Proxy group to download rule set." msgstr "用於下載規則集訂閱的代理組名稱。" -#: htdocs/luci-static/resources/fchomo/listeners.js:568 +#: htdocs/luci-static/resources/fchomo/listeners.js:605 msgid "Name of the Sub rule used for inbound matching." msgstr "用於入站匹配的子規則名稱。" -#: htdocs/luci-static/resources/view/fchomo/node.js:531 +#: htdocs/luci-static/resources/view/fchomo/node.js:549 msgid "Native UDP" msgstr "原生 UDP" -#: htdocs/luci-static/resources/fchomo.js:382 +#: htdocs/luci-static/resources/fchomo.js:383 msgid "Native appearance" msgstr "原生外觀" -#: htdocs/luci-static/resources/fchomo/listeners.js:600 +#: htdocs/luci-static/resources/fchomo/listeners.js:637 msgid "Network type" msgstr "網路類型" -#: htdocs/luci-static/resources/view/fchomo/node.js:1761 +#: htdocs/luci-static/resources/view/fchomo/node.js:1780 msgid "No" msgstr "" @@ -1948,7 +1962,7 @@ msgstr "" msgid "No Authentication IP ranges" msgstr "無需認證的 IP 範圍" -#: htdocs/luci-static/resources/fchomo/listeners.js:1126 +#: htdocs/luci-static/resources/fchomo/listeners.js:1169 msgid "No SSE header" msgstr "無 SSE header" @@ -1956,16 +1970,16 @@ msgstr "無 SSE header" msgid "No add'l params" msgstr "無附加參數" -#: htdocs/luci-static/resources/view/fchomo/node.js:1303 +#: htdocs/luci-static/resources/view/fchomo/node.js:1322 msgid "No gRPC header" msgstr "無 gRPC header" #: htdocs/luci-static/resources/view/fchomo/client.js:1115 -#: htdocs/luci-static/resources/view/fchomo/node.js:1824 +#: htdocs/luci-static/resources/view/fchomo/node.js:1843 msgid "No testing is performed when this provider node is not in use." msgstr "當此供應商的節點未使用時,不執行任何測試。" -#: htdocs/luci-static/resources/fchomo.js:687 +#: htdocs/luci-static/resources/fchomo.js:688 msgid "No valid %s found." msgstr "未找到有效的%s。" @@ -1980,17 +1994,17 @@ msgid "Node" msgstr "節點" #: htdocs/luci-static/resources/view/fchomo/client.js:1160 -#: htdocs/luci-static/resources/view/fchomo/node.js:1844 +#: htdocs/luci-static/resources/view/fchomo/node.js:1863 msgid "Node exclude filter" msgstr "排除節點" #: htdocs/luci-static/resources/view/fchomo/client.js:1165 -#: htdocs/luci-static/resources/view/fchomo/node.js:1851 +#: htdocs/luci-static/resources/view/fchomo/node.js:1870 msgid "Node exclude type" msgstr "排除節點類型" #: htdocs/luci-static/resources/view/fchomo/client.js:1155 -#: htdocs/luci-static/resources/view/fchomo/node.js:1838 +#: htdocs/luci-static/resources/view/fchomo/node.js:1857 msgid "Node filter" msgstr "過濾節點" @@ -1998,7 +2012,7 @@ msgstr "過濾節點" msgid "Node switch tolerance" msgstr "節點切換容差" -#: htdocs/luci-static/resources/fchomo.js:409 +#: htdocs/luci-static/resources/fchomo.js:410 msgid "None" msgstr "無" @@ -2006,39 +2020,49 @@ msgstr "無" msgid "Not Installed" msgstr "未安裝" -#: htdocs/luci-static/resources/fchomo.js:1205 +#: htdocs/luci-static/resources/fchomo.js:1206 msgid "Not Running" msgstr "未在運作" -#: htdocs/luci-static/resources/view/fchomo/node.js:483 +#: htdocs/luci-static/resources/view/fchomo/node.js:494 msgid "OFF" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:485 +#: htdocs/luci-static/resources/view/fchomo/node.js:496 msgid "ON" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:538 -#: htdocs/luci-static/resources/view/fchomo/node.js:816 +#: htdocs/luci-static/resources/fchomo/listeners.js:567 +#: htdocs/luci-static/resources/view/fchomo/node.js:834 msgid "Obfs Mode" msgstr "Obfs 模式" -#: htdocs/luci-static/resources/fchomo/listeners.js:199 -#: htdocs/luci-static/resources/view/fchomo/node.js:304 +#: htdocs/luci-static/resources/fchomo/listeners.js:213 +#: htdocs/luci-static/resources/view/fchomo/node.js:318 +msgid "Obfuscate maximum packet size" +msgstr "混淆最大資料包大小" + +#: htdocs/luci-static/resources/fchomo/listeners.js:208 +#: htdocs/luci-static/resources/view/fchomo/node.js:313 +msgid "Obfuscate minimum packet size" +msgstr "混淆最小資料包大小" + +#: htdocs/luci-static/resources/fchomo/listeners.js:200 +#: htdocs/luci-static/resources/view/fchomo/node.js:305 msgid "Obfuscate password" msgstr "混淆密碼" #: htdocs/luci-static/resources/fchomo/listeners.js:193 -#: htdocs/luci-static/resources/fchomo/listeners.js:358 +#: htdocs/luci-static/resources/fchomo/listeners.js:369 #: htdocs/luci-static/resources/view/fchomo/node.js:298 -#: htdocs/luci-static/resources/view/fchomo/node.js:408 +#: htdocs/luci-static/resources/view/fchomo/node.js:419 msgid "Obfuscate type" msgstr "混淆類型" -#: htdocs/luci-static/resources/fchomo/listeners.js:359 -#: htdocs/luci-static/resources/fchomo/listeners.js:360 -#: htdocs/luci-static/resources/view/fchomo/node.js:409 -#: htdocs/luci-static/resources/view/fchomo/node.js:410 +#: htdocs/luci-static/resources/fchomo/listeners.js:370 +#: htdocs/luci-static/resources/fchomo/listeners.js:371 +#: htdocs/luci-static/resources/view/fchomo/node.js:420 +#: htdocs/luci-static/resources/view/fchomo/node.js:421 msgid "Obfuscated as %s" msgstr "混淆為%s" @@ -2046,8 +2070,12 @@ msgstr "混淆為%s" msgid "One or more numbers in the range 0-63 separated by commas" msgstr "0-63 範圍內的一個或多個數字,以逗號分隔" -#: htdocs/luci-static/resources/fchomo/listeners.js:367 -#: htdocs/luci-static/resources/view/fchomo/node.js:417 +#: htdocs/luci-static/resources/fchomo/listeners.js:896 +msgid "Only applicable when %s are used as a frontend." +msgstr "僅當 %s 用作前端時適用。" + +#: htdocs/luci-static/resources/fchomo/listeners.js:378 +#: htdocs/luci-static/resources/view/fchomo/node.js:428 msgid "Only applies to the %s." msgstr "只對%s生效。" @@ -2055,7 +2083,7 @@ msgstr "只對%s生效。" msgid "Only process traffic from specific interfaces. Leave empty for all." msgstr "只處理來自指定介面的流量。留空表示全部。" -#: htdocs/luci-static/resources/fchomo.js:1199 +#: htdocs/luci-static/resources/fchomo.js:1200 msgid "Open Dashboard" msgstr "打開面板" @@ -2069,11 +2097,11 @@ msgid "Override destination" msgstr "覆蓋目標位址" #: htdocs/luci-static/resources/view/fchomo/client.js:1010 -#: htdocs/luci-static/resources/view/fchomo/node.js:1586 +#: htdocs/luci-static/resources/view/fchomo/node.js:1605 msgid "Override fields" msgstr "覆蓋欄位" -#: htdocs/luci-static/resources/view/fchomo/node.js:523 +#: htdocs/luci-static/resources/view/fchomo/node.js:541 msgid "Override the IP address of the server that DNS response." msgstr "覆蓋 DNS 回應的伺服器的 IP 位址。" @@ -2089,7 +2117,7 @@ msgstr "使用嗅探到的網域覆寫連線目標。" msgid "Override the existing ECS in original request." msgstr "覆蓋原始請求中已有的 ECS。" -#: htdocs/luci-static/resources/view/fchomo/node.js:1135 +#: htdocs/luci-static/resources/view/fchomo/node.js:1154 msgid "Overrides the domain name used for HTTPS record queries." msgstr "覆蓋用於 HTTPS 記錄查詢的網域。" @@ -2097,47 +2125,47 @@ msgstr "覆蓋用於 HTTPS 記錄查詢的網域。" msgid "Overview" msgstr "概覽" -#: htdocs/luci-static/resources/view/fchomo/node.js:1230 +#: htdocs/luci-static/resources/view/fchomo/node.js:1249 msgid "POST" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1231 +#: htdocs/luci-static/resources/view/fchomo/node.js:1250 msgid "PUT" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:667 +#: htdocs/luci-static/resources/view/fchomo/node.js:685 msgid "Packet encoding" msgstr "數據包編碼" -#: htdocs/luci-static/resources/view/fchomo/node.js:1308 +#: htdocs/luci-static/resources/view/fchomo/node.js:1327 msgid "Padding bytes" msgstr "填充位元組" -#: htdocs/luci-static/resources/fchomo/listeners.js:494 +#: htdocs/luci-static/resources/fchomo/listeners.js:523 msgid "Padding scheme" msgstr "填充方案" -#: htdocs/luci-static/resources/fchomo/listeners.js:699 -#: htdocs/luci-static/resources/view/fchomo/node.js:939 +#: htdocs/luci-static/resources/fchomo/listeners.js:736 +#: htdocs/luci-static/resources/view/fchomo/node.js:958 msgid "Paddings" msgstr "填充 (Paddings)" #: htdocs/luci-static/resources/fchomo/listeners.js:166 -#: htdocs/luci-static/resources/fchomo/listeners.js:252 -#: htdocs/luci-static/resources/fchomo/listeners.js:551 +#: htdocs/luci-static/resources/fchomo/listeners.js:263 +#: htdocs/luci-static/resources/fchomo/listeners.js:588 #: htdocs/luci-static/resources/view/fchomo/node.js:262 -#: htdocs/luci-static/resources/view/fchomo/node.js:341 -#: htdocs/luci-static/resources/view/fchomo/node.js:831 +#: htdocs/luci-static/resources/view/fchomo/node.js:352 +#: htdocs/luci-static/resources/view/fchomo/node.js:849 msgid "Password" msgstr "密碼" -#: htdocs/luci-static/resources/fchomo/listeners.js:639 -#: htdocs/luci-static/resources/view/fchomo/node.js:1650 +#: htdocs/luci-static/resources/fchomo/listeners.js:676 +#: htdocs/luci-static/resources/view/fchomo/node.js:1669 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:364 msgid "Payload" msgstr "Payload" -#: htdocs/luci-static/resources/view/fchomo/node.js:755 +#: htdocs/luci-static/resources/view/fchomo/node.js:773 msgid "Peer pubkic key" msgstr "對端公鑰" @@ -2147,11 +2175,11 @@ msgid "" "it is not needed." msgstr "效能可能會略有下降,建議僅在需要時開啟。" -#: htdocs/luci-static/resources/view/fchomo/node.js:782 +#: htdocs/luci-static/resources/view/fchomo/node.js:800 msgid "Periodically sends data packets to maintain connection persistence." msgstr "定期發送資料包以維持連線持久性。" -#: htdocs/luci-static/resources/view/fchomo/node.js:781 +#: htdocs/luci-static/resources/view/fchomo/node.js:799 msgid "Persistent keepalive" msgstr "持久連接" @@ -2174,8 +2202,8 @@ msgid "" "standards." msgstr "連結格式標準請參考
%s。" -#: htdocs/luci-static/resources/view/fchomo/node.js:1623 -#: htdocs/luci-static/resources/view/fchomo/node.js:1649 +#: htdocs/luci-static/resources/view/fchomo/node.js:1642 +#: htdocs/luci-static/resources/view/fchomo/node.js:1668 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:337 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:363 msgid "" @@ -2190,26 +2218,27 @@ msgstr "" #: htdocs/luci-static/resources/view/fchomo/client.js:1445 #: htdocs/luci-static/resources/view/fchomo/client.js:1697 #: htdocs/luci-static/resources/view/fchomo/client.js:1749 -#: htdocs/luci-static/resources/view/fchomo/node.js:1493 +#: htdocs/luci-static/resources/view/fchomo/node.js:1512 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:154 msgid "Please type %s fields of mihomo config.
" msgstr "請輸入 mihomo 配置的 %s 欄位。
" -#: htdocs/luci-static/resources/fchomo/listeners.js:530 -#: htdocs/luci-static/resources/view/fchomo/node.js:805 +#: htdocs/luci-static/resources/fchomo/listeners.js:559 +#: htdocs/luci-static/resources/view/fchomo/node.js:823 msgid "Plugin" msgstr "插件" -#: htdocs/luci-static/resources/fchomo/listeners.js:538 -#: htdocs/luci-static/resources/fchomo/listeners.js:544 -#: htdocs/luci-static/resources/fchomo/listeners.js:551 -#: htdocs/luci-static/resources/fchomo/listeners.js:557 -#: htdocs/luci-static/resources/view/fchomo/node.js:816 -#: htdocs/luci-static/resources/view/fchomo/node.js:823 -#: htdocs/luci-static/resources/view/fchomo/node.js:831 -#: htdocs/luci-static/resources/view/fchomo/node.js:837 -#: htdocs/luci-static/resources/view/fchomo/node.js:845 -#: htdocs/luci-static/resources/view/fchomo/node.js:851 +#: htdocs/luci-static/resources/fchomo/listeners.js:567 +#: htdocs/luci-static/resources/fchomo/listeners.js:574 +#: htdocs/luci-static/resources/fchomo/listeners.js:581 +#: htdocs/luci-static/resources/fchomo/listeners.js:588 +#: htdocs/luci-static/resources/fchomo/listeners.js:594 +#: htdocs/luci-static/resources/view/fchomo/node.js:834 +#: htdocs/luci-static/resources/view/fchomo/node.js:841 +#: htdocs/luci-static/resources/view/fchomo/node.js:849 +#: htdocs/luci-static/resources/view/fchomo/node.js:855 +#: htdocs/luci-static/resources/view/fchomo/node.js:863 +#: htdocs/luci-static/resources/view/fchomo/node.js:869 msgid "Plugin:" msgstr "插件:" @@ -2217,7 +2246,7 @@ msgstr "插件:" msgid "Port" msgstr "連接埠" -#: htdocs/luci-static/resources/fchomo.js:1436 +#: htdocs/luci-static/resources/fchomo.js:1437 msgid "Port %s alrealy exists!" msgstr "連接埠 %s 已存在!" @@ -2225,7 +2254,7 @@ msgstr "連接埠 %s 已存在!" msgid "Port hop interval" msgstr "連接埠跳躍間隔" -#: htdocs/luci-static/resources/view/fchomo/node.js:351 +#: htdocs/luci-static/resources/view/fchomo/node.js:362 msgid "Port range" msgstr "連接埠範圍" @@ -2238,22 +2267,23 @@ msgstr "連接埠" msgid "Ports pool" msgstr "連接埠池" -#: htdocs/luci-static/resources/fchomo/listeners.js:214 -#: htdocs/luci-static/resources/view/fchomo/node.js:500 -#: htdocs/luci-static/resources/view/fchomo/node.js:762 +#: htdocs/luci-static/resources/fchomo/listeners.js:225 +#: htdocs/luci-static/resources/fchomo/listeners.js:455 +#: htdocs/luci-static/resources/view/fchomo/node.js:511 +#: htdocs/luci-static/resources/view/fchomo/node.js:780 msgid "Pre-shared key" msgstr "預先共用金鑰" -#: htdocs/luci-static/resources/fchomo/listeners.js:837 -#: htdocs/luci-static/resources/view/fchomo/node.js:974 +#: htdocs/luci-static/resources/fchomo/listeners.js:874 +#: htdocs/luci-static/resources/view/fchomo/node.js:993 msgid "Pre-shared key of rendezvous server" msgstr "牽線伺服器的預先共用金鑰" -#: htdocs/luci-static/resources/fchomo.js:175 +#: htdocs/luci-static/resources/fchomo.js:176 msgid "Prefer IPv4" msgstr "優先 IPv4" -#: htdocs/luci-static/resources/fchomo.js:176 +#: htdocs/luci-static/resources/fchomo.js:177 msgid "Prefer IPv6" msgstr "優先 IPv6" @@ -2264,23 +2294,23 @@ msgstr "防止某些情況下的 ICMP 環回問題。 Ping 不會顯示實際延 #: htdocs/luci-static/resources/view/fchomo/global.js:736 #: htdocs/luci-static/resources/view/fchomo/global.js:753 -#: htdocs/luci-static/resources/view/fchomo/node.js:1457 -#: htdocs/luci-static/resources/view/fchomo/node.js:1463 -#: htdocs/luci-static/resources/view/fchomo/node.js:1773 -#: htdocs/luci-static/resources/view/fchomo/node.js:1780 +#: htdocs/luci-static/resources/view/fchomo/node.js:1476 +#: htdocs/luci-static/resources/view/fchomo/node.js:1482 +#: htdocs/luci-static/resources/view/fchomo/node.js:1792 +#: htdocs/luci-static/resources/view/fchomo/node.js:1799 msgid "Priority: Proxy Node > Global." msgstr "優先權: 代理節點 > 全域。" -#: htdocs/luci-static/resources/view/fchomo/node.js:313 +#: htdocs/luci-static/resources/view/fchomo/node.js:324 msgid "Priv-key" msgstr "金鑰" -#: htdocs/luci-static/resources/view/fchomo/node.js:317 +#: htdocs/luci-static/resources/view/fchomo/node.js:328 msgid "Priv-key passphrase" msgstr "金鑰密碼" -#: htdocs/luci-static/resources/view/fchomo/node.js:675 -#: htdocs/luci-static/resources/view/fchomo/node.js:747 +#: htdocs/luci-static/resources/view/fchomo/node.js:693 +#: htdocs/luci-static/resources/view/fchomo/node.js:765 msgid "Private key" msgstr "私鑰" @@ -2289,28 +2319,28 @@ msgid "Process matching mode" msgstr "進程匹配模式" #: htdocs/luci-static/resources/view/fchomo/global.js:684 -#: htdocs/luci-static/resources/view/fchomo/node.js:1369 +#: htdocs/luci-static/resources/view/fchomo/node.js:1388 msgid "Protocol" msgstr "協議" -#: htdocs/luci-static/resources/view/fchomo/node.js:662 +#: htdocs/luci-static/resources/view/fchomo/node.js:680 msgid "Protocol parameter. Enable length block encryption." msgstr "協議參數。啟用長度塊加密。" -#: htdocs/luci-static/resources/view/fchomo/node.js:656 +#: htdocs/luci-static/resources/view/fchomo/node.js:674 msgid "" "Protocol parameter. Will waste traffic randomly if enabled (enabled by " "default in v2ray and cannot be disabled)." msgstr "協議參數。 如啟用會隨機浪費流量(在 v2ray 中預設為啟用且無法停用)。" #: htdocs/luci-static/resources/view/fchomo/client.js:1055 -#: htdocs/luci-static/resources/view/fchomo/node.js:1476 -#: htdocs/luci-static/resources/view/fchomo/node.js:1485 -#: htdocs/luci-static/resources/view/fchomo/node.js:1889 +#: htdocs/luci-static/resources/view/fchomo/node.js:1495 +#: htdocs/luci-static/resources/view/fchomo/node.js:1504 +#: htdocs/luci-static/resources/view/fchomo/node.js:1908 msgid "Provider" msgstr "供應商" -#: htdocs/luci-static/resources/view/fchomo/node.js:1656 +#: htdocs/luci-static/resources/view/fchomo/node.js:1675 msgid "Provider URL" msgstr "供應商訂閱 URL" @@ -2333,19 +2363,19 @@ msgid "Proxy MAC-s" msgstr "代理 MAC 位址" #: htdocs/luci-static/resources/view/fchomo/node.js:208 -#: htdocs/luci-static/resources/view/fchomo/node.js:1888 +#: htdocs/luci-static/resources/view/fchomo/node.js:1907 msgid "Proxy Node" msgstr "代理節點" -#: htdocs/luci-static/resources/view/fchomo/node.js:1864 -#: htdocs/luci-static/resources/view/fchomo/node.js:1873 +#: htdocs/luci-static/resources/view/fchomo/node.js:1883 +#: htdocs/luci-static/resources/view/fchomo/node.js:1892 msgid "Proxy chain" msgstr "代理鏈" -#: htdocs/luci-static/resources/fchomo/listeners.js:573 +#: htdocs/luci-static/resources/fchomo/listeners.js:610 #: htdocs/luci-static/resources/view/fchomo/client.js:783 #: htdocs/luci-static/resources/view/fchomo/client.js:1543 -#: htdocs/luci-static/resources/view/fchomo/node.js:1674 +#: htdocs/luci-static/resources/view/fchomo/node.js:1693 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:388 msgid "Proxy group" msgstr "代理組" @@ -2362,8 +2392,8 @@ msgstr "代理模式" msgid "Proxy routerself" msgstr "代理路由器自身" -#: htdocs/luci-static/resources/view/fchomo/node.js:532 -#: htdocs/luci-static/resources/view/fchomo/node.js:727 +#: htdocs/luci-static/resources/view/fchomo/node.js:550 +#: htdocs/luci-static/resources/view/fchomo/node.js:745 msgid "QUIC" msgstr "" @@ -2372,44 +2402,44 @@ msgstr "" msgid "Quick Reload" msgstr "快速重載" -#: htdocs/luci-static/resources/fchomo/listeners.js:1020 -#: htdocs/luci-static/resources/view/fchomo/node.js:1149 +#: htdocs/luci-static/resources/fchomo/listeners.js:1063 +#: htdocs/luci-static/resources/view/fchomo/node.js:1168 msgid "REALITY" msgstr "REALITY" -#: htdocs/luci-static/resources/view/fchomo/node.js:1164 +#: htdocs/luci-static/resources/view/fchomo/node.js:1183 msgid "REALITY X25519MLKEM768 PQC support" msgstr "REALITY X25519MLKEM768 後量子加密支援" -#: htdocs/luci-static/resources/fchomo/listeners.js:1057 +#: htdocs/luci-static/resources/fchomo/listeners.js:1100 msgid "REALITY certificate issued to" msgstr "REALITY 證書頒發給" -#: htdocs/luci-static/resources/fchomo/listeners.js:1025 +#: htdocs/luci-static/resources/fchomo/listeners.js:1068 msgid "REALITY handshake server" msgstr "REALITY 握手伺服器" -#: htdocs/luci-static/resources/fchomo/listeners.js:1032 +#: htdocs/luci-static/resources/fchomo/listeners.js:1075 msgid "REALITY private key" msgstr "REALITY 私鑰" -#: htdocs/luci-static/resources/fchomo/listeners.js:1047 -#: htdocs/luci-static/resources/view/fchomo/node.js:1154 +#: htdocs/luci-static/resources/fchomo/listeners.js:1090 +#: htdocs/luci-static/resources/view/fchomo/node.js:1173 msgid "REALITY public key" msgstr "REALITY 公鑰" -#: htdocs/luci-static/resources/fchomo/listeners.js:1051 -#: htdocs/luci-static/resources/view/fchomo/node.js:1159 +#: htdocs/luci-static/resources/fchomo/listeners.js:1094 +#: htdocs/luci-static/resources/view/fchomo/node.js:1178 msgid "REALITY short ID" msgstr "REALITY 標識符" -#: htdocs/luci-static/resources/fchomo/listeners.js:670 -#: htdocs/luci-static/resources/fchomo/listeners.js:689 -#: htdocs/luci-static/resources/view/fchomo/node.js:929 +#: htdocs/luci-static/resources/fchomo/listeners.js:707 +#: htdocs/luci-static/resources/fchomo/listeners.js:726 +#: htdocs/luci-static/resources/view/fchomo/node.js:948 msgid "RTT" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:374 +#: htdocs/luci-static/resources/fchomo.js:375 msgid "Random" msgstr "隨機" @@ -2417,21 +2447,21 @@ msgstr "隨機" msgid "Random will be used if empty." msgstr "留空將使用隨機令牌。" -#: htdocs/luci-static/resources/fchomo.js:384 +#: htdocs/luci-static/resources/fchomo.js:385 msgid "Randomized traffic characteristics" msgstr "隨機化流量特徵" -#: htdocs/luci-static/resources/fchomo/listeners.js:826 -#: htdocs/luci-static/resources/view/fchomo/node.js:963 +#: htdocs/luci-static/resources/fchomo/listeners.js:863 +#: htdocs/luci-static/resources/view/fchomo/node.js:982 msgid "Realm" msgstr "Realm" -#: htdocs/luci-static/resources/fchomo/listeners.js:842 -#: htdocs/luci-static/resources/view/fchomo/node.js:979 +#: htdocs/luci-static/resources/fchomo/listeners.js:879 +#: htdocs/luci-static/resources/view/fchomo/node.js:998 msgid "Realm ID" msgstr "Realm ID" -#: htdocs/luci-static/resources/fchomo/listeners.js:237 +#: htdocs/luci-static/resources/fchomo/listeners.js:248 msgid "Realm name pattern" msgstr "Realm 名稱模式" @@ -2455,7 +2485,7 @@ msgstr "Redirect TCP + Tun UDP" msgid "Refresh every %s seconds." msgstr "每 %s 秒刷新。" -#: htdocs/luci-static/resources/fchomo.js:1192 +#: htdocs/luci-static/resources/fchomo.js:1193 #: htdocs/luci-static/resources/view/fchomo/client.js:927 #: htdocs/luci-static/resources/view/fchomo/global.js:193 #: htdocs/luci-static/resources/view/fchomo/server.js:45 @@ -2466,69 +2496,69 @@ msgstr "重載" msgid "Reload All" msgstr "重載所有" -#: htdocs/luci-static/resources/view/fchomo/node.js:1601 +#: htdocs/luci-static/resources/view/fchomo/node.js:1620 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:278 msgid "Remote" msgstr "遠端" -#: htdocs/luci-static/resources/view/fchomo/node.js:710 -#: htdocs/luci-static/resources/view/fchomo/node.js:793 +#: htdocs/luci-static/resources/view/fchomo/node.js:728 +#: htdocs/luci-static/resources/view/fchomo/node.js:811 msgid "Remote DNS resolve" msgstr "遠端 DNS 解析" -#: htdocs/luci-static/resources/fchomo.js:1357 +#: htdocs/luci-static/resources/fchomo.js:1358 msgid "Remove" msgstr "移除" -#: htdocs/luci-static/resources/fchomo.js:1362 -#: htdocs/luci-static/resources/view/fchomo/node.js:1577 -#: htdocs/luci-static/resources/view/fchomo/node.js:1579 +#: htdocs/luci-static/resources/fchomo.js:1363 +#: htdocs/luci-static/resources/view/fchomo/node.js:1596 +#: htdocs/luci-static/resources/view/fchomo/node.js:1598 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:251 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:253 msgid "Remove idles" msgstr "移除閒置" -#: htdocs/luci-static/resources/fchomo/listeners.js:831 -#: htdocs/luci-static/resources/view/fchomo/node.js:968 +#: htdocs/luci-static/resources/fchomo/listeners.js:868 +#: htdocs/luci-static/resources/view/fchomo/node.js:987 msgid "Rendezvous server" msgstr "牽線伺服器" -#: htdocs/luci-static/resources/view/fchomo/node.js:1703 +#: htdocs/luci-static/resources/view/fchomo/node.js:1722 msgid "Replace name" msgstr "名稱替換" -#: htdocs/luci-static/resources/view/fchomo/node.js:1704 +#: htdocs/luci-static/resources/view/fchomo/node.js:1723 msgid "Replace node name." msgstr "替換節點名稱" -#: htdocs/luci-static/resources/fchomo.js:358 +#: htdocs/luci-static/resources/fchomo.js:359 msgid "Request" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:1105 -#: htdocs/luci-static/resources/view/fchomo/node.js:1237 -#: htdocs/luci-static/resources/view/fchomo/node.js:1244 +#: htdocs/luci-static/resources/fchomo/listeners.js:1148 +#: htdocs/luci-static/resources/view/fchomo/node.js:1256 +#: htdocs/luci-static/resources/view/fchomo/node.js:1263 msgid "Request path" msgstr "請求路徑" -#: htdocs/luci-static/resources/view/fchomo/node.js:567 +#: htdocs/luci-static/resources/view/fchomo/node.js:585 msgid "Request timeout" msgstr "請求逾時" -#: htdocs/luci-static/resources/fchomo.js:361 +#: htdocs/luci-static/resources/fchomo.js:362 msgid "Require and verify" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:359 +#: htdocs/luci-static/resources/fchomo.js:360 msgid "Require any" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:392 -#: htdocs/luci-static/resources/view/fchomo/node.js:1165 +#: htdocs/luci-static/resources/fchomo.js:393 +#: htdocs/luci-static/resources/view/fchomo/node.js:1184 msgid "Requires server support." msgstr "需要伺服器支援。" -#: htdocs/luci-static/resources/view/fchomo/node.js:776 +#: htdocs/luci-static/resources/view/fchomo/node.js:794 msgid "Reserved field bytes" msgstr "保留字段位元組" @@ -2536,7 +2566,7 @@ msgstr "保留字段位元組" msgid "Resources management" msgstr "資源管理" -#: htdocs/luci-static/resources/view/fchomo/node.js:851 +#: htdocs/luci-static/resources/view/fchomo/node.js:869 msgid "Restls script" msgstr "Restls 劇本" @@ -2550,12 +2580,12 @@ msgid "" "Returns the string input for icon in the API to display in this proxy group." msgstr "在 API 傳回 icon 所輸入的字串,以在該代理組顯示。" -#: htdocs/luci-static/resources/view/fchomo/node.js:484 +#: htdocs/luci-static/resources/view/fchomo/node.js:495 msgid "Reuse HTTP connections to reduce RTT for each connection establishment." msgstr "重用 HTTP 連接以減少每次建立連接的 RTT。" -#: htdocs/luci-static/resources/view/fchomo/node.js:481 -#: htdocs/luci-static/resources/view/fchomo/node.js:485 +#: htdocs/luci-static/resources/view/fchomo/node.js:492 +#: htdocs/luci-static/resources/view/fchomo/node.js:496 msgid "Reusing a single tunnel to carry multiple target connections within it." msgstr "複用單條隧道使其內部承載多條目標連線。" @@ -2572,8 +2602,8 @@ msgstr "路由 DSCP" msgid "Routing GFW" msgstr "路由 GFW 流量" -#: htdocs/luci-static/resources/view/fchomo/node.js:1462 -#: htdocs/luci-static/resources/view/fchomo/node.js:1779 +#: htdocs/luci-static/resources/view/fchomo/node.js:1481 +#: htdocs/luci-static/resources/view/fchomo/node.js:1798 msgid "Routing mark" msgstr "路由標記" @@ -2633,11 +2663,11 @@ msgstr "規則集" msgid "Ruleset-URI-Scheme" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:1205 +#: htdocs/luci-static/resources/fchomo.js:1206 msgid "Running" msgstr "正在運作" -#: htdocs/luci-static/resources/fchomo.js:240 +#: htdocs/luci-static/resources/fchomo.js:241 msgid "SMTP" msgstr "" @@ -2645,20 +2675,20 @@ msgstr "" msgid "SOCKS" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:188 +#: htdocs/luci-static/resources/fchomo.js:189 msgid "SOCKS5" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:204 +#: htdocs/luci-static/resources/fchomo.js:205 msgid "SSH" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:241 +#: htdocs/luci-static/resources/fchomo.js:242 msgid "STUN" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:848 -#: htdocs/luci-static/resources/view/fchomo/node.js:985 +#: htdocs/luci-static/resources/fchomo/listeners.js:885 +#: htdocs/luci-static/resources/view/fchomo/node.js:1004 msgid "STUN servers" msgstr "STUN 伺服器" @@ -2666,7 +2696,7 @@ msgstr "STUN 伺服器" msgid "SUB-RULE" msgstr "SUB-RULE" -#: htdocs/luci-static/resources/view/fchomo/node.js:886 +#: htdocs/luci-static/resources/view/fchomo/node.js:905 msgid "SUoT version" msgstr "SUoT 版本" @@ -2675,11 +2705,11 @@ msgstr "SUoT 版本" msgid "Salamander" msgstr "Salamander" -#: htdocs/luci-static/resources/fchomo.js:181 +#: htdocs/luci-static/resources/fchomo.js:182 msgid "Same dstaddr requests. Same node" msgstr "相同 目標位址 請求。相同節點" -#: htdocs/luci-static/resources/fchomo.js:182 +#: htdocs/luci-static/resources/fchomo.js:183 msgid "Same srcaddr and dstaddr requests. Same node" msgstr "相同 來源位址 和 目標位址 請求。相同節點" @@ -2687,7 +2717,7 @@ msgstr "相同 來源位址 和 目標位址 請求。相同節點" msgid "Segment maximum size" msgstr "分段最大尺寸" -#: htdocs/luci-static/resources/fchomo.js:229 +#: htdocs/luci-static/resources/fchomo.js:230 msgid "Select" msgstr "手動選擇" @@ -2695,18 +2725,18 @@ msgstr "手動選擇" msgid "Select Dashboard" msgstr "選擇面板" -#: htdocs/luci-static/resources/fchomo.js:398 +#: htdocs/luci-static/resources/fchomo.js:399 msgid "Send padding randomly 0-3333 bytes with 50% probability." msgstr "以 50% 的機率發送隨機 0 到 3333 位元組的填充。" -#: htdocs/luci-static/resources/fchomo.js:387 #: htdocs/luci-static/resources/fchomo.js:388 +#: htdocs/luci-static/resources/fchomo.js:389 msgid "Send random ticket of 300s-600s duration for client 0-RTT reuse." msgstr "發送 300-600 秒的隨機票證,以供客戶端 0-RTT 重用。" -#: htdocs/luci-static/resources/fchomo/listeners.js:670 -#: htdocs/luci-static/resources/fchomo/listeners.js:918 -#: htdocs/luci-static/resources/fchomo/listeners.js:933 +#: htdocs/luci-static/resources/fchomo/listeners.js:707 +#: htdocs/luci-static/resources/fchomo/listeners.js:961 +#: htdocs/luci-static/resources/fchomo/listeners.js:976 #: htdocs/luci-static/resources/view/fchomo/server.js:58 #: root/usr/share/luci/menu.d/luci-app-fchomo.json:62 msgid "Server" @@ -2716,9 +2746,9 @@ msgstr "服務端" msgid "Server address" msgstr "伺服器位址" -#: htdocs/luci-static/resources/fchomo/listeners.js:1099 -#: htdocs/luci-static/resources/view/fchomo/node.js:1216 -#: htdocs/luci-static/resources/view/fchomo/node.js:1222 +#: htdocs/luci-static/resources/fchomo/listeners.js:1142 +#: htdocs/luci-static/resources/view/fchomo/node.js:1235 +#: htdocs/luci-static/resources/view/fchomo/node.js:1241 msgid "Server hostname" msgstr "伺服器主機名稱" @@ -2731,26 +2761,26 @@ msgid "Service status" msgstr "服務狀態" #: htdocs/luci-static/resources/fchomo.js:156 -#: htdocs/luci-static/resources/fchomo.js:189 +#: htdocs/luci-static/resources/fchomo.js:190 msgid "Shadowsocks" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:476 -#: htdocs/luci-static/resources/view/fchomo/node.js:586 +#: htdocs/luci-static/resources/fchomo/listeners.js:505 +#: htdocs/luci-static/resources/view/fchomo/node.js:604 msgid "Shadowsocks chipher" msgstr "Shadowsocks 加密方法" -#: htdocs/luci-static/resources/fchomo/listeners.js:471 -#: htdocs/luci-static/resources/view/fchomo/node.js:581 +#: htdocs/luci-static/resources/fchomo/listeners.js:500 +#: htdocs/luci-static/resources/view/fchomo/node.js:599 msgid "Shadowsocks encrypt" msgstr "Shadowsocks 加密" -#: htdocs/luci-static/resources/fchomo/listeners.js:484 -#: htdocs/luci-static/resources/view/fchomo/node.js:594 +#: htdocs/luci-static/resources/fchomo/listeners.js:513 +#: htdocs/luci-static/resources/view/fchomo/node.js:612 msgid "Shadowsocks password" msgstr "Shadowsocks 密碼" -#: htdocs/luci-static/resources/view/fchomo/node.js:1417 +#: htdocs/luci-static/resources/view/fchomo/node.js:1436 msgid "Show connections in the dashboard for breaking connections easier." msgstr "在面板中顯示連線以便於打斷連線。" @@ -2758,18 +2788,18 @@ msgstr "在面板中顯示連線以便於打斷連線。" msgid "Silent" msgstr "靜音" -#: htdocs/luci-static/resources/fchomo.js:180 +#: htdocs/luci-static/resources/fchomo.js:181 msgid "Simple round-robin all nodes" msgstr "簡單輪替所有節點" -#: htdocs/luci-static/resources/view/fchomo/node.js:1662 +#: htdocs/luci-static/resources/view/fchomo/node.js:1681 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:376 msgid "Size limit" msgstr "大小限制" #: htdocs/luci-static/resources/view/fchomo/client.js:1576 -#: htdocs/luci-static/resources/view/fchomo/node.js:1086 -#: htdocs/luci-static/resources/view/fchomo/node.js:1754 +#: htdocs/luci-static/resources/view/fchomo/node.js:1105 +#: htdocs/luci-static/resources/view/fchomo/node.js:1773 msgid "Skip cert verify" msgstr "跳過憑證驗證" @@ -2785,7 +2815,8 @@ msgstr "跳過嗅探目標位址" msgid "Skiped sniffing src address" msgstr "跳過嗅探來源位址" -#: htdocs/luci-static/resources/fchomo.js:193 +#: htdocs/luci-static/resources/fchomo.js:159 +#: htdocs/luci-static/resources/fchomo.js:194 msgid "Snell" msgstr "" @@ -2801,7 +2832,7 @@ msgstr "嗅探器" msgid "Sniffer settings" msgstr "嗅探器設定" -#: htdocs/luci-static/resources/fchomo.js:430 +#: htdocs/luci-static/resources/fchomo.js:431 msgid "Specify a ID" msgstr "指定一個ID" @@ -2820,11 +2851,11 @@ msgstr "堆栈" msgid "Standard" msgstr "標準" -#: htdocs/luci-static/resources/fchomo.js:244 +#: htdocs/luci-static/resources/fchomo.js:245 msgid "Steam Client" msgstr "Steam 客戶端" -#: htdocs/luci-static/resources/fchomo.js:245 +#: htdocs/luci-static/resources/fchomo.js:246 msgid "Steam P2P" msgstr "" @@ -2833,7 +2864,7 @@ msgstr "" msgid "Strategy" msgstr "策略" -#: htdocs/luci-static/resources/fchomo/listeners.js:567 +#: htdocs/luci-static/resources/fchomo/listeners.js:604 #: htdocs/luci-static/resources/view/fchomo/client.js:1303 #: htdocs/luci-static/resources/view/fchomo/client.js:1312 msgid "Sub rule" @@ -2843,7 +2874,7 @@ msgstr "子規則" msgid "Sub rule group" msgstr "子規則組" -#: htdocs/luci-static/resources/fchomo.js:690 +#: htdocs/luci-static/resources/fchomo.js:691 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:223 msgid "Successfully imported %s %s of total %s." msgstr "已成功匯入 %s 個%s (共 %s 個)。" @@ -2852,12 +2883,12 @@ msgstr "已成功匯入 %s 個%s (共 %s 個)。" msgid "Successfully updated." msgstr "更新成功。" -#: htdocs/luci-static/resources/fchomo.js:1707 +#: htdocs/luci-static/resources/fchomo.js:1708 msgid "Successfully uploaded." msgstr "已成功上傳。" #: htdocs/luci-static/resources/fchomo.js:158 -#: htdocs/luci-static/resources/fchomo.js:192 +#: htdocs/luci-static/resources/fchomo.js:193 msgid "Sudoku" msgstr "" @@ -2883,15 +2914,16 @@ msgstr "系統 DNS" #: htdocs/luci-static/resources/fchomo.js:160 #: htdocs/luci-static/resources/fchomo.js:161 #: htdocs/luci-static/resources/fchomo.js:162 -#: htdocs/luci-static/resources/fchomo.js:187 -#: htdocs/luci-static/resources/fchomo.js:192 +#: htdocs/luci-static/resources/fchomo.js:163 +#: htdocs/luci-static/resources/fchomo.js:188 #: htdocs/luci-static/resources/fchomo.js:193 #: htdocs/luci-static/resources/fchomo.js:194 #: htdocs/luci-static/resources/fchomo.js:195 #: htdocs/luci-static/resources/fchomo.js:196 #: htdocs/luci-static/resources/fchomo.js:197 -#: htdocs/luci-static/resources/fchomo.js:204 -#: htdocs/luci-static/resources/fchomo/listeners.js:601 +#: htdocs/luci-static/resources/fchomo.js:198 +#: htdocs/luci-static/resources/fchomo.js:205 +#: htdocs/luci-static/resources/fchomo/listeners.js:638 #: htdocs/luci-static/resources/view/fchomo/client.js:589 #: htdocs/luci-static/resources/view/fchomo/client.js:679 msgid "TCP" @@ -2901,7 +2933,7 @@ msgstr "TCP" msgid "TCP concurrency" msgstr "TCP 併發" -#: htdocs/luci-static/resources/view/fchomo/node.js:1410 +#: htdocs/luci-static/resources/view/fchomo/node.js:1429 msgid "TCP only" msgstr "僅 TCP" @@ -2917,37 +2949,37 @@ msgstr "TCP-Keep-Alive 間隔" #: htdocs/luci-static/resources/fchomo.js:155 #: htdocs/luci-static/resources/fchomo.js:156 #: htdocs/luci-static/resources/fchomo.js:157 -#: htdocs/luci-static/resources/fchomo.js:165 #: htdocs/luci-static/resources/fchomo.js:166 #: htdocs/luci-static/resources/fchomo.js:167 -#: htdocs/luci-static/resources/fchomo.js:186 -#: htdocs/luci-static/resources/fchomo.js:188 +#: htdocs/luci-static/resources/fchomo.js:168 +#: htdocs/luci-static/resources/fchomo.js:187 #: htdocs/luci-static/resources/fchomo.js:189 -#: htdocs/luci-static/resources/fchomo.js:191 -#: htdocs/luci-static/resources/fchomo.js:202 +#: htdocs/luci-static/resources/fchomo.js:190 +#: htdocs/luci-static/resources/fchomo.js:192 +#: htdocs/luci-static/resources/fchomo.js:203 msgid "TCP/UDP" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1441 -#: htdocs/luci-static/resources/view/fchomo/node.js:1721 +#: htdocs/luci-static/resources/view/fchomo/node.js:1460 +#: htdocs/luci-static/resources/view/fchomo/node.js:1740 msgid "TFO" msgstr "TCP 快速開啟 (TFO)" -#: htdocs/luci-static/resources/fchomo/listeners.js:540 -#: htdocs/luci-static/resources/fchomo/listeners.js:858 +#: htdocs/luci-static/resources/fchomo/listeners.js:569 +#: htdocs/luci-static/resources/fchomo/listeners.js:901 #: htdocs/luci-static/resources/view/fchomo/global.js:529 -#: htdocs/luci-static/resources/view/fchomo/node.js:465 -#: htdocs/luci-static/resources/view/fchomo/node.js:818 -#: htdocs/luci-static/resources/view/fchomo/node.js:995 +#: htdocs/luci-static/resources/view/fchomo/node.js:476 +#: htdocs/luci-static/resources/view/fchomo/node.js:836 +#: htdocs/luci-static/resources/view/fchomo/node.js:1014 msgid "TLS" msgstr "TLS" -#: htdocs/luci-static/resources/fchomo/listeners.js:912 -#: htdocs/luci-static/resources/view/fchomo/node.js:1026 +#: htdocs/luci-static/resources/fchomo/listeners.js:955 +#: htdocs/luci-static/resources/view/fchomo/node.js:1045 msgid "TLS ALPN" msgstr "TLS ALPN" -#: htdocs/luci-static/resources/view/fchomo/node.js:1020 +#: htdocs/luci-static/resources/view/fchomo/node.js:1039 msgid "TLS SNI" msgstr "" @@ -2956,16 +2988,16 @@ msgstr "" msgid "TLS fields" msgstr "TLS欄位" -#: htdocs/luci-static/resources/fchomo.js:163 -#: htdocs/luci-static/resources/fchomo.js:200 +#: htdocs/luci-static/resources/fchomo.js:164 +#: htdocs/luci-static/resources/fchomo.js:201 msgid "TUIC" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:242 +#: htdocs/luci-static/resources/fchomo.js:243 msgid "TURN" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:523 +#: htdocs/luci-static/resources/fchomo/listeners.js:552 msgid "Target address" msgstr "目標位址" @@ -2974,39 +3006,39 @@ msgid "" "Tell the client to use the BBR flow control algorithm instead of Hysteria CC." msgstr "讓客戶端使用 BBR 流控演算法。" -#: htdocs/luci-static/resources/view/fchomo/node.js:691 -#: htdocs/luci-static/resources/view/fchomo/node.js:699 +#: htdocs/luci-static/resources/view/fchomo/node.js:709 +#: htdocs/luci-static/resources/view/fchomo/node.js:717 msgid "The %s address used by local machine in the Cloudflare WARP network." msgstr "Cloudflare WARP 網路中使用的本機 %s 位址。" -#: htdocs/luci-static/resources/view/fchomo/node.js:734 -#: htdocs/luci-static/resources/view/fchomo/node.js:742 +#: htdocs/luci-static/resources/view/fchomo/node.js:752 +#: htdocs/luci-static/resources/view/fchomo/node.js:760 msgid "The %s address used by local machine in the Wireguard network." msgstr "WireGuard 網路中使用的本機 %s 位址。" -#: htdocs/luci-static/resources/fchomo/listeners.js:933 -#: htdocs/luci-static/resources/view/fchomo/node.js:1109 +#: htdocs/luci-static/resources/fchomo/listeners.js:976 +#: htdocs/luci-static/resources/view/fchomo/node.js:1128 msgid "The %s private key, in PEM format." msgstr "%s私鑰,需要 PEM 格式。" -#: htdocs/luci-static/resources/fchomo/listeners.js:918 -#: htdocs/luci-static/resources/fchomo/listeners.js:956 +#: htdocs/luci-static/resources/fchomo/listeners.js:961 +#: htdocs/luci-static/resources/fchomo/listeners.js:999 #: htdocs/luci-static/resources/view/fchomo/global.js:550 -#: htdocs/luci-static/resources/view/fchomo/node.js:1095 +#: htdocs/luci-static/resources/view/fchomo/node.js:1114 msgid "The %s public key, in PEM format." msgstr "%s公鑰,需要 PEM 格式。" -#: htdocs/luci-static/resources/view/fchomo/node.js:1129 +#: htdocs/luci-static/resources/view/fchomo/node.js:1148 msgid "" "The ECH parameter of the HTTPS record for the domain. Leave empty to resolve " "via DNS." msgstr "網域的 HTTPS 記錄的 ECH 參數。留空則透過 DNS 解析。" -#: htdocs/luci-static/resources/view/fchomo/node.js:387 +#: htdocs/luci-static/resources/view/fchomo/node.js:398 msgid "The ED25519 available private key or UUID provided by Sudoku server." msgstr "Sudoku 伺服器提供的 ED25519 可用私鑰 或 UUID。" -#: htdocs/luci-static/resources/fchomo/listeners.js:286 +#: htdocs/luci-static/resources/fchomo/listeners.js:297 msgid "The ED25519 master public key or UUID generated by Sudoku." msgstr "Sudoku 產生的 ED25519 主公鑰 或 UUID。" @@ -3014,8 +3046,8 @@ msgstr "Sudoku 產生的 ED25519 主公鑰 或 UUID。" msgid "The default value is 2:00 every day." msgstr "預設值為每天 2:00。" -#: htdocs/luci-static/resources/fchomo/listeners.js:702 -#: htdocs/luci-static/resources/view/fchomo/node.js:942 +#: htdocs/luci-static/resources/fchomo/listeners.js:739 +#: htdocs/luci-static/resources/view/fchomo/node.js:961 msgid "" "The first padding must have a probability of 100% and at least 35 bytes." msgstr "首個填充必須為 100% 的機率並且至少 35 位元組。" @@ -3030,26 +3062,26 @@ msgstr "匹配 %s 的將被視為未被投毒汙染。" msgid "The matching %s will be deemed as poisoned." msgstr "匹配 %s 的將被視為已被投毒汙染。" -#: htdocs/luci-static/resources/fchomo/listeners.js:700 -#: htdocs/luci-static/resources/view/fchomo/node.js:940 +#: htdocs/luci-static/resources/fchomo/listeners.js:737 +#: htdocs/luci-static/resources/view/fchomo/node.js:959 msgid "The server and client can set different padding parameters." msgstr "伺服器和客戶端可以設定不同的填充參數。" -#: htdocs/luci-static/resources/fchomo/listeners.js:1014 +#: htdocs/luci-static/resources/fchomo/listeners.js:1057 #: htdocs/luci-static/resources/view/fchomo/global.js:594 msgid "This ECH parameter needs to be added to the HTTPS record of the domain." msgstr "此 ECH 參數需要加入到網域的 HTTPS 記錄中。" #: htdocs/luci-static/resources/view/fchomo/client.js:1579 -#: htdocs/luci-static/resources/view/fchomo/node.js:1089 -#: htdocs/luci-static/resources/view/fchomo/node.js:1757 +#: htdocs/luci-static/resources/view/fchomo/node.js:1108 +#: htdocs/luci-static/resources/view/fchomo/node.js:1776 msgid "" "This is DANGEROUS, your traffic is almost like " "PLAIN TEXT! Use at your own risk!" msgstr "" "這是危險行為,您的流量將幾乎等同於明文!使用風險自負!" -#: htdocs/luci-static/resources/view/fchomo/node.js:537 +#: htdocs/luci-static/resources/view/fchomo/node.js:555 msgid "" "This is the TUIC port of the SUoT protocol, designed to provide a QUIC " "stream based UDP relay mode that TUIC does not provide." @@ -3081,23 +3113,23 @@ msgstr "Tproxy Fwmark/fwmask" msgid "Tproxy port" msgstr "Tproxy 連接埠" -#: htdocs/luci-static/resources/fchomo/listeners.js:274 -#: htdocs/luci-static/resources/view/fchomo/node.js:379 +#: htdocs/luci-static/resources/fchomo/listeners.js:285 +#: htdocs/luci-static/resources/view/fchomo/node.js:390 msgid "Traffic pattern" msgstr "流量模式" -#: htdocs/luci-static/resources/view/fchomo/node.js:1916 +#: htdocs/luci-static/resources/view/fchomo/node.js:1935 msgid "Transit proxy group" msgstr "中轉代理組" -#: htdocs/luci-static/resources/view/fchomo/node.js:1922 +#: htdocs/luci-static/resources/view/fchomo/node.js:1941 msgid "Transit proxy node" msgstr "中轉代理節點" -#: htdocs/luci-static/resources/fchomo/listeners.js:262 -#: htdocs/luci-static/resources/fchomo/listeners.js:1065 -#: htdocs/luci-static/resources/view/fchomo/node.js:356 -#: htdocs/luci-static/resources/view/fchomo/node.js:1171 +#: htdocs/luci-static/resources/fchomo/listeners.js:273 +#: htdocs/luci-static/resources/fchomo/listeners.js:1108 +#: htdocs/luci-static/resources/view/fchomo/node.js:367 +#: htdocs/luci-static/resources/view/fchomo/node.js:1190 msgid "Transport" msgstr "傳輸層" @@ -3106,8 +3138,8 @@ msgstr "傳輸層" msgid "Transport fields" msgstr "傳輸層欄位" -#: htdocs/luci-static/resources/fchomo/listeners.js:1070 -#: htdocs/luci-static/resources/view/fchomo/node.js:1176 +#: htdocs/luci-static/resources/fchomo/listeners.js:1113 +#: htdocs/luci-static/resources/view/fchomo/node.js:1195 msgid "Transport type" msgstr "傳輸層類型" @@ -3115,17 +3147,17 @@ msgstr "傳輸層類型" msgid "Treat the destination IP as the source IP." msgstr "將 目標 IP 視為 來源 IP。" -#: htdocs/luci-static/resources/fchomo.js:161 -#: htdocs/luci-static/resources/fchomo.js:196 +#: htdocs/luci-static/resources/fchomo.js:162 +#: htdocs/luci-static/resources/fchomo.js:197 msgid "Trojan" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:166 -#: htdocs/luci-static/resources/fchomo.js:202 +#: htdocs/luci-static/resources/fchomo.js:167 +#: htdocs/luci-static/resources/fchomo.js:203 msgid "TrustTunnel" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:232 +#: htdocs/luci-static/resources/fchomo/listeners.js:243 msgid "Trusted proxy header" msgstr "可信代理 Header" @@ -3145,7 +3177,7 @@ msgstr "Tun 設定" msgid "Tun stack." msgstr "Tun 堆栈" -#: htdocs/luci-static/resources/fchomo.js:167 +#: htdocs/luci-static/resources/fchomo.js:168 msgid "Tunnel" msgstr "" @@ -3156,24 +3188,24 @@ msgstr "" #: htdocs/luci-static/resources/view/fchomo/client.js:842 #: htdocs/luci-static/resources/view/fchomo/client.js:1028 #: htdocs/luci-static/resources/view/fchomo/node.js:239 -#: htdocs/luci-static/resources/view/fchomo/node.js:1599 -#: htdocs/luci-static/resources/view/fchomo/node.js:1887 +#: htdocs/luci-static/resources/view/fchomo/node.js:1618 +#: htdocs/luci-static/resources/view/fchomo/node.js:1906 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:276 msgid "Type" msgstr "類型" -#: htdocs/luci-static/resources/fchomo.js:163 #: htdocs/luci-static/resources/fchomo.js:164 -#: htdocs/luci-static/resources/fchomo.js:199 +#: htdocs/luci-static/resources/fchomo.js:165 #: htdocs/luci-static/resources/fchomo.js:200 #: htdocs/luci-static/resources/fchomo.js:201 -#: htdocs/luci-static/resources/fchomo.js:203 -#: htdocs/luci-static/resources/fchomo/listeners.js:602 -#: htdocs/luci-static/resources/fchomo/listeners.js:607 +#: htdocs/luci-static/resources/fchomo.js:202 +#: htdocs/luci-static/resources/fchomo.js:204 +#: htdocs/luci-static/resources/fchomo/listeners.js:639 +#: htdocs/luci-static/resources/fchomo/listeners.js:644 #: htdocs/luci-static/resources/view/fchomo/client.js:588 #: htdocs/luci-static/resources/view/fchomo/client.js:678 -#: htdocs/luci-static/resources/view/fchomo/node.js:875 -#: htdocs/luci-static/resources/view/fchomo/node.js:1731 +#: htdocs/luci-static/resources/view/fchomo/node.js:893 +#: htdocs/luci-static/resources/view/fchomo/node.js:1750 msgid "UDP" msgstr "UDP" @@ -3181,42 +3213,42 @@ msgstr "UDP" msgid "UDP NAT expiration time" msgstr "UDP NAT 過期時間" -#: htdocs/luci-static/resources/view/fchomo/node.js:536 +#: htdocs/luci-static/resources/view/fchomo/node.js:554 msgid "UDP over stream" msgstr "UDP over stream" -#: htdocs/luci-static/resources/view/fchomo/node.js:542 +#: htdocs/luci-static/resources/view/fchomo/node.js:560 msgid "UDP over stream version" msgstr "UDP over stream 版本" -#: htdocs/luci-static/resources/view/fchomo/node.js:529 +#: htdocs/luci-static/resources/view/fchomo/node.js:547 msgid "UDP packet relay mode." msgstr "UDP 包中繼模式。" -#: htdocs/luci-static/resources/view/fchomo/node.js:528 +#: htdocs/luci-static/resources/view/fchomo/node.js:546 msgid "UDP relay mode" msgstr "UDP 中繼模式" -#: htdocs/luci-static/resources/fchomo/listeners.js:361 -#: htdocs/luci-static/resources/fchomo/listeners.js:362 -#: htdocs/luci-static/resources/view/fchomo/node.js:411 -#: htdocs/luci-static/resources/view/fchomo/node.js:412 +#: htdocs/luci-static/resources/fchomo/listeners.js:372 +#: htdocs/luci-static/resources/fchomo/listeners.js:373 +#: htdocs/luci-static/resources/view/fchomo/node.js:422 +#: htdocs/luci-static/resources/view/fchomo/node.js:423 msgid "UP: %s; DOWN: %s" msgstr "上傳: %s; 下載: %s" -#: htdocs/luci-static/resources/fchomo.js:231 +#: htdocs/luci-static/resources/fchomo.js:232 msgid "URL test" msgstr "自動選擇" -#: htdocs/luci-static/resources/fchomo/listeners.js:283 -#: htdocs/luci-static/resources/fchomo/listeners.js:444 -#: htdocs/luci-static/resources/fchomo/listeners.js:499 -#: htdocs/luci-static/resources/view/fchomo/node.js:516 -#: htdocs/luci-static/resources/view/fchomo/node.js:625 +#: htdocs/luci-static/resources/fchomo/listeners.js:294 +#: htdocs/luci-static/resources/fchomo/listeners.js:473 +#: htdocs/luci-static/resources/fchomo/listeners.js:528 +#: htdocs/luci-static/resources/view/fchomo/node.js:534 +#: htdocs/luci-static/resources/view/fchomo/node.js:643 msgid "UUID" msgstr "UUID" -#: htdocs/luci-static/resources/fchomo.js:1250 +#: htdocs/luci-static/resources/fchomo.js:1251 msgid "Unable to download unsupported type: %s" msgstr "無法下載不支援的類型: %s" @@ -3241,8 +3273,8 @@ msgstr "未知錯誤。" msgid "Unknown error: %s" msgstr "未知錯誤:%s" -#: htdocs/luci-static/resources/view/fchomo/node.js:880 -#: htdocs/luci-static/resources/view/fchomo/node.js:1736 +#: htdocs/luci-static/resources/view/fchomo/node.js:899 +#: htdocs/luci-static/resources/view/fchomo/node.js:1755 msgid "UoT" msgstr "UDP over TCP (UoT)" @@ -3250,22 +3282,22 @@ msgstr "UDP over TCP (UoT)" msgid "Update failed." msgstr "更新失敗。" -#: htdocs/luci-static/resources/view/fchomo/node.js:1668 +#: htdocs/luci-static/resources/view/fchomo/node.js:1687 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:382 msgid "Update interval" msgstr "更新間隔" -#: htdocs/luci-static/resources/view/fchomo/node.js:1428 +#: htdocs/luci-static/resources/view/fchomo/node.js:1447 msgid "Upload bandwidth" msgstr "上傳頻寬" -#: htdocs/luci-static/resources/view/fchomo/node.js:1429 +#: htdocs/luci-static/resources/view/fchomo/node.js:1448 msgid "Upload bandwidth in Mbps." msgstr "上傳頻寬(單位:Mbps)。" -#: htdocs/luci-static/resources/fchomo/listeners.js:924 -#: htdocs/luci-static/resources/fchomo/listeners.js:964 -#: htdocs/luci-static/resources/view/fchomo/node.js:1100 +#: htdocs/luci-static/resources/fchomo/listeners.js:967 +#: htdocs/luci-static/resources/fchomo/listeners.js:1007 +#: htdocs/luci-static/resources/view/fchomo/node.js:1119 msgid "Upload certificate" msgstr "上傳憑證" @@ -3273,17 +3305,17 @@ msgstr "上傳憑證" msgid "Upload initial package" msgstr "上傳初始資源包" -#: htdocs/luci-static/resources/fchomo/listeners.js:939 -#: htdocs/luci-static/resources/view/fchomo/node.js:1114 +#: htdocs/luci-static/resources/fchomo/listeners.js:982 +#: htdocs/luci-static/resources/view/fchomo/node.js:1133 msgid "Upload key" msgstr "上傳金鑰" -#: htdocs/luci-static/resources/fchomo/listeners.js:927 -#: htdocs/luci-static/resources/fchomo/listeners.js:942 -#: htdocs/luci-static/resources/fchomo/listeners.js:967 +#: htdocs/luci-static/resources/fchomo/listeners.js:970 +#: htdocs/luci-static/resources/fchomo/listeners.js:985 +#: htdocs/luci-static/resources/fchomo/listeners.js:1010 #: htdocs/luci-static/resources/view/fchomo/global.js:306 -#: htdocs/luci-static/resources/view/fchomo/node.js:1103 -#: htdocs/luci-static/resources/view/fchomo/node.js:1117 +#: htdocs/luci-static/resources/view/fchomo/node.js:1122 +#: htdocs/luci-static/resources/view/fchomo/node.js:1136 msgid "Upload..." msgstr "上傳..." @@ -3307,7 +3339,7 @@ msgstr "用於解析 DNS 伺服器的網域。必須是 IP。" msgid "Used to resolve the domain of the Proxy node." msgstr "用於解析代理節點的網域。" -#: htdocs/luci-static/resources/view/fchomo/node.js:1021 +#: htdocs/luci-static/resources/view/fchomo/node.js:1040 msgid "Used to verify the hostname on the returned certificates." msgstr "用於驗證傳回的憑證上的主機名稱。" @@ -3315,7 +3347,7 @@ msgstr "用於驗證傳回的憑證上的主機名稱。" msgid "User Authentication" msgstr "使用者認證" -#: htdocs/luci-static/resources/fchomo/listeners.js:269 +#: htdocs/luci-static/resources/fchomo/listeners.js:280 msgid "User-hint is mandatory" msgstr "User-hint 是必填項" @@ -3328,41 +3360,42 @@ msgstr "使用者名稱" msgid "Users filter mode" msgstr "使用者過濾模式" -#: htdocs/luci-static/resources/view/fchomo/node.js:1285 +#: htdocs/luci-static/resources/view/fchomo/node.js:1304 msgid "V2ray HTTPUpgrade" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1290 +#: htdocs/luci-static/resources/view/fchomo/node.js:1309 msgid "V2ray HTTPUpgrade fast open" msgstr "" +#: htdocs/luci-static/resources/fchomo.js:161 +#: htdocs/luci-static/resources/fchomo.js:196 +msgid "VLESS" +msgstr "" + #: htdocs/luci-static/resources/fchomo.js:160 #: htdocs/luci-static/resources/fchomo.js:195 -msgid "VLESS" -msgstr "" - -#: htdocs/luci-static/resources/fchomo.js:159 -#: htdocs/luci-static/resources/fchomo.js:194 msgid "VMess" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1605 -#: htdocs/luci-static/resources/view/fchomo/node.js:1893 +#: htdocs/luci-static/resources/view/fchomo/node.js:1624 +#: htdocs/luci-static/resources/view/fchomo/node.js:1912 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:319 msgid "Value" msgstr "可視化值" -#: htdocs/luci-static/resources/fchomo.js:360 +#: htdocs/luci-static/resources/fchomo.js:361 msgid "Verify if given" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:557 -#: htdocs/luci-static/resources/view/fchomo/node.js:507 -#: htdocs/luci-static/resources/view/fchomo/node.js:837 +#: htdocs/luci-static/resources/fchomo/listeners.js:462 +#: htdocs/luci-static/resources/fchomo/listeners.js:594 +#: htdocs/luci-static/resources/view/fchomo/node.js:518 +#: htdocs/luci-static/resources/view/fchomo/node.js:855 msgid "Version" msgstr "版本" -#: htdocs/luci-static/resources/view/fchomo/node.js:845 +#: htdocs/luci-static/resources/view/fchomo/node.js:863 msgid "Version hint" msgstr "" @@ -3371,7 +3404,7 @@ msgstr "" msgid "Vless Encryption fields" msgstr "Vless Encryption 欄位" -#: htdocs/luci-static/resources/fchomo.js:397 +#: htdocs/luci-static/resources/fchomo.js:398 msgid "Wait a random 0-111 milliseconds with 75% probability." msgstr "以 75% 的機率等待隨機 0-111 毫秒。" @@ -3379,16 +3412,16 @@ msgstr "以 75% 的機率等待隨機 0-111 毫秒。" msgid "Warning" msgstr "警告" -#: htdocs/luci-static/resources/fchomo/listeners.js:429 -#: htdocs/luci-static/resources/fchomo/listeners.js:1072 -#: htdocs/luci-static/resources/fchomo/listeners.js:1081 -#: htdocs/luci-static/resources/fchomo/listeners.js:1088 -#: htdocs/luci-static/resources/view/fchomo/node.js:461 -#: htdocs/luci-static/resources/view/fchomo/node.js:490 -#: htdocs/luci-static/resources/view/fchomo/node.js:1181 -#: htdocs/luci-static/resources/view/fchomo/node.js:1192 -#: htdocs/luci-static/resources/view/fchomo/node.js:1199 -#: htdocs/luci-static/resources/view/fchomo/node.js:1205 +#: htdocs/luci-static/resources/fchomo/listeners.js:440 +#: htdocs/luci-static/resources/fchomo/listeners.js:1115 +#: htdocs/luci-static/resources/fchomo/listeners.js:1124 +#: htdocs/luci-static/resources/fchomo/listeners.js:1131 +#: htdocs/luci-static/resources/view/fchomo/node.js:472 +#: htdocs/luci-static/resources/view/fchomo/node.js:501 +#: htdocs/luci-static/resources/view/fchomo/node.js:1200 +#: htdocs/luci-static/resources/view/fchomo/node.js:1211 +#: htdocs/luci-static/resources/view/fchomo/node.js:1218 +#: htdocs/luci-static/resources/view/fchomo/node.js:1224 msgid "WebSocket" msgstr "" @@ -3400,52 +3433,52 @@ msgstr "用作服務端時,HomeProxy 是更好的選擇。" msgid "White list" msgstr "白名單" -#: htdocs/luci-static/resources/fchomo.js:203 +#: htdocs/luci-static/resources/fchomo.js:204 msgid "WireGuard" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:756 +#: htdocs/luci-static/resources/view/fchomo/node.js:774 msgid "WireGuard peer public key." msgstr "WireGuard 對端公鑰。" -#: htdocs/luci-static/resources/view/fchomo/node.js:763 +#: htdocs/luci-static/resources/view/fchomo/node.js:781 msgid "WireGuard pre-shared key." msgstr "WireGuard 預先共用金鑰。" -#: htdocs/luci-static/resources/view/fchomo/node.js:748 +#: htdocs/luci-static/resources/view/fchomo/node.js:766 msgid "WireGuard requires base64-encoded private keys." msgstr "WireGuard 要求 base64 編碼的私鑰。" -#: htdocs/luci-static/resources/fchomo/listeners.js:1073 -#: htdocs/luci-static/resources/fchomo/listeners.js:1082 -#: htdocs/luci-static/resources/view/fchomo/node.js:1182 -#: htdocs/luci-static/resources/view/fchomo/node.js:1200 +#: htdocs/luci-static/resources/fchomo/listeners.js:1116 +#: htdocs/luci-static/resources/fchomo/listeners.js:1125 +#: htdocs/luci-static/resources/view/fchomo/node.js:1201 +#: htdocs/luci-static/resources/view/fchomo/node.js:1219 msgid "XHTTP" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:1118 -#: htdocs/luci-static/resources/view/fchomo/node.js:1295 +#: htdocs/luci-static/resources/fchomo/listeners.js:1161 +#: htdocs/luci-static/resources/view/fchomo/node.js:1314 msgid "XHTTP mode" msgstr "XHTTP 模式" -#: htdocs/luci-static/resources/view/fchomo/node.js:1326 +#: htdocs/luci-static/resources/view/fchomo/node.js:1345 msgid "XMUX" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1331 -#: htdocs/luci-static/resources/view/fchomo/node.js:1336 -#: htdocs/luci-static/resources/view/fchomo/node.js:1341 -#: htdocs/luci-static/resources/view/fchomo/node.js:1346 -#: htdocs/luci-static/resources/view/fchomo/node.js:1351 -#: htdocs/luci-static/resources/view/fchomo/node.js:1356 +#: htdocs/luci-static/resources/view/fchomo/node.js:1350 +#: htdocs/luci-static/resources/view/fchomo/node.js:1355 +#: htdocs/luci-static/resources/view/fchomo/node.js:1360 +#: htdocs/luci-static/resources/view/fchomo/node.js:1365 +#: htdocs/luci-static/resources/view/fchomo/node.js:1370 +#: htdocs/luci-static/resources/view/fchomo/node.js:1375 msgid "XMUX:" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:661 +#: htdocs/luci-static/resources/fchomo/listeners.js:698 msgid "XOR mode" msgstr "XOR 模式" -#: htdocs/luci-static/resources/view/fchomo/node.js:670 +#: htdocs/luci-static/resources/view/fchomo/node.js:688 msgid "Xudp (Xray-core)" msgstr "" @@ -3453,7 +3486,7 @@ msgstr "" msgid "Yaml text" msgstr "Yaml 格式文本" -#: htdocs/luci-static/resources/view/fchomo/node.js:1760 +#: htdocs/luci-static/resources/view/fchomo/node.js:1779 msgid "Yes" msgstr "" @@ -3461,27 +3494,27 @@ msgstr "" msgid "YouTube" msgstr "YouTube" -#: htdocs/luci-static/resources/fchomo.js:1689 +#: htdocs/luci-static/resources/fchomo.js:1690 msgid "Your %s was successfully uploaded. Size: %sB." msgstr "您的 %s 已成功上傳。大小:%sB。" -#: htdocs/luci-static/resources/fchomo.js:333 -#: htdocs/luci-static/resources/fchomo.js:346 -#: htdocs/luci-static/resources/fchomo.js:351 -#: htdocs/luci-static/resources/view/fchomo/node.js:650 +#: htdocs/luci-static/resources/fchomo.js:334 +#: htdocs/luci-static/resources/fchomo.js:347 +#: htdocs/luci-static/resources/fchomo.js:352 +#: htdocs/luci-static/resources/view/fchomo/node.js:668 msgid "aes-128-gcm" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:334 +#: htdocs/luci-static/resources/fchomo.js:335 msgid "aes-192-gcm" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:335 -#: htdocs/luci-static/resources/fchomo.js:352 +#: htdocs/luci-static/resources/fchomo.js:336 +#: htdocs/luci-static/resources/fchomo.js:353 msgid "aes-256-gcm" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:647 +#: htdocs/luci-static/resources/view/fchomo/node.js:665 msgid "auto" msgstr "自動" @@ -3489,19 +3522,19 @@ msgstr "自動" msgid "bbr" msgstr "bbr" -#: htdocs/luci-static/resources/fchomo/listeners.js:929 -#: htdocs/luci-static/resources/fchomo/listeners.js:969 -#: htdocs/luci-static/resources/view/fchomo/node.js:1105 +#: htdocs/luci-static/resources/fchomo/listeners.js:972 +#: htdocs/luci-static/resources/fchomo/listeners.js:1012 +#: htdocs/luci-static/resources/view/fchomo/node.js:1124 msgid "certificate" msgstr "憑證" -#: htdocs/luci-static/resources/fchomo.js:336 -#: htdocs/luci-static/resources/fchomo.js:347 -#: htdocs/luci-static/resources/fchomo.js:353 +#: htdocs/luci-static/resources/fchomo.js:337 +#: htdocs/luci-static/resources/fchomo.js:348 +#: htdocs/luci-static/resources/fchomo.js:354 msgid "chacha20-ietf-poly1305" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:651 +#: htdocs/luci-static/resources/view/fchomo/node.js:669 msgid "chacha20-poly1305" msgstr "" @@ -3509,8 +3542,8 @@ msgstr "" msgid "cubic" msgstr "cubic" -#: htdocs/luci-static/resources/fchomo/listeners.js:613 -#: htdocs/luci-static/resources/fchomo/listeners.js:644 +#: htdocs/luci-static/resources/fchomo/listeners.js:650 +#: htdocs/luci-static/resources/fchomo/listeners.js:681 msgid "decryption" msgstr "decryption" @@ -3518,41 +3551,41 @@ msgstr "decryption" msgid "dnsmasq selects upstream on its own. (may affect CDN accuracy)" msgstr "dnsmasq 自行選擇上游服務器。 (可能影響 CDN 準確性)" -#: htdocs/luci-static/resources/view/fchomo/node.js:1748 +#: htdocs/luci-static/resources/view/fchomo/node.js:1767 msgid "down" msgstr "Hysteria 下載速率" -#: htdocs/luci-static/resources/fchomo/listeners.js:648 -#: htdocs/luci-static/resources/view/fchomo/node.js:894 -#: htdocs/luci-static/resources/view/fchomo/node.js:917 +#: htdocs/luci-static/resources/fchomo/listeners.js:685 +#: htdocs/luci-static/resources/view/fchomo/node.js:913 +#: htdocs/luci-static/resources/view/fchomo/node.js:936 msgid "encryption" msgstr "encryption" -#: htdocs/luci-static/resources/fchomo/listeners.js:413 -#: htdocs/luci-static/resources/view/fchomo/node.js:445 +#: htdocs/luci-static/resources/fchomo/listeners.js:424 +#: htdocs/luci-static/resources/view/fchomo/node.js:456 msgid "false = bandwidth optimized downlink; true = pure Sudoku downlink." msgstr "false = 頻寬最佳化下行 true = 純 Sudoku 下行。" -#: htdocs/luci-static/resources/fchomo/listeners.js:1071 -#: htdocs/luci-static/resources/fchomo/listeners.js:1080 -#: htdocs/luci-static/resources/fchomo/listeners.js:1087 -#: htdocs/luci-static/resources/view/fchomo/node.js:1180 -#: htdocs/luci-static/resources/view/fchomo/node.js:1191 -#: htdocs/luci-static/resources/view/fchomo/node.js:1198 -#: htdocs/luci-static/resources/view/fchomo/node.js:1204 +#: htdocs/luci-static/resources/fchomo/listeners.js:1114 +#: htdocs/luci-static/resources/fchomo/listeners.js:1123 +#: htdocs/luci-static/resources/fchomo/listeners.js:1130 +#: htdocs/luci-static/resources/view/fchomo/node.js:1199 +#: htdocs/luci-static/resources/view/fchomo/node.js:1210 +#: htdocs/luci-static/resources/view/fchomo/node.js:1217 +#: htdocs/luci-static/resources/view/fchomo/node.js:1223 msgid "gRPC" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1261 +#: htdocs/luci-static/resources/view/fchomo/node.js:1280 msgid "gRPC User-Agent" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1266 +#: htdocs/luci-static/resources/view/fchomo/node.js:1285 msgid "gRPC ping interval" msgstr "gRPC ping 間隔" -#: htdocs/luci-static/resources/fchomo/listeners.js:1112 -#: htdocs/luci-static/resources/view/fchomo/node.js:1257 +#: htdocs/luci-static/resources/fchomo/listeners.js:1155 +#: htdocs/luci-static/resources/view/fchomo/node.js:1276 msgid "gRPC service name" msgstr "gRPC 服務名稱" @@ -3560,11 +3593,11 @@ msgstr "gRPC 服務名稱" msgid "gVisor" msgstr "gVisor" -#: htdocs/luci-static/resources/view/fchomo/node.js:1373 +#: htdocs/luci-static/resources/view/fchomo/node.js:1392 msgid "h2mux" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:813 +#: htdocs/luci-static/resources/fchomo/listeners.js:850 msgid "least one keypair required" msgstr "至少需要一對密鑰" @@ -3578,17 +3611,17 @@ msgstr "metacubexd" #: htdocs/luci-static/resources/view/fchomo/client.js:1480 #: htdocs/luci-static/resources/view/fchomo/client.js:1711 #: htdocs/luci-static/resources/view/fchomo/client.js:1767 -#: htdocs/luci-static/resources/view/fchomo/node.js:1571 +#: htdocs/luci-static/resources/view/fchomo/node.js:1590 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:239 msgid "mihomo config" msgstr "mihomo 配置" -#: htdocs/luci-static/resources/fchomo.js:379 +#: htdocs/luci-static/resources/fchomo.js:380 msgid "mlkem768x25519plus" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1445 -#: htdocs/luci-static/resources/view/fchomo/node.js:1726 +#: htdocs/luci-static/resources/view/fchomo/node.js:1464 +#: htdocs/luci-static/resources/view/fchomo/node.js:1745 msgid "mpTCP" msgstr "多路徑 TCP (mpTCP)" @@ -3600,20 +3633,20 @@ msgstr "new_reno" msgid "no-resolve" msgstr "no-resolve" -#: htdocs/luci-static/resources/fchomo.js:1424 -#: htdocs/luci-static/resources/fchomo.js:1519 -#: htdocs/luci-static/resources/fchomo.js:1554 -#: htdocs/luci-static/resources/fchomo.js:1582 +#: htdocs/luci-static/resources/fchomo.js:1425 +#: htdocs/luci-static/resources/fchomo.js:1520 +#: htdocs/luci-static/resources/fchomo.js:1555 +#: htdocs/luci-static/resources/fchomo.js:1583 msgid "non-empty value" msgstr "非空值" -#: htdocs/luci-static/resources/fchomo.js:331 -#: htdocs/luci-static/resources/fchomo.js:345 -#: htdocs/luci-static/resources/fchomo.js:357 -#: htdocs/luci-static/resources/fchomo/listeners.js:531 -#: htdocs/luci-static/resources/view/fchomo/node.js:648 -#: htdocs/luci-static/resources/view/fchomo/node.js:668 -#: htdocs/luci-static/resources/view/fchomo/node.js:806 +#: htdocs/luci-static/resources/fchomo.js:332 +#: htdocs/luci-static/resources/fchomo.js:346 +#: htdocs/luci-static/resources/fchomo.js:358 +#: htdocs/luci-static/resources/fchomo/listeners.js:560 +#: htdocs/luci-static/resources/view/fchomo/node.js:666 +#: htdocs/luci-static/resources/view/fchomo/node.js:686 +#: htdocs/luci-static/resources/view/fchomo/node.js:824 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:315 msgid "none" msgstr "無" @@ -3626,45 +3659,45 @@ msgstr "未找到" msgid "not included \",\"" msgstr "不包含 \",\"" -#: htdocs/luci-static/resources/fchomo.js:217 -#: htdocs/luci-static/resources/fchomo/listeners.js:569 -#: htdocs/luci-static/resources/fchomo/listeners.js:570 +#: htdocs/luci-static/resources/fchomo.js:218 +#: htdocs/luci-static/resources/fchomo/listeners.js:606 +#: htdocs/luci-static/resources/fchomo/listeners.js:607 msgid "null" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:532 -#: htdocs/luci-static/resources/view/fchomo/node.js:807 +#: htdocs/luci-static/resources/fchomo/listeners.js:561 +#: htdocs/luci-static/resources/view/fchomo/node.js:825 msgid "obfs-simple" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:492 +#: htdocs/luci-static/resources/view/fchomo/node.js:503 msgid "only applies when %s is %s." msgstr "僅當 %s 為 %s 時適用。" -#: htdocs/luci-static/resources/view/fchomo/node.js:490 +#: htdocs/luci-static/resources/view/fchomo/node.js:501 msgid "only applies when %s is not %s." msgstr "僅當 %s 不為 %s 時適用。" -#: htdocs/luci-static/resources/view/fchomo/node.js:1706 +#: htdocs/luci-static/resources/view/fchomo/node.js:1725 msgid "override.proxy-name" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:669 +#: htdocs/luci-static/resources/view/fchomo/node.js:687 msgid "packet addr (v2ray-core v5+)" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:1122 -#: htdocs/luci-static/resources/view/fchomo/node.js:1299 +#: htdocs/luci-static/resources/fchomo/listeners.js:1165 +#: htdocs/luci-static/resources/view/fchomo/node.js:1318 msgid "packet-up" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:427 -#: htdocs/luci-static/resources/view/fchomo/node.js:459 +#: htdocs/luci-static/resources/fchomo/listeners.js:438 +#: htdocs/luci-static/resources/view/fchomo/node.js:470 msgid "poll" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:944 -#: htdocs/luci-static/resources/view/fchomo/node.js:1119 +#: htdocs/luci-static/resources/fchomo/listeners.js:987 +#: htdocs/luci-static/resources/view/fchomo/node.js:1138 msgid "private key" msgstr "私鑰" @@ -3677,7 +3710,7 @@ msgstr "razord-meta" msgid "requires front-end adaptation using the API." msgstr "需要使用 API 的前端適配。" -#: htdocs/luci-static/resources/view/fchomo/node.js:811 +#: htdocs/luci-static/resources/view/fchomo/node.js:829 msgid "restls" msgstr "" @@ -3685,17 +3718,17 @@ msgstr "" msgid "rule-set" msgstr "規則集" -#: htdocs/luci-static/resources/fchomo/listeners.js:533 -#: htdocs/luci-static/resources/view/fchomo/node.js:810 +#: htdocs/luci-static/resources/fchomo/listeners.js:562 +#: htdocs/luci-static/resources/view/fchomo/node.js:828 msgid "shadow-tls" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1371 +#: htdocs/luci-static/resources/view/fchomo/node.js:1390 msgid "smux" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:426 -#: htdocs/luci-static/resources/view/fchomo/node.js:458 +#: htdocs/luci-static/resources/fchomo/listeners.js:437 +#: htdocs/luci-static/resources/view/fchomo/node.js:469 msgid "split-stream" msgstr "" @@ -3703,25 +3736,25 @@ msgstr "" msgid "src" msgstr "src" -#: htdocs/luci-static/resources/fchomo/listeners.js:1120 -#: htdocs/luci-static/resources/view/fchomo/node.js:1297 +#: htdocs/luci-static/resources/fchomo/listeners.js:1163 +#: htdocs/luci-static/resources/view/fchomo/node.js:1316 msgid "stream-one" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:1121 -#: htdocs/luci-static/resources/view/fchomo/node.js:1298 +#: htdocs/luci-static/resources/fchomo/listeners.js:1164 +#: htdocs/luci-static/resources/view/fchomo/node.js:1317 msgid "stream-up" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:1137 +#: htdocs/luci-static/resources/fchomo/listeners.js:1180 msgid "stream-up server seconds" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:492 +#: htdocs/luci-static/resources/view/fchomo/node.js:503 msgid "stream/poll/auto" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:282 +#: htdocs/luci-static/resources/fchomo/listeners.js:293 msgid "sudoku-keypair" msgstr "" @@ -3729,87 +3762,100 @@ msgstr "" msgid "unchecked" msgstr "未檢查" -#: htdocs/luci-static/resources/fchomo.js:443 +#: htdocs/luci-static/resources/fchomo.js:444 msgid "unique UCI identifier" msgstr "獨立 UCI 識別" -#: htdocs/luci-static/resources/fchomo.js:446 +#: htdocs/luci-static/resources/fchomo.js:447 msgid "unique identifier" msgstr "獨立標識" -#: htdocs/luci-static/resources/fchomo.js:1591 +#: htdocs/luci-static/resources/fchomo.js:1592 msgid "unique value" msgstr "獨立值" -#: htdocs/luci-static/resources/view/fchomo/node.js:1742 +#: htdocs/luci-static/resources/view/fchomo/node.js:1761 msgid "up" msgstr "Hysteria 上傳速率" -#: htdocs/luci-static/resources/fchomo/listeners.js:558 -#: htdocs/luci-static/resources/view/fchomo/node.js:508 -#: htdocs/luci-static/resources/view/fchomo/node.js:543 -#: htdocs/luci-static/resources/view/fchomo/node.js:838 -#: htdocs/luci-static/resources/view/fchomo/node.js:887 +#: htdocs/luci-static/resources/fchomo/listeners.js:463 +#: htdocs/luci-static/resources/fchomo/listeners.js:595 +#: htdocs/luci-static/resources/view/fchomo/node.js:519 +#: htdocs/luci-static/resources/view/fchomo/node.js:561 +#: htdocs/luci-static/resources/view/fchomo/node.js:856 +#: htdocs/luci-static/resources/view/fchomo/node.js:906 msgid "v1" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:559 -#: htdocs/luci-static/resources/view/fchomo/node.js:509 -#: htdocs/luci-static/resources/view/fchomo/node.js:839 -#: htdocs/luci-static/resources/view/fchomo/node.js:888 +#: htdocs/luci-static/resources/fchomo/listeners.js:464 +#: htdocs/luci-static/resources/fchomo/listeners.js:596 +#: htdocs/luci-static/resources/view/fchomo/node.js:520 +#: htdocs/luci-static/resources/view/fchomo/node.js:857 +#: htdocs/luci-static/resources/view/fchomo/node.js:907 msgid "v2" msgstr "" -#: htdocs/luci-static/resources/fchomo/listeners.js:560 -#: htdocs/luci-static/resources/view/fchomo/node.js:510 -#: htdocs/luci-static/resources/view/fchomo/node.js:840 +#: htdocs/luci-static/resources/fchomo/listeners.js:465 +#: htdocs/luci-static/resources/fchomo/listeners.js:597 +#: htdocs/luci-static/resources/view/fchomo/node.js:521 +#: htdocs/luci-static/resources/view/fchomo/node.js:858 msgid "v3" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:1471 -#: htdocs/luci-static/resources/fchomo.js:1474 +#: htdocs/luci-static/resources/fchomo/listeners.js:466 +#: htdocs/luci-static/resources/view/fchomo/node.js:522 +msgid "v4" +msgstr "" + +#: htdocs/luci-static/resources/fchomo/listeners.js:467 +#: htdocs/luci-static/resources/view/fchomo/node.js:523 +msgid "v5" +msgstr "" + +#: htdocs/luci-static/resources/fchomo.js:1472 +#: htdocs/luci-static/resources/fchomo.js:1475 msgid "valid JSON format" msgstr "有效的 JSON 格式" -#: htdocs/luci-static/resources/view/fchomo/node.js:1079 +#: htdocs/luci-static/resources/view/fchomo/node.js:1098 msgid "valid SHA256 string with %d characters" msgstr "包含 %d 個字元的有效 SHA256 字串" -#: htdocs/luci-static/resources/fchomo.js:1496 -#: htdocs/luci-static/resources/fchomo.js:1499 +#: htdocs/luci-static/resources/fchomo.js:1497 +#: htdocs/luci-static/resources/fchomo.js:1500 msgid "valid URL" msgstr "有效網址" -#: htdocs/luci-static/resources/fchomo.js:1509 +#: htdocs/luci-static/resources/fchomo.js:1510 msgid "valid base64 key with %d characters" msgstr "包含 %d 個字元的有效 base64 金鑰" -#: htdocs/luci-static/resources/fchomo.js:1569 -#: htdocs/luci-static/resources/fchomo.js:1575 +#: htdocs/luci-static/resources/fchomo.js:1570 +#: htdocs/luci-static/resources/fchomo.js:1576 msgid "valid format: 2x, 2p, 4v" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:1556 +#: htdocs/luci-static/resources/fchomo.js:1557 msgid "valid key length with %d characters" msgstr "包含 %d 個字元的有效金鑰" -#: htdocs/luci-static/resources/fchomo.js:1434 +#: htdocs/luci-static/resources/fchomo.js:1435 msgid "valid port value" msgstr "有效連接埠值" -#: htdocs/luci-static/resources/fchomo.js:1484 +#: htdocs/luci-static/resources/fchomo.js:1485 msgid "valid uuid" msgstr "有效 uuid" -#: htdocs/luci-static/resources/fchomo.js:403 +#: htdocs/luci-static/resources/fchomo.js:404 msgid "vless-mlkem768" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:402 +#: htdocs/luci-static/resources/fchomo.js:403 msgid "vless-x25519" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:337 +#: htdocs/luci-static/resources/fchomo.js:338 msgid "xchacha20-ietf-poly1305" msgstr "" @@ -3817,7 +3863,7 @@ msgstr "" msgid "yacd-meta" msgstr "yacd-meta" -#: htdocs/luci-static/resources/view/fchomo/node.js:1372 +#: htdocs/luci-static/resources/view/fchomo/node.js:1391 msgid "yamux" msgstr "" @@ -3825,11 +3871,11 @@ msgstr "" msgid "zashboard" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:649 +#: htdocs/luci-static/resources/view/fchomo/node.js:667 msgid "zero" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:1252 +#: htdocs/luci-static/resources/fchomo.js:1253 msgid "🡇" msgstr "" diff --git a/luci-app-fchomo/root/usr/share/fchomo/generate_client.uc b/luci-app-fchomo/root/usr/share/fchomo/generate_client.uc index 4cba4232..2870e41e 100644 --- a/luci-app-fchomo/root/usr/share/fchomo/generate_client.uc +++ b/luci-app-fchomo/root/usr/share/fchomo/generate_client.uc @@ -511,6 +511,8 @@ uci.foreach(uciconf, ucinode, (cfg) => { down: cfg.hysteria_down_mbps ? cfg.hysteria_down_mbps + ' Mbps' : null, obfs: cfg.hysteria_obfs_type, "obfs-password": cfg.hysteria_obfs_password, + "obfs-min-packet-size": strToInt(cfg.hysteria_obfs_min_packet_size), + "obfs-max-packet-size": strToInt(cfg.hysteria_obfs_max_packet_size), "realm-opts": cfg.hysteria2_realm === '1' ? { enable: true, "server-url": cfg.hysteria2_realm_server_url, @@ -562,6 +564,7 @@ uci.foreach(uciconf, ucinode, (cfg) => { /* Snell */ psk: cfg.snell_psk, version: cfg.snell_version, + reuse: strToBool(cfg.snell_reuse), "obfs-opts": cfg.type === 'snell' ? { mode: cfg.plugin_opts_obfsmode, host: cfg.plugin_opts_host, diff --git a/luci-app-fchomo/root/usr/share/ucode/fchomo.uc b/luci-app-fchomo/root/usr/share/ucode/fchomo.uc index 3bc690a9..0e0cd533 100644 --- a/luci-app-fchomo/root/usr/share/ucode/fchomo.uc +++ b/luci-app-fchomo/root/usr/share/ucode/fchomo.uc @@ -250,6 +250,8 @@ export function parseListener(cfg, isClient, label) { "ignore-client-bandwidth": strToBool(cfg.hysteria_ignore_client_bandwidth), obfs: cfg.hysteria_obfs_type, "obfs-password": cfg.hysteria_obfs_password, + "obfs-min-packet-size": strToInt(cfg.hysteria_obfs_min_packet_size), + "obfs-max-packet-size": strToInt(cfg.hysteria_obfs_max_packet_size), masquerade: cfg.hysteria_masquerade, "realm-opts": cfg.hysteria2_realm === '1' ? { enable: true, @@ -300,6 +302,14 @@ export function parseListener(cfg, isClient, label) { } : {}), fallback: (cfg.sudoku_http_mask === '0') ? null : cfg.sudoku_fallback, + /* Snell */ + psk: cfg.snell_psk, + version: cfg.snell_version, + "obfs-opts": cfg.type === 'snell' ? { + mode: cfg.plugin_opts_obfsmode, + host: cfg.plugin_opts_host, + } : null, + /* Tuic */ "max-idle-time": durationToSecond(cfg.tuic_max_idle_time), "authentication-timeout": durationToSecond(cfg.tuic_authentication_timeout), @@ -350,10 +360,10 @@ export function parseListener(cfg, isClient, label) { "congestion-controller": cfg.congestion_controller, "bbr-profile": cfg.bbr_profile, network: cfg.network, - udp: strToBool(cfg.udp), + udp: cfg.udp === '0' ? false : true, /* TLS fields */ - ...(cfg.tls === '1' ? { + ...(cfg.allow_insecure === '1' ? { "allow-insecure": true } : cfg.tls === '1' ? { alpn: cfg.tls_alpn, ...(cfg.tls_reality === '1' ? { "reality-config": { diff --git a/luci-app-passwall/Makefile b/luci-app-passwall/Makefile index 94cef985..d88f9b30 100644 --- a/luci-app-passwall/Makefile +++ b/luci-app-passwall/Makefile @@ -7,8 +7,8 @@ include $(TOPDIR)/rules.mk PKG_NAME:=luci-app-passwall -PKG_VERSION:=26.5.20 -PKG_RELEASE:=146 +PKG_VERSION:=26.6.2 +PKG_RELEASE:=147 PKG_PO_VERSION:=$(PKG_VERSION) PKG_CONFIG_DEPENDS:= \ diff --git a/luci-app-passwall2/Makefile b/luci-app-passwall2/Makefile index da6ed0d1..396efbe8 100644 --- a/luci-app-passwall2/Makefile +++ b/luci-app-passwall2/Makefile @@ -7,7 +7,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=luci-app-passwall2 PKG_VERSION:=26.5.19 -PKG_RELEASE:=47 +PKG_RELEASE:=48 PKG_PO_VERSION:=$(PKG_VERSION) PKG_CONFIG_DEPENDS:= \ diff --git a/luci-app-passwall2/luasrc/passwall2/util_xray.lua b/luci-app-passwall2/luasrc/passwall2/util_xray.lua index b674e971..3ba5db0e 100644 --- a/luci-app-passwall2/luasrc/passwall2/util_xray.lua +++ b/luci-app-passwall2/luasrc/passwall2/util_xray.lua @@ -1684,12 +1684,13 @@ function gen_config(var) blockTypes = (api.compare_versions(xray_version, "<", "26.4.25")) and { 65 } or nil, -- Todo is to remove it rules = (api.compare_versions(xray_version, ">", "26.4.17")) and { { - qtype = "1,28", + qType = "1,28", action = "hijack" }, { - qtype = 65, - action = "reject", + qType = 65, + action = "return", + rCode = 0 }, { action = "direct" @@ -1708,11 +1709,12 @@ function gen_config(var) nonIPQuery = (api.compare_versions(xray_version, "<", "26.4.25")) and "reject" or nil, -- Todo is to remove it rules = (api.compare_versions(xray_version, ">", "26.4.17")) and { { - qtype = "1,28", + qType = "1,28", action = "hijack" }, { - action = "reject" + action = "return", + rCode = 0 } } or nil } diff --git a/luci-app-quickfile/Makefile b/luci-app-quickfile/Makefile index 314e654a..362e024f 100644 --- a/luci-app-quickfile/Makefile +++ b/luci-app-quickfile/Makefile @@ -7,7 +7,7 @@ LUCI_DEPENDS:=+luci-nginx +quickfile PKG_LICENSE:=Apache-2.0 PKG_VERSION:=1.0.0 -PKG_RELEASE:=5 +PKG_RELEASE:=6 PKG_MAINTAINER:=sbwml include $(TOPDIR)/feeds/luci/luci.mk diff --git a/luci-app-quickfile/root/usr/share/luci/menu.d/luci-app-quickfile.json b/luci-app-quickfile/root/usr/share/luci/menu.d/luci-app-quickfile.json index a5fbf6d3..70c66514 100644 --- a/luci-app-quickfile/root/usr/share/luci/menu.d/luci-app-quickfile.json +++ b/luci-app-quickfile/root/usr/share/luci/menu.d/luci-app-quickfile.json @@ -5,9 +5,6 @@ "action": { "type": "view", "path": "system/quickfile" - }, - "depends": { - "acl": [ "luci-app-quickfile" ] } } } diff --git a/mihomo-alpha/Makefile b/mihomo-alpha/Makefile index 2239fa93..9a88230c 100644 --- a/mihomo-alpha/Makefile +++ b/mihomo-alpha/Makefile @@ -1,14 +1,14 @@ include $(TOPDIR)/rules.mk PKG_NAME:=mihomo-alpha -PKG_VERSION:=2026.05.19 -PKG_RELEASE:=9 +PKG_VERSION:=2026.05.30 +PKG_RELEASE:=10 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION) PKG_SOURCE_PROTO:=git PKG_SOURCE_URL:=https://github.com/MetaCubeX/mihomo.git -PKG_SOURCE_VERSION:=a52a27ed563970b79e50ced79f15100abf0bcc85 +PKG_SOURCE_VERSION:=fc8c5a24b16991f98cd736950c17d1aa306a5041 PKG_MIRROR_HASH:=skip PKG_LICENSE:=GPL3.0+ @@ -18,7 +18,7 @@ PKG_BUILD_DEPENDS:=golang/host PKG_BUILD_PARALLEL:=1 PKG_BUILD_FLAGS:=no-mips16 -PKG_BUILD_VERSION:=alpha-a52a27ed +PKG_BUILD_VERSION:=alpha-fc8c5a24 PKG_BUILD_TIME:=$(shell date -u -Iseconds) GO_PKG:=github.com/metacubex/mihomo diff --git a/mihomo-meta/Makefile b/mihomo-meta/Makefile index 1cc34c8b..2e85e7e6 100644 --- a/mihomo-meta/Makefile +++ b/mihomo-meta/Makefile @@ -1,14 +1,14 @@ include $(TOPDIR)/rules.mk PKG_NAME:=mihomo-meta -PKG_VERSION:=1.19.25 -PKG_RELEASE:=5 +PKG_VERSION:=1.19.26 +PKG_RELEASE:=6 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION) PKG_SOURCE_PROTO:=git PKG_SOURCE_URL:=https://github.com/MetaCubeX/mihomo.git -PKG_SOURCE_VERSION:=v1.19.25 +PKG_SOURCE_VERSION:=v1.19.26 PKG_MIRROR_HASH:=skip PKG_LICENSE:=GPL3.0+ @@ -18,7 +18,7 @@ PKG_BUILD_DEPENDS:=golang/host PKG_BUILD_PARALLEL:=1 PKG_BUILD_FLAGS:=no-mips16 -PKG_BUILD_VERSION:=v1.19.25 +PKG_BUILD_VERSION:=v1.19.26 PKG_BUILD_TIME:=$(shell date -u -Iseconds) GO_PKG:=github.com/metacubex/mihomo diff --git a/mihomo/Makefile b/mihomo/Makefile index 1a909002..fda170d1 100644 --- a/mihomo/Makefile +++ b/mihomo/Makefile @@ -5,8 +5,8 @@ include $(TOPDIR)/rules.mk PKG_NAME:=mihomo -PKG_VERSION:=1.19.25 -PKG_RELEASE:=9 +PKG_VERSION:=1.19.26 +PKG_RELEASE:=10 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz PKG_SOURCE_URL:=https://codeload.github.com/metacubex/mihomo/tar.gz/v$(PKG_VERSION)?