feat(relay): Add relay mode configuration and update related schemas

This commit is contained in:
web@ppanel 2024-12-30 17:28:24 +07:00
parent c44ad47f3c
commit 3cc94773ef
32 changed files with 346 additions and 111 deletions

View File

@ -92,9 +92,17 @@ const baseFormSchema = z.object({
speed_limit: z.number().nullish(), speed_limit: z.number().nullish(),
traffic_ratio: z.number().default(1), traffic_ratio: z.number().default(1),
group_id: z.number().nullish(), group_id: z.number().nullish(),
enable_relay: z.boolean().nullish().default(false), relay_mode: z.string().nullish().default('none'),
relay_host: nullableString, relay_node: z
relay_port: portSchema, .array(
z.object({
host: z.string(),
port: portSchema,
prefix: z.string().nullish(),
}),
)
.nullish()
.default([]),
}); });
export const formSchema = z.intersection(baseFormSchema, protocolConfigSchema); export const formSchema = z.intersection(baseFormSchema, protocolConfigSchema);

View File

@ -33,6 +33,7 @@ import {
import { Switch } from '@workspace/ui/components/switch'; import { Switch } from '@workspace/ui/components/switch';
import { Tabs, TabsList, TabsTrigger } from '@workspace/ui/components/tabs'; import { Tabs, TabsList, TabsTrigger } from '@workspace/ui/components/tabs';
import { Combobox } from '@workspace/ui/custom-components/combobox'; import { Combobox } from '@workspace/ui/custom-components/combobox';
import { ArrayInput } from '@workspace/ui/custom-components/dynamic-Inputs';
import { EnhancedInput } from '@workspace/ui/custom-components/enhanced-input'; import { EnhancedInput } from '@workspace/ui/custom-components/enhanced-input';
import { cn } from '@workspace/ui/lib/utils'; import { cn } from '@workspace/ui/lib/utils';
import { unitConversion } from '@workspace/ui/utils'; import { unitConversion } from '@workspace/ui/utils';
@ -75,6 +76,7 @@ export default function NodeForm<T extends { [x: string]: any }>({
const protocol = form.watch('protocol'); const protocol = form.watch('protocol');
const transport = form.watch('config.transport'); const transport = form.watch('config.transport');
const security = form.watch('config.security'); const security = form.watch('config.security');
const relayMode = form.watch('relay_mode');
useEffect(() => { useEffect(() => {
form?.reset(initialValues); form?.reset(initialValues);
@ -105,7 +107,7 @@ export default function NodeForm<T extends { [x: string]: any }>({
{trigger} {trigger}
</Button> </Button>
</SheetTrigger> </SheetTrigger>
<SheetContent className='w-[500px] max-w-full md:max-w-screen-md'> <SheetContent className='w-[520px] max-w-full md:max-w-screen-md'>
<SheetHeader> <SheetHeader>
<SheetTitle>{title}</SheetTitle> <SheetTitle>{title}</SheetTitle>
</SheetHeader> </SheetHeader>
@ -214,65 +216,6 @@ export default function NodeForm<T extends { [x: string]: any }>({
</FormItem> </FormItem>
)} )}
/> />
<FormField
control={form.control}
name='enable_relay'
render={({ field }) => (
<FormItem>
<FormLabel>{t('form.enableRelay')}</FormLabel>
<FormControl>
<div className='pt-2'>
<Switch
checked={!!field.value}
onCheckedChange={(value) => {
form.setValue(field.name, value);
}}
/>
</div>
</FormControl>
<FormMessage />
</FormItem>
)}
/>
<FormField
control={form.control}
name='relay_host'
render={({ field }) => (
<FormItem>
<FormLabel>{t('form.relayHost')}</FormLabel>
<FormControl>
<EnhancedInput
{...field}
onValueChange={(value) => {
form.setValue(field.name, value);
}}
/>
</FormControl>
<FormMessage />
</FormItem>
)}
/>
<FormField
control={form.control}
name='relay_port'
render={({ field }) => (
<FormItem>
<FormLabel>{t('form.relayPort')}</FormLabel>
<FormControl>
<EnhancedInput
{...field}
type='number'
min={1}
max={65535}
onValueChange={(value) => {
form.setValue(field.name, value);
}}
/>
</FormControl>
<FormMessage />
</FormItem>
)}
/>
</div> </div>
<FormField <FormField
@ -358,6 +301,7 @@ export default function NodeForm<T extends { [x: string]: any }>({
<EnhancedInput <EnhancedInput
{...field} {...field}
type='number' type='number'
placeholder='1-65535'
min={1} min={1}
max={65535} max={65535}
onValueChange={(value) => { onValueChange={(value) => {
@ -389,6 +333,7 @@ export default function NodeForm<T extends { [x: string]: any }>({
<EnhancedInput <EnhancedInput
{...field} {...field}
type='number' type='number'
placeholder='1-65535'
onValueChange={(value) => { onValueChange={(value) => {
form.setValue(field.name, value); form.setValue(field.name, value);
}} }}
@ -499,7 +444,7 @@ export default function NodeForm<T extends { [x: string]: any }>({
control={form.control} control={form.control}
name='config.transport' name='config.transport'
render={({ field }) => ( render={({ field }) => (
<FormItem className='min-w-32'> <FormItem className='!mt-0 min-w-32'>
<FormControl> <FormControl>
<Select <Select
value={field.value} value={field.value}
@ -603,7 +548,7 @@ export default function NodeForm<T extends { [x: string]: any }>({
control={form.control} control={form.control}
name='config.security' name='config.security'
render={({ field }) => ( render={({ field }) => (
<FormItem className='min-w-32'> <FormItem className='!mt-0 min-w-32'>
<Select <Select
value={field.value} value={field.value}
onValueChange={(value) => { onValueChange={(value) => {
@ -814,6 +759,84 @@ export default function NodeForm<T extends { [x: string]: any }>({
</Card> </Card>
</div> </div>
)} )}
<Card>
<CardHeader className='flex flex-row items-center justify-between p-3'>
<CardTitle>{t('form.relayMode')}</CardTitle>
<FormField
control={form.control}
name='relay_mode'
render={({ field }) => (
<FormItem className='!mt-0 min-w-32'>
<FormControl>
<Select
value={field.value}
onValueChange={(value) => {
form.setValue(field.name, value);
}}
>
<FormControl>
<SelectTrigger>
<SelectValue placeholder={t('form.selectRelayMode')} />
</SelectTrigger>
</FormControl>
<SelectContent>
<SelectItem value='none'>
{t('form.relayModeOptions.none')}
</SelectItem>
<SelectItem value='all'>{t('form.relayModeOptions.all')}</SelectItem>
<SelectItem value='random'>
{t('form.relayModeOptions.random')}
</SelectItem>
</SelectContent>
</Select>
</FormControl>
<FormMessage />
</FormItem>
)}
/>
</CardHeader>
{relayMode !== 'none' && (
<CardContent className='w-full space-y-3 px-3'>
<FormField
control={form.control}
name='relay_node'
render={({ field }) => (
<FormItem>
<FormControl>
<ArrayInput
fields={[
{
name: 'host',
type: 'text',
placeholder: t('form.relayHost'),
},
{
name: 'port',
type: 'number',
min: 1,
max: 65535,
placeholder: t('form.relayPort'),
},
{
name: 'prefix',
type: 'text',
placeholder: t('form.relayPrefix'),
},
]}
value={field.value}
onChange={(value) => {
form.setValue(field.name, value);
}}
/>
</FormControl>
<FormMessage />
</FormItem>
)}
/>
</CardContent>
)}
</Card>
</form> </form>
</Form> </Form>
</ScrollArea> </ScrollArea>

View File

@ -177,7 +177,7 @@ export default function Node() {
</Table> </Table>
<div className='flex flex-col-reverse gap-8 px-4 pt-6 md:flex-row md:items-start'> <div className='flex flex-col-reverse gap-8 px-4 pt-6 md:flex-row md:items-start'>
<div className='w-full md:w-1/2'> <div className='w-full md:w-1/2'>
<ChartContainer config={chartConfig} className='mx-auto aspect-square max-w-[400px]'> <ChartContainer config={chartConfig} className='mx-auto aspect-[4/3] max-w-[400px]'>
<PieChart> <PieChart>
<Pie <Pie
data={chartTimeSlots} data={chartTimeSlots}

View File

@ -49,7 +49,6 @@
"confirm": "Potvrdit", "confirm": "Potvrdit",
"edit": "Upravit", "edit": "Upravit",
"editSecurity": "Upravit nastavení zabezpečení", "editSecurity": "Upravit nastavení zabezpečení",
"enableRelay": "Povolit přenos",
"enableTLS": "Povolit TLS", "enableTLS": "Povolit TLS",
"encryptionMethod": "Metoda šifrování", "encryptionMethod": "Metoda šifrování",
"flow": "Algoritmus řízení toku", "flow": "Algoritmus řízení toku",
@ -65,7 +64,14 @@
"port": "Port služby", "port": "Port služby",
"protocol": "Protokol", "protocol": "Protokol",
"relayHost": "Adresa přenosu", "relayHost": "Adresa přenosu",
"relayMode": "Režim relé",
"relayModeOptions": {
"all": "Vše",
"none": "Žádný",
"random": "Náhodný"
},
"relayPort": "Port přenosu", "relayPort": "Port přenosu",
"relayPrefix": "Předpona relé",
"remarks": "Poznámky", "remarks": "Poznámky",
"security": "Zabezpečení", "security": "Zabezpečení",
"securityConfig": "Nastavení zabezpečení", "securityConfig": "Nastavení zabezpečení",
@ -88,6 +94,7 @@
"selectEncryptionMethod": "Vyberte metodu šifrování", "selectEncryptionMethod": "Vyberte metodu šifrování",
"selectNodeGroup": "Vyberte skupinu uzlů", "selectNodeGroup": "Vyberte skupinu uzlů",
"selectProtocol": "Vyberte protokol", "selectProtocol": "Vyberte protokol",
"selectRelayMode": "Vyberte režim relé",
"serverAddr": "Adresa serveru", "serverAddr": "Adresa serveru",
"serverName": "Název služby", "serverName": "Název služby",
"speedLimit": "Omezení rychlosti", "speedLimit": "Omezení rychlosti",

View File

@ -49,7 +49,6 @@
"confirm": "Bestätigen", "confirm": "Bestätigen",
"edit": "Bearbeiten", "edit": "Bearbeiten",
"editSecurity": "Sicherheitskonfiguration bearbeiten", "editSecurity": "Sicherheitskonfiguration bearbeiten",
"enableRelay": "Relay aktivieren",
"enableTLS": "TLS aktivieren", "enableTLS": "TLS aktivieren",
"encryptionMethod": "Verschlüsselungsmethode", "encryptionMethod": "Verschlüsselungsmethode",
"flow": "Flusskontrollalgorithmus", "flow": "Flusskontrollalgorithmus",
@ -65,7 +64,14 @@
"port": "Serverport", "port": "Serverport",
"protocol": "Protokoll", "protocol": "Protokoll",
"relayHost": "Relay-Adresse", "relayHost": "Relay-Adresse",
"relayMode": "Relaismodus",
"relayModeOptions": {
"all": "Alle",
"none": "Keine",
"random": "Zufällig"
},
"relayPort": "Relay-Port", "relayPort": "Relay-Port",
"relayPrefix": "Relaispräfix",
"remarks": "Bemerkungen", "remarks": "Bemerkungen",
"security": "Sicherheit", "security": "Sicherheit",
"securityConfig": "Sicherheitskonfiguration", "securityConfig": "Sicherheitskonfiguration",
@ -88,6 +94,7 @@
"selectEncryptionMethod": "Verschlüsselungsmethode auswählen", "selectEncryptionMethod": "Verschlüsselungsmethode auswählen",
"selectNodeGroup": "Knotengruppe auswählen", "selectNodeGroup": "Knotengruppe auswählen",
"selectProtocol": "Protokoll auswählen", "selectProtocol": "Protokoll auswählen",
"selectRelayMode": "Relaismodus auswählen",
"serverAddr": "Serveradresse", "serverAddr": "Serveradresse",
"serverName": "Dienstname", "serverName": "Dienstname",
"speedLimit": "Geschwindigkeitsbegrenzung", "speedLimit": "Geschwindigkeitsbegrenzung",

View File

@ -49,7 +49,6 @@
"confirm": "Confirm", "confirm": "Confirm",
"edit": "Edit", "edit": "Edit",
"editSecurity": "Edit Security Configuration", "editSecurity": "Edit Security Configuration",
"enableRelay": "Enable Relay",
"enableTLS": "Enable TLS", "enableTLS": "Enable TLS",
"encryptionMethod": "Encryption Method", "encryptionMethod": "Encryption Method",
"flow": "Flow Control Algorithm", "flow": "Flow Control Algorithm",
@ -62,10 +61,18 @@
"obfsPasswordPlaceholder": "Leave blank for no obfuscation", "obfsPasswordPlaceholder": "Leave blank for no obfuscation",
"path": "Path", "path": "Path",
"pleaseSelect": "Please Select", "pleaseSelect": "Please Select",
"selectRelayMode": "Select Relay Mode",
"relayModeOptions": {
"none": "None",
"all": "All",
"random": "Random"
},
"port": "Server Port", "port": "Server Port",
"protocol": "Protocol", "protocol": "Protocol",
"relayMode": "Relay Mode",
"relayHost": "Relay Host", "relayHost": "Relay Host",
"relayPort": "Relay Port", "relayPort": "Relay Port",
"relayPrefix": "Relay Prefix",
"remarks": "Remarks", "remarks": "Remarks",
"security": "Security", "security": "Security",
"securityConfig": "Security Configuration", "securityConfig": "Security Configuration",

View File

@ -49,7 +49,6 @@
"confirm": "Confirmar", "confirm": "Confirmar",
"edit": "Editar", "edit": "Editar",
"editSecurity": "Editar configuración de seguridad", "editSecurity": "Editar configuración de seguridad",
"enableRelay": "Habilitar retransmisión",
"enableTLS": "Habilitar TLS", "enableTLS": "Habilitar TLS",
"encryptionMethod": "Método de encriptación", "encryptionMethod": "Método de encriptación",
"flow": "Algoritmo de control de flujo", "flow": "Algoritmo de control de flujo",
@ -65,7 +64,14 @@
"port": "Puerto del servidor", "port": "Puerto del servidor",
"protocol": "Protocolo", "protocol": "Protocolo",
"relayHost": "Dirección de retransmisión", "relayHost": "Dirección de retransmisión",
"relayMode": "Modo de retransmisión",
"relayModeOptions": {
"all": "Todos",
"none": "Ninguno",
"random": "Aleatorio"
},
"relayPort": "Puerto de retransmisión", "relayPort": "Puerto de retransmisión",
"relayPrefix": "Prefijo de retransmisión",
"remarks": "Observaciones", "remarks": "Observaciones",
"security": "Seguridad", "security": "Seguridad",
"securityConfig": "Configuración de seguridad", "securityConfig": "Configuración de seguridad",
@ -88,6 +94,7 @@
"selectEncryptionMethod": "Seleccionar método de encriptación", "selectEncryptionMethod": "Seleccionar método de encriptación",
"selectNodeGroup": "Seleccionar grupo de nodos", "selectNodeGroup": "Seleccionar grupo de nodos",
"selectProtocol": "Seleccionar protocolo", "selectProtocol": "Seleccionar protocolo",
"selectRelayMode": "Seleccionar modo de retransmisión",
"serverAddr": "Dirección del servidor", "serverAddr": "Dirección del servidor",
"serverName": "Nombre del servicio", "serverName": "Nombre del servicio",
"speedLimit": "Límite de velocidad", "speedLimit": "Límite de velocidad",

View File

@ -49,7 +49,6 @@
"confirm": "Confirmar", "confirm": "Confirmar",
"edit": "Editar", "edit": "Editar",
"editSecurity": "Editar configuración de seguridad", "editSecurity": "Editar configuración de seguridad",
"enableRelay": "Habilitar retransmisión",
"enableTLS": "Habilitar TLS", "enableTLS": "Habilitar TLS",
"encryptionMethod": "Método de encriptación", "encryptionMethod": "Método de encriptación",
"flow": "Algoritmo de control de flujo", "flow": "Algoritmo de control de flujo",
@ -65,7 +64,14 @@
"port": "Puerto del servidor", "port": "Puerto del servidor",
"protocol": "Protocolo", "protocol": "Protocolo",
"relayHost": "Dirección de retransmisión", "relayHost": "Dirección de retransmisión",
"relayMode": "Modo de retransmisión",
"relayModeOptions": {
"all": "Todos",
"none": "Ninguno",
"random": "Aleatorio"
},
"relayPort": "Puerto de retransmisión", "relayPort": "Puerto de retransmisión",
"relayPrefix": "Prefijo de retransmisión",
"remarks": "Comentarios", "remarks": "Comentarios",
"security": "Seguridad", "security": "Seguridad",
"securityConfig": "Configuración de seguridad", "securityConfig": "Configuración de seguridad",
@ -88,6 +94,7 @@
"selectEncryptionMethod": "Seleccionar método de encriptación", "selectEncryptionMethod": "Seleccionar método de encriptación",
"selectNodeGroup": "Seleccionar grupo de nodos", "selectNodeGroup": "Seleccionar grupo de nodos",
"selectProtocol": "Seleccionar protocolo", "selectProtocol": "Seleccionar protocolo",
"selectRelayMode": "Seleccionar modo de retransmisión",
"serverAddr": "Dirección del servidor", "serverAddr": "Dirección del servidor",
"serverName": "Nombre del servicio", "serverName": "Nombre del servicio",
"speedLimit": "Límite de velocidad", "speedLimit": "Límite de velocidad",

View File

@ -49,7 +49,6 @@
"confirm": "تأیید", "confirm": "تأیید",
"edit": "ویرایش", "edit": "ویرایش",
"editSecurity": "ویرایش تنظیمات امنیتی", "editSecurity": "ویرایش تنظیمات امنیتی",
"enableRelay": "فعال‌سازی رله",
"enableTLS": "فعال‌سازی TLS", "enableTLS": "فعال‌سازی TLS",
"encryptionMethod": "روش رمزنگاری", "encryptionMethod": "روش رمزنگاری",
"flow": "الگوریتم کنترل جریان", "flow": "الگوریتم کنترل جریان",
@ -65,7 +64,14 @@
"port": "پورت سرور", "port": "پورت سرور",
"protocol": "پروتکل", "protocol": "پروتکل",
"relayHost": "میزبان رله", "relayHost": "میزبان رله",
"relayMode": "حالت رله",
"relayModeOptions": {
"all": "همه",
"none": "هیچ‌کدام",
"random": "تصادفی"
},
"relayPort": "پورت رله", "relayPort": "پورت رله",
"relayPrefix": "پیشوند رله",
"remarks": "توضیحات", "remarks": "توضیحات",
"security": "امنیت", "security": "امنیت",
"securityConfig": "پیکربندی امنیتی", "securityConfig": "پیکربندی امنیتی",
@ -88,6 +94,7 @@
"selectEncryptionMethod": "انتخاب روش رمزنگاری", "selectEncryptionMethod": "انتخاب روش رمزنگاری",
"selectNodeGroup": "انتخاب گروه گره", "selectNodeGroup": "انتخاب گروه گره",
"selectProtocol": "انتخاب پروتکل", "selectProtocol": "انتخاب پروتکل",
"selectRelayMode": "انتخاب حالت رله",
"serverAddr": "آدرس سرور", "serverAddr": "آدرس سرور",
"serverName": "نام سرویس", "serverName": "نام سرویس",
"speedLimit": "محدودیت سرعت", "speedLimit": "محدودیت سرعت",

View File

@ -49,7 +49,6 @@
"confirm": "Vahvista", "confirm": "Vahvista",
"edit": "Muokkaa", "edit": "Muokkaa",
"editSecurity": "Muokkaa suojausasetuksia", "editSecurity": "Muokkaa suojausasetuksia",
"enableRelay": "Ota välitys käyttöön",
"enableTLS": "Ota TLS käyttöön", "enableTLS": "Ota TLS käyttöön",
"encryptionMethod": "Salausmenetelmä", "encryptionMethod": "Salausmenetelmä",
"flow": "Virtausalgoritmi", "flow": "Virtausalgoritmi",
@ -65,7 +64,14 @@
"port": "Palvelinportti", "port": "Palvelinportti",
"protocol": "Protokolla", "protocol": "Protokolla",
"relayHost": "Välityksen osoite", "relayHost": "Välityksen osoite",
"relayMode": "Välitystila",
"relayModeOptions": {
"all": "Kaikki",
"none": "Ei mitään",
"random": "Satunnainen"
},
"relayPort": "Välityksen portti", "relayPort": "Välityksen portti",
"relayPrefix": "Välitys etuliite",
"remarks": "Huomautukset", "remarks": "Huomautukset",
"security": "Turvallisuus", "security": "Turvallisuus",
"securityConfig": "Turvallisuusasetukset", "securityConfig": "Turvallisuusasetukset",
@ -88,6 +94,7 @@
"selectEncryptionMethod": "Valitse salausmenetelmä", "selectEncryptionMethod": "Valitse salausmenetelmä",
"selectNodeGroup": "Valitse solmuryhmä", "selectNodeGroup": "Valitse solmuryhmä",
"selectProtocol": "Valitse protokolla", "selectProtocol": "Valitse protokolla",
"selectRelayMode": "Valitse välitystila",
"serverAddr": "Palvelimen osoite", "serverAddr": "Palvelimen osoite",
"serverName": "Palvelimen nimi", "serverName": "Palvelimen nimi",
"speedLimit": "Nopeusrajoitus", "speedLimit": "Nopeusrajoitus",

View File

@ -49,7 +49,6 @@
"confirm": "Confirmer", "confirm": "Confirmer",
"edit": "Éditer", "edit": "Éditer",
"editSecurity": "Éditer la configuration de sécurité", "editSecurity": "Éditer la configuration de sécurité",
"enableRelay": "Activer le relais",
"enableTLS": "Activer TLS", "enableTLS": "Activer TLS",
"encryptionMethod": "Méthode de cryptage", "encryptionMethod": "Méthode de cryptage",
"flow": "Algorithme de contrôle de flux", "flow": "Algorithme de contrôle de flux",
@ -65,7 +64,14 @@
"port": "Port de service", "port": "Port de service",
"protocol": "Protocole", "protocol": "Protocole",
"relayHost": "Adresse de relais", "relayHost": "Adresse de relais",
"relayMode": "Mode relais",
"relayModeOptions": {
"all": "Tous",
"none": "Aucun",
"random": "Aléatoire"
},
"relayPort": "Port de relais", "relayPort": "Port de relais",
"relayPrefix": "Préfixe relais",
"remarks": "Remarques", "remarks": "Remarques",
"security": "Sécurité", "security": "Sécurité",
"securityConfig": "Configuration de sécurité", "securityConfig": "Configuration de sécurité",
@ -88,6 +94,7 @@
"selectEncryptionMethod": "Sélectionner la méthode de cryptage", "selectEncryptionMethod": "Sélectionner la méthode de cryptage",
"selectNodeGroup": "Sélectionner le groupe de nœuds", "selectNodeGroup": "Sélectionner le groupe de nœuds",
"selectProtocol": "Sélectionner le protocole", "selectProtocol": "Sélectionner le protocole",
"selectRelayMode": "Sélectionner le mode relais",
"serverAddr": "Adresse du serveur", "serverAddr": "Adresse du serveur",
"serverName": "Nom du service", "serverName": "Nom du service",
"speedLimit": "Limite de vitesse", "speedLimit": "Limite de vitesse",

View File

@ -49,7 +49,6 @@
"confirm": "पुष्टि करें", "confirm": "पुष्टि करें",
"edit": "संपादित करें", "edit": "संपादित करें",
"editSecurity": "सुरक्षा कॉन्फ़िगरेशन संपादित करें", "editSecurity": "सुरक्षा कॉन्फ़िगरेशन संपादित करें",
"enableRelay": "रिले सक्षम करें",
"enableTLS": "TLS सक्षम करें", "enableTLS": "TLS सक्षम करें",
"encryptionMethod": "एन्क्रिप्शन विधि", "encryptionMethod": "एन्क्रिप्शन विधि",
"flow": "फ्लो कंट्रोल एल्गोरिदम", "flow": "फ्लो कंट्रोल एल्गोरिदम",
@ -65,7 +64,14 @@
"port": "सर्वर पोर्ट", "port": "सर्वर पोर्ट",
"protocol": "प्रोटोकॉल", "protocol": "प्रोटोकॉल",
"relayHost": "रिले पता", "relayHost": "रिले पता",
"relayMode": "रिले मोड",
"relayModeOptions": {
"all": "सभी",
"none": "कोई नहीं",
"random": "यादृच्छिक"
},
"relayPort": "रिले पोर्ट", "relayPort": "रिले पोर्ट",
"relayPrefix": "रिले उपसर्ग",
"remarks": "टिप्पणियाँ", "remarks": "टिप्पणियाँ",
"security": "सुरक्षा", "security": "सुरक्षा",
"securityConfig": "सुरक्षा कॉन्फ़िगरेशन", "securityConfig": "सुरक्षा कॉन्फ़िगरेशन",
@ -88,6 +94,7 @@
"selectEncryptionMethod": "एन्क्रिप्शन विधि चुनें", "selectEncryptionMethod": "एन्क्रिप्शन विधि चुनें",
"selectNodeGroup": "नोड समूह चुनें", "selectNodeGroup": "नोड समूह चुनें",
"selectProtocol": "प्रोटोकॉल चुनें", "selectProtocol": "प्रोटोकॉल चुनें",
"selectRelayMode": "रिले मोड चुनें",
"serverAddr": "सर्वर पता", "serverAddr": "सर्वर पता",
"serverName": "सेवा नाम", "serverName": "सेवा नाम",
"speedLimit": "गति सीमा", "speedLimit": "गति सीमा",

View File

@ -49,7 +49,6 @@
"confirm": "Megerősít", "confirm": "Megerősít",
"edit": "Szerkesztés", "edit": "Szerkesztés",
"editSecurity": "Biztonsági beállítások szerkesztése", "editSecurity": "Biztonsági beállítások szerkesztése",
"enableRelay": "Átjátszás engedélyezése",
"enableTLS": "TLS engedélyezése", "enableTLS": "TLS engedélyezése",
"encryptionMethod": "Titkosítási módszer", "encryptionMethod": "Titkosítási módszer",
"flow": "Áramlásszabályozási algoritmus", "flow": "Áramlásszabályozási algoritmus",
@ -65,7 +64,14 @@
"port": "Szolgáltatási port", "port": "Szolgáltatási port",
"protocol": "Protokoll", "protocol": "Protokoll",
"relayHost": "Átjátszó cím", "relayHost": "Átjátszó cím",
"relayMode": "Relé mód",
"relayModeOptions": {
"all": "Összes",
"none": "Nincs",
"random": "Véletlenszerű"
},
"relayPort": "Átjátszó port", "relayPort": "Átjátszó port",
"relayPrefix": "Relé előtag",
"remarks": "Megjegyzések", "remarks": "Megjegyzések",
"security": "Biztonság", "security": "Biztonság",
"securityConfig": "Biztonsági beállítások", "securityConfig": "Biztonsági beállítások",
@ -88,6 +94,7 @@
"selectEncryptionMethod": "Válasszon titkosítási módszert", "selectEncryptionMethod": "Válasszon titkosítási módszert",
"selectNodeGroup": "Válasszon csomópont csoportot", "selectNodeGroup": "Válasszon csomópont csoportot",
"selectProtocol": "Válasszon protokollt", "selectProtocol": "Válasszon protokollt",
"selectRelayMode": "Válassza ki a relé módot",
"serverAddr": "Szerver cím", "serverAddr": "Szerver cím",
"serverName": "Szolgáltatás neve", "serverName": "Szolgáltatás neve",
"speedLimit": "Sebességkorlátozás", "speedLimit": "Sebességkorlátozás",

View File

@ -49,7 +49,6 @@
"confirm": "確認", "confirm": "確認",
"edit": "編集", "edit": "編集",
"editSecurity": "セキュリティ設定を編集", "editSecurity": "セキュリティ設定を編集",
"enableRelay": "リレーを有効化",
"enableTLS": "TLSを有効化", "enableTLS": "TLSを有効化",
"encryptionMethod": "暗号化方式", "encryptionMethod": "暗号化方式",
"flow": "フロー制御アルゴリズム", "flow": "フロー制御アルゴリズム",
@ -65,7 +64,14 @@
"port": "サーバーポート", "port": "サーバーポート",
"protocol": "プロトコル", "protocol": "プロトコル",
"relayHost": "リレーアドレス", "relayHost": "リレーアドレス",
"relayMode": "リレーモード",
"relayModeOptions": {
"all": "すべて",
"none": "なし",
"random": "ランダム"
},
"relayPort": "リレーポート", "relayPort": "リレーポート",
"relayPrefix": "リレープレフィックス",
"remarks": "備考", "remarks": "備考",
"security": "セキュリティ", "security": "セキュリティ",
"securityConfig": "セキュリティ設定", "securityConfig": "セキュリティ設定",
@ -88,6 +94,7 @@
"selectEncryptionMethod": "暗号化方式を選択", "selectEncryptionMethod": "暗号化方式を選択",
"selectNodeGroup": "ノードグループを選択", "selectNodeGroup": "ノードグループを選択",
"selectProtocol": "プロトコルを選択", "selectProtocol": "プロトコルを選択",
"selectRelayMode": "リレーモードを選択",
"serverAddr": "サーバーアドレス", "serverAddr": "サーバーアドレス",
"serverName": "サービス名", "serverName": "サービス名",
"speedLimit": "速度制限", "speedLimit": "速度制限",

View File

@ -49,7 +49,6 @@
"confirm": "확인", "confirm": "확인",
"edit": "편집", "edit": "편집",
"editSecurity": "보안 설정 편집", "editSecurity": "보안 설정 편집",
"enableRelay": "중계 활성화",
"enableTLS": "TLS 활성화", "enableTLS": "TLS 활성화",
"encryptionMethod": "암호화 방법", "encryptionMethod": "암호화 방법",
"flow": "흐름 제어 알고리즘", "flow": "흐름 제어 알고리즘",
@ -65,7 +64,14 @@
"port": "서비스 포트", "port": "서비스 포트",
"protocol": "프로토콜", "protocol": "프로토콜",
"relayHost": "중계 주소", "relayHost": "중계 주소",
"relayMode": "릴레이 모드",
"relayModeOptions": {
"all": "모두",
"none": "없음",
"random": "무작위"
},
"relayPort": "중계 포트", "relayPort": "중계 포트",
"relayPrefix": "릴레이 접두사",
"remarks": "비고", "remarks": "비고",
"security": "보안", "security": "보안",
"securityConfig": "보안 설정", "securityConfig": "보안 설정",
@ -88,6 +94,7 @@
"selectEncryptionMethod": "암호화 방법 선택", "selectEncryptionMethod": "암호화 방법 선택",
"selectNodeGroup": "노드 그룹 선택", "selectNodeGroup": "노드 그룹 선택",
"selectProtocol": "프로토콜 선택", "selectProtocol": "프로토콜 선택",
"selectRelayMode": "릴레이 모드 선택",
"serverAddr": "서버 주소", "serverAddr": "서버 주소",
"serverName": "서비스 이름", "serverName": "서비스 이름",
"speedLimit": "속도 제한", "speedLimit": "속도 제한",

View File

@ -49,7 +49,6 @@
"confirm": "Bekreft", "confirm": "Bekreft",
"edit": "Rediger", "edit": "Rediger",
"editSecurity": "Rediger sikkerhetskonfigurasjon", "editSecurity": "Rediger sikkerhetskonfigurasjon",
"enableRelay": "Aktiver relé",
"enableTLS": "Aktiver TLS", "enableTLS": "Aktiver TLS",
"encryptionMethod": "Krypteringsmetode", "encryptionMethod": "Krypteringsmetode",
"flow": "Flytkontrollalgoritme", "flow": "Flytkontrollalgoritme",
@ -65,7 +64,14 @@
"port": "Tjenesteport", "port": "Tjenesteport",
"protocol": "Protokoll", "protocol": "Protokoll",
"relayHost": "Reléadresse", "relayHost": "Reléadresse",
"relayMode": "Relémodus",
"relayModeOptions": {
"all": "Alle",
"none": "Ingen",
"random": "Tilfeldig"
},
"relayPort": "Reléport", "relayPort": "Reléport",
"relayPrefix": "Reléprefiks",
"remarks": "Merknader", "remarks": "Merknader",
"security": "Sikkerhet", "security": "Sikkerhet",
"securityConfig": "Sikkerhetskonfigurasjon", "securityConfig": "Sikkerhetskonfigurasjon",
@ -88,6 +94,7 @@
"selectEncryptionMethod": "Velg krypteringsmetode", "selectEncryptionMethod": "Velg krypteringsmetode",
"selectNodeGroup": "Velg nodegruppe", "selectNodeGroup": "Velg nodegruppe",
"selectProtocol": "Velg protokoll", "selectProtocol": "Velg protokoll",
"selectRelayMode": "Velg relémodus",
"serverAddr": "Serveradresse", "serverAddr": "Serveradresse",
"serverName": "Tjenestenavn", "serverName": "Tjenestenavn",
"speedLimit": "Hastighetsbegrensning", "speedLimit": "Hastighetsbegrensning",

View File

@ -49,7 +49,6 @@
"confirm": "Potwierdź", "confirm": "Potwierdź",
"edit": "Edytuj", "edit": "Edytuj",
"editSecurity": "Edytuj konfigurację bezpieczeństwa", "editSecurity": "Edytuj konfigurację bezpieczeństwa",
"enableRelay": "Włącz przekaźnik",
"enableTLS": "Włącz TLS", "enableTLS": "Włącz TLS",
"encryptionMethod": "Metoda szyfrowania", "encryptionMethod": "Metoda szyfrowania",
"flow": "Algorytm kontroli przepływu", "flow": "Algorytm kontroli przepływu",
@ -65,7 +64,14 @@
"port": "Port serwera", "port": "Port serwera",
"protocol": "Protokół", "protocol": "Protokół",
"relayHost": "Adres przekaźnika", "relayHost": "Adres przekaźnika",
"relayMode": "Tryb przekaźnika",
"relayModeOptions": {
"all": "Wszystkie",
"none": "Brak",
"random": "Losowy"
},
"relayPort": "Port przekaźnika", "relayPort": "Port przekaźnika",
"relayPrefix": "Prefiks przekaźnika",
"remarks": "Uwagi", "remarks": "Uwagi",
"security": "Bezpieczeństwo", "security": "Bezpieczeństwo",
"securityConfig": "Konfiguracja bezpieczeństwa", "securityConfig": "Konfiguracja bezpieczeństwa",
@ -88,6 +94,7 @@
"selectEncryptionMethod": "Wybierz metodę szyfrowania", "selectEncryptionMethod": "Wybierz metodę szyfrowania",
"selectNodeGroup": "Wybierz grupę węzłów", "selectNodeGroup": "Wybierz grupę węzłów",
"selectProtocol": "Wybierz protokół", "selectProtocol": "Wybierz protokół",
"selectRelayMode": "Wybierz tryb przekaźnika",
"serverAddr": "Adres serwera", "serverAddr": "Adres serwera",
"serverName": "Nazwa usługi", "serverName": "Nazwa usługi",
"speedLimit": "Ograniczenie prędkości", "speedLimit": "Ograniczenie prędkości",

View File

@ -49,7 +49,6 @@
"confirm": "Confirmar", "confirm": "Confirmar",
"edit": "Editar", "edit": "Editar",
"editSecurity": "Editar Configuração de Segurança", "editSecurity": "Editar Configuração de Segurança",
"enableRelay": "Habilitar Relay",
"enableTLS": "Habilitar TLS", "enableTLS": "Habilitar TLS",
"encryptionMethod": "Método de Criptografia", "encryptionMethod": "Método de Criptografia",
"flow": "Algoritmo de Controle de Fluxo", "flow": "Algoritmo de Controle de Fluxo",
@ -65,7 +64,14 @@
"port": "Porta do Servidor", "port": "Porta do Servidor",
"protocol": "Protocolo", "protocol": "Protocolo",
"relayHost": "Endereço de Relay", "relayHost": "Endereço de Relay",
"relayMode": "Modo de Retransmissão",
"relayModeOptions": {
"all": "Todos",
"none": "Nenhum",
"random": "Aleatório"
},
"relayPort": "Porta de Relay", "relayPort": "Porta de Relay",
"relayPrefix": "Prefixo de Retransmissão",
"remarks": "Observações", "remarks": "Observações",
"security": "Segurança", "security": "Segurança",
"securityConfig": "Configuração de Segurança", "securityConfig": "Configuração de Segurança",
@ -88,6 +94,7 @@
"selectEncryptionMethod": "Selecione o Método de Criptografia", "selectEncryptionMethod": "Selecione o Método de Criptografia",
"selectNodeGroup": "Selecione o Grupo de Nós", "selectNodeGroup": "Selecione o Grupo de Nós",
"selectProtocol": "Selecione o Protocolo", "selectProtocol": "Selecione o Protocolo",
"selectRelayMode": "Selecionar Modo de Retransmissão",
"serverAddr": "Endereço do Servidor", "serverAddr": "Endereço do Servidor",
"serverName": "Nome do Serviço", "serverName": "Nome do Serviço",
"speedLimit": "Limite de Velocidade", "speedLimit": "Limite de Velocidade",

View File

@ -49,7 +49,6 @@
"confirm": "Confirmă", "confirm": "Confirmă",
"edit": "Editează", "edit": "Editează",
"editSecurity": "Editează configurația de securitate", "editSecurity": "Editează configurația de securitate",
"enableRelay": "Activează retransmisia",
"enableTLS": "Activează TLS", "enableTLS": "Activează TLS",
"encryptionMethod": "Metodă de criptare", "encryptionMethod": "Metodă de criptare",
"flow": "Algoritm de control al fluxului", "flow": "Algoritm de control al fluxului",
@ -65,7 +64,14 @@
"port": "Port server", "port": "Port server",
"protocol": "Protocol", "protocol": "Protocol",
"relayHost": "Adresă retransmisie", "relayHost": "Adresă retransmisie",
"relayMode": "Modul de Releu",
"relayModeOptions": {
"all": "Toate",
"none": "Niciunul",
"random": "Aleatoriu"
},
"relayPort": "Port retransmisie", "relayPort": "Port retransmisie",
"relayPrefix": "Prefix de Releu",
"remarks": "Observații", "remarks": "Observații",
"security": "Securitate", "security": "Securitate",
"securityConfig": "Configurație de securitate", "securityConfig": "Configurație de securitate",
@ -88,6 +94,7 @@
"selectEncryptionMethod": "Selectați metoda de criptare", "selectEncryptionMethod": "Selectați metoda de criptare",
"selectNodeGroup": "Selectați grupul de noduri", "selectNodeGroup": "Selectați grupul de noduri",
"selectProtocol": "Selectați protocolul", "selectProtocol": "Selectați protocolul",
"selectRelayMode": "Selectați Modul de Releu",
"serverAddr": "Adresă server", "serverAddr": "Adresă server",
"serverName": "Nume serviciu", "serverName": "Nume serviciu",
"speedLimit": "Limită de viteză", "speedLimit": "Limită de viteză",

View File

@ -49,7 +49,6 @@
"confirm": "Подтвердить", "confirm": "Подтвердить",
"edit": "Редактировать", "edit": "Редактировать",
"editSecurity": "Редактировать настройки безопасности", "editSecurity": "Редактировать настройки безопасности",
"enableRelay": "Включить реле",
"enableTLS": "Включить TLS", "enableTLS": "Включить TLS",
"encryptionMethod": "Метод шифрования", "encryptionMethod": "Метод шифрования",
"flow": "Алгоритм управления потоком", "flow": "Алгоритм управления потоком",
@ -65,7 +64,14 @@
"port": "Порт сервера", "port": "Порт сервера",
"protocol": "Протокол", "protocol": "Протокол",
"relayHost": "Адрес реле", "relayHost": "Адрес реле",
"relayMode": "Режим ретрансляции",
"relayModeOptions": {
"all": "Все",
"none": "Нет",
"random": "Случайный"
},
"relayPort": "Порт реле", "relayPort": "Порт реле",
"relayPrefix": "Префикс ретрансляции",
"remarks": "Примечания", "remarks": "Примечания",
"security": "Безопасность", "security": "Безопасность",
"securityConfig": "Настройки безопасности", "securityConfig": "Настройки безопасности",
@ -88,6 +94,7 @@
"selectEncryptionMethod": "Выберите метод шифрования", "selectEncryptionMethod": "Выберите метод шифрования",
"selectNodeGroup": "Выберите группу узлов", "selectNodeGroup": "Выберите группу узлов",
"selectProtocol": "Выберите протокол", "selectProtocol": "Выберите протокол",
"selectRelayMode": "Выберите режим ретрансляции",
"serverAddr": "Адрес сервера", "serverAddr": "Адрес сервера",
"serverName": "Имя сервера", "serverName": "Имя сервера",
"speedLimit": "Ограничение скорости", "speedLimit": "Ограничение скорости",

View File

@ -49,7 +49,6 @@
"confirm": "ยืนยัน", "confirm": "ยืนยัน",
"edit": "แก้ไข", "edit": "แก้ไข",
"editSecurity": "แก้ไขการตั้งค่าความปลอดภัย", "editSecurity": "แก้ไขการตั้งค่าความปลอดภัย",
"enableRelay": "เปิดใช้งานรีเลย์",
"enableTLS": "เปิดใช้งานTLS", "enableTLS": "เปิดใช้งานTLS",
"encryptionMethod": "วิธีการเข้ารหัส", "encryptionMethod": "วิธีการเข้ารหัส",
"flow": "อัลกอริทึมควบคุมการไหล", "flow": "อัลกอริทึมควบคุมการไหล",
@ -65,7 +64,14 @@
"port": "พอร์ตบริการ", "port": "พอร์ตบริการ",
"protocol": "โปรโตคอล", "protocol": "โปรโตคอล",
"relayHost": "ที่อยู่รีเลย์", "relayHost": "ที่อยู่รีเลย์",
"relayMode": "โหมดรีเลย์",
"relayModeOptions": {
"all": "ทั้งหมด",
"none": "ไม่มี",
"random": "สุ่ม"
},
"relayPort": "พอร์ตรรีเลย์", "relayPort": "พอร์ตรรีเลย์",
"relayPrefix": "คำนำหน้ารีเลย์",
"remarks": "หมายเหตุ", "remarks": "หมายเหตุ",
"security": "ความปลอดภัย", "security": "ความปลอดภัย",
"securityConfig": "การตั้งค่าความปลอดภัย", "securityConfig": "การตั้งค่าความปลอดภัย",
@ -88,6 +94,7 @@
"selectEncryptionMethod": "เลือกวิธีการเข้ารหัส", "selectEncryptionMethod": "เลือกวิธีการเข้ารหัส",
"selectNodeGroup": "เลือกกลุ่มโหนด", "selectNodeGroup": "เลือกกลุ่มโหนด",
"selectProtocol": "เลือกโปรโตคอล", "selectProtocol": "เลือกโปรโตคอล",
"selectRelayMode": "เลือกโหมดรีเลย์",
"serverAddr": "ที่อยู่เซิร์ฟเวอร์", "serverAddr": "ที่อยู่เซิร์ฟเวอร์",
"serverName": "ชื่อบริการ", "serverName": "ชื่อบริการ",
"speedLimit": "จำกัดความเร็ว", "speedLimit": "จำกัดความเร็ว",

View File

@ -49,7 +49,6 @@
"confirm": "Onayla", "confirm": "Onayla",
"edit": "Düzenle", "edit": "Düzenle",
"editSecurity": "Güvenlik Ayarlarını Düzenle", "editSecurity": "Güvenlik Ayarlarını Düzenle",
"enableRelay": "Röleyi Etkinleştir",
"enableTLS": "TLS'i Etkinleştir", "enableTLS": "TLS'i Etkinleştir",
"encryptionMethod": "Şifreleme Yöntemi", "encryptionMethod": "Şifreleme Yöntemi",
"flow": "Akış Kontrol Algoritması", "flow": "Akış Kontrol Algoritması",
@ -65,7 +64,14 @@
"port": "Sunucu Portu", "port": "Sunucu Portu",
"protocol": "Protokol", "protocol": "Protokol",
"relayHost": "Röle Adresi", "relayHost": "Röle Adresi",
"relayMode": "Röle Modu",
"relayModeOptions": {
"all": "Tümü",
"none": "Hiçbiri",
"random": "Rastgele"
},
"relayPort": "Röle Portu", "relayPort": "Röle Portu",
"relayPrefix": "Röle Öneki",
"remarks": "Açıklamalar", "remarks": "Açıklamalar",
"security": "Güvenlik", "security": "Güvenlik",
"securityConfig": "Güvenlik Ayarları", "securityConfig": "Güvenlik Ayarları",
@ -88,6 +94,7 @@
"selectEncryptionMethod": "Şifreleme Yöntemi Seç", "selectEncryptionMethod": "Şifreleme Yöntemi Seç",
"selectNodeGroup": "Düğüm Grubu Seç", "selectNodeGroup": "Düğüm Grubu Seç",
"selectProtocol": "Protokol Seç", "selectProtocol": "Protokol Seç",
"selectRelayMode": "Röle Modunu Seçin",
"serverAddr": "Sunucu Adresi", "serverAddr": "Sunucu Adresi",
"serverName": "Sunucu Adı", "serverName": "Sunucu Adı",
"speedLimit": "Hız Sınırı", "speedLimit": "Hız Sınırı",

View File

@ -49,7 +49,6 @@
"confirm": "Підтвердити", "confirm": "Підтвердити",
"edit": "Редагувати", "edit": "Редагувати",
"editSecurity": "Редагувати налаштування безпеки", "editSecurity": "Редагувати налаштування безпеки",
"enableRelay": "Увімкнути реле",
"enableTLS": "Увімкнути TLS", "enableTLS": "Увімкнути TLS",
"encryptionMethod": "Метод шифрування", "encryptionMethod": "Метод шифрування",
"flow": "Алгоритм контролю потоку", "flow": "Алгоритм контролю потоку",
@ -65,7 +64,14 @@
"port": "Порт сервера", "port": "Порт сервера",
"protocol": "Протокол", "protocol": "Протокол",
"relayHost": "Адреса реле", "relayHost": "Адреса реле",
"relayMode": "Режим ретрансляції",
"relayModeOptions": {
"all": "Всі",
"none": "Немає",
"random": "Випадковий"
},
"relayPort": "Порт реле", "relayPort": "Порт реле",
"relayPrefix": "Префікс ретрансляції",
"remarks": "Примітки", "remarks": "Примітки",
"security": "Безпека", "security": "Безпека",
"securityConfig": "Налаштування безпеки", "securityConfig": "Налаштування безпеки",
@ -88,6 +94,7 @@
"selectEncryptionMethod": "Виберіть метод шифрування", "selectEncryptionMethod": "Виберіть метод шифрування",
"selectNodeGroup": "Виберіть групу вузлів", "selectNodeGroup": "Виберіть групу вузлів",
"selectProtocol": "Виберіть протокол", "selectProtocol": "Виберіть протокол",
"selectRelayMode": "Виберіть режим ретрансляції",
"serverAddr": "Адреса сервера", "serverAddr": "Адреса сервера",
"serverName": "Назва сервісу", "serverName": "Назва сервісу",
"speedLimit": "Обмеження швидкості", "speedLimit": "Обмеження швидкості",

View File

@ -49,7 +49,6 @@
"confirm": "Xác nhận", "confirm": "Xác nhận",
"edit": "Chỉnh sửa", "edit": "Chỉnh sửa",
"editSecurity": "Chỉnh sửa cấu hình bảo mật", "editSecurity": "Chỉnh sửa cấu hình bảo mật",
"enableRelay": "Kích hoạt chuyển tiếp",
"enableTLS": "Kích hoạt TLS", "enableTLS": "Kích hoạt TLS",
"encryptionMethod": "Phương pháp mã hóa", "encryptionMethod": "Phương pháp mã hóa",
"flow": "Thuật toán điều khiển luồng", "flow": "Thuật toán điều khiển luồng",
@ -65,7 +64,14 @@
"port": "Cổng dịch vụ", "port": "Cổng dịch vụ",
"protocol": "Giao thức", "protocol": "Giao thức",
"relayHost": "Địa chỉ chuyển tiếp", "relayHost": "Địa chỉ chuyển tiếp",
"relayMode": "Chế Độ Tiếp Sức",
"relayModeOptions": {
"all": "Tất Cả",
"none": "Không Có",
"random": "Ngẫu Nhiên"
},
"relayPort": "Cổng chuyển tiếp", "relayPort": "Cổng chuyển tiếp",
"relayPrefix": "Tiền Tố Tiếp Sức",
"remarks": "Ghi chú", "remarks": "Ghi chú",
"security": "Bảo mật", "security": "Bảo mật",
"securityConfig": "Cấu hình bảo mật", "securityConfig": "Cấu hình bảo mật",
@ -88,6 +94,7 @@
"selectEncryptionMethod": "Chọn phương pháp mã hóa", "selectEncryptionMethod": "Chọn phương pháp mã hóa",
"selectNodeGroup": "Chọn nhóm nút", "selectNodeGroup": "Chọn nhóm nút",
"selectProtocol": "Chọn giao thức", "selectProtocol": "Chọn giao thức",
"selectRelayMode": "Chọn Chế Độ Tiếp Sức",
"serverAddr": "Địa chỉ máy chủ", "serverAddr": "Địa chỉ máy chủ",
"serverName": "Tên dịch vụ", "serverName": "Tên dịch vụ",
"speedLimit": "Giới hạn tốc độ", "speedLimit": "Giới hạn tốc độ",

View File

@ -49,7 +49,6 @@
"confirm": "确认", "confirm": "确认",
"edit": "编辑", "edit": "编辑",
"editSecurity": "编辑安全性配置", "editSecurity": "编辑安全性配置",
"enableRelay": "启用中转",
"enableTLS": "启用TLS", "enableTLS": "启用TLS",
"encryptionMethod": "加密方法", "encryptionMethod": "加密方法",
"flow": "流控算法", "flow": "流控算法",
@ -65,7 +64,14 @@
"port": "服务端口", "port": "服务端口",
"protocol": "协议", "protocol": "协议",
"relayHost": "中转地址", "relayHost": "中转地址",
"relayMode": "中转模式",
"relayModeOptions": {
"all": "全部",
"none": "无",
"random": "随机"
},
"relayPort": "中转端口", "relayPort": "中转端口",
"relayPrefix": "中转前缀",
"remarks": "备注", "remarks": "备注",
"security": "安全性", "security": "安全性",
"securityConfig": "安全性配置", "securityConfig": "安全性配置",
@ -88,6 +94,7 @@
"selectEncryptionMethod": "选择加密方法", "selectEncryptionMethod": "选择加密方法",
"selectNodeGroup": "选择节点组", "selectNodeGroup": "选择节点组",
"selectProtocol": "选择协议", "selectProtocol": "选择协议",
"selectRelayMode": "选择中继模式",
"serverAddr": "服务器地址", "serverAddr": "服务器地址",
"serverName": "服务名称", "serverName": "服务名称",
"speedLimit": "速度限制", "speedLimit": "速度限制",

View File

@ -49,7 +49,6 @@
"confirm": "確認", "confirm": "確認",
"edit": "編輯", "edit": "編輯",
"editSecurity": "編輯安全性配置", "editSecurity": "編輯安全性配置",
"enableRelay": "啟用中繼",
"enableTLS": "啟用TLS", "enableTLS": "啟用TLS",
"encryptionMethod": "加密方法", "encryptionMethod": "加密方法",
"flow": "流控算法", "flow": "流控算法",
@ -65,7 +64,14 @@
"port": "服務端口", "port": "服務端口",
"protocol": "協議", "protocol": "協議",
"relayHost": "中繼地址", "relayHost": "中繼地址",
"relayMode": "中繼模式",
"relayModeOptions": {
"all": "全部",
"none": "無",
"random": "隨機"
},
"relayPort": "中繼端口", "relayPort": "中繼端口",
"relayPrefix": "中繼前綴",
"remarks": "備註", "remarks": "備註",
"security": "安全性", "security": "安全性",
"securityConfig": "安全性配置", "securityConfig": "安全性配置",
@ -88,6 +94,7 @@
"selectEncryptionMethod": "選擇加密方法", "selectEncryptionMethod": "選擇加密方法",
"selectNodeGroup": "選擇節點組", "selectNodeGroup": "選擇節點組",
"selectProtocol": "選擇協議", "selectProtocol": "選擇協議",
"selectRelayMode": "選擇中繼模式",
"serverAddr": "伺服器地址", "serverAddr": "伺服器地址",
"serverName": "服務名稱", "serverName": "服務名稱",
"speedLimit": "速度限制", "speedLimit": "速度限制",

View File

@ -122,9 +122,8 @@ declare namespace API {
type CreateNodeRequest = { type CreateNodeRequest = {
name: string; name: string;
server_addr: string; server_addr: string;
enable_relay: boolean; relay_mode: string;
relay_host: string; relay_node: NodeRelay[];
relay_port: number;
speed_limit: number; speed_limit: number;
traffic_ratio: number; traffic_ratio: number;
group_id: number; group_id: number;
@ -520,6 +519,12 @@ declare namespace API {
node_push_interval: number; node_push_interval: number;
}; };
type NodeRelay = {
host: string;
port: number;
prefix: string;
};
type NodeSortRequest = { type NodeSortRequest = {
sort: SortItem[]; sort: SortItem[];
}; };
@ -608,6 +613,11 @@ declare namespace API {
ip_register_limit_duration: number; ip_register_limit_duration: number;
}; };
type RelayConfig = {
dispatch_mode: string;
relay_nodes: NodeRelay[];
};
type Response = { type Response = {
/** 状态码 */ /** 状态码 */
code?: number; code?: number;
@ -638,9 +648,8 @@ declare namespace API {
id: number; id: number;
name: string; name: string;
server_addr: string; server_addr: string;
enable_relay: boolean; relay_mode: string;
relay_host: string; relay_node: NodeRelay[];
relay_port: number;
speed_limit: number; speed_limit: number;
traffic_ratio: number; traffic_ratio: number;
group_id: number; group_id: number;
@ -910,9 +919,8 @@ declare namespace API {
id: number; id: number;
name: string; name: string;
server_addr: string; server_addr: string;
enable_relay: boolean; relay_mode: string;
relay_host: string; relay_node: NodeRelay[];
relay_port: number;
speed_limit: number; speed_limit: number;
traffic_ratio: number; traffic_ratio: number;
group_id: number; group_id: number;

View File

@ -140,6 +140,12 @@ declare namespace API {
node_push_interval: number; node_push_interval: number;
}; };
type NodeRelay = {
host: string;
port: number;
prefix: string;
};
type NodeStatus = { type NodeStatus = {
online_users: OnlineUser[]; online_users: OnlineUser[];
status: ServerStatus; status: ServerStatus;
@ -216,6 +222,11 @@ declare namespace API {
ip_register_limit_duration: number; ip_register_limit_duration: number;
}; };
type RelayConfig = {
dispatch_mode: string;
relay_nodes: NodeRelay[];
};
type ResetPasswordRequest = { type ResetPasswordRequest = {
email: string; email: string;
password: string; password: string;
@ -256,9 +267,8 @@ declare namespace API {
id: number; id: number;
name: string; name: string;
server_addr: string; server_addr: string;
enable_relay: boolean; relay_mode: string;
relay_host: string; relay_node: NodeRelay[];
relay_port: number;
speed_limit: number; speed_limit: number;
traffic_ratio: number; traffic_ratio: number;
group_id: number; group_id: number;

View File

@ -140,6 +140,12 @@ declare namespace API {
node_push_interval: number; node_push_interval: number;
}; };
type NodeRelay = {
host: string;
port: number;
prefix: string;
};
type NodeStatus = { type NodeStatus = {
online_users: OnlineUser[]; online_users: OnlineUser[];
status: ServerStatus; status: ServerStatus;
@ -216,6 +222,11 @@ declare namespace API {
ip_register_limit_duration: number; ip_register_limit_duration: number;
}; };
type RelayConfig = {
dispatch_mode: string;
relay_nodes: NodeRelay[];
};
type ResetPasswordRequest = { type ResetPasswordRequest = {
email: string; email: string;
password: string; password: string;
@ -256,9 +267,8 @@ declare namespace API {
id: number; id: number;
name: string; name: string;
server_addr: string; server_addr: string;
enable_relay: boolean; relay_mode: string;
relay_host: string; relay_node: NodeRelay[];
relay_port: number;
speed_limit: number; speed_limit: number;
traffic_ratio: number; traffic_ratio: number;
group_id: number; group_id: number;

View File

@ -162,6 +162,12 @@ declare namespace API {
node_push_interval: number; node_push_interval: number;
}; };
type NodeRelay = {
host: string;
port: number;
prefix: string;
};
type NodeStatus = { type NodeStatus = {
online_users: OnlineUser[]; online_users: OnlineUser[];
status: ServerStatus; status: ServerStatus;
@ -352,6 +358,11 @@ declare namespace API {
ip_register_limit_duration: number; ip_register_limit_duration: number;
}; };
type RelayConfig = {
dispatch_mode: string;
relay_nodes: NodeRelay[];
};
type RenewalOrderRequest = { type RenewalOrderRequest = {
subscribe_id: number; subscribe_id: number;
quantity: number; quantity: number;
@ -398,9 +409,8 @@ declare namespace API {
id: number; id: number;
name: string; name: string;
server_addr: string; server_addr: string;
enable_relay: boolean; relay_mode: string;
relay_host: string; relay_node: NodeRelay[];
relay_port: number;
speed_limit: number; speed_limit: number;
traffic_ratio: number; traffic_ratio: number;
group_id: number; group_id: number;

View File

@ -1,6 +1,7 @@
import { Button } from '@workspace/ui/components/button'; import { Button } from '@workspace/ui/components/button';
import { Combobox } from '@workspace/ui/custom-components/combobox'; import { Combobox } from '@workspace/ui/custom-components/combobox';
import { EnhancedInput, EnhancedInputProps } from '@workspace/ui/custom-components/enhanced-input'; import { EnhancedInput, EnhancedInputProps } from '@workspace/ui/custom-components/enhanced-input';
import { cn } from '@workspace/ui/lib/utils';
import { CircleMinusIcon, CirclePlusIcon } from 'lucide-react'; import { CircleMinusIcon, CirclePlusIcon } from 'lucide-react';
import { useEffect, useState } from 'react'; import { useEffect, useState } from 'react';
@ -54,8 +55,8 @@ export function ObjectInput<T extends Record<string, any>>({
return ( return (
<div className='flex flex-1 flex-wrap gap-4'> <div className='flex flex-1 flex-wrap gap-4'>
{fields.map(({ name, type, options, ...fieldProps }) => ( {fields.map(({ name, type, options, className, ...fieldProps }) => (
<div key={name} className='flex-1'> <div key={name} className={cn('flex-1', className)}>
{type === 'select' && options ? ( {type === 'select' && options ? (
<Combobox<string, false> <Combobox<string, false>
placeholder={fieldProps.placeholder} placeholder={fieldProps.placeholder}

View File

@ -77,7 +77,9 @@ export function EnhancedInput({
suppressHydrationWarning suppressHydrationWarning
> >
{prefix && ( {prefix && (
<div className='bg-muted mr-px flex h-9 items-center text-nowrap px-3'>{prefix}</div> <div className='bg-muted relative mr-px flex h-9 items-center text-nowrap px-3'>
{prefix}
</div>
)} )}
<Input <Input
{...props} {...props}
@ -87,7 +89,9 @@ export function EnhancedInput({
onBlur={handleBlur} onBlur={handleBlur}
/> />
{suffix && ( {suffix && (
<div className='bg-muted ml-px flex h-9 items-center text-nowrap px-3'>{suffix}</div> <div className='bg-muted relative ml-px flex h-9 items-center text-nowrap px-3'>
{suffix}
</div>
)} )}
</div> </div>
); );