mirror of
https://github.com/perfect-panel/ppanel-web.git
synced 2026-02-06 03:30:25 -05:00
🐛 fix: Implement encryption and obfuscation features in protocol configuration
This commit is contained in:
parent
597a01885b
commit
54de16bdd5
@ -1,4 +1,6 @@
|
||||
import { z } from 'zod';
|
||||
import { generatePassword, generateRealityKeyPair, generateRealityShortId } from './generate';
|
||||
import { generateVlessX25519Pair } from './generate/mlkem768x25519plus';
|
||||
|
||||
export const protocols = [
|
||||
'shadowsocks',
|
||||
@ -25,9 +27,12 @@ export type FieldConfig = {
|
||||
max?: number;
|
||||
step?: number;
|
||||
suffix?: string;
|
||||
password?: number;
|
||||
generate?: {
|
||||
function: () => any;
|
||||
updateFields?: Record<string, string>;
|
||||
};
|
||||
condition?: (protocol: any, values: any) => boolean;
|
||||
group?: 'basic' | 'transport' | 'security' | 'reality' | 'plugin';
|
||||
group?: 'basic' | 'transport' | 'security' | 'reality' | 'obfs' | 'encryption';
|
||||
gridSpan?: 1 | 2;
|
||||
};
|
||||
|
||||
@ -55,13 +60,9 @@ export const LABELS = {
|
||||
'360': '360',
|
||||
'qq': 'QQ',
|
||||
// multiplex
|
||||
'off': 'Off',
|
||||
'low': 'Low',
|
||||
'middle': 'Middle',
|
||||
'high': 'High',
|
||||
// ss plugins
|
||||
'v2ray-plugin': 'V2Ray Plugin',
|
||||
'simple-obfs': 'Simple Obfs',
|
||||
} as const;
|
||||
|
||||
// Flat arrays for enum-like sets
|
||||
@ -75,8 +76,6 @@ export const SS_CIPHERS = [
|
||||
'2022-blake3-chacha20-poly1305',
|
||||
] as const;
|
||||
|
||||
export const SS_PLUGINS = ['none', 'simple-obfs', 'v2ray-plugin'] as const;
|
||||
|
||||
export const TRANSPORTS = {
|
||||
vmess: ['tcp', 'websocket', 'grpc'] as const,
|
||||
vless: ['tcp', 'websocket', 'grpc', 'mkcp', 'httpupgrade', 'xhttp'] as const,
|
||||
@ -101,6 +100,10 @@ export const FLOWS = {
|
||||
|
||||
export const TUIC_UDP_RELAY_MODES = ['native', 'quic'] as const;
|
||||
export const TUIC_CONGESTION = ['bbr', 'cubic', 'new_reno'] as const;
|
||||
export const XHTTP_MODES = ['auto', 'packet-up', 'stream-up', 'stream-one'] as const;
|
||||
export const ENCRYPTION_TYPES = ['none', 'mlkem768x25519plus'] as const;
|
||||
export const ENCRYPTION_MODES = ['native', 'xorpub', 'random'] as const;
|
||||
export const ENCRYPTION_RTT = ['0rtt', '1rtt'] as const;
|
||||
export const FINGERPRINTS = [
|
||||
'chrome',
|
||||
'firefox',
|
||||
@ -112,7 +115,7 @@ export const FINGERPRINTS = [
|
||||
'qq',
|
||||
] as const;
|
||||
|
||||
export const multiplexLevels = ['off', 'low', 'middle', 'high'] as const;
|
||||
export const multiplexLevels = ['none', 'low', 'middle', 'high'] as const;
|
||||
|
||||
export function getLabel(value: string): string {
|
||||
const label = (LABELS as Record<string, string>)[value];
|
||||
@ -129,8 +132,9 @@ const ss = z.object({
|
||||
port: nullablePort,
|
||||
cipher: z.enum(SS_CIPHERS as any).nullish(),
|
||||
server_key: nullableString,
|
||||
plugin: z.enum(SS_PLUGINS as any).nullish(),
|
||||
plugin_options: nullableString,
|
||||
obfs: z.enum(['none', 'http', 'tls'] as const).nullish(),
|
||||
obfs_host: nullableString,
|
||||
obfs_path: nullableString,
|
||||
});
|
||||
|
||||
const vmess = z.object({
|
||||
@ -163,6 +167,16 @@ const vless = z.object({
|
||||
reality_private_key: nullableString,
|
||||
reality_public_key: nullableString,
|
||||
reality_short_id: nullableString,
|
||||
mode: nullableString,
|
||||
extra: nullableString,
|
||||
encryption: z.enum(ENCRYPTION_TYPES as any).nullish(),
|
||||
encryption_mode: z.enum(ENCRYPTION_MODES as any).nullish(),
|
||||
encryption_rtt: z.enum(ENCRYPTION_RTT as any).nullish(),
|
||||
encryption_ticket: nullableString,
|
||||
encryption_server_padding: nullableString,
|
||||
encryption_private_key: nullableString,
|
||||
encryption_client_padding: nullableString,
|
||||
encryption_password: nullableString,
|
||||
});
|
||||
|
||||
const trojan = z.object({
|
||||
@ -183,6 +197,7 @@ const hysteria2 = z.object({
|
||||
hop_ports: nullableString,
|
||||
hop_interval: z.number().nullish(),
|
||||
obfs_password: nullableString,
|
||||
obfs: z.enum(['none', 'salamander'] as const).nullish(),
|
||||
port: nullablePort,
|
||||
security: z.enum(SECURITY.hysteria2 as any).nullish(),
|
||||
sni: nullableString,
|
||||
@ -281,8 +296,9 @@ export function getProtocolDefaultConfig(proto: ProtocolType) {
|
||||
port: null,
|
||||
cipher: 'chacha20-ietf-poly1305',
|
||||
server_key: null,
|
||||
plugin: 'none',
|
||||
plugin_opts: null,
|
||||
obfs: 'none',
|
||||
obfs_host: null,
|
||||
obfs_path: null,
|
||||
} as any;
|
||||
case 'vmess':
|
||||
return { type: 'vmess', port: null, transport: 'tcp', security: 'none' } as any;
|
||||
@ -296,6 +312,7 @@ export function getProtocolDefaultConfig(proto: ProtocolType) {
|
||||
port: null,
|
||||
hop_ports: null,
|
||||
hop_interval: null,
|
||||
obfs: 'none',
|
||||
obfs_password: null,
|
||||
security: 'tls',
|
||||
up_mbps: null,
|
||||
@ -335,7 +352,7 @@ export function getProtocolDefaultConfig(proto: ProtocolType) {
|
||||
return {
|
||||
type: 'meru',
|
||||
port: null,
|
||||
multiplex: 'off',
|
||||
multiplex: 'none',
|
||||
transport: 'tcp',
|
||||
} as any;
|
||||
case 'anytls':
|
||||
@ -367,7 +384,7 @@ export const PROTOCOL_FIELDS: Record<string, FieldConfig[]> = {
|
||||
{
|
||||
name: 'cipher',
|
||||
type: 'select',
|
||||
label: 'encryption_method',
|
||||
label: 'cipher',
|
||||
options: SS_CIPHERS,
|
||||
defaultValue: 'chacha20-ietf-poly1305',
|
||||
group: 'basic',
|
||||
@ -376,7 +393,9 @@ export const PROTOCOL_FIELDS: Record<string, FieldConfig[]> = {
|
||||
name: 'server_key',
|
||||
type: 'input',
|
||||
label: 'server_key',
|
||||
password: 32,
|
||||
generate: {
|
||||
function: () => generatePassword(32),
|
||||
},
|
||||
group: 'basic',
|
||||
condition: (p) =>
|
||||
[
|
||||
@ -386,29 +405,28 @@ export const PROTOCOL_FIELDS: Record<string, FieldConfig[]> = {
|
||||
].includes(p.cipher),
|
||||
},
|
||||
{
|
||||
name: 'plugin',
|
||||
name: 'obfs',
|
||||
type: 'select',
|
||||
label: 'plugin',
|
||||
options: SS_PLUGINS,
|
||||
label: 'obfs',
|
||||
options: ['none', 'http', 'tls'],
|
||||
defaultValue: 'none',
|
||||
group: 'plugin',
|
||||
group: 'obfs',
|
||||
},
|
||||
{
|
||||
name: 'plugin_opts',
|
||||
type: 'textarea',
|
||||
label: 'plugin_opts',
|
||||
placeholder: (t: (key: string) => string, p: any) => {
|
||||
switch (p.plugin) {
|
||||
case 'simple-obfs':
|
||||
return 'obfs=http;obfs-host=www.bing.com;path=/';
|
||||
case 'v2ray-plugin':
|
||||
return 'WebSocket: mode=websocket;host=mydomain.me;path=/;tls=true\n\nQUIC: mode=quic;host=mydomain.me';
|
||||
default:
|
||||
return 'key=value;key2=value2';
|
||||
}
|
||||
},
|
||||
group: 'plugin',
|
||||
condition: (p) => ['simple-obfs', 'v2ray-plugin'].includes(p.plugin),
|
||||
name: 'obfs_host',
|
||||
type: 'input',
|
||||
label: 'obfs_host',
|
||||
placeholder: 'e.g. www.bing.com',
|
||||
group: 'obfs',
|
||||
condition: (p) => p.obfs && p.obfs !== 'none',
|
||||
},
|
||||
{
|
||||
name: 'obfs_path',
|
||||
type: 'input',
|
||||
label: 'obfs_path',
|
||||
placeholder: 'e.g. /path/to/obfs',
|
||||
group: 'obfs',
|
||||
condition: (p) => p.obfs && p.obfs !== 'none',
|
||||
},
|
||||
],
|
||||
vmess: [
|
||||
@ -441,6 +459,7 @@ export const PROTOCOL_FIELDS: Record<string, FieldConfig[]> = {
|
||||
name: 'host',
|
||||
type: 'input',
|
||||
label: 'host',
|
||||
placeholder: 'e.g. www.bing.com',
|
||||
group: 'transport',
|
||||
condition: (p) => ['websocket', 'xhttp', 'httpupgrade'].includes(p.transport),
|
||||
},
|
||||
@ -448,6 +467,7 @@ export const PROTOCOL_FIELDS: Record<string, FieldConfig[]> = {
|
||||
name: 'path',
|
||||
type: 'input',
|
||||
label: 'path',
|
||||
placeholder: 'e.g. /path/to/obfs',
|
||||
group: 'transport',
|
||||
condition: (p) => ['websocket', 'xhttp', 'httpupgrade'].includes(p.transport),
|
||||
},
|
||||
@ -492,14 +512,6 @@ export const PROTOCOL_FIELDS: Record<string, FieldConfig[]> = {
|
||||
placeholder: '1-65535',
|
||||
group: 'basic',
|
||||
},
|
||||
{
|
||||
name: 'flow',
|
||||
type: 'select',
|
||||
label: 'flow',
|
||||
options: FLOWS.vless,
|
||||
defaultValue: 'none',
|
||||
group: 'basic',
|
||||
},
|
||||
{
|
||||
name: 'transport',
|
||||
type: 'select',
|
||||
@ -508,6 +520,15 @@ export const PROTOCOL_FIELDS: Record<string, FieldConfig[]> = {
|
||||
defaultValue: 'tcp',
|
||||
group: 'transport',
|
||||
},
|
||||
{
|
||||
name: 'flow',
|
||||
type: 'select',
|
||||
label: 'flow',
|
||||
options: FLOWS.vless,
|
||||
defaultValue: 'none',
|
||||
group: 'transport',
|
||||
condition: (p) => p.transport === 'tcp',
|
||||
},
|
||||
{
|
||||
name: 'security',
|
||||
type: 'select',
|
||||
@ -520,6 +541,7 @@ export const PROTOCOL_FIELDS: Record<string, FieldConfig[]> = {
|
||||
name: 'host',
|
||||
type: 'input',
|
||||
label: 'host',
|
||||
placeholder: 'e.g. www.bing.com',
|
||||
group: 'transport',
|
||||
condition: (p) => ['websocket', 'mkcp', 'httpupgrade', 'xhttp'].includes(p.transport),
|
||||
},
|
||||
@ -527,6 +549,7 @@ export const PROTOCOL_FIELDS: Record<string, FieldConfig[]> = {
|
||||
name: 'path',
|
||||
type: 'input',
|
||||
label: 'path',
|
||||
placeholder: 'e.g. /path/to/obfs',
|
||||
group: 'transport',
|
||||
condition: (p) => ['websocket', 'mkcp', 'httpupgrade', 'xhttp'].includes(p.transport),
|
||||
},
|
||||
@ -537,6 +560,23 @@ export const PROTOCOL_FIELDS: Record<string, FieldConfig[]> = {
|
||||
group: 'transport',
|
||||
condition: (p) => p.transport === 'grpc',
|
||||
},
|
||||
{
|
||||
name: 'mode',
|
||||
type: 'select',
|
||||
label: 'mode',
|
||||
options: XHTTP_MODES,
|
||||
defaultValue: 'auto',
|
||||
group: 'transport',
|
||||
condition: (p) => p.transport === 'xhttp',
|
||||
},
|
||||
{
|
||||
name: 'extra',
|
||||
type: 'textarea',
|
||||
label: 'extra',
|
||||
placeholder: '{}',
|
||||
group: 'transport',
|
||||
condition: (p) => p.transport === 'xhttp',
|
||||
},
|
||||
{
|
||||
name: 'sni',
|
||||
type: 'input',
|
||||
@ -584,6 +624,13 @@ export const PROTOCOL_FIELDS: Record<string, FieldConfig[]> = {
|
||||
label: 'security_private_key',
|
||||
placeholder: (t) => t('security_private_key_placeholder'),
|
||||
group: 'reality',
|
||||
generate: {
|
||||
function: generateRealityKeyPair,
|
||||
updateFields: {
|
||||
reality_private_key: 'privateKey',
|
||||
reality_public_key: 'publicKey',
|
||||
},
|
||||
},
|
||||
condition: (p) => p.security === 'reality',
|
||||
},
|
||||
{
|
||||
@ -599,8 +646,84 @@ export const PROTOCOL_FIELDS: Record<string, FieldConfig[]> = {
|
||||
type: 'input',
|
||||
label: 'security_short_id',
|
||||
group: 'reality',
|
||||
generate: {
|
||||
function: generateRealityShortId,
|
||||
},
|
||||
condition: (p) => p.security === 'reality',
|
||||
},
|
||||
{
|
||||
name: 'encryption',
|
||||
type: 'select',
|
||||
label: 'encryption',
|
||||
options: ENCRYPTION_TYPES,
|
||||
defaultValue: 'none',
|
||||
group: 'encryption',
|
||||
},
|
||||
{
|
||||
name: 'encryption_mode',
|
||||
type: 'select',
|
||||
label: 'encryption_mode',
|
||||
options: ENCRYPTION_MODES,
|
||||
defaultValue: 'native',
|
||||
group: 'encryption',
|
||||
condition: (p) => p.encryption === 'mlkem768x25519plus',
|
||||
},
|
||||
{
|
||||
name: 'encryption_rtt',
|
||||
type: 'select',
|
||||
label: 'encryption_rtt',
|
||||
options: ENCRYPTION_RTT,
|
||||
defaultValue: '1rtt',
|
||||
group: 'encryption',
|
||||
condition: (p) => p.encryption === 'mlkem768x25519plus',
|
||||
},
|
||||
{
|
||||
name: 'encryption_ticket',
|
||||
type: 'input',
|
||||
label: 'encryption_ticket',
|
||||
placeholder: 'e.g. 600s',
|
||||
group: 'encryption',
|
||||
condition: (p) => p.encryption === 'mlkem768x25519plus' && p.encryption_rtt === '0rtt',
|
||||
},
|
||||
{
|
||||
name: 'encryption_server_padding',
|
||||
type: 'input',
|
||||
label: 'encryption_server_padding',
|
||||
placeholder: 'e.g. 100-111-1111.75-0-111.50-0-3333',
|
||||
group: 'encryption',
|
||||
condition: (p) => p.encryption === 'mlkem768x25519plus',
|
||||
},
|
||||
{
|
||||
name: 'encryption_private_key',
|
||||
type: 'input',
|
||||
label: 'encryption_private_key',
|
||||
placeholder: (t) => t('encryption_private_key_placeholder'),
|
||||
group: 'encryption',
|
||||
generate: {
|
||||
function: () => generateVlessX25519Pair(),
|
||||
updateFields: {
|
||||
encryption_private_key: 'privateKeyB64',
|
||||
encryption_password: 'passwordB64',
|
||||
},
|
||||
},
|
||||
condition: (p) => p.encryption === 'mlkem768x25519plus',
|
||||
},
|
||||
{
|
||||
name: 'encryption_client_padding',
|
||||
type: 'input',
|
||||
label: 'encryption_client_padding',
|
||||
placeholder: 'e.g. 100-111-1111.75-0-111.50-0-3333',
|
||||
group: 'encryption',
|
||||
condition: (p) => p.encryption === 'mlkem768x25519plus',
|
||||
},
|
||||
{
|
||||
name: 'encryption_password',
|
||||
type: 'input',
|
||||
label: 'encryption_password',
|
||||
placeholder: (t) => t('encryption_password_placeholder'),
|
||||
group: 'encryption',
|
||||
condition: (p) => p.encryption === 'mlkem768x25519plus',
|
||||
},
|
||||
],
|
||||
trojan: [
|
||||
{
|
||||
@ -632,6 +755,7 @@ export const PROTOCOL_FIELDS: Record<string, FieldConfig[]> = {
|
||||
name: 'host',
|
||||
type: 'input',
|
||||
label: 'host',
|
||||
placeholder: 'e.g. www.bing.com',
|
||||
group: 'transport',
|
||||
condition: (p) => ['websocket', 'xhttp', 'httpupgrade'].includes(p.transport),
|
||||
},
|
||||
@ -639,6 +763,7 @@ export const PROTOCOL_FIELDS: Record<string, FieldConfig[]> = {
|
||||
name: 'path',
|
||||
type: 'input',
|
||||
label: 'path',
|
||||
placeholder: 'e.g. /path/to/obfs',
|
||||
group: 'transport',
|
||||
condition: (p) => ['websocket', 'xhttp', 'httpupgrade'].includes(p.transport),
|
||||
},
|
||||
@ -699,13 +824,24 @@ export const PROTOCOL_FIELDS: Record<string, FieldConfig[]> = {
|
||||
suffix: 'S',
|
||||
group: 'basic',
|
||||
},
|
||||
{
|
||||
name: 'obfs',
|
||||
type: 'select',
|
||||
label: 'obfs',
|
||||
options: ['none', 'salamander'],
|
||||
defaultValue: 'none',
|
||||
group: 'obfs',
|
||||
},
|
||||
{
|
||||
name: 'obfs_password',
|
||||
type: 'input',
|
||||
label: 'obfs_password',
|
||||
placeholder: (t) => t('obfs_password_placeholder'),
|
||||
password: 16,
|
||||
group: 'basic',
|
||||
generate: {
|
||||
function: () => generatePassword(16),
|
||||
},
|
||||
group: 'obfs',
|
||||
condition: (p) => p.obfs && p.obfs !== 'none',
|
||||
},
|
||||
{
|
||||
name: 'up_mbps',
|
||||
|
||||
6
apps/admin/app/dashboard/servers/generate/index.ts
Normal file
6
apps/admin/app/dashboard/servers/generate/index.ts
Normal file
@ -0,0 +1,6 @@
|
||||
export { generatePassword } from './random';
|
||||
export {
|
||||
generateRealityKeyPair,
|
||||
generateRealityShortId,
|
||||
publicKeyFromPrivate,
|
||||
} from './reality-key';
|
||||
@ -0,0 +1,21 @@
|
||||
import { x25519 } from '@noble/curves/ed25519';
|
||||
|
||||
const toB64 = (u8: Uint8Array): string => {
|
||||
if (typeof Buffer !== 'undefined') return Buffer.from(u8).toString('base64');
|
||||
let s = '';
|
||||
for (const b of u8) s += String.fromCharCode(b);
|
||||
return btoa(s);
|
||||
};
|
||||
|
||||
export type VlessX25519Pair = {
|
||||
passwordB64: string;
|
||||
privateKeyB64: string;
|
||||
};
|
||||
|
||||
export function generateVlessX25519Pair(): VlessX25519Pair {
|
||||
const { secretKey, publicKey } = x25519.keygen();
|
||||
return {
|
||||
passwordB64: toB64(publicKey),
|
||||
privateKeyB64: toB64(secretKey),
|
||||
};
|
||||
}
|
||||
11
apps/admin/app/dashboard/servers/generate/random.ts
Normal file
11
apps/admin/app/dashboard/servers/generate/random.ts
Normal file
@ -0,0 +1,11 @@
|
||||
import { uid } from 'radash';
|
||||
|
||||
/**
|
||||
* Generate a random password
|
||||
* @param length Length of the password
|
||||
* @param charset Character set to use (defaults to alphanumeric)
|
||||
* @returns Randomly generated password
|
||||
*/
|
||||
export function generatePassword(length = 16, charset?: string) {
|
||||
return uid(length, charset).toLowerCase();
|
||||
}
|
||||
49
apps/admin/app/dashboard/servers/generate/reality-key.ts
Normal file
49
apps/admin/app/dashboard/servers/generate/reality-key.ts
Normal file
@ -0,0 +1,49 @@
|
||||
import { x25519 } from '@noble/curves/ed25519.js';
|
||||
|
||||
function toB64Url(bytes: Uint8Array) {
|
||||
return btoa(String.fromCharCode(...bytes))
|
||||
.replace(/\+/g, '-')
|
||||
.replace(/\//g, '_')
|
||||
.replace(/=+$/g, '');
|
||||
}
|
||||
function fromB64Url(s: string) {
|
||||
const b64 = s
|
||||
.replace(/-/g, '+')
|
||||
.replace(/_/g, '/')
|
||||
.padEnd(Math.ceil(s.length / 4) * 4, '=');
|
||||
const bin = atob(b64);
|
||||
return new Uint8Array([...bin].map((c) => c.charCodeAt(0)));
|
||||
}
|
||||
/**
|
||||
* Generate a Reality key pair
|
||||
* @returns An object containing the private and public keys in base64url format
|
||||
*/
|
||||
export function generateRealityKeyPair() {
|
||||
const { secretKey, publicKey } = x25519.keygen();
|
||||
return { privateKey: toB64Url(secretKey), publicKey: toB64Url(publicKey) };
|
||||
}
|
||||
|
||||
/**
|
||||
* Derive public key from private key
|
||||
* @param privateKeyB64Url Private key in base64url format
|
||||
* @returns Public key in base64url format
|
||||
*/
|
||||
export function publicKeyFromPrivate(privateKeyB64Url: string) {
|
||||
return toB64Url(x25519.getPublicKey(fromB64Url(privateKeyB64Url)));
|
||||
}
|
||||
|
||||
/**
|
||||
* Generate a short ID for Reality
|
||||
* @returns A random hexadecimal string of length 2, 4, 6, 8, 10, 12, 14, or 16
|
||||
*/
|
||||
export function generateRealityShortId() {
|
||||
const hex = '0123456789abcdef';
|
||||
const lengths = [2, 4, 6, 8, 10, 12, 14, 16];
|
||||
const idx = Math.floor(Math.random() * lengths.length);
|
||||
const len = lengths[idx] ?? 16;
|
||||
let out = '';
|
||||
for (let i = 0; i < len; i++) {
|
||||
out += hex.charAt(Math.floor(Math.random() * hex.length));
|
||||
}
|
||||
return out;
|
||||
}
|
||||
@ -38,7 +38,6 @@ import { EnhancedInput } from '@workspace/ui/custom-components/enhanced-input';
|
||||
import { Icon } from '@workspace/ui/custom-components/icon';
|
||||
import { cn } from '@workspace/ui/lib/utils';
|
||||
import { useTranslations } from 'next-intl';
|
||||
import { uid } from 'radash';
|
||||
import { useEffect, useState } from 'react';
|
||||
import { useForm, useWatch } from 'react-hook-form';
|
||||
import { toast } from 'sonner';
|
||||
@ -55,12 +54,14 @@ import {
|
||||
function DynamicField({
|
||||
field,
|
||||
control,
|
||||
form,
|
||||
protocolIndex,
|
||||
protocolData,
|
||||
t,
|
||||
}: {
|
||||
field: FieldConfig;
|
||||
control: any;
|
||||
form: any;
|
||||
protocolIndex: number;
|
||||
protocolData: any;
|
||||
t: (key: string) => string;
|
||||
@ -97,17 +98,29 @@ function DynamicField({
|
||||
}
|
||||
onValueChange={(v) => fieldProps.onChange(v)}
|
||||
suffix={
|
||||
field.password ? (
|
||||
field.generate ? (
|
||||
<Button
|
||||
type='button'
|
||||
variant='ghost'
|
||||
onClick={() => {
|
||||
const length = field.password || 16;
|
||||
const result = uid(length).toLowerCase();
|
||||
fieldProps.onChange(result);
|
||||
const result = field.generate!.function();
|
||||
if (typeof result === 'string') {
|
||||
fieldProps.onChange(result);
|
||||
} else if (field.generate!.updateFields) {
|
||||
Object.entries(field.generate!.updateFields).forEach(
|
||||
([fieldName, resultKey]) => {
|
||||
const fullFieldName = `protocols.${protocolIndex}.${fieldName}`;
|
||||
form.setValue(fullFieldName, (result as any)[resultKey]);
|
||||
},
|
||||
);
|
||||
} else {
|
||||
if (result.privateKey) {
|
||||
fieldProps.onChange(result.privateKey);
|
||||
}
|
||||
}
|
||||
}}
|
||||
>
|
||||
<Icon icon='mdi:refresh' className='h-4 w-4' />
|
||||
<Icon icon='mdi:key' className='h-4 w-4' />
|
||||
</Button>
|
||||
) : (
|
||||
field.suffix
|
||||
@ -225,7 +238,7 @@ function DynamicField({
|
||||
field.placeholder
|
||||
? typeof field.placeholder === 'function'
|
||||
? field.placeholder(t, protocolData)
|
||||
: t(field.placeholder)
|
||||
: field.placeholder
|
||||
: undefined
|
||||
}
|
||||
onChange={(e) => fieldProps.onChange(e.target.value)}
|
||||
@ -246,6 +259,7 @@ function renderFieldsByGroup(
|
||||
fields: FieldConfig[],
|
||||
group: string,
|
||||
control: any,
|
||||
form: any,
|
||||
protocolIndex: number,
|
||||
protocolData: any,
|
||||
t: (key: string) => string,
|
||||
@ -260,6 +274,7 @@ function renderFieldsByGroup(
|
||||
key={field.name}
|
||||
field={field}
|
||||
control={control}
|
||||
form={form}
|
||||
protocolIndex={protocolIndex}
|
||||
protocolData={protocolData}
|
||||
t={t}
|
||||
@ -274,6 +289,7 @@ function renderGroupCard(
|
||||
fields: FieldConfig[],
|
||||
group: string,
|
||||
control: any,
|
||||
form: any,
|
||||
protocolIndex: number,
|
||||
protocolData: any,
|
||||
t: (key: string) => string,
|
||||
@ -294,7 +310,7 @@ function renderGroupCard(
|
||||
{t(title)}
|
||||
</legend>
|
||||
<div className='p-4 pt-2'>
|
||||
{renderFieldsByGroup(fields, group, control, protocolIndex, protocolData, t)}
|
||||
{renderFieldsByGroup(fields, group, control, form, protocolIndex, protocolData, t)}
|
||||
</div>
|
||||
</fieldset>
|
||||
</div>
|
||||
@ -541,19 +557,48 @@ export default function ServerForm(props: {
|
||||
</AccordionTrigger>
|
||||
<AccordionContent className='px-4 pb-4 pt-0'>
|
||||
<div className='-mx-4 space-y-4 rounded-b-lg border-t px-4 pt-4'>
|
||||
{renderGroupCard('basic', fields, 'basic', control, i, current, t)}
|
||||
{renderGroupCard('plugin', fields, 'plugin', control, i, current, t)}
|
||||
{renderGroupCard('basic', fields, 'basic', control, form, i, current, t)}
|
||||
{renderGroupCard('obfs', fields, 'obfs', control, form, i, current, t)}
|
||||
{renderGroupCard(
|
||||
'transport',
|
||||
fields,
|
||||
'transport',
|
||||
control,
|
||||
form,
|
||||
i,
|
||||
current,
|
||||
t,
|
||||
)}
|
||||
{renderGroupCard(
|
||||
'security',
|
||||
fields,
|
||||
'security',
|
||||
control,
|
||||
form,
|
||||
i,
|
||||
current,
|
||||
t,
|
||||
)}
|
||||
{renderGroupCard(
|
||||
'reality',
|
||||
fields,
|
||||
'reality',
|
||||
control,
|
||||
form,
|
||||
i,
|
||||
current,
|
||||
t,
|
||||
)}
|
||||
{renderGroupCard(
|
||||
'encryption',
|
||||
fields,
|
||||
'encryption',
|
||||
control,
|
||||
form,
|
||||
i,
|
||||
current,
|
||||
t,
|
||||
)}
|
||||
{renderGroupCard('security', fields, 'security', control, i, current, t)}
|
||||
{renderGroupCard('reality', fields, 'reality', control, i, current, t)}
|
||||
</div>
|
||||
</AccordionContent>
|
||||
</AccordionItem>
|
||||
|
||||
@ -4,6 +4,7 @@
|
||||
"bandwidth_placeholder": "Zadejte šířku pásma, nechte prázdné pro BBR",
|
||||
"basic": "Základní konfigurace",
|
||||
"cancel": "Zrušit",
|
||||
"cipher": "Šifrovací algoritmus",
|
||||
"city": "Město",
|
||||
"config": {
|
||||
"actions": {
|
||||
@ -49,9 +50,19 @@
|
||||
"drawerEditTitle": "Upravit server",
|
||||
"edit": "Upravit",
|
||||
"enabled": "Povoleno",
|
||||
"encryption_method": "Metoda šifrování",
|
||||
"encryption": "Metoda šifrování",
|
||||
"encryption_client_padding": "Padding klienta",
|
||||
"encryption_mode": "Režim",
|
||||
"encryption_password": "Heslo",
|
||||
"encryption_password_placeholder": "Nechte prázdné pro automatickou generaci, nahraďte ručně pro postkvantové šifrování",
|
||||
"encryption_private_key": "Soukromý klíč",
|
||||
"encryption_private_key_placeholder": "Nechte prázdné pro automatickou generaci, nahraďte ručně pro postkvantové šifrování",
|
||||
"encryption_rtt": "RTT",
|
||||
"encryption_server_padding": "Padding serveru",
|
||||
"encryption_ticket": "Čas lístku",
|
||||
"expireTime": "Čas vypršení",
|
||||
"expired": "Vypršelo",
|
||||
"extra": "Další konfigurace",
|
||||
"flow": "Tok",
|
||||
"hop_interval": "Interval skoku",
|
||||
"hop_ports": "Porty skoku",
|
||||
@ -64,12 +75,16 @@
|
||||
"migrateFailed": "Migrace dat se nezdařila",
|
||||
"migrated": "Data byla úspěšně migrována",
|
||||
"migrating": "Probíhá migrace...",
|
||||
"mode": "Režim",
|
||||
"multiplex": "Multiplex",
|
||||
"name": "Název",
|
||||
"noData": "Žádná data",
|
||||
"notAvailable": "Není k dispozici",
|
||||
"obfs": "Obfuskování",
|
||||
"obfs_host": "Obfs hostitel",
|
||||
"obfs_password": "Heslo pro obfuskaci",
|
||||
"obfs_password_placeholder": "Zadejte heslo pro obfuskaci",
|
||||
"obfs_path": "Obfs cesta",
|
||||
"offline": "Offline",
|
||||
"online": "Online",
|
||||
"onlineUsers": "Online uživatelé",
|
||||
@ -78,8 +93,6 @@
|
||||
"pageTitle": "Servery",
|
||||
"path": "Cesta",
|
||||
"please_select": "Prosím vyberte",
|
||||
"plugin": "Konfigurace pluginu",
|
||||
"plugin_opts": "Možnosti pluginu",
|
||||
"port": "Port",
|
||||
"protocol_configurations": "Konfigurace protokolu",
|
||||
"protocol_configurations_desc": "Povolit a nakonfigurovat požadované typy protokolů",
|
||||
|
||||
@ -4,6 +4,7 @@
|
||||
"bandwidth_placeholder": "Geben Sie die Bandbreite ein, lassen Sie das Feld leer für BBR",
|
||||
"basic": "Grundkonfiguration",
|
||||
"cancel": "Abbrechen",
|
||||
"cipher": "Verschlüsselungsalgorithmus",
|
||||
"city": "Stadt",
|
||||
"config": {
|
||||
"actions": {
|
||||
@ -49,9 +50,19 @@
|
||||
"drawerEditTitle": "Server bearbeiten",
|
||||
"edit": "Bearbeiten",
|
||||
"enabled": "Aktiviert",
|
||||
"encryption_method": "Verschlüsselungsmethode",
|
||||
"encryption": "Verschlüsselungsmethode",
|
||||
"encryption_client_padding": "Client-Padding",
|
||||
"encryption_mode": "Modus",
|
||||
"encryption_password": "Passwort",
|
||||
"encryption_password_placeholder": "Leer lassen für automatische Generierung, manuell ersetzen für post-quanten Verschlüsselung",
|
||||
"encryption_private_key": "Privater Schlüssel",
|
||||
"encryption_private_key_placeholder": "Leer lassen für automatische Generierung, manuell ersetzen für post-quanten Verschlüsselung",
|
||||
"encryption_rtt": "RTT",
|
||||
"encryption_server_padding": "Server-Padding",
|
||||
"encryption_ticket": "Ticketzeit",
|
||||
"expireTime": "Ablaufzeit",
|
||||
"expired": "Abgelaufen",
|
||||
"extra": "Zusätzliche Konfiguration",
|
||||
"flow": "Fluss",
|
||||
"hop_interval": "Hop-Intervall",
|
||||
"hop_ports": "Hop-Ports",
|
||||
@ -64,12 +75,16 @@
|
||||
"migrateFailed": "Datenmigration fehlgeschlagen",
|
||||
"migrated": "Daten erfolgreich migriert",
|
||||
"migrating": "Wird migriert...",
|
||||
"mode": "Modus",
|
||||
"multiplex": "Multiplex",
|
||||
"name": "Name",
|
||||
"noData": "Keine Daten",
|
||||
"notAvailable": "Nicht verfügbar",
|
||||
"obfs": "Obfuskation",
|
||||
"obfs_host": "Obfs-Host",
|
||||
"obfs_password": "Obfuskationspasswort",
|
||||
"obfs_password_placeholder": "Obfuskationspasswort eingeben",
|
||||
"obfs_path": "Obfs-Pfad",
|
||||
"offline": "Offline",
|
||||
"online": "Online",
|
||||
"onlineUsers": "Online-Benutzer",
|
||||
@ -78,8 +93,6 @@
|
||||
"pageTitle": "Server",
|
||||
"path": "Pfad",
|
||||
"please_select": "Bitte auswählen",
|
||||
"plugin": "Plugin-Konfiguration",
|
||||
"plugin_opts": "Plugin-Optionen",
|
||||
"port": "Port",
|
||||
"protocol_configurations": "Protokollkonfigurationen",
|
||||
"protocol_configurations_desc": "Aktivieren und konfigurieren Sie die erforderlichen Protokolltypen",
|
||||
|
||||
@ -4,6 +4,7 @@
|
||||
"bandwidth_placeholder": "Enter bandwidth, leave empty for BBR",
|
||||
"basic": "Basic Configuration",
|
||||
"cancel": "Cancel",
|
||||
"cipher": "Encryption Algorithm",
|
||||
"city": "City",
|
||||
"config": {
|
||||
"title": "Node configuration",
|
||||
@ -49,9 +50,19 @@
|
||||
"drawerEditTitle": "Edit Server",
|
||||
"edit": "Edit",
|
||||
"enabled": "Enabled",
|
||||
"encryption_method": "Encryption method",
|
||||
"encryption": "Encryption Method",
|
||||
"encryption_client_padding": "Client Padding",
|
||||
"encryption_mode": "Mode",
|
||||
"encryption_password": "Password",
|
||||
"encryption_password_placeholder": "Leave empty for auto-generation, replace manually for post-quantum encryption",
|
||||
"encryption_private_key": "Private Key",
|
||||
"encryption_private_key_placeholder": "Leave empty for auto-generation, replace manually for post-quantum encryption",
|
||||
"encryption_rtt": "RTT",
|
||||
"encryption_server_padding": "Server Padding",
|
||||
"encryption_ticket": "Ticket time",
|
||||
"expireTime": "Expire time",
|
||||
"expired": "Expired",
|
||||
"extra": "Extra Configuration",
|
||||
"flow": "Flow",
|
||||
"hop_interval": "Hop interval",
|
||||
"hop_ports": "Hop ports",
|
||||
@ -64,12 +75,16 @@
|
||||
"migrateFailed": "Data migration failed",
|
||||
"migrated": "Data migrated successfully",
|
||||
"migrating": "Migrating...",
|
||||
"mode": "Mode",
|
||||
"multiplex": "Multiplex",
|
||||
"name": "Name",
|
||||
"noData": "No data",
|
||||
"notAvailable": "N/A",
|
||||
"obfs": "Obfuscation",
|
||||
"obfs_host": "Obfs Host",
|
||||
"obfs_password": "Obfuscation password",
|
||||
"obfs_password_placeholder": "Enter obfuscation password",
|
||||
"obfs_path": "Obfs Path",
|
||||
"offline": "Offline",
|
||||
"online": "Online",
|
||||
"onlineUsers": "Online users",
|
||||
@ -78,8 +93,6 @@
|
||||
"pageTitle": "Servers",
|
||||
"path": "Path",
|
||||
"please_select": "Please select",
|
||||
"plugin": "Plugin Configuration",
|
||||
"plugin_opts": "Plugin Options",
|
||||
"port": "Port",
|
||||
"protocol_configurations": "Protocol Configurations",
|
||||
"protocol_configurations_desc": "Enable and configure the required protocol types",
|
||||
|
||||
@ -4,6 +4,7 @@
|
||||
"bandwidth_placeholder": "Introduce el ancho de banda, deja vacío para BBR",
|
||||
"basic": "Configuración Básica",
|
||||
"cancel": "Cancelar",
|
||||
"cipher": "Algoritmo de Cifrado",
|
||||
"city": "Ciudad",
|
||||
"config": {
|
||||
"actions": {
|
||||
@ -49,9 +50,19 @@
|
||||
"drawerEditTitle": "Editar Servidor",
|
||||
"edit": "Editar",
|
||||
"enabled": "Habilitado",
|
||||
"encryption_method": "Método de cifrado",
|
||||
"encryption": "Método de Cifrado",
|
||||
"encryption_client_padding": "Relleno del Cliente",
|
||||
"encryption_mode": "Modo",
|
||||
"encryption_password": "Contraseña",
|
||||
"encryption_password_placeholder": "Dejar vacío para auto-generación, reemplazar manualmente para cifrado post-cuántico",
|
||||
"encryption_private_key": "Clave Privada",
|
||||
"encryption_private_key_placeholder": "Dejar vacío para auto-generación, reemplazar manualmente para cifrado post-cuántico",
|
||||
"encryption_rtt": "RTT",
|
||||
"encryption_server_padding": "Relleno del Servidor",
|
||||
"encryption_ticket": "Tiempo de Ticket",
|
||||
"expireTime": "Tiempo de expiración",
|
||||
"expired": "Expirado",
|
||||
"extra": "Configuración Extra",
|
||||
"flow": "Flujo",
|
||||
"hop_interval": "Intervalo de salto",
|
||||
"hop_ports": "Puertos de salto",
|
||||
@ -64,12 +75,16 @@
|
||||
"migrateFailed": "La migración de datos falló",
|
||||
"migrated": "Datos migrados con éxito",
|
||||
"migrating": "Migrando...",
|
||||
"mode": "Modo",
|
||||
"multiplex": "Multiplex",
|
||||
"name": "Nombre",
|
||||
"noData": "Sin datos",
|
||||
"notAvailable": "N/A",
|
||||
"obfs": "Ofuscación",
|
||||
"obfs_host": "Host de Ofuscación",
|
||||
"obfs_password": "Contraseña de ofuscación",
|
||||
"obfs_password_placeholder": "Ingrese la contraseña de ofuscación",
|
||||
"obfs_path": "Ruta de Ofuscación",
|
||||
"offline": "Desconectado",
|
||||
"online": "Conectado",
|
||||
"onlineUsers": "Usuarios en línea",
|
||||
@ -78,8 +93,6 @@
|
||||
"pageTitle": "Servidores",
|
||||
"path": "Ruta",
|
||||
"please_select": "Por favor seleccione",
|
||||
"plugin": "Configuración del Plugin",
|
||||
"plugin_opts": "Opciones del Plugin",
|
||||
"port": "Puerto",
|
||||
"protocol_configurations": "Configuraciones de Protocolo",
|
||||
"protocol_configurations_desc": "Habilitar y configurar los tipos de protocolo requeridos",
|
||||
|
||||
@ -4,6 +4,7 @@
|
||||
"bandwidth_placeholder": "Ingresa el ancho de banda, deja vacío para BBR",
|
||||
"basic": "Configuración Básica",
|
||||
"cancel": "Cancelar",
|
||||
"cipher": "Algoritmo de Cifrado",
|
||||
"city": "Ciudad",
|
||||
"config": {
|
||||
"actions": {
|
||||
@ -49,9 +50,19 @@
|
||||
"drawerEditTitle": "Editar Servidor",
|
||||
"edit": "Editar",
|
||||
"enabled": "Habilitado",
|
||||
"encryption_method": "Método de encriptación",
|
||||
"encryption": "Método de Cifrado",
|
||||
"encryption_client_padding": "Relleno del Cliente",
|
||||
"encryption_mode": "Modo",
|
||||
"encryption_password": "Contraseña",
|
||||
"encryption_password_placeholder": "Dejar vacío para auto-generación, reemplazar manualmente para cifrado post-cuántico",
|
||||
"encryption_private_key": "Clave Privada",
|
||||
"encryption_private_key_placeholder": "Dejar vacío para auto-generación, reemplazar manualmente para cifrado post-cuántico",
|
||||
"encryption_rtt": "RTT",
|
||||
"encryption_server_padding": "Relleno del Servidor",
|
||||
"encryption_ticket": "Tiempo de Ticket",
|
||||
"expireTime": "Tiempo de expiración",
|
||||
"expired": "Expirado",
|
||||
"extra": "Configuración Extra",
|
||||
"flow": "Flujo",
|
||||
"hop_interval": "Intervalo de salto",
|
||||
"hop_ports": "Puertos de salto",
|
||||
@ -64,12 +75,16 @@
|
||||
"migrateFailed": "La migración de datos falló",
|
||||
"migrated": "Datos migrados con éxito",
|
||||
"migrating": "Migrando...",
|
||||
"mode": "Modo",
|
||||
"multiplex": "Multiplex",
|
||||
"name": "Nombre",
|
||||
"noData": "Sin datos",
|
||||
"notAvailable": "N/A",
|
||||
"obfs": "Ofuscación",
|
||||
"obfs_host": "Host de Ofuscación",
|
||||
"obfs_password": "Contraseña de ofuscación",
|
||||
"obfs_password_placeholder": "Ingresa la contraseña de ofuscación",
|
||||
"obfs_path": "Ruta de Ofuscación",
|
||||
"offline": "Desconectado",
|
||||
"online": "Conectado",
|
||||
"onlineUsers": "Usuarios en línea",
|
||||
@ -78,8 +93,6 @@
|
||||
"pageTitle": "Servidores",
|
||||
"path": "Ruta",
|
||||
"please_select": "Por favor selecciona",
|
||||
"plugin": "Configuración del Plugin",
|
||||
"plugin_opts": "Opciones del Plugin",
|
||||
"port": "Puerto",
|
||||
"protocol_configurations": "Configuraciones de Protocolo",
|
||||
"protocol_configurations_desc": "Habilitar y configurar los tipos de protocolo requeridos",
|
||||
|
||||
@ -4,6 +4,7 @@
|
||||
"bandwidth_placeholder": "عرض پهنای باند، برای BBR خالی بگذارید",
|
||||
"basic": "پیکربندی پایه",
|
||||
"cancel": "لغو",
|
||||
"cipher": "الگوریتم رمزنگاری",
|
||||
"city": "شهر",
|
||||
"config": {
|
||||
"actions": {
|
||||
@ -49,9 +50,19 @@
|
||||
"drawerEditTitle": "ویرایش سرور",
|
||||
"edit": "ویرایش",
|
||||
"enabled": "فعال",
|
||||
"encryption_method": "روش رمزنگاری",
|
||||
"encryption": "روش رمزنگاری",
|
||||
"encryption_client_padding": "پدینگ کلاینت",
|
||||
"encryption_mode": "حالت",
|
||||
"encryption_password": "گذرواژه",
|
||||
"encryption_password_placeholder": "برای تولید خودکار خالی بگذارید، به صورت دستی برای رمزنگاری پساکوانتومی جایگزین کنید",
|
||||
"encryption_private_key": "کلید خصوصی",
|
||||
"encryption_private_key_placeholder": "برای تولید خودکار خالی بگذارید، به صورت دستی برای رمزنگاری پساکوانتومی جایگزین کنید",
|
||||
"encryption_rtt": "RTT",
|
||||
"encryption_server_padding": "پدینگ سرور",
|
||||
"encryption_ticket": "زمان بلیط",
|
||||
"expireTime": "زمان انقضا",
|
||||
"expired": "منقضی شده",
|
||||
"extra": "پیکربندی اضافی",
|
||||
"flow": "جریان",
|
||||
"hop_interval": "فاصله پرش",
|
||||
"hop_ports": "پورتهای پرش",
|
||||
@ -64,12 +75,16 @@
|
||||
"migrateFailed": "انتقال داده ناموفق بود",
|
||||
"migrated": "داده با موفقیت منتقل شد",
|
||||
"migrating": "در حال انتقال...",
|
||||
"mode": "حالت",
|
||||
"multiplex": "چندمنظوره",
|
||||
"name": "نام",
|
||||
"noData": "هیچ دادهای",
|
||||
"notAvailable": "غیرقابل دسترسی",
|
||||
"obfs": "پنهانسازی",
|
||||
"obfs_host": "میزبان پنهانسازی",
|
||||
"obfs_password": "رمز عبور اختفا",
|
||||
"obfs_password_placeholder": "رمز عبور اختفا را وارد کنید",
|
||||
"obfs_path": "مسیر پنهانسازی",
|
||||
"offline": "آفلاین",
|
||||
"online": "آنلاین",
|
||||
"onlineUsers": "کاربران آنلاین",
|
||||
@ -78,8 +93,6 @@
|
||||
"pageTitle": "سرورها",
|
||||
"path": "مسیر",
|
||||
"please_select": "لطفاً انتخاب کنید",
|
||||
"plugin": "پیکربندی پلاگین",
|
||||
"plugin_opts": "گزینههای پلاگین",
|
||||
"port": "پورت",
|
||||
"protocol_configurations": "پیکربندیهای پروتکل",
|
||||
"protocol_configurations_desc": "پروتکلهای مورد نیاز را فعال و پیکربندی کنید",
|
||||
|
||||
@ -4,6 +4,7 @@
|
||||
"bandwidth_placeholder": "Syötä kaistanleveys, jätä tyhjäksi BBR:lle",
|
||||
"basic": "Perusasetukset",
|
||||
"cancel": "Peruuta",
|
||||
"cipher": "Salausalgoritmi",
|
||||
"city": "Kaupunki",
|
||||
"config": {
|
||||
"actions": {
|
||||
@ -49,9 +50,19 @@
|
||||
"drawerEditTitle": "Muokkaa palvelinta",
|
||||
"edit": "Muokkaa",
|
||||
"enabled": "Käytössä",
|
||||
"encryption_method": "Salausmenetelmä",
|
||||
"encryption": "Salausmenetelmä",
|
||||
"encryption_client_padding": "Asiakkaan täyte",
|
||||
"encryption_mode": "Tila",
|
||||
"encryption_password": "Salasana",
|
||||
"encryption_password_placeholder": "Jätä tyhjäksi automaattista generointia varten, vaihda manuaalisesti post-kvanttisalausta varten",
|
||||
"encryption_private_key": "Yksityinen avain",
|
||||
"encryption_private_key_placeholder": "Jätä tyhjäksi automaattista generointia varten, vaihda manuaalisesti post-kvanttisalausta varten",
|
||||
"encryption_rtt": "RTT",
|
||||
"encryption_server_padding": "Palvelimen täyte",
|
||||
"encryption_ticket": "Lippuaika",
|
||||
"expireTime": "Voimassaoloaika",
|
||||
"expired": "Vanhentunut",
|
||||
"extra": "Lisäasetukset",
|
||||
"flow": "Virta",
|
||||
"hop_interval": "Hyppyvälit",
|
||||
"hop_ports": "Hyppysatamat",
|
||||
@ -64,12 +75,16 @@
|
||||
"migrateFailed": "Tietojen siirto epäonnistui",
|
||||
"migrated": "Tiedot siirretty onnistuneesti",
|
||||
"migrating": "Siirretään...",
|
||||
"mode": "Tila",
|
||||
"multiplex": "Monistamo",
|
||||
"name": "Nimi",
|
||||
"noData": "Ei tietoja",
|
||||
"notAvailable": "Ei saatavilla",
|
||||
"obfs": "Häilytys",
|
||||
"obfs_host": "Häilytys isäntä",
|
||||
"obfs_password": "Häilytyssalasana",
|
||||
"obfs_password_placeholder": "Syötä häilytyssalasana",
|
||||
"obfs_path": "Häilytys polku",
|
||||
"offline": "Offline",
|
||||
"online": "Online",
|
||||
"onlineUsers": "Verkossa olevat käyttäjät",
|
||||
@ -78,8 +93,6 @@
|
||||
"pageTitle": "Palvelimet",
|
||||
"path": "Polku",
|
||||
"please_select": "Ole hyvä ja valitse",
|
||||
"plugin": "Laajennuksen asetukset",
|
||||
"plugin_opts": "Laajennusvaihtoehdot",
|
||||
"port": "Portti",
|
||||
"protocol_configurations": "Protokolla-asetukset",
|
||||
"protocol_configurations_desc": "Ota käyttöön ja määritä tarvittavat protokollatyypit",
|
||||
|
||||
@ -4,6 +4,7 @@
|
||||
"bandwidth_placeholder": "Entrez la bande passante, laissez vide pour BBR",
|
||||
"basic": "Configuration de base",
|
||||
"cancel": "Annuler",
|
||||
"cipher": "Algorithme de chiffrement",
|
||||
"city": "Ville",
|
||||
"config": {
|
||||
"actions": {
|
||||
@ -49,9 +50,19 @@
|
||||
"drawerEditTitle": "Modifier le serveur",
|
||||
"edit": "Modifier",
|
||||
"enabled": "Activé",
|
||||
"encryption_method": "Méthode de chiffrement",
|
||||
"encryption": "Méthode de chiffrement",
|
||||
"encryption_client_padding": "Remplissage client",
|
||||
"encryption_mode": "Mode",
|
||||
"encryption_password": "Mot de passe",
|
||||
"encryption_password_placeholder": "Laissez vide pour une génération automatique, remplacez manuellement pour un chiffrement post-quantique",
|
||||
"encryption_private_key": "Clé privée",
|
||||
"encryption_private_key_placeholder": "Laissez vide pour une génération automatique, remplacez manuellement pour un chiffrement post-quantique",
|
||||
"encryption_rtt": "RTT",
|
||||
"encryption_server_padding": "Remplissage serveur",
|
||||
"encryption_ticket": "Temps de ticket",
|
||||
"expireTime": "Temps d'expiration",
|
||||
"expired": "Expiré",
|
||||
"extra": "Configuration supplémentaire",
|
||||
"flow": "Flux",
|
||||
"hop_interval": "Intervalle de saut",
|
||||
"hop_ports": "Ports de saut",
|
||||
@ -64,12 +75,16 @@
|
||||
"migrateFailed": "Échec de la migration des données",
|
||||
"migrated": "Données migrées avec succès",
|
||||
"migrating": "Migration en cours...",
|
||||
"mode": "Mode",
|
||||
"multiplex": "Multiplex",
|
||||
"name": "Nom",
|
||||
"noData": "Aucune donnée",
|
||||
"notAvailable": "N/A",
|
||||
"obfs": "Obfuscation",
|
||||
"obfs_host": "Hôte Obfs",
|
||||
"obfs_password": "Mot de passe d'obfuscation",
|
||||
"obfs_password_placeholder": "Entrez le mot de passe d'obfuscation",
|
||||
"obfs_path": "Chemin Obfs",
|
||||
"offline": "Hors ligne",
|
||||
"online": "En ligne",
|
||||
"onlineUsers": "Utilisateurs en ligne",
|
||||
@ -78,8 +93,6 @@
|
||||
"pageTitle": "Serveurs",
|
||||
"path": "Chemin",
|
||||
"please_select": "Veuillez sélectionner",
|
||||
"plugin": "Configuration du plugin",
|
||||
"plugin_opts": "Options du plugin",
|
||||
"port": "Port",
|
||||
"protocol_configurations": "Configurations de protocole",
|
||||
"protocol_configurations_desc": "Activer et configurer les types de protocole requis",
|
||||
|
||||
@ -4,6 +4,7 @@
|
||||
"bandwidth_placeholder": "बैंडविड्थ दर्ज करें, BBR के लिए खाली छोड़ें",
|
||||
"basic": "बुनियादी कॉन्फ़िगरेशन",
|
||||
"cancel": "रद्द करें",
|
||||
"cipher": "एन्क्रिप्शन एल्गोरिदम",
|
||||
"city": "शहर",
|
||||
"config": {
|
||||
"actions": {
|
||||
@ -49,9 +50,19 @@
|
||||
"drawerEditTitle": "सर्वर संपादित करें",
|
||||
"edit": "संपादित करें",
|
||||
"enabled": "सक्षम",
|
||||
"encryption_method": "एन्क्रिप्शन विधि",
|
||||
"encryption": "एन्क्रिप्शन विधि",
|
||||
"encryption_client_padding": "क्लाइंट पैडिंग",
|
||||
"encryption_mode": "मोड",
|
||||
"encryption_password": "पासवर्ड",
|
||||
"encryption_password_placeholder": "स्वतः उत्पन्न करने के लिए खाली छोड़ें, पोस्ट-क्वांटम एन्क्रिप्शन के लिए मैन्युअल रूप से बदलें",
|
||||
"encryption_private_key": "निजी कुंजी",
|
||||
"encryption_private_key_placeholder": "स्वतः उत्पन्न करने के लिए खाली छोड़ें, पोस्ट-क्वांटम एन्क्रिप्शन के लिए मैन्युअल रूप से बदलें",
|
||||
"encryption_rtt": "RTT",
|
||||
"encryption_server_padding": "सर्वर पैडिंग",
|
||||
"encryption_ticket": "टिकट समय",
|
||||
"expireTime": "समाप्ति समय",
|
||||
"expired": "समय समाप्त",
|
||||
"extra": "अतिरिक्त कॉन्फ़िगरेशन",
|
||||
"flow": "प्रवाह",
|
||||
"hop_interval": "हॉप अंतराल",
|
||||
"hop_ports": "हॉप पोर्ट",
|
||||
@ -64,12 +75,16 @@
|
||||
"migrateFailed": "डेटा माइग्रेशन विफल",
|
||||
"migrated": "डेटा सफलतापूर्वक माइग्रेट किया गया",
|
||||
"migrating": "माइग्रेट किया जा रहा है...",
|
||||
"mode": "मोड",
|
||||
"multiplex": "मल्टीप्लेक्स",
|
||||
"name": "नाम",
|
||||
"noData": "कोई डेटा नहीं",
|
||||
"notAvailable": "उपलब्ध नहीं",
|
||||
"obfs": "ओबफस्केशन",
|
||||
"obfs_host": "ओबफ्स होस्ट",
|
||||
"obfs_password": "अवशोषण पासवर्ड",
|
||||
"obfs_password_placeholder": "अवशोषण पासवर्ड दर्ज करें",
|
||||
"obfs_path": "ओबफ्स पथ",
|
||||
"offline": "ऑफलाइन",
|
||||
"online": "ऑनलाइन",
|
||||
"onlineUsers": "ऑनलाइन उपयोगकर्ता",
|
||||
@ -78,8 +93,6 @@
|
||||
"pageTitle": "सर्वर",
|
||||
"path": "पथ",
|
||||
"please_select": "कृपया चुनें",
|
||||
"plugin": "प्लगइन कॉन्फ़िगरेशन",
|
||||
"plugin_opts": "प्लगइन विकल्प",
|
||||
"port": "पोर्ट",
|
||||
"protocol_configurations": "प्रोटोकॉल कॉन्फ़िगरेशन",
|
||||
"protocol_configurations_desc": "आवश्यक प्रोटोकॉल प्रकारों को सक्षम और कॉन्फ़िगर करें",
|
||||
|
||||
@ -4,6 +4,7 @@
|
||||
"bandwidth_placeholder": "Adja meg a sávszélességet, hagyja üresen a BBR-hez",
|
||||
"basic": "Alapértelmezett Beállítások",
|
||||
"cancel": "Mégse",
|
||||
"cipher": "Titkosítási algoritmus",
|
||||
"city": "Város",
|
||||
"config": {
|
||||
"actions": {
|
||||
@ -49,9 +50,19 @@
|
||||
"drawerEditTitle": "Szerver szerkesztése",
|
||||
"edit": "Szerkesztés",
|
||||
"enabled": "Engedélyezve",
|
||||
"encryption_method": "Titkosítási módszer",
|
||||
"encryption": "Titkosítási módszer",
|
||||
"encryption_client_padding": "Kliens kitöltés",
|
||||
"encryption_mode": "Mód",
|
||||
"encryption_password": "Jelszó",
|
||||
"encryption_password_placeholder": "Hagyja üresen az automatikus generáláshoz, cserélje ki kézzel a poszt-kvantum titkosításhoz",
|
||||
"encryption_private_key": "Privát kulcs",
|
||||
"encryption_private_key_placeholder": "Hagyja üresen az automatikus generáláshoz, cserélje ki kézzel a poszt-kvantum titkosításhoz",
|
||||
"encryption_rtt": "RTT",
|
||||
"encryption_server_padding": "Szerver kitöltés",
|
||||
"encryption_ticket": "Jegy idő",
|
||||
"expireTime": "Lejárati idő",
|
||||
"expired": "Lejárt",
|
||||
"extra": "További konfiguráció",
|
||||
"flow": "Forgalom",
|
||||
"hop_interval": "Ugrás időköz",
|
||||
"hop_ports": "Ugrás portok",
|
||||
@ -64,12 +75,16 @@
|
||||
"migrateFailed": "Az adatok migrálása sikertelen",
|
||||
"migrated": "Az adatok sikeresen migrálva",
|
||||
"migrating": "Migrálás...",
|
||||
"mode": "Mód",
|
||||
"multiplex": "Multiplex",
|
||||
"name": "Név",
|
||||
"noData": "Nincs adat",
|
||||
"notAvailable": "N/A",
|
||||
"obfs": "Obfuszkálás",
|
||||
"obfs_host": "Obfs gazda",
|
||||
"obfs_password": "Obfuszkálás jelszó",
|
||||
"obfs_password_placeholder": "Adja meg az obfuszkálás jelszót",
|
||||
"obfs_path": "Obfs útvonal",
|
||||
"offline": "Offline",
|
||||
"online": "Online",
|
||||
"onlineUsers": "Online felhasználók",
|
||||
@ -78,8 +93,6 @@
|
||||
"pageTitle": "Szerverek",
|
||||
"path": "Útvonal",
|
||||
"please_select": "Kérjük, válasszon",
|
||||
"plugin": "Bővítmény Beállítások",
|
||||
"plugin_opts": "Bővítmény Opciók",
|
||||
"port": "Port",
|
||||
"protocol_configurations": "Protokoll Beállítások",
|
||||
"protocol_configurations_desc": "Engedélyezze és konfigurálja a szükséges protokolltípusokat",
|
||||
|
||||
@ -4,6 +4,7 @@
|
||||
"bandwidth_placeholder": "帯域幅を入力してください。BBRの場合は空白のままにしてください。",
|
||||
"basic": "基本設定",
|
||||
"cancel": "キャンセル",
|
||||
"cipher": "暗号化アルゴリズム",
|
||||
"city": "都市",
|
||||
"config": {
|
||||
"actions": {
|
||||
@ -49,9 +50,19 @@
|
||||
"drawerEditTitle": "サーバーを編集",
|
||||
"edit": "編集",
|
||||
"enabled": "有効",
|
||||
"encryption_method": "暗号化方式",
|
||||
"encryption": "暗号化方式",
|
||||
"encryption_client_padding": "クライアントパディング",
|
||||
"encryption_mode": "モード",
|
||||
"encryption_password": "パスワード",
|
||||
"encryption_password_placeholder": "自動生成のために空白のままにし、ポスト量子暗号化のために手動で置き換えてください",
|
||||
"encryption_private_key": "秘密鍵",
|
||||
"encryption_private_key_placeholder": "自動生成のために空白のままにし、ポスト量子暗号化のために手動で置き換えてください",
|
||||
"encryption_rtt": "RTT",
|
||||
"encryption_server_padding": "サーバーパディング",
|
||||
"encryption_ticket": "チケット時間",
|
||||
"expireTime": "有効期限",
|
||||
"expired": "期限切れ",
|
||||
"extra": "追加設定",
|
||||
"flow": "フロー",
|
||||
"hop_interval": "ホップ間隔",
|
||||
"hop_ports": "ホップポート",
|
||||
@ -64,12 +75,16 @@
|
||||
"migrateFailed": "データの移行に失敗しました",
|
||||
"migrated": "データが正常に移行されました",
|
||||
"migrating": "移行中...",
|
||||
"mode": "モード",
|
||||
"multiplex": "マルチプレックス",
|
||||
"name": "名前",
|
||||
"noData": "データなし",
|
||||
"notAvailable": "利用不可",
|
||||
"obfs": "難読化",
|
||||
"obfs_host": "難読化ホスト",
|
||||
"obfs_password": "難読化パスワード",
|
||||
"obfs_password_placeholder": "難読化パスワードを入力してください",
|
||||
"obfs_path": "難読化パス",
|
||||
"offline": "オフライン",
|
||||
"online": "オンライン",
|
||||
"onlineUsers": "オンラインユーザー",
|
||||
@ -78,8 +93,6 @@
|
||||
"pageTitle": "サーバー",
|
||||
"path": "パス",
|
||||
"please_select": "選択してください",
|
||||
"plugin": "プラグイン設定",
|
||||
"plugin_opts": "プラグインオプション",
|
||||
"port": "ポート",
|
||||
"protocol_configurations": "プロトコル設定",
|
||||
"protocol_configurations_desc": "必要なプロトコルタイプを有効にして設定します",
|
||||
|
||||
@ -4,6 +4,7 @@
|
||||
"bandwidth_placeholder": "대역폭을 입력하세요. BBR을 사용하려면 비워 두세요.",
|
||||
"basic": "기본 설정",
|
||||
"cancel": "취소",
|
||||
"cipher": "암호화 알고리즘",
|
||||
"city": "도시",
|
||||
"config": {
|
||||
"actions": {
|
||||
@ -49,9 +50,19 @@
|
||||
"drawerEditTitle": "서버 편집",
|
||||
"edit": "편집",
|
||||
"enabled": "활성화됨",
|
||||
"encryption_method": "암호화 방법",
|
||||
"encryption": "암호화 방법",
|
||||
"encryption_client_padding": "클라이언트 패딩",
|
||||
"encryption_mode": "모드",
|
||||
"encryption_password": "비밀번호",
|
||||
"encryption_password_placeholder": "자동 생성하려면 비워 두고, 포스트 양자 암호화를 위해 수동으로 교체하세요",
|
||||
"encryption_private_key": "개인 키",
|
||||
"encryption_private_key_placeholder": "자동 생성하려면 비워 두고, 포스트 양자 암호화를 위해 수동으로 교체하세요",
|
||||
"encryption_rtt": "RTT",
|
||||
"encryption_server_padding": "서버 패딩",
|
||||
"encryption_ticket": "티켓 시간",
|
||||
"expireTime": "만료 시간",
|
||||
"expired": "만료됨",
|
||||
"extra": "추가 구성",
|
||||
"flow": "흐름",
|
||||
"hop_interval": "홉 간격",
|
||||
"hop_ports": "홉 포트",
|
||||
@ -64,12 +75,16 @@
|
||||
"migrateFailed": "데이터 마이그레이션 실패",
|
||||
"migrated": "데이터가 성공적으로 마이그레이션되었습니다",
|
||||
"migrating": "마이그레이션 중...",
|
||||
"mode": "모드",
|
||||
"multiplex": "멀티플렉스",
|
||||
"name": "이름",
|
||||
"noData": "데이터 없음",
|
||||
"notAvailable": "사용 불가",
|
||||
"obfs": "난독화",
|
||||
"obfs_host": "난독화 호스트",
|
||||
"obfs_password": "난독화 비밀번호",
|
||||
"obfs_password_placeholder": "난독화 비밀번호를 입력하세요",
|
||||
"obfs_path": "난독화 경로",
|
||||
"offline": "오프라인",
|
||||
"online": "온라인",
|
||||
"onlineUsers": "온라인 사용자",
|
||||
@ -78,8 +93,6 @@
|
||||
"pageTitle": "서버",
|
||||
"path": "경로",
|
||||
"please_select": "선택해 주세요",
|
||||
"plugin": "플러그인 설정",
|
||||
"plugin_opts": "플러그인 옵션",
|
||||
"port": "포트",
|
||||
"protocol_configurations": "프로토콜 설정",
|
||||
"protocol_configurations_desc": "필요한 프로토콜 유형을 활성화하고 구성합니다",
|
||||
|
||||
@ -4,6 +4,7 @@
|
||||
"bandwidth_placeholder": "Skriv inn båndbredde, la stå tomt for BBR",
|
||||
"basic": "Grunnleggende Konfigurasjon",
|
||||
"cancel": "Avbryt",
|
||||
"cipher": "Krypteringsalgoritme",
|
||||
"city": "By",
|
||||
"config": {
|
||||
"actions": {
|
||||
@ -49,9 +50,19 @@
|
||||
"drawerEditTitle": "Rediger server",
|
||||
"edit": "Rediger",
|
||||
"enabled": "Aktivert",
|
||||
"encryption_method": "Krypteringsmetode",
|
||||
"encryption": "Krypteringsmetode",
|
||||
"encryption_client_padding": "Klient Padding",
|
||||
"encryption_mode": "Modus",
|
||||
"encryption_password": "Passord",
|
||||
"encryption_password_placeholder": "La stå tom for automatisk generering, erstatt manuelt for post-kvantum kryptering",
|
||||
"encryption_private_key": "Privat nøkkel",
|
||||
"encryption_private_key_placeholder": "La stå tom for automatisk generering, erstatt manuelt for post-kvantum kryptering",
|
||||
"encryption_rtt": "RTT",
|
||||
"encryption_server_padding": "Server Padding",
|
||||
"encryption_ticket": "Billettid",
|
||||
"expireTime": "Utløpstid",
|
||||
"expired": "Utløpt",
|
||||
"extra": "Ekstra konfigurasjon",
|
||||
"flow": "Flyt",
|
||||
"hop_interval": "Hoppintervall",
|
||||
"hop_ports": "Hoppporter",
|
||||
@ -64,12 +75,16 @@
|
||||
"migrateFailed": "Datamigrering mislyktes",
|
||||
"migrated": "Data migrert med suksess",
|
||||
"migrating": "Migrerer...",
|
||||
"mode": "Modus",
|
||||
"multiplex": "Multiplex",
|
||||
"name": "Navn",
|
||||
"noData": "Ingen data",
|
||||
"notAvailable": "Ikke tilgjengelig",
|
||||
"obfs": "Obfuskering",
|
||||
"obfs_host": "Obfs Vert",
|
||||
"obfs_password": "Obfuskasjonspassord",
|
||||
"obfs_password_placeholder": "Skriv inn obfuskasjonspassord",
|
||||
"obfs_path": "Obfs Sti",
|
||||
"offline": "Frakoblet",
|
||||
"online": "På nett",
|
||||
"onlineUsers": "Brukere på nett",
|
||||
@ -78,8 +93,6 @@
|
||||
"pageTitle": "Servere",
|
||||
"path": "Sti",
|
||||
"please_select": "Vennligst velg",
|
||||
"plugin": "Plugin Konfigurasjon",
|
||||
"plugin_opts": "Plugin Alternativer",
|
||||
"port": "Port",
|
||||
"protocol_configurations": "Protokoll Konfigurasjoner",
|
||||
"protocol_configurations_desc": "Aktiver og konfigurer de nødvendige protokolltypene",
|
||||
|
||||
@ -4,6 +4,7 @@
|
||||
"bandwidth_placeholder": "Wprowadź przepustowość, pozostaw puste dla BBR",
|
||||
"basic": "Podstawowa konfiguracja",
|
||||
"cancel": "Anuluj",
|
||||
"cipher": "Algorytm szyfrowania",
|
||||
"city": "Miasto",
|
||||
"config": {
|
||||
"actions": {
|
||||
@ -49,9 +50,19 @@
|
||||
"drawerEditTitle": "Edytuj serwer",
|
||||
"edit": "Edytuj",
|
||||
"enabled": "Włączony",
|
||||
"encryption_method": "Metoda szyfrowania",
|
||||
"encryption": "Metoda szyfrowania",
|
||||
"encryption_client_padding": "Padding klienta",
|
||||
"encryption_mode": "Tryb",
|
||||
"encryption_password": "Hasło",
|
||||
"encryption_password_placeholder": "Pozostaw puste dla automatycznego generowania, zastąp ręcznie dla szyfrowania post-kwantowego",
|
||||
"encryption_private_key": "Klucz prywatny",
|
||||
"encryption_private_key_placeholder": "Pozostaw puste dla automatycznego generowania, zastąp ręcznie dla szyfrowania post-kwantowego",
|
||||
"encryption_rtt": "RTT",
|
||||
"encryption_server_padding": "Padding serwera",
|
||||
"encryption_ticket": "Czas biletu",
|
||||
"expireTime": "Czas wygaśnięcia",
|
||||
"expired": "Wygasł",
|
||||
"extra": "Dodatkowa konfiguracja",
|
||||
"flow": "Przepływ",
|
||||
"hop_interval": "Interwał skoku",
|
||||
"hop_ports": "Porty skoku",
|
||||
@ -64,12 +75,16 @@
|
||||
"migrateFailed": "Migracja danych nie powiodła się",
|
||||
"migrated": "Dane zostały pomyślnie zmigrowane",
|
||||
"migrating": "Migracja...",
|
||||
"mode": "Tryb",
|
||||
"multiplex": "Multiplex",
|
||||
"name": "Nazwa",
|
||||
"noData": "Brak danych",
|
||||
"notAvailable": "N/D",
|
||||
"obfs": "Obfuskacja",
|
||||
"obfs_host": "Host obfuskacji",
|
||||
"obfs_password": "Hasło obfuskacji",
|
||||
"obfs_password_placeholder": "Wprowadź hasło obfuskacji",
|
||||
"obfs_path": "Ścieżka obfuskacji",
|
||||
"offline": "Offline",
|
||||
"online": "Online",
|
||||
"onlineUsers": "Użytkownicy online",
|
||||
@ -78,8 +93,6 @@
|
||||
"pageTitle": "Serwery",
|
||||
"path": "Ścieżka",
|
||||
"please_select": "Proszę wybrać",
|
||||
"plugin": "Konfiguracja wtyczki",
|
||||
"plugin_opts": "Opcje wtyczki",
|
||||
"port": "Port",
|
||||
"protocol_configurations": "Konfiguracje protokołów",
|
||||
"protocol_configurations_desc": "Włącz i skonfiguruj wymagane typy protokołów",
|
||||
|
||||
@ -4,6 +4,7 @@
|
||||
"bandwidth_placeholder": "Insira a largura de banda, deixe em branco para BBR",
|
||||
"basic": "Configuração Básica",
|
||||
"cancel": "Cancelar",
|
||||
"cipher": "Algoritmo de Criptografia",
|
||||
"city": "Cidade",
|
||||
"config": {
|
||||
"actions": {
|
||||
@ -49,9 +50,19 @@
|
||||
"drawerEditTitle": "Editar Servidor",
|
||||
"edit": "Editar",
|
||||
"enabled": "Ativado",
|
||||
"encryption_method": "Método de criptografia",
|
||||
"encryption": "Método de Criptografia",
|
||||
"encryption_client_padding": "Preenchimento do Cliente",
|
||||
"encryption_mode": "Modo",
|
||||
"encryption_password": "Senha",
|
||||
"encryption_password_placeholder": "Deixe em branco para auto-geração, substitua manualmente para criptografia pós-quântica",
|
||||
"encryption_private_key": "Chave Privada",
|
||||
"encryption_private_key_placeholder": "Deixe em branco para auto-geração, substitua manualmente para criptografia pós-quântica",
|
||||
"encryption_rtt": "RTT",
|
||||
"encryption_server_padding": "Preenchimento do Servidor",
|
||||
"encryption_ticket": "Tempo do Ticket",
|
||||
"expireTime": "Tempo de expiração",
|
||||
"expired": "Expirado",
|
||||
"extra": "Configuração Extra",
|
||||
"flow": "Fluxo",
|
||||
"hop_interval": "Intervalo de salto",
|
||||
"hop_ports": "Portas de salto",
|
||||
@ -64,12 +75,16 @@
|
||||
"migrateFailed": "A migração de dados falhou",
|
||||
"migrated": "Dados migrados com sucesso",
|
||||
"migrating": "Migrando...",
|
||||
"mode": "Modo",
|
||||
"multiplex": "Multiplex",
|
||||
"name": "Nome",
|
||||
"noData": "Sem dados",
|
||||
"notAvailable": "N/D",
|
||||
"obfs": "Ofuscação",
|
||||
"obfs_host": "Host de Ofuscação",
|
||||
"obfs_password": "Senha de ofuscação",
|
||||
"obfs_password_placeholder": "Insira a senha de ofuscação",
|
||||
"obfs_path": "Caminho de Ofuscação",
|
||||
"offline": "Offline",
|
||||
"online": "Online",
|
||||
"onlineUsers": "Usuários online",
|
||||
@ -78,8 +93,6 @@
|
||||
"pageTitle": "Servidores",
|
||||
"path": "Caminho",
|
||||
"please_select": "Por favor, selecione",
|
||||
"plugin": "Configuração do Plugin",
|
||||
"plugin_opts": "Opções do Plugin",
|
||||
"port": "Porta",
|
||||
"protocol_configurations": "Configurações de Protocolo",
|
||||
"protocol_configurations_desc": "Ative e configure os tipos de protocolo necessários",
|
||||
|
||||
@ -4,6 +4,7 @@
|
||||
"bandwidth_placeholder": "Introduceți lățimea de bandă, lăsați liber pentru BBR",
|
||||
"basic": "Configurare de bază",
|
||||
"cancel": "Anulează",
|
||||
"cipher": "Algoritm de criptare",
|
||||
"city": "Oraș",
|
||||
"config": {
|
||||
"actions": {
|
||||
@ -49,9 +50,19 @@
|
||||
"drawerEditTitle": "Editează Server",
|
||||
"edit": "Editează",
|
||||
"enabled": "Activat",
|
||||
"encryption_method": "Metodă de criptare",
|
||||
"encryption": "Metodă de criptare",
|
||||
"encryption_client_padding": "Padding client",
|
||||
"encryption_mode": "Mod",
|
||||
"encryption_password": "Parolă",
|
||||
"encryption_password_placeholder": "Lăsați gol pentru generare automată, înlocuiți manual pentru criptare post-cuantică",
|
||||
"encryption_private_key": "Cheie privată",
|
||||
"encryption_private_key_placeholder": "Lăsați gol pentru generare automată, înlocuiți manual pentru criptare post-cuantică",
|
||||
"encryption_rtt": "RTT",
|
||||
"encryption_server_padding": "Padding server",
|
||||
"encryption_ticket": "Timp bilet",
|
||||
"expireTime": "Timp de expirare",
|
||||
"expired": "Expirat",
|
||||
"extra": "Configurație suplimentară",
|
||||
"flow": "Flux",
|
||||
"hop_interval": "Interval de hop",
|
||||
"hop_ports": "Porturi hop",
|
||||
@ -64,12 +75,16 @@
|
||||
"migrateFailed": "Migrarea datelor a eșuat",
|
||||
"migrated": "Datele au fost migrate cu succes",
|
||||
"migrating": "Se migrează...",
|
||||
"mode": "Mod",
|
||||
"multiplex": "Multiplex",
|
||||
"name": "Nume",
|
||||
"noData": "Fără date",
|
||||
"notAvailable": "N/A",
|
||||
"obfs": "Obfuscare",
|
||||
"obfs_host": "Host Obfs",
|
||||
"obfs_password": "Parola de obfuscare",
|
||||
"obfs_password_placeholder": "Introdu parola de obfuscare",
|
||||
"obfs_path": "Cale Obfs",
|
||||
"offline": "Offline",
|
||||
"online": "Online",
|
||||
"onlineUsers": "Utilizatori online",
|
||||
@ -78,8 +93,6 @@
|
||||
"pageTitle": "Servere",
|
||||
"path": "Cale",
|
||||
"please_select": "Te rog selectează",
|
||||
"plugin": "Configurare plugin",
|
||||
"plugin_opts": "Opțiuni plugin",
|
||||
"port": "Port",
|
||||
"protocol_configurations": "Configurări protocol",
|
||||
"protocol_configurations_desc": "Activează și configurează tipurile de protocol necesare",
|
||||
|
||||
@ -4,6 +4,7 @@
|
||||
"bandwidth_placeholder": "Введите пропускную способность, оставьте пустым для BBR",
|
||||
"basic": "Базовая конфигурация",
|
||||
"cancel": "Отмена",
|
||||
"cipher": "Алгоритм шифрования",
|
||||
"city": "Город",
|
||||
"config": {
|
||||
"actions": {
|
||||
@ -49,9 +50,19 @@
|
||||
"drawerEditTitle": "Редактировать сервер",
|
||||
"edit": "Редактировать",
|
||||
"enabled": "Включено",
|
||||
"encryption_method": "Метод шифрования",
|
||||
"encryption": "Метод шифрования",
|
||||
"encryption_client_padding": "Дополнение клиента",
|
||||
"encryption_mode": "Режим",
|
||||
"encryption_password": "Пароль",
|
||||
"encryption_password_placeholder": "Оставьте пустым для авто-генерации, замените вручную для пост-квантового шифрования",
|
||||
"encryption_private_key": "Закрытый ключ",
|
||||
"encryption_private_key_placeholder": "Оставьте пустым для авто-генерации, замените вручную для пост-квантового шифрования",
|
||||
"encryption_rtt": "RTT",
|
||||
"encryption_server_padding": "Дополнение сервера",
|
||||
"encryption_ticket": "Время билета",
|
||||
"expireTime": "Время истечения",
|
||||
"expired": "Истекло",
|
||||
"extra": "Дополнительная конфигурация",
|
||||
"flow": "Поток",
|
||||
"hop_interval": "Интервал перехода",
|
||||
"hop_ports": "Порты перехода",
|
||||
@ -64,12 +75,16 @@
|
||||
"migrateFailed": "Ошибка при переносе данных",
|
||||
"migrated": "Данные успешно перенесены",
|
||||
"migrating": "Перенос данных...",
|
||||
"mode": "Режим",
|
||||
"multiplex": "Мультиплекс",
|
||||
"name": "Имя",
|
||||
"noData": "Нет данных",
|
||||
"notAvailable": "Недоступно",
|
||||
"obfs": "Обфускация",
|
||||
"obfs_host": "Обфусцированный хост",
|
||||
"obfs_password": "Пароль обфускации",
|
||||
"obfs_password_placeholder": "Введите пароль обфускации",
|
||||
"obfs_path": "Обфусцированный путь",
|
||||
"offline": "Офлайн",
|
||||
"online": "Онлайн",
|
||||
"onlineUsers": "Онлайн пользователи",
|
||||
@ -78,8 +93,6 @@
|
||||
"pageTitle": "Серверы",
|
||||
"path": "Путь",
|
||||
"please_select": "Пожалуйста, выберите",
|
||||
"plugin": "Конфигурация плагина",
|
||||
"plugin_opts": "Опции плагина",
|
||||
"port": "Порт",
|
||||
"protocol_configurations": "Конфигурации протоколов",
|
||||
"protocol_configurations_desc": "Включите и настройте необходимые типы протоколов",
|
||||
|
||||
@ -4,6 +4,7 @@
|
||||
"bandwidth_placeholder": "กรุณากรอกแบนด์วิธ ทิ้งว่างไว้สำหรับ BBR",
|
||||
"basic": "การตั้งค่าพื้นฐาน",
|
||||
"cancel": "ยกเลิก",
|
||||
"cipher": "อัลกอริธึมการเข้ารหัส",
|
||||
"city": "เมือง",
|
||||
"config": {
|
||||
"actions": {
|
||||
@ -49,9 +50,19 @@
|
||||
"drawerEditTitle": "แก้ไขเซิร์ฟเวอร์",
|
||||
"edit": "แก้ไข",
|
||||
"enabled": "เปิดใช้งาน",
|
||||
"encryption_method": "วิธีการเข้ารหัส",
|
||||
"encryption": "วิธีการเข้ารหัส",
|
||||
"encryption_client_padding": "การเติมข้อมูลของลูกค้า",
|
||||
"encryption_mode": "โหมด",
|
||||
"encryption_password": "รหัสผ่าน",
|
||||
"encryption_password_placeholder": "ปล่อยว่างเพื่อสร้างอัตโนมัติ เปลี่ยนด้วยตนเองสำหรับการเข้ารหัสหลังควอนตัม",
|
||||
"encryption_private_key": "กุญแจส่วนตัว",
|
||||
"encryption_private_key_placeholder": "ปล่อยว่างเพื่อสร้างอัตโนมัติ เปลี่ยนด้วยตนเองสำหรับการเข้ารหัสหลังควอนตัม",
|
||||
"encryption_rtt": "RTT",
|
||||
"encryption_server_padding": "การเติมข้อมูลของเซิร์ฟเวอร์",
|
||||
"encryption_ticket": "เวลาตั๋ว",
|
||||
"expireTime": "เวลาหมดอายุ",
|
||||
"expired": "หมดอายุ",
|
||||
"extra": "การกำหนดค่าพิเศษ",
|
||||
"flow": "การไหล",
|
||||
"hop_interval": "ช่วงเวลาการกระโดด",
|
||||
"hop_ports": "พอร์ตการกระโดด",
|
||||
@ -64,12 +75,16 @@
|
||||
"migrateFailed": "การย้ายข้อมูลล้มเหลว",
|
||||
"migrated": "ย้ายข้อมูลสำเร็จ",
|
||||
"migrating": "กำลังย้ายข้อมูล...",
|
||||
"mode": "โหมด",
|
||||
"multiplex": "หลายช่อง",
|
||||
"name": "ชื่อ",
|
||||
"noData": "ไม่มีข้อมูล",
|
||||
"notAvailable": "ไม่สามารถใช้ได้",
|
||||
"obfs": "การทำให้ไม่สามารถอ่านได้",
|
||||
"obfs_host": "โฮสต์การทำให้ไม่สามารถอ่านได้",
|
||||
"obfs_password": "รหัสผ่านการปกปิด",
|
||||
"obfs_password_placeholder": "กรอกรหัสผ่านการปกปิด",
|
||||
"obfs_path": "เส้นทางการทำให้ไม่สามารถอ่านได้",
|
||||
"offline": "ออฟไลน์",
|
||||
"online": "ออนไลน์",
|
||||
"onlineUsers": "ผู้ใช้งานออนไลน์",
|
||||
@ -78,8 +93,6 @@
|
||||
"pageTitle": "เซิร์ฟเวอร์",
|
||||
"path": "เส้นทาง",
|
||||
"please_select": "กรุณาเลือก",
|
||||
"plugin": "การตั้งค่าปลั๊กอิน",
|
||||
"plugin_opts": "ตัวเลือกปลั๊กอิน",
|
||||
"port": "พอร์ต",
|
||||
"protocol_configurations": "การตั้งค่าโปรโตคอล",
|
||||
"protocol_configurations_desc": "เปิดใช้งานและกำหนดค่าประเภทโปรโตคอลที่ต้องการ",
|
||||
|
||||
@ -4,6 +4,7 @@
|
||||
"bandwidth_placeholder": "Bant genişliğini girin, BBR için boş bırakın",
|
||||
"basic": "Temel Yapılandırma",
|
||||
"cancel": "İptal",
|
||||
"cipher": "Şifreleme Algoritması",
|
||||
"city": "Şehir",
|
||||
"config": {
|
||||
"actions": {
|
||||
@ -49,9 +50,19 @@
|
||||
"drawerEditTitle": "Sunucuyu Düzenle",
|
||||
"edit": "Düzenle",
|
||||
"enabled": "Etkin",
|
||||
"encryption_method": "Şifreleme yöntemi",
|
||||
"encryption": "Şifreleme Yöntemi",
|
||||
"encryption_client_padding": "İstemci Dolgusu",
|
||||
"encryption_mode": "Mod",
|
||||
"encryption_password": "Şifre",
|
||||
"encryption_password_placeholder": "Otomatik oluşturma için boş bırakın, post-kuantum şifreleme için manuel olarak değiştirin",
|
||||
"encryption_private_key": "Özel Anahtar",
|
||||
"encryption_private_key_placeholder": "Otomatik oluşturma için boş bırakın, post-kuantum şifreleme için manuel olarak değiştirin",
|
||||
"encryption_rtt": "RTT",
|
||||
"encryption_server_padding": "Sunucu Dolgusu",
|
||||
"encryption_ticket": "Bilet süresi",
|
||||
"expireTime": "Son kullanma zamanı",
|
||||
"expired": "Süresi dolmuş",
|
||||
"extra": "Ek Yapılandırma",
|
||||
"flow": "Akış",
|
||||
"hop_interval": "Atlama aralığı",
|
||||
"hop_ports": "Atlama portları",
|
||||
@ -64,12 +75,16 @@
|
||||
"migrateFailed": "Veri taşıma işlemi başarısız oldu",
|
||||
"migrated": "Veri başarıyla taşındı",
|
||||
"migrating": "Taşınıyor...",
|
||||
"mode": "Mod",
|
||||
"multiplex": "Çoklu Salon",
|
||||
"name": "İsim",
|
||||
"noData": "Veri yok",
|
||||
"notAvailable": "Mevcut değil",
|
||||
"obfs": "Obfuscation",
|
||||
"obfs_host": "Obfs Ana Bilgisi",
|
||||
"obfs_password": "Gizleme şifresi",
|
||||
"obfs_password_placeholder": "Gizleme şifresini girin",
|
||||
"obfs_path": "Obfs Yolu",
|
||||
"offline": "Çevrimdışı",
|
||||
"online": "Çevrimiçi",
|
||||
"onlineUsers": "Çevrimiçi kullanıcılar",
|
||||
@ -78,8 +93,6 @@
|
||||
"pageTitle": "Sunucular",
|
||||
"path": "Yol",
|
||||
"please_select": "Lütfen seçin",
|
||||
"plugin": "Eklenti Yapılandırması",
|
||||
"plugin_opts": "Eklenti Seçenekleri",
|
||||
"port": "Port",
|
||||
"protocol_configurations": "Protokol Yapılandırmaları",
|
||||
"protocol_configurations_desc": "Gerekli protokol türlerini etkinleştir ve yapılandır",
|
||||
|
||||
@ -4,6 +4,7 @@
|
||||
"bandwidth_placeholder": "Введіть пропускну здатність, залиште порожнім для BBR",
|
||||
"basic": "Базова конфігурація",
|
||||
"cancel": "Скасувати",
|
||||
"cipher": "Алгоритм шифрування",
|
||||
"city": "Місто",
|
||||
"config": {
|
||||
"actions": {
|
||||
@ -49,9 +50,19 @@
|
||||
"drawerEditTitle": "Редагувати сервер",
|
||||
"edit": "Редагувати",
|
||||
"enabled": "Увімкнено",
|
||||
"encryption_method": "Метод шифрування",
|
||||
"encryption": "Метод шифрування",
|
||||
"encryption_client_padding": "Паддінг клієнта",
|
||||
"encryption_mode": "Режим",
|
||||
"encryption_password": "Пароль",
|
||||
"encryption_password_placeholder": "Залиште порожнім для автоматичної генерації, замініть вручну для пост-квантового шифрування",
|
||||
"encryption_private_key": "Приватний ключ",
|
||||
"encryption_private_key_placeholder": "Залиште порожнім для автоматичної генерації, замініть вручну для пост-квантового шифрування",
|
||||
"encryption_rtt": "RTT",
|
||||
"encryption_server_padding": "Паддінг сервера",
|
||||
"encryption_ticket": "Час квитка",
|
||||
"expireTime": "Час закінчення",
|
||||
"expired": "Термін дії закінчився",
|
||||
"extra": "Додаткова конфігурація",
|
||||
"flow": "Потік",
|
||||
"hop_interval": "Інтервал стрибка",
|
||||
"hop_ports": "Порти стрибка",
|
||||
@ -64,12 +75,16 @@
|
||||
"migrateFailed": "Міграція даних не вдалася",
|
||||
"migrated": "Дані успішно мігрували",
|
||||
"migrating": "Міграція...",
|
||||
"mode": "Режим",
|
||||
"multiplex": "Мультиплекс",
|
||||
"name": "Ім'я",
|
||||
"noData": "Немає даних",
|
||||
"notAvailable": "Н/Д",
|
||||
"obfs": "Обфускація",
|
||||
"obfs_host": "Обфускаційний хост",
|
||||
"obfs_password": "Пароль обфускації",
|
||||
"obfs_password_placeholder": "Введіть пароль обфускації",
|
||||
"obfs_path": "Обфускаційний шлях",
|
||||
"offline": "Офлайн",
|
||||
"online": "Онлайн",
|
||||
"onlineUsers": "Онлайн користувачі",
|
||||
@ -78,8 +93,6 @@
|
||||
"pageTitle": "Сервери",
|
||||
"path": "Шлях",
|
||||
"please_select": "Будь ласка, виберіть",
|
||||
"plugin": "Конфігурація плагіна",
|
||||
"plugin_opts": "Опції плагіна",
|
||||
"port": "Порт",
|
||||
"protocol_configurations": "Конфігурації протоколів",
|
||||
"protocol_configurations_desc": "Увімкніть та налаштуйте необхідні типи протоколів",
|
||||
|
||||
@ -4,6 +4,7 @@
|
||||
"bandwidth_placeholder": "Nhập băng thông, để trống cho BBR",
|
||||
"basic": "Cấu Hình Cơ Bản",
|
||||
"cancel": "Hủy",
|
||||
"cipher": "Thuật toán Mã hóa",
|
||||
"city": "Thành phố",
|
||||
"config": {
|
||||
"actions": {
|
||||
@ -49,9 +50,19 @@
|
||||
"drawerEditTitle": "Chỉnh sửa Máy chủ",
|
||||
"edit": "Chỉnh sửa",
|
||||
"enabled": "Đã bật",
|
||||
"encryption_method": "Phương pháp mã hóa",
|
||||
"encryption": "Phương pháp Mã hóa",
|
||||
"encryption_client_padding": "B padding của Client",
|
||||
"encryption_mode": "Chế độ",
|
||||
"encryption_password": "Mật khẩu",
|
||||
"encryption_password_placeholder": "Để trống để tự động tạo, thay thế thủ công cho mã hóa sau lượng tử",
|
||||
"encryption_private_key": "Khóa riêng",
|
||||
"encryption_private_key_placeholder": "Để trống để tự động tạo, thay thế thủ công cho mã hóa sau lượng tử",
|
||||
"encryption_rtt": "RTT",
|
||||
"encryption_server_padding": "B padding của Server",
|
||||
"encryption_ticket": "Thời gian vé",
|
||||
"expireTime": "Thời gian hết hạn",
|
||||
"expired": "Đã hết hạn",
|
||||
"extra": "Cấu hình thêm",
|
||||
"flow": "Lưu lượng",
|
||||
"hop_interval": "Khoảng thời gian nhảy",
|
||||
"hop_ports": "Cổng nhảy",
|
||||
@ -64,12 +75,16 @@
|
||||
"migrateFailed": "Di chuyển dữ liệu thất bại",
|
||||
"migrated": "Dữ liệu đã được di chuyển thành công",
|
||||
"migrating": "Đang di chuyển...",
|
||||
"mode": "Chế độ",
|
||||
"multiplex": "Rạp chiếu phim",
|
||||
"name": "Tên",
|
||||
"noData": "Không có dữ liệu",
|
||||
"notAvailable": "Không khả dụng",
|
||||
"obfs": "Làm mờ",
|
||||
"obfs_host": "Máy chủ Obfs",
|
||||
"obfs_password": "Mật khẩu làm mờ",
|
||||
"obfs_password_placeholder": "Nhập mật khẩu làm mờ",
|
||||
"obfs_path": "Đường dẫn Obfs",
|
||||
"offline": "Ngoại tuyến",
|
||||
"online": "Trực tuyến",
|
||||
"onlineUsers": "Người dùng trực tuyến",
|
||||
@ -78,8 +93,6 @@
|
||||
"pageTitle": "Máy chủ",
|
||||
"path": "Đường dẫn",
|
||||
"please_select": "Vui lòng chọn",
|
||||
"plugin": "Cấu Hình Plugin",
|
||||
"plugin_opts": "Tùy Chọn Plugin",
|
||||
"port": "Cổng",
|
||||
"protocol_configurations": "Cấu Hình Giao Thức",
|
||||
"protocol_configurations_desc": "Kích hoạt và cấu hình các loại giao thức cần thiết",
|
||||
|
||||
@ -4,6 +4,7 @@
|
||||
"bandwidth_placeholder": "请输入带宽,留空则使用BBR",
|
||||
"basic": "基础配置",
|
||||
"cancel": "取消",
|
||||
"cipher": "加密算法",
|
||||
"city": "城市",
|
||||
"config": {
|
||||
"title": "节点配置",
|
||||
@ -49,9 +50,19 @@
|
||||
"drawerEditTitle": "编辑服务器",
|
||||
"edit": "编辑",
|
||||
"enabled": "启用",
|
||||
"encryption_method": "加密方式",
|
||||
"encryption": "加密方式",
|
||||
"encryption_client_padding": "客户端填充",
|
||||
"encryption_mode": "模式",
|
||||
"encryption_password": "密码",
|
||||
"encryption_password_placeholder": "留空自动生成,需抗量子加密请自行替换",
|
||||
"encryption_private_key": "私钥",
|
||||
"encryption_private_key_placeholder": "留空自动生成,需抗量子加密请自行替换",
|
||||
"encryption_rtt": "RTT",
|
||||
"encryption_server_padding": "服务器填充",
|
||||
"encryption_ticket": "票据时间",
|
||||
"expireTime": "到期时间",
|
||||
"expired": "已过期",
|
||||
"extra": "额外配置",
|
||||
"flow": "流控",
|
||||
"hop_interval": "跳跃端口间隔",
|
||||
"hop_ports": "跳跃端口",
|
||||
@ -64,12 +75,16 @@
|
||||
"migrateFailed": "数据迁移失败",
|
||||
"migrated": "数据迁移成功",
|
||||
"migrating": "迁移中...",
|
||||
"mode": "模式",
|
||||
"multiplex": "多路复用",
|
||||
"name": "名称",
|
||||
"noData": "暂无数据",
|
||||
"notAvailable": "—",
|
||||
"obfs": "混淆",
|
||||
"obfs_host": "混淆主机",
|
||||
"obfs_password": "混淆密码",
|
||||
"obfs_password_placeholder": "输入混淆密码",
|
||||
"obfs_path": "混淆路径",
|
||||
"offline": "离线",
|
||||
"online": "在线",
|
||||
"onlineUsers": "在线人数",
|
||||
@ -78,8 +93,6 @@
|
||||
"pageTitle": "服务器",
|
||||
"path": "路径",
|
||||
"please_select": "请选择",
|
||||
"plugin": "插件配置",
|
||||
"plugin_opts": "插件选项",
|
||||
"port": "端口",
|
||||
"protocol_configurations": "协议配置",
|
||||
"protocol_configurations_desc": "启用并配置所需的协议类型",
|
||||
|
||||
@ -4,6 +4,7 @@
|
||||
"bandwidth_placeholder": "輸入帶寬,留空以使用BBR",
|
||||
"basic": "基本配置",
|
||||
"cancel": "取消",
|
||||
"cipher": "加密算法",
|
||||
"city": "城市",
|
||||
"config": {
|
||||
"actions": {
|
||||
@ -49,9 +50,19 @@
|
||||
"drawerEditTitle": "編輯伺服器",
|
||||
"edit": "編輯",
|
||||
"enabled": "已啟用",
|
||||
"encryption_method": "加密方法",
|
||||
"encryption": "加密方法",
|
||||
"encryption_client_padding": "客戶端填充",
|
||||
"encryption_mode": "模式",
|
||||
"encryption_password": "密碼",
|
||||
"encryption_password_placeholder": "留空以自動生成,手動替換以進行後量子加密",
|
||||
"encryption_private_key": "私鑰",
|
||||
"encryption_private_key_placeholder": "留空以自動生成,手動替換以進行後量子加密",
|
||||
"encryption_rtt": "RTT",
|
||||
"encryption_server_padding": "服務器填充",
|
||||
"encryption_ticket": "票據時間",
|
||||
"expireTime": "過期時間",
|
||||
"expired": "已過期",
|
||||
"extra": "額外配置",
|
||||
"flow": "流量",
|
||||
"hop_interval": "跳躍間隔",
|
||||
"hop_ports": "跳躍端口",
|
||||
@ -64,12 +75,16 @@
|
||||
"migrateFailed": "數據遷移失敗",
|
||||
"migrated": "數據已成功遷移",
|
||||
"migrating": "正在遷移...",
|
||||
"mode": "模式",
|
||||
"multiplex": "多元影院",
|
||||
"name": "名稱",
|
||||
"noData": "無數據",
|
||||
"notAvailable": "不可用",
|
||||
"obfs": "混淆",
|
||||
"obfs_host": "混淆主機",
|
||||
"obfs_password": "混淆密碼",
|
||||
"obfs_password_placeholder": "輸入混淆密碼",
|
||||
"obfs_path": "混淆路徑",
|
||||
"offline": "離線",
|
||||
"online": "在線",
|
||||
"onlineUsers": "在線用戶",
|
||||
@ -78,8 +93,6 @@
|
||||
"pageTitle": "伺服器",
|
||||
"path": "路徑",
|
||||
"please_select": "請選擇",
|
||||
"plugin": "插件配置",
|
||||
"plugin_opts": "插件選項",
|
||||
"port": "端口",
|
||||
"protocol_configurations": "協議配置",
|
||||
"protocol_configurations_desc": "啟用並配置所需的協議類型",
|
||||
|
||||
@ -11,6 +11,7 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"@lottiefiles/dotlottie-react": "^0.15.1",
|
||||
"@noble/curves": "^2.0.0",
|
||||
"@tanstack/react-query": "^5.85.5",
|
||||
"@tanstack/react-query-next-experimental": "^5.85.5",
|
||||
"@workspace/ui": "workspace:*",
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user