mirror of
https://github.com/mofeng-git/One-KVM.git
synced 2026-01-29 00:51:53 +08:00
init
This commit is contained in:
704
web/src/i18n/en-US.ts
Normal file
704
web/src/i18n/en-US.ts
Normal file
@@ -0,0 +1,704 @@
|
||||
export default {
|
||||
common: {
|
||||
loading: 'Loading...',
|
||||
save: 'Save',
|
||||
cancel: 'Cancel',
|
||||
confirm: 'Confirm',
|
||||
delete: 'Delete',
|
||||
upload: 'Upload',
|
||||
download: 'Download',
|
||||
refresh: 'Refresh',
|
||||
close: 'Close',
|
||||
success: 'Success',
|
||||
error: 'Error',
|
||||
warning: 'Warning',
|
||||
info: 'Info',
|
||||
yes: 'Yes',
|
||||
no: 'No',
|
||||
on: 'On',
|
||||
off: 'Off',
|
||||
enabled: 'Enabled',
|
||||
disabled: 'Disabled',
|
||||
connected: 'Connected',
|
||||
disconnected: 'Disconnected',
|
||||
connecting: 'Connecting...',
|
||||
disconnecting: 'Disconnecting...',
|
||||
unknown: 'Unknown',
|
||||
back: 'Back',
|
||||
next: 'Next',
|
||||
apply: 'Apply',
|
||||
menu: 'Menu',
|
||||
optional: 'Optional',
|
||||
recommended: 'Recommended',
|
||||
create: 'Create',
|
||||
creating: 'Creating...',
|
||||
deleting: 'Deleting...',
|
||||
more: 'More',
|
||||
collapse: 'Collapse',
|
||||
expand: 'Expand',
|
||||
toggleTheme: 'Toggle theme',
|
||||
toggleLanguage: 'Toggle language',
|
||||
},
|
||||
nav: {
|
||||
console: 'Console',
|
||||
msd: 'Virtual Media',
|
||||
settings: 'Settings',
|
||||
logout: 'Logout',
|
||||
},
|
||||
auth: {
|
||||
login: 'Login',
|
||||
logout: 'Logout',
|
||||
username: 'Username',
|
||||
password: 'Password',
|
||||
enterUsername: 'Enter username',
|
||||
enterPassword: 'Enter password',
|
||||
loginPrompt: 'Enter your credentials to login',
|
||||
loginFailed: 'Login failed',
|
||||
invalidPassword: 'Invalid username or password',
|
||||
changePassword: 'Change Password',
|
||||
currentPassword: 'Current Password',
|
||||
currentPasswordPlaceholder: 'Enter current password',
|
||||
newPassword: 'New Password',
|
||||
newPasswordPlaceholder: 'Enter new password',
|
||||
confirmPassword: 'Confirm Password',
|
||||
confirmPasswordPlaceholder: 'Re-enter new password',
|
||||
passwordRequired: 'Please fill in all password fields',
|
||||
passwordMismatch: 'Passwords do not match',
|
||||
passwordTooShort: 'Password must be at least 4 characters',
|
||||
passwordChanged: 'Password changed successfully',
|
||||
userNotFound: 'User not found',
|
||||
},
|
||||
status: {
|
||||
connected: 'Connected',
|
||||
connecting: 'Connecting',
|
||||
disconnected: 'Disconnected',
|
||||
error: 'Error',
|
||||
},
|
||||
actionbar: {
|
||||
paste: 'Paste Text',
|
||||
virtualMedia: 'Virtual Media',
|
||||
virtualMediaTip: 'Manage virtual media devices',
|
||||
power: 'Power',
|
||||
keyboard: 'Virtual Keyboard',
|
||||
keyboardTip: 'Show virtual keyboard',
|
||||
mouseAbsolute: 'Absolute Mouse',
|
||||
mouseRelative: 'Relative Mouse',
|
||||
mouseAbsoluteTip: 'Absolute positioning - direct screen coordinate mapping',
|
||||
mouseRelativeTip: 'Relative positioning - sends mouse movement deltas',
|
||||
extension: 'Extension',
|
||||
extensionTip: 'Extension features',
|
||||
stats: 'Stats',
|
||||
statsTip: 'View connection statistics',
|
||||
settings: 'Settings',
|
||||
settingsTip: 'System settings',
|
||||
fullscreen: 'Fullscreen',
|
||||
fullscreenTip: 'Toggle fullscreen mode',
|
||||
// Video Config
|
||||
videoConfig: 'Video Config',
|
||||
streamSettings: 'Stream Settings',
|
||||
deviceSettings: 'Device Settings',
|
||||
videoMode: 'Mode',
|
||||
selectMode: 'Select mode...',
|
||||
h264Hint: 'H.264 mode requires WebRTC support, lower latency',
|
||||
webrtcHint: 'WebRTC mode has lower latency, requires browser support',
|
||||
videoDevice: 'Device',
|
||||
videoFormat: 'Format',
|
||||
videoResolution: 'Resolution',
|
||||
videoFps: 'Frame Rate',
|
||||
selectDevice: 'Select device...',
|
||||
selectFormat: 'Select format...',
|
||||
selectResolution: 'Select resolution...',
|
||||
selectFps: 'Select FPS...',
|
||||
bitrate: 'Bitrate',
|
||||
browserUnsupported: 'Browser unsupported',
|
||||
encoder: 'Encoder',
|
||||
changeEncoderBackend: 'Change encoder backend...',
|
||||
backendSoftware: 'Software',
|
||||
backendAuto: 'Auto',
|
||||
recommended: 'Recommended',
|
||||
// HID Config
|
||||
hidConfig: 'Mouse & HID',
|
||||
mouseSettings: 'Mouse Settings',
|
||||
hidDeviceSettings: 'HID Device Settings',
|
||||
positioningMode: 'Positioning Mode',
|
||||
sendInterval: 'Send Interval',
|
||||
showCursor: 'Show Cursor',
|
||||
backend: 'Backend',
|
||||
devicePath: 'Device Path',
|
||||
baudrate: 'Baudrate',
|
||||
absolute: 'Absolute',
|
||||
relative: 'Relative',
|
||||
applying: 'Applying...',
|
||||
// Audio Config
|
||||
audioConfig: 'Audio',
|
||||
playbackControl: 'Playback',
|
||||
volume: 'Volume',
|
||||
mute: 'Mute',
|
||||
audioDeviceSettings: 'Device Settings',
|
||||
audioEnabled: 'Audio',
|
||||
audioDevice: 'Device',
|
||||
audioQuality: 'Quality',
|
||||
qualityVoice: 'Voice',
|
||||
qualityBalanced: 'Balanced',
|
||||
qualityHigh: 'High',
|
||||
selectAudioDevice: 'Select device...',
|
||||
},
|
||||
infobar: {
|
||||
keys: 'Keys',
|
||||
pointer: 'Pointer',
|
||||
caps: 'Caps',
|
||||
num: 'Num',
|
||||
scroll: 'Scroll',
|
||||
},
|
||||
paste: {
|
||||
title: 'Paste Text',
|
||||
description: 'Enter text to send to remote host as keyboard input',
|
||||
label: 'Text Content',
|
||||
placeholder: 'Enter text to paste here...',
|
||||
hint: 'Press Ctrl+Enter to send quickly',
|
||||
confirm: 'Send',
|
||||
typing: 'Typing...',
|
||||
escToCancel: 'Press Esc to cancel',
|
||||
stop: 'Stop',
|
||||
untypableWarning: 'Some characters cannot be typed',
|
||||
untypableChars: 'Untypable characters: {chars}',
|
||||
},
|
||||
atx: {
|
||||
title: 'Power Control',
|
||||
description: 'Control remote host power state',
|
||||
powerState: 'Power State',
|
||||
stateOn: 'On',
|
||||
stateOff: 'Off',
|
||||
stateUnknown: 'Unknown',
|
||||
shortPress: 'Power (Short)',
|
||||
longPress: 'Power (Long/Force Off)',
|
||||
reset: 'Reset',
|
||||
confirmShortTitle: 'Confirm Power Press',
|
||||
confirmShortDesc: 'This will simulate pressing the power button, same as a physical short press.',
|
||||
confirmLongTitle: 'Confirm Force Power Off',
|
||||
confirmLongDesc: 'This will force power off the host, which may cause data loss. Are you sure?',
|
||||
confirmResetTitle: 'Confirm Reset',
|
||||
confirmResetDesc: 'This will reset the host, which may cause unsaved data loss. Are you sure?',
|
||||
wol: 'Wake-on-LAN',
|
||||
wolDescription: 'Send Wake-on-LAN magic packet to power on a remote machine.',
|
||||
macAddress: 'MAC Address',
|
||||
invalidMac: 'Invalid MAC address format',
|
||||
recentMac: 'Recent',
|
||||
send: 'Send',
|
||||
wolSent: 'WOL packet sent',
|
||||
wolFailed: 'Failed to send WOL packet',
|
||||
},
|
||||
setup: {
|
||||
title: 'Initial Setup',
|
||||
welcome: 'Welcome to One-KVM',
|
||||
description: 'Complete the initial setup to get started',
|
||||
// Step titles
|
||||
stepAccount: 'Account Setup',
|
||||
stepVideo: 'Video Setup',
|
||||
stepHid: 'HID Setup',
|
||||
// Account
|
||||
setUsername: 'Set Admin Username',
|
||||
usernameHint: 'Username must be at least 2 characters',
|
||||
setPassword: 'Set Admin Password',
|
||||
passwordHint: 'Password must be at least 4 characters',
|
||||
confirmPassword: 'Confirm Password',
|
||||
passwordMismatch: 'Passwords do not match',
|
||||
// Video
|
||||
videoDevice: 'Video Device',
|
||||
selectVideoDevice: 'Select video capture device',
|
||||
videoFormat: 'Video Format',
|
||||
selectFormat: 'Select format',
|
||||
resolution: 'Resolution',
|
||||
selectResolution: 'Select resolution',
|
||||
fps: 'Frame Rate',
|
||||
selectFps: 'Select FPS',
|
||||
noVideoDevices: 'No video devices detected',
|
||||
// HID
|
||||
hidBackend: 'HID Backend',
|
||||
selectHidBackend: 'Select HID control method',
|
||||
serialHid: 'Serial HID',
|
||||
disableHid: 'Disabled',
|
||||
serialPort: 'Serial Port',
|
||||
selectSerialPort: 'Select serial port',
|
||||
noSerialDevices: 'No serial devices detected',
|
||||
baudRate: 'Baud Rate',
|
||||
udc: 'USB Device Controller',
|
||||
selectUdc: 'Select UDC',
|
||||
noUdcDevices: 'No UDC devices detected',
|
||||
hidDisabledHint: 'Disabling HID will prevent keyboard and mouse control of the remote host',
|
||||
// Complete
|
||||
complete: 'Complete Setup',
|
||||
setupFailed: 'Setup failed',
|
||||
// Advanced encoder
|
||||
advancedEncoder: 'Advanced: Encoder Backend',
|
||||
encoderHint: 'The default "Auto" option works for most cases. Only change if you need a specific encoder backend.',
|
||||
autoRecommended: 'Auto (Recommended)',
|
||||
hardware: 'Hardware',
|
||||
software: 'Software',
|
||||
// Progress
|
||||
progress: 'Step {current} of {total}',
|
||||
// Help tooltips
|
||||
ch9329Help: 'CH9329 is a serial-to-HID chip connected via serial port. Works with most hardware configurations.',
|
||||
otgHelp: 'USB OTG mode emulates HID devices directly through USB Device Controller. Requires hardware OTG support.',
|
||||
videoDeviceHelp: 'Select the video capture device for capturing the remote host display. Usually an HDMI capture card.',
|
||||
videoFormatHelp: 'MJPEG has best compatibility. H.264/H.265 uses less bandwidth but requires encoding support.',
|
||||
// Password strength
|
||||
passwordStrength: 'Password Strength',
|
||||
passwordWeak: 'Weak',
|
||||
passwordMedium: 'Medium',
|
||||
passwordStrong: 'Strong',
|
||||
passwordVeryStrong: 'Very Strong',
|
||||
},
|
||||
console: {
|
||||
title: 'Remote Console',
|
||||
videoAlt: 'KVM Video',
|
||||
videoMode: 'Video Mode',
|
||||
mjpeg: 'MJPEG',
|
||||
webrtc: 'WebRTC',
|
||||
fullscreen: 'Fullscreen',
|
||||
exitFullscreen: 'Exit Fullscreen',
|
||||
screenshot: 'Screenshot',
|
||||
reconnect: 'Reconnect',
|
||||
noVideo: 'No video signal',
|
||||
connecting: 'Connecting...',
|
||||
streamOffline: 'Stream offline',
|
||||
connectionFailed: 'Connection Failed',
|
||||
connectionFailedDesc: 'Unable to connect to video stream, please check device status',
|
||||
videoRestarting: 'Video stream is restarting',
|
||||
deviceSwitching: 'Switching video device...',
|
||||
configChanging: 'Applying new configuration...',
|
||||
videoRestarted: 'Video stream updated',
|
||||
streamError: 'Stream error',
|
||||
// WebRTC
|
||||
webrtcConnected: 'WebRTC Connected',
|
||||
webrtcConnectedDesc: 'Using low-latency H.264 video stream',
|
||||
webrtcFailed: 'WebRTC Connection Failed',
|
||||
fallingBackToMjpeg: 'Falling back to MJPEG mode',
|
||||
// Pointer Lock
|
||||
pointerLocked: 'Pointer Locked',
|
||||
pointerLockedDesc: 'Press Escape to release the pointer',
|
||||
pointerLockFailed: 'Failed to lock pointer',
|
||||
relativeModeHint: 'Relative Mouse Mode',
|
||||
relativeModeHintDesc: 'Click on the video area to lock the pointer, press Escape to release',
|
||||
// Meta Key Hint
|
||||
metaKeyHint: 'System Key Detected',
|
||||
metaKeyHintDesc: 'Enter fullscreen mode to capture Win/Meta keys',
|
||||
// Stream mode change
|
||||
streamModeChanged: 'Video Mode Changed',
|
||||
streamModeChangedDesc: 'Server switched to {mode} mode',
|
||||
// Device monitoring
|
||||
deviceLost: 'Video Device Lost',
|
||||
deviceLostDesc: '{device}: {reason}',
|
||||
deviceRecovering: 'Video Device Recovering',
|
||||
deviceRecoveringDesc: 'Attempting to recover video device (attempt {attempt})',
|
||||
deviceRecovered: 'Video Device Recovered',
|
||||
deviceRecoveredDesc: 'Video device reconnected successfully',
|
||||
// Loading state
|
||||
pleaseWait: 'Please wait...',
|
||||
retryCount: 'Retrying (attempt {count})',
|
||||
// Error details
|
||||
errorDetails: 'Error details',
|
||||
},
|
||||
hid: {
|
||||
title: 'HID Control',
|
||||
keyboard: 'Keyboard',
|
||||
mouse: 'Mouse',
|
||||
reset: 'Reset HID',
|
||||
sendCtrlAltDel: 'Send Ctrl+Alt+Del',
|
||||
pasteText: 'Paste Text',
|
||||
absoluteMouse: 'Absolute',
|
||||
relativeMouse: 'Relative',
|
||||
// Device monitoring
|
||||
deviceLost: 'HID Device Lost',
|
||||
deviceLostDesc: '{backend}: {reason}',
|
||||
reconnecting: 'HID Reconnecting',
|
||||
reconnectingDesc: 'Attempting to reconnect (attempt {attempt})',
|
||||
recovered: 'HID Recovered',
|
||||
recoveredDesc: '{backend} HID device reconnected successfully',
|
||||
},
|
||||
audio: {
|
||||
// Device monitoring
|
||||
deviceLost: 'Audio Device Lost',
|
||||
deviceLostDesc: '{device}: {reason}',
|
||||
reconnecting: 'Audio Reconnecting',
|
||||
reconnectingDesc: 'Attempting to reconnect (attempt {attempt})',
|
||||
recovered: 'Audio Recovered',
|
||||
recoveredDesc: '{device} audio device reconnected successfully',
|
||||
},
|
||||
msd: {
|
||||
title: 'Virtual Media',
|
||||
images: 'ISO/IMG Mount',
|
||||
imagesDesc: 'Mount ISO/IMG images to target device',
|
||||
drive: 'Virtual USB',
|
||||
driveDesc: 'Transfer files to target device like a USB drive, supports Ventoy boot',
|
||||
imageList: 'Image List',
|
||||
uploadImage: 'Upload Image',
|
||||
noImages: 'No images',
|
||||
connect: 'Connect',
|
||||
disconnect: 'Disconnect',
|
||||
connectedTo: 'Connected to',
|
||||
cdrom: 'CD-ROM',
|
||||
flash: 'Flash',
|
||||
storageMode: 'Storage Mode',
|
||||
accessMode: 'Access Mode',
|
||||
readOnly: 'Read Only',
|
||||
readWrite: 'Read/Write',
|
||||
fileList: 'File List',
|
||||
uploadFile: 'Upload File',
|
||||
createFolder: 'Create Folder',
|
||||
driveNotInitialized: 'Virtual drive not initialized',
|
||||
initializeDrive: 'Initialize Drive',
|
||||
driveSize: 'Drive Size',
|
||||
usedSpace: 'Used',
|
||||
freeSpace: 'Free',
|
||||
deleteDrive: 'Delete Drive',
|
||||
confirmDeleteDrive: 'Are you sure you want to delete the virtual drive? All files will be erased.',
|
||||
driveDeleted: 'Drive deleted',
|
||||
systemAvailable: 'System Available',
|
||||
emptyFolder: 'Empty folder',
|
||||
confirmDelete: 'Are you sure you want to delete "{name}"?',
|
||||
folderName: 'Folder name',
|
||||
uploadImageHint: 'Click to upload ISO/IMG',
|
||||
imageMounted: 'Image {name} mounted',
|
||||
imageUnmounted: 'Image unmounted',
|
||||
// URL download
|
||||
downloadFromUrl: 'Download from URL',
|
||||
downloadFromUrlDesc: 'Enter the URL of an image file (ISO/IMG supported)',
|
||||
url: 'URL',
|
||||
filename: 'Filename',
|
||||
filenameAutoDetect: 'Auto-detect from URL',
|
||||
download: 'Download',
|
||||
downloadComplete: 'Download complete',
|
||||
downloadFailed: 'Download failed',
|
||||
largeFileWarning: '>2.2GB',
|
||||
largeFileTooltip: 'File is larger than 2.2GB, please use Flash mode to mount',
|
||||
// Device monitoring
|
||||
error: 'MSD Error',
|
||||
errorDesc: '{reason}',
|
||||
recovered: 'MSD Recovered',
|
||||
recoveredDesc: 'MSD operation completed successfully',
|
||||
// Operation status
|
||||
operationInProgress: 'Operation in progress, please wait',
|
||||
driveConnected: 'Virtual USB drive connected',
|
||||
imageConnected: 'Image {name} connected',
|
||||
// Drive initialization
|
||||
selectDriveSize: 'Select virtual drive size',
|
||||
selectedSize: 'Selected size',
|
||||
customSize: 'Custom size',
|
||||
driveSizeHint: 'Custom size overrides selection above (64MB - 32GB)',
|
||||
driveCreated: 'Virtual drive created ({size} MB)',
|
||||
fileDeleted: 'File deleted',
|
||||
imageDeleted: 'Image deleted',
|
||||
},
|
||||
settings: {
|
||||
title: 'Settings',
|
||||
basic: 'Basic',
|
||||
general: 'General',
|
||||
appearance: 'Appearance',
|
||||
video: 'Video',
|
||||
encoder: 'Encoder',
|
||||
hid: 'HID',
|
||||
msd: 'MSD',
|
||||
atx: 'ATX',
|
||||
network: 'Network',
|
||||
users: 'Users',
|
||||
hardware: 'Hardware',
|
||||
system: 'System',
|
||||
extensions: 'Extensions',
|
||||
configured: 'Configured',
|
||||
security: 'Security',
|
||||
about: 'About',
|
||||
aboutDesc: 'Open and Lightweight IP-KVM Solution',
|
||||
// Device info
|
||||
deviceInfo: 'Device Info',
|
||||
deviceInfoDesc: 'Host system information',
|
||||
hostname: 'Hostname',
|
||||
cpuModel: 'CPU Model',
|
||||
cpuUsage: 'CPU Usage',
|
||||
memoryUsage: 'Memory Usage',
|
||||
networkAddresses: 'Network Addresses',
|
||||
language: 'Language',
|
||||
theme: 'Theme',
|
||||
lightMode: 'Light',
|
||||
darkMode: 'Dark',
|
||||
systemMode: 'System',
|
||||
changePassword: 'Change Password',
|
||||
currentPassword: 'Current Password',
|
||||
newPassword: 'New Password',
|
||||
version: 'Version',
|
||||
buildInfo: 'Build Info',
|
||||
detectDevices: 'Detect Devices',
|
||||
detecting: 'Detecting...',
|
||||
builtWith: 'Built with Rust + Vue 3 + shadcn-vue',
|
||||
networkSettings: 'Network Settings',
|
||||
msdSettings: 'MSD Settings',
|
||||
atxSettings: 'ATX Settings',
|
||||
// Network tab
|
||||
httpSettings: 'HTTP Settings',
|
||||
httpPort: 'HTTP Port',
|
||||
configureHttpPort: 'Configure HTTP server port',
|
||||
// User management
|
||||
userManagement: 'User Management',
|
||||
userManagementDesc: 'Manage user accounts and permissions',
|
||||
addUser: 'Add User',
|
||||
editUser: 'Edit User',
|
||||
deleteUser: 'Delete User',
|
||||
username: 'Username',
|
||||
password: 'Password',
|
||||
role: 'Role',
|
||||
roleAdmin: 'Admin',
|
||||
roleUser: 'User',
|
||||
loadingUsers: 'Loading users...',
|
||||
noUsers: 'No users found',
|
||||
create: 'Create',
|
||||
confirmDeleteUser: 'Are you sure you want to delete user "{name}"?',
|
||||
// MSD/ATX status
|
||||
msdStatus: 'MSD Status',
|
||||
atxStatus: 'ATX Status',
|
||||
available: 'Available',
|
||||
notAvailable: 'Not available',
|
||||
msdEnable: 'Enable MSD',
|
||||
msdEnableDesc: 'Enable to mount ISO images and virtual drives to the target machine',
|
||||
willBeEnabledAfterSave: 'Will be enabled after save',
|
||||
disabled: 'Disabled',
|
||||
msdDesc: 'Mass Storage Device allows you to mount ISO images and virtual drives to the target machine. Use the MSD panel on the main page to manage images.',
|
||||
atxDesc: 'ATX power control allows you to remotely power on/off and reset the target machine. Use the ATX panel on the main page to control power.',
|
||||
// ATX configuration
|
||||
atxSettingsDesc: 'Configure ATX power control hardware bindings',
|
||||
atxEnable: 'Enable ATX Control',
|
||||
atxEnableDesc: 'Enable remote control of power and reset buttons',
|
||||
atxPowerButton: 'Power Button',
|
||||
atxPowerButtonDesc: 'For power on (short press) and force off (long press)',
|
||||
atxResetButton: 'Reset Button',
|
||||
atxResetButtonDesc: 'For resetting the target machine',
|
||||
atxDriver: 'Driver Type',
|
||||
atxDriverNone: 'Disabled',
|
||||
atxDriverGpio: 'GPIO',
|
||||
atxDriverUsbRelay: 'USB Relay',
|
||||
atxDevice: 'Device',
|
||||
atxPin: 'GPIO Pin',
|
||||
atxChannel: 'Relay Channel',
|
||||
atxActiveLevel: 'Active Level',
|
||||
atxLevelHigh: 'Active High',
|
||||
atxLevelLow: 'Active Low',
|
||||
atxLedSensing: 'LED Status Sensing',
|
||||
atxLedSensingDesc: 'Detect host power LED to determine power state (optional)',
|
||||
atxLedEnable: 'Enable LED Sensing',
|
||||
atxLedEnableDesc: 'Read power LED status via GPIO',
|
||||
atxLedChip: 'GPIO Chip',
|
||||
atxLedPin: 'GPIO Pin',
|
||||
atxLedInverted: 'Invert Logic',
|
||||
atxLedInvertedDesc: 'GPIO is low when LED is on',
|
||||
// WOL configuration
|
||||
atxWolSettings: 'Wake-on-LAN Settings',
|
||||
atxWolSettingsDesc: 'Configure WOL magic packet sending options',
|
||||
atxWolInterface: 'Network Interface',
|
||||
atxWolInterfacePlaceholder: 'e.g. eth0, enp0s3',
|
||||
atxWolInterfaceHint: 'Specify network interface for WOL packets, leave empty for default routing',
|
||||
// Basic tab descriptions
|
||||
themeDesc: 'Choose your preferred color scheme',
|
||||
languageDesc: 'Select your preferred language',
|
||||
// Video tab
|
||||
videoSettings: 'Video Settings',
|
||||
videoSettingsDesc: 'Configure video capture device',
|
||||
videoDevice: 'Video Device',
|
||||
selectDevice: 'Select device...',
|
||||
videoFormat: 'Video Format',
|
||||
selectFormat: 'Select format...',
|
||||
driver: 'Driver',
|
||||
resolution: 'Resolution',
|
||||
frameRate: 'Frame Rate',
|
||||
encoderBackend: 'Encoder Backend',
|
||||
encoderBackendDesc: 'Select encoder backend for WebRTC streaming',
|
||||
backend: 'Backend',
|
||||
autoRecommended: 'Auto (Recommended)',
|
||||
software: 'Software',
|
||||
supportedFormats: 'Supported Formats',
|
||||
encoderHint: 'Hardware encoders provide better performance with lower CPU usage. Software encoders are more compatible but require more CPU resources.',
|
||||
// HID tab
|
||||
hidSettings: 'HID Settings',
|
||||
hidSettingsDesc: 'Configure keyboard and mouse control',
|
||||
hidBackend: 'HID Backend',
|
||||
serialDevice: 'Serial Device',
|
||||
baudRate: 'Baud Rate',
|
||||
// WebRTC / ICE
|
||||
webrtcSettings: 'WebRTC Settings',
|
||||
webrtcSettingsDesc: 'Configure STUN/TURN servers for NAT traversal',
|
||||
stunServer: 'STUN Server',
|
||||
stunServerPlaceholder: 'stun:stun.l.google.com:19302',
|
||||
stunServerHint: 'STUN server for NAT traversal (e.g., stun:stun.l.google.com:19302)',
|
||||
turnServer: 'TURN Server',
|
||||
turnServerPlaceholder: 'turn:turn.example.com:3478',
|
||||
turnServerHint: 'TURN relay server for restrictive networks (optional)',
|
||||
turnUsername: 'TURN Username',
|
||||
turnPassword: 'TURN Password',
|
||||
turnPasswordConfigured: 'Password already configured. Leave empty to keep current password.',
|
||||
turnCredentialsHint: 'Credentials for TURN server authentication',
|
||||
iceConfigNote: 'Note: Changes require reconnecting the WebRTC session to take effect.',
|
||||
},
|
||||
virtualKeyboard: {
|
||||
title: 'Virtual Keyboard',
|
||||
attach: 'Attach',
|
||||
detach: 'Detach',
|
||||
hide: 'Hide',
|
||||
show: 'Show Virtual Keyboard',
|
||||
layoutSelect: 'Keyboard Layout',
|
||||
},
|
||||
config: {
|
||||
applied: 'Configuration applied',
|
||||
applyFailed: 'Failed to apply configuration',
|
||||
loadDevicesFailed: 'Failed to load device list',
|
||||
updateFailed: 'Update failed',
|
||||
},
|
||||
statusCard: {
|
||||
device: 'Device',
|
||||
video: 'Video',
|
||||
hid: 'HID',
|
||||
audio: 'Audio',
|
||||
msd: 'MSD',
|
||||
online: 'Online',
|
||||
offline: 'Offline',
|
||||
connecting: 'Connecting...',
|
||||
version: 'Version',
|
||||
uptime: 'Uptime',
|
||||
running: 'Running',
|
||||
mode: 'Mode',
|
||||
format: 'Format',
|
||||
resolution: 'Resolution',
|
||||
targetFps: 'Target FPS',
|
||||
fps: 'Actual FPS',
|
||||
clients: 'Clients',
|
||||
backend: 'Backend',
|
||||
initialized: 'Initialized',
|
||||
yes: 'Yes',
|
||||
no: 'No',
|
||||
mouse: 'Mouse',
|
||||
mouseSupport: 'Mouse Support',
|
||||
currentMode: 'Current Mode',
|
||||
absolute: 'Absolute',
|
||||
relative: 'Relative',
|
||||
connection: 'Connection',
|
||||
networkError: 'Network Error',
|
||||
disconnected: 'Disconnected',
|
||||
availability: 'Availability',
|
||||
hidUnavailable: 'HID Unavailable',
|
||||
sampleRate: 'Sample Rate',
|
||||
channels: 'Channels',
|
||||
quality: 'Quality',
|
||||
streaming: 'Streaming',
|
||||
off: 'Off',
|
||||
notConnected: 'Not Connected',
|
||||
connected: 'Connected',
|
||||
image: 'Image',
|
||||
// MSD status details
|
||||
msdStatus: 'Status',
|
||||
msdStandby: 'Idle',
|
||||
msdImageMode: 'Image Mode',
|
||||
msdDriveMode: 'Virtual USB',
|
||||
msdMountType: 'Mount Type',
|
||||
msdCurrentImage: 'Current Image',
|
||||
msdNoImage: 'None',
|
||||
},
|
||||
extensions: {
|
||||
// Common
|
||||
available: 'Available',
|
||||
unavailable: 'Unavailable',
|
||||
running: 'Running',
|
||||
stopped: 'Stopped',
|
||||
failed: 'Failed',
|
||||
start: 'Start',
|
||||
stop: 'Stop',
|
||||
autoStart: 'Auto Start',
|
||||
viewLogs: 'View Logs',
|
||||
noLogs: 'No logs available',
|
||||
binaryNotFound: '{path} not found, please install the required program',
|
||||
// ttyd
|
||||
ttyd: {
|
||||
title: 'Web Terminal',
|
||||
desc: 'Web terminal access via ttyd',
|
||||
open: 'Open Terminal',
|
||||
openInNewTab: 'Open in New Tab',
|
||||
port: 'Port',
|
||||
shell: 'Shell',
|
||||
credential: 'Credential',
|
||||
},
|
||||
// gostc
|
||||
gostc: {
|
||||
title: 'NAT Traversal',
|
||||
desc: 'NAT traversal via GOSTC',
|
||||
addr: 'Server Address',
|
||||
key: 'Client Key',
|
||||
tls: 'Enable TLS',
|
||||
},
|
||||
// easytier
|
||||
easytier: {
|
||||
title: 'P2P Network',
|
||||
desc: 'P2P VPN networking via EasyTier',
|
||||
networkName: 'Network Name',
|
||||
networkSecret: 'Network Secret',
|
||||
peers: 'Peer Nodes',
|
||||
addPeer: 'Add Peer',
|
||||
virtualIp: 'Virtual IP',
|
||||
virtualIpHint: 'Leave empty for DHCP, or specify with CIDR (e.g., 10.0.0.1/24)',
|
||||
},
|
||||
},
|
||||
stats: {
|
||||
title: 'Connection Stats',
|
||||
webrtcMode: 'WebRTC Real-time Stats',
|
||||
mjpegMode: 'MJPEG Real-time Stats',
|
||||
current: 'Current Status',
|
||||
video: 'Video',
|
||||
videoDesc: 'Video stream from server to client.',
|
||||
stability: 'Network Stability',
|
||||
stabilityDesc: 'How smooth the incoming video packets are in the network.',
|
||||
jitter: 'Jitter',
|
||||
delay: 'Playback Delay',
|
||||
delayDesc: 'Delay added by jitter buffer to smooth unevenly arriving frames.',
|
||||
packetLoss: 'Packet Loss',
|
||||
packetLossDesc: 'Number of lost incoming video RTP packets.',
|
||||
total: 'total',
|
||||
frameRate: 'Frame Rate',
|
||||
frameRateDesc: 'Number of incoming video frames displayed per second.',
|
||||
additional: 'Additional Info',
|
||||
latency: 'ICE Latency',
|
||||
bitrate: 'Bitrate',
|
||||
fps: 'FPS',
|
||||
resolution: 'Resolution',
|
||||
packetsLost: 'Packets Lost',
|
||||
wsLatency: 'WS Latency',
|
||||
connection: 'Connection Info',
|
||||
connectionType: 'Connection Type',
|
||||
transport: 'Transport',
|
||||
localCandidate: 'Local Candidate',
|
||||
remoteCandidate: 'Remote Candidate',
|
||||
p2p: 'P2P Direct',
|
||||
relay: 'TURN Relay',
|
||||
},
|
||||
// Help tooltip texts
|
||||
help: {
|
||||
// MSD related
|
||||
flashMode: 'Flash mode mounts the image as a USB drive, compatible with most BIOS boot',
|
||||
cdromMode: 'CDROM mode mounts the image as a CD drive, for systems requiring optical boot',
|
||||
readOnlyMode: 'Read-only mode is safer, the target system cannot modify the image',
|
||||
readWriteMode: 'Read-write mode allows writing data, useful for saving configurations',
|
||||
driveSize: 'Virtual drive size. Larger drives can store more files but take longer to initialize',
|
||||
// Video related
|
||||
mjpegMode: 'MJPEG mode has best compatibility, works with all browsers, but higher latency',
|
||||
webrtcMode: 'WebRTC mode has lower latency, but requires browser codec support',
|
||||
videoBitrate: 'Higher bitrate means better quality but requires more bandwidth. Adjust based on network',
|
||||
encoderBackend: 'Hardware encoder has better performance and lower power. Software encoder has better compatibility',
|
||||
// HID related
|
||||
absoluteMode: 'Absolute mode maps mouse coordinates directly, suitable for most scenarios',
|
||||
relativeMode: 'Relative mode sends mouse movement delta, for games or special software',
|
||||
mouseThrottle: 'Send interval controls mouse event frequency. Higher values reduce network load',
|
||||
hidBackend: 'OTG backend requires USB OTG hardware support. CH9329 is a serial HID chip solution',
|
||||
// ATX related
|
||||
atxActiveLevel: 'Active level depends on your hardware wiring. High means high voltage when triggered',
|
||||
wolInterface: 'Network interface name for sending Wake-on-LAN magic packets, e.g., eth0 or br0',
|
||||
// Network related
|
||||
stunServer: 'STUN server for NAT traversal to establish P2P connections. Leave empty for public servers',
|
||||
turnServer: 'TURN server provides relay when P2P fails. Requires more bandwidth but more reliable',
|
||||
// Audio related
|
||||
audioQuality: 'Higher quality means better audio but requires more network bandwidth',
|
||||
},
|
||||
}
|
||||
70
web/src/i18n/index.ts
Normal file
70
web/src/i18n/index.ts
Normal file
@@ -0,0 +1,70 @@
|
||||
import { createI18n } from 'vue-i18n'
|
||||
import zhCN from './zh-CN'
|
||||
import enUS from './en-US'
|
||||
|
||||
// Supported languages
|
||||
export const supportedLanguages = [
|
||||
{ code: 'zh-CN', name: '中文', flag: '🇨🇳' },
|
||||
{ code: 'en-US', name: 'English', flag: '🇺🇸' },
|
||||
] as const
|
||||
|
||||
export type SupportedLocale = (typeof supportedLanguages)[number]['code']
|
||||
|
||||
// Detect browser language with improved logic
|
||||
function detectLanguage(): SupportedLocale {
|
||||
// 1. Check localStorage for saved preference
|
||||
const stored = localStorage.getItem('language')
|
||||
if (stored && supportedLanguages.some((l) => l.code === stored)) {
|
||||
return stored as SupportedLocale
|
||||
}
|
||||
|
||||
// 2. Check browser language list (navigator.languages is more comprehensive)
|
||||
const languages = navigator.languages || [navigator.language]
|
||||
for (const lang of languages) {
|
||||
const normalizedLang = lang.toLowerCase()
|
||||
// Check for Chinese variants (zh, zh-CN, zh-TW, zh-HK, etc.)
|
||||
if (normalizedLang.startsWith('zh')) {
|
||||
return 'zh-CN'
|
||||
}
|
||||
// Check for English variants
|
||||
if (normalizedLang.startsWith('en')) {
|
||||
return 'en-US'
|
||||
}
|
||||
}
|
||||
|
||||
// 3. Default to English
|
||||
return 'en-US'
|
||||
}
|
||||
|
||||
// Initialize language and set HTML lang attribute
|
||||
function initializeLanguage(): SupportedLocale {
|
||||
const lang = detectLanguage()
|
||||
document.documentElement.setAttribute('lang', lang)
|
||||
return lang
|
||||
}
|
||||
|
||||
const i18n = createI18n({
|
||||
legacy: false,
|
||||
locale: initializeLanguage(),
|
||||
fallbackLocale: 'en-US',
|
||||
messages: {
|
||||
'zh-CN': zhCN,
|
||||
'en-US': enUS,
|
||||
},
|
||||
})
|
||||
|
||||
export function setLanguage(lang: SupportedLocale) {
|
||||
i18n.global.locale.value = lang
|
||||
localStorage.setItem('language', lang)
|
||||
document.documentElement.setAttribute('lang', lang)
|
||||
}
|
||||
|
||||
export function getCurrentLanguage(): SupportedLocale {
|
||||
return i18n.global.locale.value as SupportedLocale
|
||||
}
|
||||
|
||||
export function getLanguageInfo(code: SupportedLocale) {
|
||||
return supportedLanguages.find((l) => l.code === code)
|
||||
}
|
||||
|
||||
export default i18n
|
||||
704
web/src/i18n/zh-CN.ts
Normal file
704
web/src/i18n/zh-CN.ts
Normal file
@@ -0,0 +1,704 @@
|
||||
export default {
|
||||
common: {
|
||||
loading: '加载中...',
|
||||
save: '保存',
|
||||
cancel: '取消',
|
||||
confirm: '确认',
|
||||
delete: '删除',
|
||||
upload: '上传',
|
||||
download: '下载',
|
||||
refresh: '刷新',
|
||||
close: '关闭',
|
||||
success: '成功',
|
||||
error: '错误',
|
||||
warning: '警告',
|
||||
info: '信息',
|
||||
yes: '是',
|
||||
no: '否',
|
||||
on: '开',
|
||||
off: '关',
|
||||
enabled: '已启用',
|
||||
disabled: '已禁用',
|
||||
connected: '已连接',
|
||||
disconnected: '已断开',
|
||||
connecting: '连接中...',
|
||||
disconnecting: '断开中...',
|
||||
unknown: '未知',
|
||||
back: '上一步',
|
||||
next: '下一步',
|
||||
apply: '应用',
|
||||
menu: '菜单',
|
||||
optional: '可选',
|
||||
recommended: '推荐',
|
||||
create: '创建',
|
||||
creating: '创建中...',
|
||||
deleting: '删除中...',
|
||||
more: '更多',
|
||||
collapse: '收起',
|
||||
expand: '展开',
|
||||
toggleTheme: '切换主题',
|
||||
toggleLanguage: '切换语言',
|
||||
},
|
||||
nav: {
|
||||
console: '控制台',
|
||||
msd: '虚拟媒体',
|
||||
settings: '设置',
|
||||
logout: '退出登录',
|
||||
},
|
||||
auth: {
|
||||
login: '登录',
|
||||
logout: '退出登录',
|
||||
username: '用户名',
|
||||
password: '密码',
|
||||
enterUsername: '请输入用户名',
|
||||
enterPassword: '请输入密码',
|
||||
loginPrompt: '请输入您的账号和密码',
|
||||
loginFailed: '登录失败',
|
||||
invalidPassword: '用户名或密码错误',
|
||||
changePassword: '修改密码',
|
||||
currentPassword: '当前密码',
|
||||
currentPasswordPlaceholder: '请输入当前密码',
|
||||
newPassword: '新密码',
|
||||
newPasswordPlaceholder: '请输入新密码',
|
||||
confirmPassword: '确认密码',
|
||||
confirmPasswordPlaceholder: '请再次输入新密码',
|
||||
passwordRequired: '请填写所有密码字段',
|
||||
passwordMismatch: '两次输入的密码不一致',
|
||||
passwordTooShort: '密码至少需要4个字符',
|
||||
passwordChanged: '密码修改成功',
|
||||
userNotFound: '用户不存在',
|
||||
},
|
||||
status: {
|
||||
connected: '已连接',
|
||||
connecting: '连接中',
|
||||
disconnected: '已断开',
|
||||
error: '错误',
|
||||
},
|
||||
actionbar: {
|
||||
paste: '粘贴文本',
|
||||
virtualMedia: '虚拟媒体',
|
||||
virtualMediaTip: '管理虚拟媒体设备',
|
||||
power: '电源',
|
||||
keyboard: '虚拟键盘',
|
||||
keyboardTip: '显示虚拟键盘',
|
||||
mouseAbsolute: '绝对鼠标',
|
||||
mouseRelative: '相对鼠标',
|
||||
mouseAbsoluteTip: '绝对定位模式 - 直接映射屏幕坐标',
|
||||
mouseRelativeTip: '相对定位模式 - 发送鼠标移动增量',
|
||||
extension: '扩展',
|
||||
extensionTip: '扩展功能',
|
||||
stats: '连接统计',
|
||||
statsTip: '查看连接状态',
|
||||
settings: '设置',
|
||||
settingsTip: '系统设置',
|
||||
fullscreen: '全屏',
|
||||
fullscreenTip: '切换全屏模式',
|
||||
// Video Config
|
||||
videoConfig: '视频配置',
|
||||
streamSettings: '流设置',
|
||||
deviceSettings: '设备配置',
|
||||
videoMode: '视频模式',
|
||||
selectMode: '选择模式...',
|
||||
h264Hint: 'H.264 模式需要 WebRTC 支持,延迟更低',
|
||||
webrtcHint: 'WebRTC 模式延迟更低,需要浏览器支持',
|
||||
videoDevice: '视频设备',
|
||||
videoFormat: '视频格式',
|
||||
videoResolution: '分辨率',
|
||||
videoFps: '帧率',
|
||||
selectDevice: '选择设备...',
|
||||
selectFormat: '选择格式...',
|
||||
selectResolution: '选择分辨率...',
|
||||
selectFps: '选择帧率...',
|
||||
bitrate: '码率',
|
||||
browserUnsupported: '浏览器不支持',
|
||||
encoder: '编码器',
|
||||
changeEncoderBackend: '更改编码器后端...',
|
||||
backendSoftware: '软件编码',
|
||||
backendAuto: '自动',
|
||||
recommended: '推荐',
|
||||
// HID Config
|
||||
hidConfig: '鼠键配置',
|
||||
mouseSettings: '鼠标设置',
|
||||
hidDeviceSettings: 'HID 设备设置',
|
||||
positioningMode: '定位模式',
|
||||
sendInterval: '发送间隔',
|
||||
showCursor: '显示指针',
|
||||
backend: '后端类型',
|
||||
devicePath: '设备路径',
|
||||
baudrate: '波特率',
|
||||
absolute: '绝对定位',
|
||||
relative: '相对定位',
|
||||
applying: '应用中...',
|
||||
// Audio Config
|
||||
audioConfig: '音频',
|
||||
playbackControl: '播放控制',
|
||||
volume: '音量',
|
||||
mute: '静音',
|
||||
audioDeviceSettings: '设备配置',
|
||||
audioEnabled: '启用音频',
|
||||
audioDevice: '音频设备',
|
||||
audioQuality: '音频质量',
|
||||
qualityVoice: '语音',
|
||||
qualityBalanced: '均衡',
|
||||
qualityHigh: '高品质',
|
||||
selectAudioDevice: '选择设备...',
|
||||
},
|
||||
infobar: {
|
||||
keys: '按键',
|
||||
pointer: '指针',
|
||||
caps: 'Caps',
|
||||
num: 'Num',
|
||||
scroll: 'Scroll',
|
||||
},
|
||||
paste: {
|
||||
title: '粘贴文本',
|
||||
description: '输入要发送到远程主机的文本,将以键盘输入方式发送',
|
||||
label: '文本内容',
|
||||
placeholder: '在此输入要粘贴的文本...',
|
||||
hint: '按 Ctrl+Enter 快速发送',
|
||||
confirm: '发送',
|
||||
typing: '正在输入...',
|
||||
escToCancel: '按 Esc 取消',
|
||||
stop: '停止',
|
||||
untypableWarning: '部分字符无法通过键盘输入',
|
||||
untypableChars: '无法输入的字符: {chars}',
|
||||
},
|
||||
atx: {
|
||||
title: '电源控制',
|
||||
description: '控制远程主机的电源状态',
|
||||
powerState: '电源状态',
|
||||
stateOn: '已开机',
|
||||
stateOff: '已关机',
|
||||
stateUnknown: '未知',
|
||||
shortPress: '短按电源',
|
||||
longPress: '长按电源 (强制关机)',
|
||||
reset: '重启',
|
||||
confirmShortTitle: '确认短按电源',
|
||||
confirmShortDesc: '这将模拟按下电源按钮,与物理短按电源键效果相同。',
|
||||
confirmLongTitle: '确认强制关机',
|
||||
confirmLongDesc: '这将强制关闭主机,可能导致数据丢失。确定继续吗?',
|
||||
confirmResetTitle: '确认重启',
|
||||
confirmResetDesc: '这将重启主机,可能导致未保存的数据丢失。确定继续吗?',
|
||||
wol: '网络唤醒',
|
||||
wolDescription: '发送 Wake-on-LAN 魔术包以远程开机。',
|
||||
macAddress: 'MAC 地址',
|
||||
invalidMac: 'MAC 地址格式无效',
|
||||
recentMac: '最近使用',
|
||||
send: '发送',
|
||||
wolSent: 'WOL 唤醒包已发送',
|
||||
wolFailed: 'WOL 发送失败',
|
||||
},
|
||||
setup: {
|
||||
title: '初始化设置',
|
||||
welcome: '欢迎使用 One-KVM',
|
||||
description: '请完成初始设置以开始使用',
|
||||
// Step titles
|
||||
stepAccount: '账号设置',
|
||||
stepVideo: '视频设置',
|
||||
stepHid: '鼠键设置',
|
||||
// Account
|
||||
setUsername: '设置管理员用户名',
|
||||
usernameHint: '用户名至少2个字符',
|
||||
setPassword: '设置管理员密码',
|
||||
passwordHint: '密码至少4个字符',
|
||||
confirmPassword: '确认密码',
|
||||
passwordMismatch: '两次输入的密码不一致',
|
||||
// Video
|
||||
videoDevice: '视频设备',
|
||||
selectVideoDevice: '选择视频采集设备',
|
||||
videoFormat: '画面格式',
|
||||
selectFormat: '选择画面格式',
|
||||
resolution: '分辨率',
|
||||
selectResolution: '选择分辨率',
|
||||
fps: '帧率',
|
||||
selectFps: '选择帧率',
|
||||
noVideoDevices: '未检测到视频设备',
|
||||
// HID
|
||||
hidBackend: 'HID 后端',
|
||||
selectHidBackend: '选择 HID 控制方式',
|
||||
serialHid: '串口 HID',
|
||||
disableHid: '禁用',
|
||||
serialPort: '串口设备',
|
||||
selectSerialPort: '选择串口设备',
|
||||
noSerialDevices: '未检测到串口设备',
|
||||
baudRate: '波特率',
|
||||
udc: 'USB 设备控制器',
|
||||
selectUdc: '选择 UDC',
|
||||
noUdcDevices: '未检测到 UDC 设备',
|
||||
hidDisabledHint: '禁用 HID 后将无法控制远程主机的键盘和鼠标',
|
||||
// Complete
|
||||
complete: '完成设置',
|
||||
setupFailed: '设置失败',
|
||||
// Advanced encoder
|
||||
advancedEncoder: '高级选项:编码器后端',
|
||||
encoderHint: '默认的"自动"选项适用于大多数情况。仅在需要特定编码器后端时更改。',
|
||||
autoRecommended: '自动(推荐)',
|
||||
hardware: '硬件',
|
||||
software: '软件',
|
||||
// Progress
|
||||
progress: '步骤 {current} / {total}',
|
||||
// Help tooltips
|
||||
ch9329Help: 'CH9329 是一款串口转 HID 芯片,通过串口连接到主机。适用于大多数硬件配置。',
|
||||
otgHelp: 'USB OTG 模式通过 USB 设备控制器直接模拟 HID 设备。需要硬件支持 USB OTG 功能。',
|
||||
videoDeviceHelp: '选择用于捕获远程主机画面的视频采集设备。通常是 HDMI 采集卡。',
|
||||
videoFormatHelp: 'MJPEG 格式兼容性最好,H.264/H.265 带宽占用更低但需要编码支持。',
|
||||
// Password strength
|
||||
passwordStrength: '密码强度',
|
||||
passwordWeak: '弱',
|
||||
passwordMedium: '中',
|
||||
passwordStrong: '强',
|
||||
passwordVeryStrong: '很强',
|
||||
},
|
||||
console: {
|
||||
title: '远程控制台',
|
||||
videoAlt: 'KVM 视频',
|
||||
videoMode: '视频模式',
|
||||
mjpeg: 'MJPEG',
|
||||
webrtc: 'WebRTC',
|
||||
fullscreen: '全屏',
|
||||
exitFullscreen: '退出全屏',
|
||||
screenshot: '截图',
|
||||
reconnect: '重新连接',
|
||||
noVideo: '无视频信号',
|
||||
connecting: '正在连接...',
|
||||
streamOffline: '视频流离线',
|
||||
connectionFailed: '连接失败',
|
||||
connectionFailedDesc: '无法连接到视频流,请检查设备状态',
|
||||
videoRestarting: '视频流正在重启',
|
||||
deviceSwitching: '正在切换视频设备...',
|
||||
configChanging: '正在应用新配置...',
|
||||
videoRestarted: '视频流已更新',
|
||||
streamError: '视频流错误',
|
||||
// WebRTC
|
||||
webrtcConnected: 'WebRTC 已连接',
|
||||
webrtcConnectedDesc: '正在使用 H.264 低延迟视频流',
|
||||
webrtcFailed: 'WebRTC 连接失败',
|
||||
fallingBackToMjpeg: '自动切换到 MJPEG 模式',
|
||||
// Pointer Lock
|
||||
pointerLocked: '鼠标已锁定',
|
||||
pointerLockedDesc: '按 Escape 键释放鼠标',
|
||||
pointerLockFailed: '鼠标锁定失败',
|
||||
relativeModeHint: '相对鼠标模式',
|
||||
relativeModeHintDesc: '点击视频区域以锁定鼠标,按 Escape 释放',
|
||||
// Meta Key Hint
|
||||
metaKeyHint: '检测到系统键',
|
||||
metaKeyHintDesc: '请进入全屏模式以捕获 Win/Meta 键',
|
||||
// Stream mode change
|
||||
streamModeChanged: '视频模式已切换',
|
||||
streamModeChangedDesc: '服务器已切换到 {mode} 模式',
|
||||
// 设备监控
|
||||
deviceLost: '视频设备丢失',
|
||||
deviceLostDesc: '{device}: {reason}',
|
||||
deviceRecovering: '视频设备恢复中',
|
||||
deviceRecoveringDesc: '正在尝试恢复视频设备(第 {attempt} 次)',
|
||||
deviceRecovered: '视频设备已恢复',
|
||||
deviceRecoveredDesc: '视频设备已成功重连',
|
||||
// 加载状态
|
||||
pleaseWait: '请稍候...',
|
||||
retryCount: '正在重试 (第 {count} 次)',
|
||||
// 错误详情
|
||||
errorDetails: '错误详情',
|
||||
},
|
||||
hid: {
|
||||
title: 'HID 控制',
|
||||
keyboard: '键盘',
|
||||
mouse: '鼠标',
|
||||
reset: '重置 HID',
|
||||
sendCtrlAltDel: '发送 Ctrl+Alt+Del',
|
||||
pasteText: '粘贴文本',
|
||||
absoluteMouse: '绝对定位',
|
||||
relativeMouse: '相对定位',
|
||||
// 设备监控
|
||||
deviceLost: 'HID 设备丢失',
|
||||
deviceLostDesc: '{backend}: {reason}',
|
||||
reconnecting: 'HID 重连中',
|
||||
reconnectingDesc: '正在尝试重连(第 {attempt} 次)',
|
||||
recovered: 'HID 已恢复',
|
||||
recoveredDesc: '{backend} HID 设备已成功重连',
|
||||
},
|
||||
audio: {
|
||||
// 设备监控
|
||||
deviceLost: '音频设备丢失',
|
||||
deviceLostDesc: '{device}: {reason}',
|
||||
reconnecting: '音频重连中',
|
||||
reconnectingDesc: '正在尝试重连(第 {attempt} 次)',
|
||||
recovered: '音频已恢复',
|
||||
recoveredDesc: '音频设备已成功重连',
|
||||
},
|
||||
msd: {
|
||||
title: '虚拟媒体',
|
||||
images: 'ISO/IMG 挂载',
|
||||
imagesDesc: '将 ISO/IMG 镜像挂载到目标设备',
|
||||
drive: '虚拟U盘',
|
||||
driveDesc: '像U盘一样向目标设备传输文件,支持 Ventoy 引导',
|
||||
imageList: '镜像列表',
|
||||
uploadImage: '上传镜像',
|
||||
noImages: '暂无镜像',
|
||||
connect: '连接',
|
||||
disconnect: '断开',
|
||||
connectedTo: '已连接至',
|
||||
cdrom: 'CD-ROM',
|
||||
flash: 'Flash',
|
||||
storageMode: '存储模式',
|
||||
accessMode: '访问模式',
|
||||
readOnly: '只读',
|
||||
readWrite: '读写',
|
||||
fileList: '文件列表',
|
||||
uploadFile: '上传文件',
|
||||
createFolder: '新建文件夹',
|
||||
driveNotInitialized: '虚拟驱动器未初始化',
|
||||
initializeDrive: '初始化驱动器',
|
||||
driveSize: '驱动器大小',
|
||||
usedSpace: '已用',
|
||||
freeSpace: '剩余',
|
||||
deleteDrive: '删除驱动器',
|
||||
confirmDeleteDrive: '确定要删除虚拟驱动器吗?所有文件将被清除。',
|
||||
driveDeleted: '驱动器已删除',
|
||||
systemAvailable: '系统可用',
|
||||
emptyFolder: '空文件夹',
|
||||
confirmDelete: '确定要删除 "{name}" 吗?',
|
||||
folderName: '文件夹名称',
|
||||
uploadImageHint: '点击上传 ISO/IMG 镜像',
|
||||
imageMounted: '镜像 {name} 已挂载',
|
||||
imageUnmounted: '镜像已卸载',
|
||||
// URL download
|
||||
downloadFromUrl: '从 URL 下载',
|
||||
downloadFromUrlDesc: '输入镜像文件的 URL 地址,支持 ISO/IMG 格式',
|
||||
url: 'URL 地址',
|
||||
filename: '文件名',
|
||||
filenameAutoDetect: '自动从 URL 获取',
|
||||
download: '下载',
|
||||
downloadComplete: '下载完成',
|
||||
downloadFailed: '下载失败',
|
||||
largeFileWarning: '>2.2GB',
|
||||
largeFileTooltip: '文件大于 2.2GB,请使用 Flash 模式挂载',
|
||||
// 设备监控
|
||||
error: 'MSD 错误',
|
||||
errorDesc: '{reason}',
|
||||
recovered: 'MSD 已恢复',
|
||||
recoveredDesc: 'MSD 设备已恢复正常',
|
||||
// 操作状态
|
||||
operationInProgress: '操作进行中,请稍候',
|
||||
driveConnected: '虚拟U盘已连接',
|
||||
imageConnected: '镜像 {name} 已连接',
|
||||
// 驱动器初始化
|
||||
selectDriveSize: '选择虚拟驱动器大小',
|
||||
selectedSize: '选定大小',
|
||||
customSize: '自定义大小',
|
||||
driveSizeHint: '输入自定义大小会覆盖上方选择 (64MB - 32GB)',
|
||||
driveCreated: '虚拟驱动器已创建 ({size} MB)',
|
||||
fileDeleted: '文件已删除',
|
||||
imageDeleted: '镜像已删除',
|
||||
},
|
||||
settings: {
|
||||
title: '系统设置',
|
||||
basic: '基础',
|
||||
general: '通用',
|
||||
appearance: '外观',
|
||||
video: '视频',
|
||||
encoder: '编码器',
|
||||
hid: 'HID',
|
||||
msd: 'MSD',
|
||||
atx: 'ATX',
|
||||
network: '网络',
|
||||
users: '用户',
|
||||
hardware: '硬件',
|
||||
system: '系统',
|
||||
extensions: '扩展',
|
||||
configured: '已配置',
|
||||
security: '安全',
|
||||
about: '关于',
|
||||
aboutDesc: '开放轻量的 IP-KVM 解决方案',
|
||||
// Device info
|
||||
deviceInfo: '设备信息',
|
||||
deviceInfoDesc: '主机系统信息',
|
||||
hostname: '主机名',
|
||||
cpuModel: 'CPU 型号',
|
||||
cpuUsage: 'CPU 利用率',
|
||||
memoryUsage: '内存使用',
|
||||
networkAddresses: '网络地址',
|
||||
language: '语言',
|
||||
theme: '主题',
|
||||
lightMode: '浅色模式',
|
||||
darkMode: '深色模式',
|
||||
systemMode: '跟随系统',
|
||||
changePassword: '修改密码',
|
||||
currentPassword: '当前密码',
|
||||
newPassword: '新密码',
|
||||
version: '版本',
|
||||
buildInfo: '构建信息',
|
||||
detectDevices: '探测设备',
|
||||
detecting: '探测中...',
|
||||
builtWith: '基于 Rust + Vue 3 + shadcn-vue 构建',
|
||||
networkSettings: '网络设置',
|
||||
msdSettings: 'MSD 设置',
|
||||
atxSettings: 'ATX 设置',
|
||||
// Network tab
|
||||
httpSettings: 'HTTP 设置',
|
||||
httpPort: 'HTTP 端口',
|
||||
configureHttpPort: '配置 HTTP 服务器端口',
|
||||
// User management
|
||||
userManagement: '用户管理',
|
||||
userManagementDesc: '管理用户账号和权限',
|
||||
addUser: '添加用户',
|
||||
editUser: '编辑用户',
|
||||
deleteUser: '删除用户',
|
||||
username: '用户名',
|
||||
password: '密码',
|
||||
role: '角色',
|
||||
roleAdmin: '管理员',
|
||||
roleUser: '普通用户',
|
||||
loadingUsers: '加载用户中...',
|
||||
noUsers: '暂无用户',
|
||||
create: '创建',
|
||||
confirmDeleteUser: '确定要删除用户 "{name}" 吗?',
|
||||
// MSD/ATX status
|
||||
msdStatus: 'MSD 状态',
|
||||
atxStatus: 'ATX 状态',
|
||||
available: '可用',
|
||||
notAvailable: '不可用',
|
||||
msdEnable: '启用 MSD',
|
||||
msdEnableDesc: '启用后可以挂载 ISO 镜像和虚拟驱动器到目标机器',
|
||||
willBeEnabledAfterSave: '保存后生效',
|
||||
disabled: '已禁用',
|
||||
msdDesc: '虚拟存储设备允许您将 ISO 镜像和虚拟驱动器挂载到目标机器。请在主页面的 MSD 面板中管理镜像。',
|
||||
atxDesc: 'ATX 电源控制允许您远程开关机和重启目标机器。请在主页面的 ATX 面板中控制电源。',
|
||||
// ATX configuration
|
||||
atxSettingsDesc: '配置 ATX 电源控制硬件绑定',
|
||||
atxEnable: '启用 ATX 控制',
|
||||
atxEnableDesc: '启用后可以远程控制电源和重启按钮',
|
||||
atxPowerButton: '电源按钮',
|
||||
atxPowerButtonDesc: '用于开机(短按)和强制关机(长按)',
|
||||
atxResetButton: '重启按钮',
|
||||
atxResetButtonDesc: '用于重启目标机器',
|
||||
atxDriver: '驱动类型',
|
||||
atxDriverNone: '禁用',
|
||||
atxDriverGpio: 'GPIO',
|
||||
atxDriverUsbRelay: 'USB 继电器',
|
||||
atxDevice: '设备',
|
||||
atxPin: 'GPIO 引脚',
|
||||
atxChannel: '继电器通道',
|
||||
atxActiveLevel: '有效电平',
|
||||
atxLevelHigh: '高电平有效',
|
||||
atxLevelLow: '低电平有效',
|
||||
atxLedSensing: 'LED 状态检测',
|
||||
atxLedSensingDesc: '检测主机电源 LED 以确定电源状态(可选)',
|
||||
atxLedEnable: '启用 LED 检测',
|
||||
atxLedEnableDesc: '通过 GPIO 读取电源 LED 状态',
|
||||
atxLedChip: 'GPIO 芯片',
|
||||
atxLedPin: 'GPIO 引脚',
|
||||
atxLedInverted: '反转逻辑',
|
||||
atxLedInvertedDesc: 'LED 亮起时 GPIO 为低电平',
|
||||
// WOL configuration
|
||||
atxWolSettings: '网络唤醒设置',
|
||||
atxWolSettingsDesc: '配置 Wake-on-LAN 魔术包发送选项',
|
||||
atxWolInterface: '网络接口',
|
||||
atxWolInterfacePlaceholder: '例如: eth0, enp0s3',
|
||||
atxWolInterfaceHint: '指定发送 WOL 包的网络接口,留空则使用系统默认路由',
|
||||
// Basic tab descriptions
|
||||
themeDesc: '选择您喜欢的颜色方案',
|
||||
languageDesc: '选择您的首选语言',
|
||||
// Video tab
|
||||
videoSettings: '视频设置',
|
||||
videoSettingsDesc: '配置视频采集设备',
|
||||
videoDevice: '视频设备',
|
||||
selectDevice: '选择设备...',
|
||||
videoFormat: '视频格式',
|
||||
selectFormat: '选择格式...',
|
||||
driver: '驱动',
|
||||
resolution: '分辨率',
|
||||
frameRate: '帧率',
|
||||
encoderBackend: '编码器后端',
|
||||
encoderBackendDesc: '选择 WebRTC 流的编码器后端',
|
||||
backend: '后端',
|
||||
autoRecommended: '自动(推荐)',
|
||||
software: '软件',
|
||||
supportedFormats: '支持的格式',
|
||||
encoderHint: '硬件编码器性能更好,CPU 占用更低。软件编码器兼容性更好,但需要更多 CPU 资源。',
|
||||
// HID tab
|
||||
hidSettings: 'HID 设置',
|
||||
hidSettingsDesc: '配置键盘和鼠标控制',
|
||||
hidBackend: 'HID 后端',
|
||||
serialDevice: '串口设备',
|
||||
baudRate: '波特率',
|
||||
// WebRTC / ICE
|
||||
webrtcSettings: 'WebRTC 设置',
|
||||
webrtcSettingsDesc: '配置 STUN/TURN 服务器以实现 NAT 穿透',
|
||||
stunServer: 'STUN 服务器',
|
||||
stunServerPlaceholder: 'stun:stun.l.google.com:19302',
|
||||
stunServerHint: '用于 NAT 穿透的 STUN 服务器(例如:stun:stun.l.google.com:19302)',
|
||||
turnServer: 'TURN 服务器',
|
||||
turnServerPlaceholder: 'turn:turn.example.com:3478',
|
||||
turnServerHint: '用于限制性网络的 TURN 中继服务器(可选)',
|
||||
turnUsername: 'TURN 用户名',
|
||||
turnPassword: 'TURN 密码',
|
||||
turnPasswordConfigured: '密码已配置。留空则保持当前密码。',
|
||||
turnCredentialsHint: '用于 TURN 服务器认证的凭据',
|
||||
iceConfigNote: '注意:更改后需要重新连接 WebRTC 会话才能生效。',
|
||||
},
|
||||
virtualKeyboard: {
|
||||
title: '虚拟键盘',
|
||||
attach: '固定',
|
||||
detach: '浮动',
|
||||
hide: '隐藏',
|
||||
show: '显示虚拟键盘',
|
||||
layoutSelect: '键盘布局',
|
||||
},
|
||||
config: {
|
||||
applied: '配置已应用',
|
||||
applyFailed: '配置应用失败',
|
||||
loadDevicesFailed: '加载设备列表失败',
|
||||
updateFailed: '更新失败',
|
||||
},
|
||||
statusCard: {
|
||||
device: '设备',
|
||||
video: '视频',
|
||||
hid: 'HID',
|
||||
audio: '音频',
|
||||
msd: 'MSD',
|
||||
online: '在线',
|
||||
offline: '离线',
|
||||
connecting: '连接中...',
|
||||
version: '版本',
|
||||
uptime: '运行时间',
|
||||
running: '运行中',
|
||||
mode: '模式',
|
||||
format: '格式',
|
||||
resolution: '分辨率',
|
||||
targetFps: '目标帧率',
|
||||
fps: '实际帧率',
|
||||
clients: '客户端',
|
||||
backend: '后端',
|
||||
initialized: '已初始化',
|
||||
yes: '是',
|
||||
no: '否',
|
||||
mouse: '鼠标',
|
||||
mouseSupport: '鼠标支持',
|
||||
currentMode: '当前模式',
|
||||
absolute: '绝对定位',
|
||||
relative: '相对定位',
|
||||
connection: '连接',
|
||||
networkError: '网络错误',
|
||||
disconnected: '已断开',
|
||||
availability: '可用性',
|
||||
hidUnavailable: 'HID不可用',
|
||||
sampleRate: '采样率',
|
||||
channels: '声道',
|
||||
quality: '质量',
|
||||
streaming: '传输中',
|
||||
off: '关闭',
|
||||
notConnected: '未连接',
|
||||
connected: '已连接',
|
||||
image: '镜像',
|
||||
// MSD 状态详情
|
||||
msdStatus: '状态',
|
||||
msdStandby: '空闲',
|
||||
msdImageMode: '镜像模式',
|
||||
msdDriveMode: '虚拟U盘',
|
||||
msdMountType: '挂载类型',
|
||||
msdCurrentImage: '当前镜像',
|
||||
msdNoImage: '无',
|
||||
},
|
||||
extensions: {
|
||||
// Common
|
||||
available: '可用',
|
||||
unavailable: '不可用',
|
||||
running: '运行中',
|
||||
stopped: '已停止',
|
||||
failed: '启动失败',
|
||||
start: '启动',
|
||||
stop: '停止',
|
||||
autoStart: '开机自启',
|
||||
viewLogs: '查看日志',
|
||||
noLogs: '暂无日志',
|
||||
binaryNotFound: '未找到 {path},请先安装对应程序',
|
||||
// ttyd
|
||||
ttyd: {
|
||||
title: '网页终端',
|
||||
desc: '通过 ttyd 提供网页终端访问',
|
||||
open: '打开终端',
|
||||
openInNewTab: '在新标签页打开',
|
||||
port: '端口',
|
||||
shell: 'Shell',
|
||||
credential: '认证凭据',
|
||||
},
|
||||
// gostc
|
||||
gostc: {
|
||||
title: '内网穿透',
|
||||
desc: '通过 GOSTC 实现内网穿透',
|
||||
addr: '服务器地址',
|
||||
key: '客户端密钥',
|
||||
tls: '启用 TLS',
|
||||
},
|
||||
// easytier
|
||||
easytier: {
|
||||
title: 'P2P 组网',
|
||||
desc: '通过 EasyTier 实现 P2P VPN 组网',
|
||||
networkName: '网络名称',
|
||||
networkSecret: '网络密钥',
|
||||
peers: '对等节点',
|
||||
addPeer: '添加节点',
|
||||
virtualIp: '虚拟 IP',
|
||||
virtualIpHint: '留空则自动分配,手动指定需包含网段(如 10.0.0.1/24)',
|
||||
},
|
||||
},
|
||||
stats: {
|
||||
title: '连接统计',
|
||||
webrtcMode: 'WebRTC 实时统计',
|
||||
mjpegMode: 'MJPEG 实时统计',
|
||||
current: '当前状态',
|
||||
video: '视频',
|
||||
videoDesc: '从服务器到客户端的视频流。',
|
||||
stability: '网络稳定性',
|
||||
stabilityDesc: '入站视频数据包在网络中的平稳程度。',
|
||||
jitter: '抖动',
|
||||
delay: '播放延迟',
|
||||
delayDesc: '为平滑不均匀到达的帧而由抖动缓冲添加的延迟。',
|
||||
packetLoss: '丢包',
|
||||
packetLossDesc: '入站视频 RTP 数据包的丢失数量。',
|
||||
total: '个',
|
||||
frameRate: '帧率',
|
||||
frameRateDesc: '每秒显示的入站视频帧数。',
|
||||
additional: '其他信息',
|
||||
latency: 'ICE 延迟',
|
||||
bitrate: '码率',
|
||||
fps: '帧率',
|
||||
resolution: '分辨率',
|
||||
packetsLost: '丢包数',
|
||||
wsLatency: 'WS 延迟',
|
||||
connection: '连接信息',
|
||||
connectionType: '连接类型',
|
||||
transport: '传输协议',
|
||||
localCandidate: '本地候选',
|
||||
remoteCandidate: '远程候选',
|
||||
p2p: 'P2P 直连',
|
||||
relay: 'TURN 中继',
|
||||
},
|
||||
// 帮助提示文本
|
||||
help: {
|
||||
// MSD 相关
|
||||
flashMode: 'Flash 模式将镜像作为 U 盘挂载,支持大多数 BIOS 启动',
|
||||
cdromMode: 'CDROM 模式将镜像作为光驱挂载,适用于需要光盘启动的系统',
|
||||
readOnlyMode: '只读模式更安全,目标系统无法修改镜像内容',
|
||||
readWriteMode: '读写模式允许目标系统写入数据,适用于需要保存配置的场景',
|
||||
driveSize: '虚拟驱动器大小。较大的驱动器支持存放更多文件,但初始化时间更长',
|
||||
// 视频相关
|
||||
mjpegMode: 'MJPEG 模式兼容性最好,适用于所有浏览器,但延迟较高',
|
||||
webrtcMode: 'WebRTC 模式延迟更低,但需要浏览器支持相应编解码器',
|
||||
videoBitrate: '比特率越高画质越好,但需要更大的网络带宽。建议根据网络状况调整',
|
||||
encoderBackend: '硬件编码器性能更好功耗更低,软件编码器兼容性更好',
|
||||
// HID 相关
|
||||
absoluteMode: '绝对定位模式直接映射鼠标坐标,适用于大多数场景',
|
||||
relativeMode: '相对定位模式发送鼠标移动增量,适用于游戏或特殊软件',
|
||||
mouseThrottle: '发送间隔控制鼠标事件的发送频率,较大的值可减少网络负载',
|
||||
hidBackend: 'OTG 后端需要硬件支持 USB OTG,CH9329 是串口 HID 芯片方案',
|
||||
// ATX 相关
|
||||
atxActiveLevel: '活跃电平取决于您的硬件接线方式。高电平表示触发时输出高电压,低电平相反',
|
||||
wolInterface: '用于发送 Wake-on-LAN 魔术包的网络接口名称,如 eth0 或 br0',
|
||||
// 网络相关
|
||||
stunServer: 'STUN 服务器用于 NAT 穿透,帮助建立 P2P 连接。留空使用公共服务器',
|
||||
turnServer: 'TURN 服务器在 P2P 连接失败时提供中继。需要更多带宽但连接更可靠',
|
||||
// 音频相关
|
||||
audioQuality: '更高的质量意味着更好的音频效果,但需要更多的网络带宽',
|
||||
},
|
||||
}
|
||||
Reference in New Issue
Block a user