feat: add validations & translations

This commit is contained in:
divocat
2025-10-27 13:06:33 +02:00
parent d4b3377d68
commit f1a6ff3469
9 changed files with 488 additions and 210 deletions

View File

@@ -45,21 +45,21 @@
"call": "Applicable for SOCKS and Shadowsocks proxy",
"key": "Applicable for SOCKS and Shadowsocks proxy",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:111"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:175"
]
},
{
"call": "At least one valid domain must be specified. Comments-only content is not allowed.",
"key": "At least one valid domain must be specified. Comments-only content is not allowed.",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:356"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:420"
]
},
{
"call": "At least one valid subnet or IP must be specified. Comments-only content is not allowed.",
"key": "At least one valid subnet or IP must be specified. Comments-only content is not allowed.",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:437"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:501"
]
},
{
@@ -171,7 +171,7 @@
"call": "Community Lists",
"key": "Community Lists",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:211"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:275"
]
},
{
@@ -290,8 +290,8 @@
"call": "Disabled",
"key": "Disabled",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:302",
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:382"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:366",
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:446"
]
},
{
@@ -305,7 +305,7 @@
"call": "DNS over HTTPS (DoH)",
"key": "DNS over HTTPS (DoH)",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:179",
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:243",
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:15"
]
},
@@ -313,7 +313,7 @@
"call": "DNS over TLS (DoT)",
"key": "DNS over TLS (DoT)",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:180",
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:244",
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:16"
]
},
@@ -321,7 +321,7 @@
"call": "DNS Protocol Type",
"key": "DNS Protocol Type",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:176",
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:240",
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:12"
]
},
@@ -336,7 +336,7 @@
"call": "DNS Server",
"key": "DNS Server",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:189",
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:253",
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:24"
]
},
@@ -358,7 +358,7 @@
"call": "Domain Resolver",
"key": "Domain Resolver",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:166"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:230"
]
},
{
@@ -409,8 +409,8 @@
"call": "Dynamic List",
"key": "Dynamic List",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:303",
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:383"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:367",
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:447"
]
},
{
@@ -424,14 +424,14 @@
"call": "Enable built-in DNS resolver for domains handled by this section",
"key": "Enable built-in DNS resolver for domains handled by this section",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:167"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:231"
]
},
{
"call": "Enable Mixed Proxy",
"key": "Enable Mixed Proxy",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:575"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:639"
]
},
{
@@ -445,7 +445,7 @@
"call": "Enable the mixed proxy, allowing this section to route traffic through both HTTP and SOCKS proxies",
"key": "Enable the mixed proxy, allowing this section to route traffic through both HTTP and SOCKS proxies",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:576"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:640"
]
},
{
@@ -466,21 +466,49 @@
"call": "Enter domain names separated by commas, spaces, or newlines. You can add comments using //",
"key": "Enter domain names separated by commas, spaces, or newlines. You can add comments using //",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:338"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:402"
]
},
{
"call": "Enter domain names without protocols, e.g. example.com or sub.example.com",
"key": "Enter domain names without protocols, e.g. example.com or sub.example.com",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:312"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:376"
]
},
{
"call": "Enter subnets in CIDR notation (e.g. 103.21.244.0/22) or single IP addresses",
"key": "Enter subnets in CIDR notation (e.g. 103.21.244.0/22) or single IP addresses",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:392"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:456"
]
},
{
"call": "Every 1 minute",
"key": "Every 1 minute",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:114"
]
},
{
"call": "Every 3 minutes",
"key": "Every 3 minutes",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:115"
]
},
{
"call": "Every 30 seconds",
"key": "Every 30 seconds",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:113"
]
},
{
"call": "Every 5 minutes",
"key": "Every 5 minutes",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:116"
]
},
{
@@ -521,14 +549,14 @@
"key": "Fastest",
"places": [
"src/podkop/methods/custom/getDashboardSections.ts:117",
"src/podkop/tabs/diagnostic/checks/runSectionsCheck.ts:58"
"src/podkop/tabs/diagnostic/checks/runSectionsCheck.ts:59"
]
},
{
"call": "Fully Routed IPs",
"key": "Fully Routed IPs",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:550"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:614"
]
},
{
@@ -774,7 +802,8 @@
"call": "Invalid URL format",
"key": "Invalid URL format",
"places": [
"src/validators/validateUrl.ts:18"
"src/validators/validateUrl.ts:8",
"src/validators/validateUrl.ts:31"
]
},
{
@@ -816,14 +845,14 @@
"call": "Local Domain Lists",
"key": "Local Domain Lists",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:458"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:522"
]
},
{
"call": "Local Subnet Lists",
"key": "Local Subnet Lists",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:481"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:545"
]
},
{
@@ -844,7 +873,7 @@
"call": "Mixed Proxy Port",
"key": "Mixed Proxy Port",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:586"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:650"
]
},
{
@@ -854,11 +883,18 @@
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:198"
]
},
{
"call": "Must be a number in the range of 50 - 1000",
"key": "Must be a number in the range of 50 - 1000",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:140"
]
},
{
"call": "Network Interface",
"key": "Network Interface",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:120"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:184"
]
},
{
@@ -879,9 +915,9 @@
"call": "Not responding",
"key": "Not responding",
"places": [
"src/podkop/tabs/diagnostic/checks/runSectionsCheck.ts:74",
"src/podkop/tabs/diagnostic/checks/runSectionsCheck.ts:80",
"src/podkop/tabs/diagnostic/checks/runSectionsCheck.ts:99"
"src/podkop/tabs/diagnostic/checks/runSectionsCheck.ts:75",
"src/podkop/tabs/diagnostic/checks/runSectionsCheck.ts:81",
"src/podkop/tabs/diagnostic/checks/runSectionsCheck.ts:100"
]
},
{
@@ -1015,21 +1051,21 @@
"call": "Regional options cannot be used together",
"key": "Regional options cannot be used together",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:245"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:309"
]
},
{
"call": "Remote Domain Lists",
"key": "Remote Domain Lists",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:504"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:568"
]
},
{
"call": "Remote Subnet Lists",
"key": "Remote Subnet Lists",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:527"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:591"
]
},
{
@@ -1113,7 +1149,7 @@
"call": "Russia inside restrictions",
"key": "Russia inside restrictions",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:264"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:328"
]
},
{
@@ -1127,7 +1163,7 @@
"call": "Select a predefined list for routing",
"key": "Select a predefined list for routing",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:212"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:276"
]
},
{
@@ -1162,14 +1198,14 @@
"call": "Select network interface for VPN connection",
"key": "Select network interface for VPN connection",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:121"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:185"
]
},
{
"call": "Select or enter DNS server address",
"key": "Select or enter DNS server address",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:190",
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:254",
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:25"
]
},
@@ -1191,21 +1227,21 @@
"call": "Select the DNS protocol type for the domain resolver",
"key": "Select the DNS protocol type for the domain resolver",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:177"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:241"
]
},
{
"call": "Select the list type for adding custom domains",
"key": "Select the list type for adding custom domains",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:300"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:364"
]
},
{
"call": "Select the list type for adding custom subnets",
"key": "Select the list type for adding custom subnets",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:380"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:444"
]
},
{
@@ -1318,29 +1354,29 @@
"call": "Specify local IP addresses or subnets whose traffic will always be routed through the configured route",
"key": "Specify local IP addresses or subnets whose traffic will always be routed through the configured route",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:551"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:615"
]
},
{
"call": "Specify remote URLs to download and use domain lists",
"key": "Specify remote URLs to download and use domain lists",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:505"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:569"
]
},
{
"call": "Specify remote URLs to download and use subnet lists",
"key": "Specify remote URLs to download and use subnet lists",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:528"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:592"
]
},
{
"call": "Specify the path to the list file located on the router filesystem",
"key": "Specify the path to the list file located on the router filesystem",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:459",
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:482"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:523",
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:546"
]
},
{
@@ -1396,14 +1432,14 @@
"call": "Text List",
"key": "Text List",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:304"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:368"
]
},
{
"call": "Text List (comma/space/newline separated)",
"key": "Text List (comma/space/newline separated)",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:384"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:448"
]
},
{
@@ -1413,6 +1449,27 @@
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:46"
]
},
{
"call": "The interval between connectivity tests",
"key": "The interval between connectivity tests",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:111"
]
},
{
"call": "The maximum difference in response times (ms) allowed when comparing servers",
"key": "The maximum difference in response times (ms) allowed when comparing servers",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:124"
]
},
{
"call": "The URL used to test server connectivity",
"key": "The URL used to test server connectivity",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:147"
]
},
{
"call": "Time in seconds for DNS record caching (default: 60)",
"key": "Time in seconds for DNS record caching (default: 60)",
@@ -1459,7 +1516,7 @@
"call": "UDP (Unprotected DNS)",
"key": "UDP (Unprotected DNS)",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:181",
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:245",
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:17"
]
},
@@ -1467,7 +1524,7 @@
"call": "UDP over TCP",
"key": "UDP over TCP",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:110"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:174"
]
},
{
@@ -1509,7 +1566,7 @@
"call": "URL must use one of the following protocols:",
"key": "URL must use one of the following protocols:",
"places": [
"src/validators/validateUrl.ts:13"
"src/validators/validateUrl.ts:17"
]
},
{
@@ -1519,6 +1576,13 @@
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:27"
]
},
{
"call": "URLTest Check Interval",
"key": "URLTest Check Interval",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:110"
]
},
{
"call": "URLTest Proxy Links",
"key": "URLTest Proxy Links",
@@ -1526,46 +1590,60 @@
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:87"
]
},
{
"call": "URLTest Testing URL",
"key": "URLTest Testing URL",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:146"
]
},
{
"call": "URLTest Tolerance",
"key": "URLTest Tolerance",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:123"
]
},
{
"call": "User Domain List Type",
"key": "User Domain List Type",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:299"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:363"
]
},
{
"call": "User Domains",
"key": "User Domains",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:311"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:375"
]
},
{
"call": "User Domains List",
"key": "User Domains List",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:337"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:401"
]
},
{
"call": "User Subnet List Type",
"key": "User Subnet List Type",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:379"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:443"
]
},
{
"call": "User Subnets",
"key": "User Subnets",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:391"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:455"
]
},
{
"call": "User Subnets List",
"key": "User Subnets List",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:417"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:481"
]
},
{
@@ -1583,7 +1661,7 @@
"src/validators/validateSocksUrl.ts:80",
"src/validators/validateSubnet.ts:38",
"src/validators/validateTrojanUrl.ts:59",
"src/validators/validateUrl.ts:16",
"src/validators/validateUrl.ts:28",
"src/validators/validateVlessUrl.ts:108"
]
},
@@ -1591,8 +1669,8 @@
"call": "Validation errors:",
"key": "Validation errors:",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:370",
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:449"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:434",
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:513"
]
},
{
@@ -1614,14 +1692,14 @@
"call": "Warning: %s cannot be used together with %s. Previous selections have been removed.",
"key": "Warning: %s cannot be used together with %s. Previous selections have been removed.",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:247"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:311"
]
},
{
"call": "Warning: Russia inside can only be used with %s. %s already in Russia inside and have been removed from selection.",
"key": "Warning: Russia inside can only be used with %s. %s already in Russia inside and have been removed from selection.",
"places": [
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:266"
"../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:330"
]
},
{

View File

@@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: PODKOP\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-10-26 12:56+0200\n"
"PO-Revision-Date: 2025-10-26 12:56+0200\n"
"POT-Creation-Date: 2025-10-27 11:06+0200\n"
"PO-Revision-Date: 2025-10-27 11:06+0200\n"
"Last-Translator: divocat <divocatt@gmail.com>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
@@ -40,15 +40,15 @@ msgstr ""
msgid "Additional marking rules found"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:111
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:175
msgid "Applicable for SOCKS and Shadowsocks proxy"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:356
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:420
msgid "At least one valid domain must be specified. Comments-only content is not allowed."
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:437
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:501
msgid "At least one valid subnet or IP must be specified. Comments-only content is not allowed."
msgstr ""
@@ -115,7 +115,7 @@ msgstr ""
msgid "Close"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:211
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:275
msgid "Community Lists"
msgstr ""
@@ -183,8 +183,8 @@ msgstr ""
msgid "Disable the QUIC protocol to improve compatibility or fix issues with video streaming"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:302
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:382
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:366
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:446
msgid "Disabled"
msgstr ""
@@ -192,17 +192,17 @@ msgstr ""
msgid "DNS on router"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:179
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:243
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:15
msgid "DNS over HTTPS (DoH)"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:180
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:244
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:16
msgid "DNS over TLS (DoT)"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:176
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:240
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:12
msgid "DNS Protocol Type"
msgstr ""
@@ -211,7 +211,7 @@ msgstr ""
msgid "DNS Rewrite TTL"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:189
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:253
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:24
msgid "DNS Server"
msgstr ""
@@ -224,7 +224,7 @@ msgstr ""
msgid "Do not panic, everything can be fixed, just..."
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:166
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:230
msgid "Domain Resolver"
msgstr ""
@@ -254,8 +254,8 @@ msgstr ""
msgid "Downloading all lists via specific Proxy/VPN"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:303
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:383
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:367
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:447
msgid "Dynamic List"
msgstr ""
@@ -263,11 +263,11 @@ msgstr ""
msgid "Enable autostart"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:167
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:231
msgid "Enable built-in DNS resolver for domains handled by this section"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:575
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:639
msgid "Enable Mixed Proxy"
msgstr ""
@@ -275,7 +275,7 @@ msgstr ""
msgid "Enable Output Network Interface"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:576
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:640
msgid "Enable the mixed proxy, allowing this section to route traffic through both HTTP and SOCKS proxies"
msgstr ""
@@ -287,18 +287,34 @@ msgstr ""
msgid "Enter complete outbound configuration in JSON format"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:338
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:402
msgid "Enter domain names separated by commas, spaces, or newlines. You can add comments using //"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:312
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:376
msgid "Enter domain names without protocols, e.g. example.com or sub.example.com"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:392
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:456
msgid "Enter subnets in CIDR notation (e.g. 103.21.244.0/22) or single IP addresses"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:114
msgid "Every 1 minute"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:115
msgid "Every 3 minutes"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:113
msgid "Every 30 seconds"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:116
msgid "Every 5 minutes"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:365
msgid "Exclude NTP"
msgstr ""
@@ -321,11 +337,11 @@ msgid "Failed to execute!"
msgstr ""
#: src/podkop/methods/custom/getDashboardSections.ts:117
#: src/podkop/tabs/diagnostic/checks/runSectionsCheck.ts:58
#: src/podkop/tabs/diagnostic/checks/runSectionsCheck.ts:59
msgid "Fastest"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:550
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:614
msgid "Fully Routed IPs"
msgstr ""
@@ -466,7 +482,8 @@ msgstr ""
msgid "Invalid Trojan URL: parsing failed"
msgstr ""
#: src/validators/validateUrl.ts:18
#: src/validators/validateUrl.ts:8
#: src/validators/validateUrl.ts:31
msgid "Invalid URL format"
msgstr ""
@@ -490,11 +507,11 @@ msgstr ""
msgid "List Update Frequency"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:458
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:522
msgid "Local Domain Lists"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:481
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:545
msgid "Local Subnet Lists"
msgstr ""
@@ -506,7 +523,7 @@ msgstr ""
msgid "Memory Usage"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:586
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:650
msgid "Mixed Proxy Port"
msgstr ""
@@ -514,7 +531,11 @@ msgstr ""
msgid "Monitored Interfaces"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:120
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:140
msgid "Must be a number in the range of 50 - 1000"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:184
msgid "Network Interface"
msgstr ""
@@ -526,9 +547,9 @@ msgstr ""
msgid "Not implement yet"
msgstr ""
#: src/podkop/tabs/diagnostic/checks/runSectionsCheck.ts:74
#: src/podkop/tabs/diagnostic/checks/runSectionsCheck.ts:80
#: src/podkop/tabs/diagnostic/checks/runSectionsCheck.ts:99
#: src/podkop/tabs/diagnostic/checks/runSectionsCheck.ts:75
#: src/podkop/tabs/diagnostic/checks/runSectionsCheck.ts:81
#: src/podkop/tabs/diagnostic/checks/runSectionsCheck.ts:100
msgid "Not responding"
msgstr ""
@@ -608,15 +629,15 @@ msgstr ""
msgid "Proxy traffic is routed via FakeIP"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:245
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:309
msgid "Regional options cannot be used together"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:504
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:568
msgid "Remote Domain Lists"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:527
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:591
msgid "Remote Subnet Lists"
msgstr ""
@@ -664,7 +685,7 @@ msgstr ""
msgid "Run Diagnostic"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:264
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:328
msgid "Russia inside restrictions"
msgstr ""
@@ -672,7 +693,7 @@ msgstr ""
msgid "Sections"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:212
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:276
msgid "Select a predefined list for routing"
msgstr ""
@@ -692,11 +713,11 @@ msgstr ""
msgid "Select how to configure the proxy"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:121
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:185
msgid "Select network interface for VPN connection"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:190
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:254
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:25
msgid "Select or enter DNS server address"
msgstr ""
@@ -709,15 +730,15 @@ msgstr ""
msgid "Select path for sing-box config file. Change this ONLY if you know what you are doing"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:177
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:241
msgid "Select the DNS protocol type for the domain resolver"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:300
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:364
msgid "Select the list type for adding custom domains"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:380
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:444
msgid "Select the list type for adding custom subnets"
msgstr ""
@@ -782,20 +803,20 @@ msgstr ""
msgid "Specify a local IP address to be excluded from routing"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:551
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:615
msgid "Specify local IP addresses or subnets whose traffic will always be routed through the configured route"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:505
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:569
msgid "Specify remote URLs to download and use domain lists"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:528
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:592
msgid "Specify remote URLs to download and use subnet lists"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:459
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:482
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:523
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:546
msgid "Specify the path to the list file located on the router filesystem"
msgstr ""
@@ -827,11 +848,11 @@ msgstr ""
msgid "Test latency"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:304
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:368
msgid "Text List"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:384
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:448
msgid "Text List (comma/space/newline separated)"
msgstr ""
@@ -839,6 +860,18 @@ msgstr ""
msgid "The DNS server used to look up the IP address of an upstream DNS server"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:111
msgid "The interval between connectivity tests"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:124
msgid "The maximum difference in response times (ms) allowed when comparing servers"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:147
msgid "The URL used to test server connectivity"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:69
msgid "Time in seconds for DNS record caching (default: 60)"
msgstr ""
@@ -863,12 +896,12 @@ msgstr ""
msgid "TTL value cannot be empty"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:181
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:245
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:17
msgid "UDP (Unprotected DNS)"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:110
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:174
msgid "UDP over TCP"
msgstr ""
@@ -895,7 +928,7 @@ msgstr ""
msgid "URL must start with vless://, ss://, trojan://, or socks4/5://"
msgstr ""
#: src/validators/validateUrl.ts:13
#: src/validators/validateUrl.ts:17
msgid "URL must use one of the following protocols:"
msgstr ""
@@ -903,31 +936,43 @@ msgstr ""
msgid "URLTest"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:110
msgid "URLTest Check Interval"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:87
msgid "URLTest Proxy Links"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:299
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:146
msgid "URLTest Testing URL"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:123
msgid "URLTest Tolerance"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:363
msgid "User Domain List Type"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:311
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:375
msgid "User Domains"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:337
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:401
msgid "User Domains List"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:379
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:443
msgid "User Subnet List Type"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:391
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:455
msgid "User Subnets"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:417
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:481
msgid "User Subnets List"
msgstr ""
@@ -942,13 +987,13 @@ msgstr ""
#: src/validators/validateSocksUrl.ts:80
#: src/validators/validateSubnet.ts:38
#: src/validators/validateTrojanUrl.ts:59
#: src/validators/validateUrl.ts:16
#: src/validators/validateUrl.ts:28
#: src/validators/validateVlessUrl.ts:108
msgid "Valid"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:370
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:449
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:434
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:513
msgid "Validation errors:"
msgstr ""
@@ -961,11 +1006,11 @@ msgstr ""
msgid "Visit Wiki"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:247
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:311
msgid "Warning: %s cannot be used together with %s. Previous selections have been removed."
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:266
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:330
msgid "Warning: Russia inside can only be used with %s. %s already in Russia inside and have been removed from selection."
msgstr ""

View File

@@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: PODKOP\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-10-26 14:56+0200\n"
"PO-Revision-Date: 2025-10-26 14:56+0200\n"
"POT-Creation-Date: 2025-10-27 13:06+0200\n"
"PO-Revision-Date: 2025-10-27 13:06+0200\n"
"Last-Translator: divocat\n"
"Language-Team: none\n"
"Language: ru\n"
@@ -218,6 +218,18 @@ msgstr "Введите доменные имена без протоколов,
msgid "Enter subnets in CIDR notation (e.g. 103.21.244.0/22) or single IP addresses"
msgstr "Введите подсети в нотации CIDR (например, 103.21.244.0/22) или отдельные IP-адреса"
msgid "Every 1 minute"
msgstr "Каждую минуту"
msgid "Every 3 minutes"
msgstr "каждые 3 минуты"
msgid "Every 30 seconds"
msgstr "Каждые 30 секунд"
msgid "Every 5 minutes"
msgstr "Каждые 5 минут"
msgid "Exclude NTP"
msgstr "Исключить NTP"
@@ -374,6 +386,9 @@ msgstr "Порт смешанного прокси"
msgid "Monitored Interfaces"
msgstr "Наблюдаемые интерфейсы"
msgid "Must be a number in the range of 50 - 1000"
msgstr "Должно быть числом от 50 до 1000"
msgid "Network Interface"
msgstr "Сетевой интерфейс"
@@ -608,6 +623,15 @@ msgstr "Текстовый список (через запятую, пробел
msgid "The DNS server used to look up the IP address of an upstream DNS server"
msgstr "DNS-сервер, используемый для поиска IP-адреса вышестоящего DNS-сервера"
msgid "The interval between connectivity tests"
msgstr "Интервал между тестами подключения"
msgid "The maximum difference in response times (ms) allowed when comparing servers"
msgstr "Максимально допустимая разница во времени отклика (мс) при сравнении серверов"
msgid "The URL used to test server connectivity"
msgstr "URL-адрес, используемый для проверки подключения к серверу"
msgid "Time in seconds for DNS record caching (default: 60)"
msgstr "Время в секундах для кэширования DNS записей (по умолчанию: 60)"
@@ -650,9 +674,18 @@ msgstr "URL должен использовать один из следующи
msgid "URLTest"
msgstr "URLTest"
msgid "URLTest Check Interval"
msgstr "Интервал проверки URLTest"
msgid "URLTest Proxy Links"
msgstr "Ссылки прокси для URLTest"
msgid "URLTest Testing URL"
msgstr "URLTest ссылка для проверки"
msgid "URLTest Tolerance"
msgstr "URLTest допустимое отклонение"
msgid "User Domain List Type"
msgstr "Тип пользовательского списка доменов"

View File

@@ -16,6 +16,7 @@ const invalidUrls = [
['Unsupported protocol (ftp)', 'ftp://example.com'],
['Unsupported protocol (ws)', 'ws://example.com'],
['Empty string', ''],
['Without tld', 'https://google'],
];
describe('validateUrl', () => {

View File

@@ -2,19 +2,31 @@ import { ValidationResult } from './types';
export function validateUrl(
url: string,
protocols: string[] = ['http:', 'https:'],
protocols = ['http:', 'https:'],
): ValidationResult {
try {
const parsedUrl = new URL(url);
if (!protocols.includes(parsedUrl.protocol)) {
return {
valid: false,
message: `${_('URL must use one of the following protocols:')} ${protocols.join(', ')}`,
};
}
return { valid: true, message: _('Valid') };
} catch (_e) {
if (!url.length) {
return { valid: false, message: _('Invalid URL format') };
}
const hasValidProtocol = protocols.some((p) => url.indexOf(p + '//') === 0);
if (!hasValidProtocol)
return {
valid: false,
message:
_('URL must use one of the following protocols:') +
' ' +
protocols.join(', '),
};
const regex = new RegExp(
`^(?:${protocols.map((p) => p.replace(':', '')).join('|')})://` +
`(?:[A-Za-z0-9-]+\\.)+[A-Za-z]{2,}(?::\\d+)?(?:/[^\\s]*)?$`,
);
if (regex.test(url)) {
return { valid: true, message: _('Valid') };
}
return { valid: false, message: _('Invalid URL format') };
}