🐛 fix: Implement encryption and obfuscation features in protocol configuration

This commit is contained in:
web 2025-09-15 09:35:03 -07:00
parent 597a01885b
commit 54de16bdd5
31 changed files with 694 additions and 126 deletions

View File

@ -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',

View File

@ -0,0 +1,6 @@
export { generatePassword } from './random';
export {
generateRealityKeyPair,
generateRealityShortId,
publicKeyFromPrivate,
} from './reality-key';

View File

@ -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),
};
}

View 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();
}

View 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;
}

View File

@ -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>

View File

@ -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ů",

View File

@ -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",

View File

@ -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",

View File

@ -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",

View File

@ -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",

View File

@ -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": "پروتکل‌های مورد نیاز را فعال و پیکربندی کنید",

View File

@ -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",

View File

@ -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",

View File

@ -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": "आवश्यक प्रोटोकॉल प्रकारों को सक्षम और कॉन्फ़िगर करें",

View File

@ -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",

View File

@ -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": "必要なプロトコルタイプを有効にして設定します",

View File

@ -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": "필요한 프로토콜 유형을 활성화하고 구성합니다",

View File

@ -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",

View File

@ -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",

View File

@ -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",

View File

@ -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",

View File

@ -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": "Включите и настройте необходимые типы протоколов",

View File

@ -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": "เปิดใช้งานและกำหนดค่าประเภทโปรโตคอลที่ต้องการ",

View File

@ -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",

View File

@ -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": "Увімкніть та налаштуйте необхідні типи протоколів",

View File

@ -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",

View File

@ -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": "启用并配置所需的协议类型",

View File

@ -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": "啟用並配置所需的協議類型",

View File

@ -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:*",

BIN
bun.lockb

Binary file not shown.