export default { videoInput: { format: 'Input Format', resolution: 'Resolution', frameRate: 'Frame Rate', noSignal: 'No signal', unavailable: 'Unable to read input status', refresh: 'Refresh input status', selectFormat: 'Select format...', selectResolution: 'Select resolution...', selectFps: 'Select FPS...', }, common: { loading: 'Loading...', save: 'Save', cancel: 'Cancel', confirm: 'Confirm', delete: 'Delete', refresh: 'Refresh', success: 'Success', error: 'Error', warning: 'Warning', info: 'Info', yes: 'Yes', no: 'No', on: 'On', off: 'Off', enabled: 'Enabled', disabled: 'Disabled', later: 'Later', restartNow: 'Restart Now', connected: 'Connected', disconnected: 'Disconnected', connecting: 'Connecting...', unknown: 'Unknown', back: 'Back', next: 'Next', apply: 'Apply', menu: 'Menu', optional: 'Optional', notSupportedYet: ' (Not Yet Supported)', create: 'Create', creating: 'Creating...', deleting: 'Deleting...', toggleTheme: 'Toggle theme', toggleLanguage: 'Toggle language', retry: 'Retry', }, toast: { closeNotification: 'Dismiss notification', notificationsRegion: 'Notifications', }, api: { operationFailed: 'Operation Failed', operationFailedDesc: 'Operation failed', parseResponseFailed: 'Failed to parse response', networkError: 'Network Error', networkErrorDesc: 'Unable to connect to server. Please check your connection.', }, nav: { logout: 'Logout', }, auth: { login: 'Login', logout: 'Logout', username: 'Username', password: 'Password', enterUsername: 'Enter username', enterPassword: 'Enter password', loginFailed: 'Login failed', invalidPassword: 'Invalid username or password', systemNotInitialized: 'System not initialized. Complete setup first.', 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', sessionExpired: 'Session expired', loggedInElsewhere: 'Logged in elsewhere', forgotPassword: 'Forgot password', forgotPasswordHint: 'Forgot your password? On the host running One-KVM, open a terminal and run one-kvm user set-password, then enter and confirm the new password when prompted.', totpPrompt: 'Enter the code from your authenticator app', totpCode: 'Authenticator code', totpCodePlaceholder: '6-digit code', enterTotpCode: 'Enter a 6-digit authenticator code', invalidTotpCode: 'The authenticator code is incorrect', totpChallengeExpired: 'This login attempt has expired. Enter your password again.', totpRateLimited: 'Too many incorrect codes. Wait one minute, then sign in again.', verifyAndLogin: 'Verify and login', backToPassword: 'Back to password', }, status: { connected: 'Connected', connecting: 'Connecting', disconnected: 'Disconnected', error: 'Error', }, actionbar: { paste: 'Paste Text', micStart: 'Start Transfer', micStop: 'Stop Transfer', microphoneTransfer: 'Audio Transfer Settings', grantMicrophonePermission: 'Allow Microphone Access', noMicrophoneDevices: 'No audio input devices found', micState: { idle: 'Idle', starting: 'Starting', streaming: 'Streaming', stopping: 'Stopping', error: 'Error', }, micError: { 'secure-context-required': 'Browsers only allow microphone access on HTTPS pages. Open the console over HTTPS.', unsupported: 'This browser cannot encode microphone audio with WebCodecs. Use a browser with WebCodecs support.', 'permission-denied': 'Microphone access was denied. Allow it in your browser site permissions.', 'device-unavailable': 'The selected microphone is unavailable. Check the device connection or choose another input.', 'connection-failed': 'Could not connect to USB microphone transfer. Check that UAC is enabled and no other session is active.', 'encoder-failed': 'The browser audio encoder failed and transfer was stopped.', unknown: 'Microphone transfer failed to start. Check the device and browser permissions.', }, virtualMedia: 'Virtual Media', virtualMediaTip: 'Manage virtual media devices', power: 'Power', keyboard: 'Virtual Keyboard', keyboardTip: 'Show virtual keyboard', webTerminal: 'Web Terminal', stats: 'Stats', statsTip: 'View connection statistics', settings: 'Settings', settingsTip: 'System settings', fullscreen: 'Fullscreen', fullscreenTip: 'Toggle fullscreen mode', actualSizeAria: 'Display video at original pixel size', actualSizeTip: 'Display at original pixels', fitSizeAria: 'Fit video to window', fitSizeTip: 'Restore fit to window', videoConfig: 'Video', streamSettings: 'Stream Settings', deviceSettings: 'Device Settings', videoMode: 'Mode', selectMode: 'Select mode...', videoModeHint: 'HTTP uses more bandwidth but offers broad compatibility; WebRTC has stricter network requirements but uses less bandwidth', videoDevice: 'Device', videoFormat: 'Format', videoResolution: 'Resolution', videoFps: 'Frame Rate', selectDevice: 'Select device...', selectFormat: 'Select format...', selectResolution: 'Select resolution...', selectFps: 'Select FPS...', bitratePreset: 'Bitrate', bitrateSpeed: 'Speed', bitrateBalanced: 'Balanced', bitrateQuality: 'Quality', browserUnsupported: 'Browser unsupported', backendSoftware: 'Software', backendAuto: 'Auto', recommended: 'Recommended', notRecommended: 'Not Recommended', multiSourceCodecLocked: '{sources} are enabled. Current codec is locked.', multiSourceVideoParamsWarning: '{sources} are enabled. Changing video device and input parameters will interrupt the stream.', hidConfig: '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...', audioConfig: 'Audio', playbackControl: 'Audio Playback Settings', volume: 'Volume', audioDeviceSettings: 'Device Settings', audioEnabled: 'Audio', audioDevice: 'Audio Input Device', audioQuality: 'Quality', qualityVoice: 'Voice', qualityBalanced: 'Balanced', qualityHigh: 'High', selectAudioDevice: 'Select device...', }, infobar: { keys: 'Keys', pointer: 'Pointer', caps: 'Caps', num: 'Num', scroll: 'Scroll', keyboardLedUnavailable: 'Keyboard LED status is disabled or unsupported', }, paste: { title: 'Paste Text', 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', powerState: 'Power State', hddState: 'HDD Activity', stateOn: 'On', stateOff: 'Off', stateUnknown: 'Unknown', hddActive: 'Active', hddInactive: 'Inactive', shortPress: 'Power (Short)', longPress: 'Power (Long/Force Off)', reset: 'Reset', wol: 'Wake-on-LAN', macAddress: 'MAC Address', invalidMac: 'Invalid MAC address format', recentMac: 'Recent', wolFailed: 'Failed to send WOL packet', }, setup: { welcome: 'Welcome to One-KVM', description: 'Complete the initial setup to get started', stepAccount: 'Account Setup', stepAudioVideo: 'Audio/Video Setup', stepHid: 'HID Setup', 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', 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', noSignalDetected: 'No HDMI signal detected. Please connect an HDMI cable and refresh.', refreshDevices: 'Refresh Devices', audioDevice: 'Audio Device', selectAudioDevice: 'Select audio capture device', noAudio: 'No audio', noAudioDevices: 'No audio devices detected', audioDeviceHelp: 'Select the audio capture device for capturing remote host audio. Usually on the same USB device as the video capture card.', hidBackend: 'HID Backend', serialHid: 'Serial HID', 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', complete: 'Complete Setup', setupFailed: 'Setup failed', 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: 'Step {current} of {total}', 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.', stepExtensions: 'Extensions', extensionsDescription: 'Choose which extensions to auto-start', ttydTitle: 'Web Terminal (ttyd)', ttydDescription: 'Access device command line in browser', extensionsHint: 'These settings can be changed later in Settings', notInstalled: 'Not installed', passwordStrength: 'Password Strength', passwordWeak: 'Weak', passwordMedium: 'Medium', passwordStrong: 'Strong', passwordVeryStrong: 'Very Strong', }, console: { videoAlt: 'KVM Video', mjpeg: 'MJPEG', webrtc: 'WebRTC', reconnect: 'Refresh Page', connecting: 'Connecting...', connectionFailed: 'Connection Failed', connectionFailedDesc: 'Unable to connect to video stream, please refresh page or check device status', videoRestarting: 'Video stream is restarting', streamError: 'Stream error', // Four canonical video states (backend StreamStateChanged: streaming / // no_signal / device_lost / device_busy). `reason` provides optional // fine-grained diagnostic sub-text. signal: { noSignal: { title: 'Waiting for video signal', detail: 'No video signal detected', }, deviceLost: { title: 'Video device offline', detail: 'Capture card is not responding, attempting to re-detect…', }, audioDeviceLost: { title: 'Audio device offline', detail: 'Reconnecting the audio capture device…', }, deviceBusy: { title: 'Video channel busy', detail: 'Applying a new configuration or another component is using the device, please wait…', }, uvc_usb_error: { title: 'USB capture transport error', detail: 'The USB capture device encountered a protocol error (EPROTO). You can try resetting it from Settings → Other → USB Device Reset.', }, uvc_capture_stall: { title: 'UVC capture stalled', detail: 'Check the device connection. If already connected, try changing the capture format and resetting the device.', }, reason: { no_cable: 'HDMI cable not detected — check the cable and that the target is powered on', no_sync: 'No signal or unstable signal; unable to lock timing', out_of_range: 'Resolution or refresh rate exceeds capture capability — try 1080p60 or below', no_signal: 'Capture card is ready, waiting for a picture…', recovering: 'Reconnecting the video device automatically', device_lost: 'Video node disappeared, waiting for the driver to recover', config_changing: 'Applying new configuration', mode_switching: 'Switching video mode', audio_device_lost: 'Audio capture is unavailable; recovery in progress', audio_reconnecting: 'Retrying audio device connection', uvc_usb_error: 'Try another USB port or cable, avoid hubs, or reconnect the device. You can also reset it from Settings → Other → USB Device Reset.', uvc_capture_stall: '', }, }, webrtcConnected: 'WebRTC Connected', webrtcFailed: 'WebRTC Connection Failed', webrtcPhaseIceServers: 'Loading ICE servers...', webrtcPhaseCreatePeer: 'Creating peer connection...', webrtcPhaseCreateChannel: 'Creating data channel...', webrtcPhaseCreateOffer: 'Creating local offer...', webrtcPhaseWaitAnswer: 'Waiting for remote answer...', webrtcPhaseSetRemote: 'Applying remote description...', webrtcPhaseApplyIce: 'Applying ICE candidates...', webrtcPhaseNegotiating: 'Negotiating secure connection...', mjpegPhaseWebsocket: 'Connecting control channel...', mjpegPhaseStream: 'Requesting video stream...', mjpegPhaseFirstFrame: 'Waiting for first frame...', stepProgress: 'Step {current}/{total}', pointerLockFailed: 'Failed to lock pointer', deviceLost: 'Video Device Lost', deviceLostDesc: '{device}: {reason}', pleaseWait: 'Please wait...', errorDetails: 'Error details', }, hid: { keyboard: 'Keyboard', errorHints: { udcNotConfigured: 'OTG is ready, waiting for the target host to connect and finish USB enumeration', disabled: 'HID backend is disabled', hidDeviceMissing: 'HID gadget device node is missing, try restarting HID service', notOpened: 'HID device is not open, try restarting HID service', portNotFound: 'Serial port not found, check CH9329 wiring and device path', noResponse: 'No response from CH9329, check baud rate and power', noResponseWithCmd: 'No response from CH9329, check baud rate and power (cmd {cmd})', invalidConfig: 'Serial port parameters are invalid, check device path and baud rate', protocolError: 'CH9329 replied with invalid protocol data', deviceDisconnected: 'HID device disconnected, check cable and host port', ioError: 'I/O communication error detected', otgIoError: 'OTG link is unstable, check USB cable and host port', ch9329IoError: 'CH9329 serial link is unstable, check wiring and power', serialError: 'Serial communication error, check CH9329 wiring and config', initFailed: 'CH9329 initialization failed, check serial settings and power', shutdown: 'HID backend has stopped', reconnecting: 'CH9329 is reconnecting. Try again shortly', workerStopped: 'CH9329 background communication has stopped. Check the device connection, then restart HID service or save HID settings again', backendError: '{backend} HID backend error, check device connection and configuration', }, }, audio: { deviceLost: 'Audio Device Lost', deviceLostDesc: '{device}: {reason}', }, msd: { title: 'Virtual Media', images: 'ISO/IMG Mount', drive: 'Virtual USB', imageList: 'Image List', uploadImage: 'Upload Image', noImages: 'No images', connect: 'Connect', disconnect: 'Disconnect', cdrom: 'CD-ROM', flash: 'Flash', storageMode: 'Storage Mode', accessMode: 'Access Mode', readOnly: 'Read Only', readWrite: 'Read/Write', 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.', systemAvailable: 'System Available', emptyFolder: 'Empty folder', confirmDelete: 'Are you sure you want to delete "{name}"?', folderName: 'Folder name', 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', largeFileWarning: '>2.2GB', largeFileTooltip: 'If DVD image support is not enabled in the kernel, only the first 2.2 GB is accessible after mounting.', operationInProgress: 'Operation in progress, please wait', selectDriveSize: 'Select virtual drive size', driveSpaceUnknown: 'Unable to read available space for the MSD directory filesystem', driveSpaceUnavailable: 'Not enough space on the MSD directory filesystem to create a virtual drive', driveSpaceTooSmall: 'Available space is less than {min} MB; cannot create a virtual drive', driveCreateFailed: 'Failed to create virtual drive', driveFileTooLarge: 'The MSD directory filesystem does not support a virtual drive file this large', driveReadOnly: 'The MSD directory filesystem is read-only', drivePermissionDenied: 'One-KVM does not have permission to write to the MSD directory', driveConnectedBlocked: 'Disconnect the drive before editing files', driveConnectedFilesHidden: 'Drive is connected to target machine — file list unavailable', uploadFailed: 'File upload failed', driveUnreadable: 'Format unsupported', driveUnreadableTooltip: 'Unable to parse the exFAT filesystem. It may have been formatted with an unsupported format.', reinitializeDrive: 'Re-initialize', diskMode: 'Drive Mode', singleDiskMode: 'Single', multiDiskMode: 'Multi', diskModeHint: 'Single drive provides 1 media slot; multi drive provides 8. Switching modes clears mounted media and re-enumerates USB.', mountImage: 'Mount Image', mediaCount: 'Media {count}/{capacity}', mediaSlotsFull: 'Media slots are full; no more media can be mounted', reenumerating: 'USB is re-enumerating', operations: { loadStatus: 'Failed to load virtual media status', loadImages: 'Failed to load image list', uploadImage: 'Image upload failed', deleteImage: 'Image deletion failed', mountImage: 'Image mounting failed', unmountImage: 'Image unmounting failed', mountDrive: 'Virtual drive mounting failed', unmountDrive: 'Virtual drive unmounting failed', changeMode: 'Drive mode change failed', initializeDrive: 'Virtual drive initialization failed', deleteDrive: 'Virtual drive deletion failed', loadDriveFiles: 'Failed to load virtual drive files', uploadDriveFile: 'File upload failed', deleteDriveFile: 'File deletion failed', createDirectory: 'Folder creation failed', startDownload: 'Failed to start image download', cancelDownload: 'Failed to cancel image download', downloadImage: 'Image download failed', }, errors: { unavailable: 'Virtual media service is unavailable.', operationInProgress: 'Another virtual media operation is in progress.', operationFailed: 'The virtual media operation failed.', invalidRequest: 'The virtual media request is invalid.', resourceNotFound: 'The requested virtual media resource was not found.', resourceAlreadyExists: 'The virtual media resource already exists.', mediaSlotsFull: 'All virtual media slots are in use.', mediaAlreadyMounted: 'The virtual medium is already mounted.', mediaInUse: 'The virtual medium is currently in use.', imageTooLarge: 'The virtual media image is too large.', invalidUrl: 'The download URL is invalid.', remoteDownloadFailed: 'The remote image download failed.', downloadIncomplete: 'The remote image download was incomplete.', driveNotInitialized: 'The virtual drive is not initialized.', driveConnected: 'The virtual drive is connected to the controlled computer. Disconnect it before editing files.', driveFilesystemUnsupported: 'The virtual drive filesystem is unsupported. Reinitialize it to continue.', driveSizeInvalid: 'The virtual drive size is invalid.', storageSpaceUnavailable: 'Available virtual media storage space could not be determined.', storageFull: 'Virtual media storage does not have enough free space.', storageReadOnly: 'Virtual media storage is read-only.', storagePermissionDenied: 'Permission to access virtual media storage was denied.', mediumRemovalPrevented: 'The controlled computer is using this virtual medium and has prevented its removal. Eject or unmount it on the controlled computer, then try again.', disconnectFailed: 'Virtual media could not be disconnected. Please try again or check the system logs.', }, }, settings: { title: 'Settings', appearance: 'Appearance', accountSubtitle: 'Manage console login credentials and security verification', account: 'Account', video: 'Video', encoder: 'Encoder', hid: 'HID', msd: 'MSD', atx: 'ATX', environment: 'Environment', networkSubtitle: 'Configure web server ports, listen addresses, and HTTPS', network: 'Network', hardware: 'Hardware', system: 'System', other: 'Other', extensions: 'Extensions', about: 'About', appearanceSubtitle: 'Customize interface appearance and language', videoSubtitle: 'Configure capture device, video encoder and WebRTC ICE servers', hidSubtitle: 'Configure the HID backend, device, descriptors, and USB gadget functions', atxSubtitle: 'Configure remote power control hardware and Wake-on-LAN', environmentSubtitle: 'View device information and system runtime diagnostics', otherSubtitle: 'Additional hardware controls and USB device maintenance', aboutSubtitle: 'Online upgrade and version information', extTtydSubtitle: 'Open a host Shell terminal in the browser', thirdPartyAccessSubtitle: 'Configure external RustDesk, VNC, RTSP, and Redfish access', extRemoteAccessSubtitle: 'Remote access through NAT-traversal services', extFrpcSubtitle: 'NAT traversal through the FRP client', watchdog: { title: 'Hardware Watchdog', description: 'The hardware watchdog can trigger a hardware reset if the system hangs or the process exits', status: { running: 'Running', closed: 'Off', unsupported: 'Unsupported', error: 'Error', }, loadFailed: 'Failed to load hardware watchdog status', toggleFailed: 'Failed to update hardware watchdog', enableFailed: 'Failed to enable the hardware watchdog.', unsupportedReason: 'No supported hardware watchdog was found.', discoveryFailed: 'Failed to detect the hardware watchdog.', openFailed: 'The hardware watchdog could not be opened.', feedFailed: 'The hardware watchdog is not being fed successfully.', disableFailed: 'The hardware watchdog cannot be safely disabled and keepalive will continue.', abnormalReason: 'The hardware watchdog is in an abnormal state.', }, deviceInfo: 'Device Info', deviceInfoDesc: 'Host system information', hostname: 'Hostname', cpuModel: 'Processor / Platform', 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', usernameDesc: 'Change the console login username', passwordDesc: 'Change the console login password', totp: { title: 'Two-factor authentication', description: 'Require an authenticator code when signing in to the web console', serverTime: 'Server time', localTime: 'Local time', clockOffset: 'Clock offset: {seconds} seconds', clockDriftWarning: 'The server and this device differ by at least 30 seconds. Codes may fail until their clocks are corrected.', enable: 'Enable 2FA', disable: 'Disable 2FA', enableTitle: 'Set up two-factor authentication', disableTitle: 'Disable two-factor authentication', manualSecret: 'Manual setup key', secretOneTime: 'This key is shown only during setup. Store it in your authenticator now.', enterSixDigitCode: 'Enter a 6-digit authenticator code', currentPasswordIncorrect: 'The current password is incorrect', invalidCode: 'The authenticator code is incorrect', enrollmentExpired: 'Setup expired. Enter your password to start again.', rateLimited: 'Too many incorrect codes. Wait one minute and try again.', alreadyEnabled: 'Two-factor authentication is already enabled', notEnabled: 'Two-factor authentication is not enabled', operationFailed: 'Unable to update two-factor authentication', loadFailed: 'Unable to load two-factor authentication status', }, httpPort: 'HTTP Port', httpsPort: 'HTTPS Port', bindAddress: 'Bind Address', bindMode: 'Listening Address', bindModeAll: 'All addresses', bindModeLocal: 'Local only (127.0.0.1)', bindModeCustom: 'Custom address list', bindIpv6: 'Enable IPv6', bindAddressList: 'Address List', addBindAddress: 'Add address', bindAddressListEmpty: 'Add at least one IP address.', httpsEnabled: 'Enable HTTPS', portConfig: 'Port & Protocol', portConfigDesc: 'The service listens on a single port at a time, determined by the HTTPS toggle', redfishTitle: 'Redfish', redfishDesc: 'DMTF Redfish standard management interface', redfishEnabled: 'Enable Redfish API', redfishEndpoint: 'Redfish Endpoint', portActive: 'Active', portReserved: 'Reserved', previewUrl: 'Access URL preview', copyUrl: 'Copy access URL', openInBrowser: 'Open in browser', listenAddress: 'Listen Address', listenAddressDesc: 'Configure the network interfaces used by the web server', effectiveAddresses: 'Effective listen addresses', sslCertificate: 'SSL Certificate', sslCertificateDesc: 'Upload a custom PEM certificate to replace the self-signed one. A service restart is required to apply.', sslCertCustom: 'Custom Certificate', sslCertSelfSigned: 'Self-Signed', sslCertActive: 'Custom certificate is active', sslCertClear: 'Revert to Self-Signed', sslCertSave: 'Save Certificate', sslCertPem: 'Certificate (.crt / .pem)', sslKeyPem: 'Private Key (.key)', sslCertPemPlaceholder: '-----BEGIN CERTIFICATE-----\n...\n-----END CERTIFICATE-----', sslKeyPemPlaceholder: '-----BEGIN PRIVATE KEY-----\n...\n-----END PRIVATE KEY-----', restartRequired: 'Restart Required', restartRequiredHint: 'The service will restart automatically to apply the new configuration.', unsavedChangesHint: 'Click Save to apply changes', restartMessage: 'Web server configuration saved. A restart is required for changes to take effect.', restarting: 'Restarting...', autoRestarting: 'Restarting automatically', autoRestartingDesc: 'Configuration saved. Will redirect to the new address once the service is back...', autoRestartingHttpsDesc: 'Service is restarting. A redirect link will appear in {sec}s...', autoRestartFailed: 'Auto-restart timed out. Please refresh the page or check the service status.', httpsManualRedirectTitle: 'Click the link below to open the new address', httpsManualRedirectDesc: 'HTTPS with a self-signed certificate requires browser approval. Click the link and choose "Proceed" on the security warning.', onlineUpgrade: 'Online Upgrade', onlineUpgradeDesc: 'Check and upgrade One-KVM', updateChannel: 'Update Channel', currentVersion: 'Current Version', latestVersion: 'Latest Version', updateStatus: 'Update Status', releaseNotes: 'Release Notes', noUpdates: 'No new version available for current channel', updateOverviewLoadFailed: 'Failed to load update information', startUpgrade: 'Start Upgrade', updatePhaseIdle: 'Idle', updatePhaseChecking: 'Checking', updatePhaseDownloading: 'Downloading', updatePhaseVerifying: 'Verifying', updatePhaseInstalling: 'Installing', updatePhaseRestarting: 'Restarting', updatePhaseSuccess: 'Success', updatePhaseFailed: 'Failed', updateMsgChecking: 'Checking for updates', updateMsgDownloading: 'Downloading binary', updateMsgVerifying: 'Verifying (SHA256)', updateMsgInstalling: 'Replacing binary', updateMsgRestarting: 'Restarting service', auth: 'Access', authSettings: 'Session Policy', authSettingsDesc: 'Configure single-user login and concurrent session behavior', allowMultipleSessions: 'Allow concurrent web sessions', username: 'Username', password: 'Password', msdDir: 'MSD directory', msdFlashInquiryString: 'Flash device name', msdCdromInquiryString: 'CD-ROM device name', atxPowerButton: 'Power Button', atxResetButton: 'Reset Button', atxPowerManagement: 'Power Management', atxDriver: 'Driver Type', atxDriverNone: 'Disabled', atxDriverGpio: 'GPIO', atxDriverUsbRelay: 'USB LCUS HID Relay', atxDriverSerial: 'USB LCUS Serial Relay', atxDevice: 'Device', atxGpioChip: 'GPIO Chip', atxPin: 'GPIO Pin', atxChannel: 'Relay Channel', atxActiveLevel: 'Trigger Level', atxLevelHigh: 'High-level trigger', atxLevelLow: 'Low-level trigger', atxLedSensing: 'LED Status Sensing', atxHddSensing: 'HDD Activity Sensing', atxWolSettings: 'Wake-on-LAN Settings', atxWolSettingsDesc: 'Configure WOL magic packet sending options', atxWolInterface: 'Network Interface', atxWolInterfacePlaceholder: 'e.g. eth0, enp0s3', themeDesc: 'Choose the interface color scheme', languageDesc: 'Choose the interface display language', featureVisibility: 'Feature Visibility', featureVisibilityDesc: 'Control which feature entry points are shown on the console page', computerUseAgent: 'Computer Use Agent', pasteText: 'Paste Text', videoSettings: 'Video Capture', videoSettingsDesc: 'Select a capture device. Source-following inputs report their active mode automatically.', videoDevice: 'Video Device', selectDevice: 'Select device...', videoFormat: 'Video Format', selectFormat: 'Select format...', resolution: 'Resolution', frameRate: 'Frame Rate', encoderBackend: 'Video Encoder', encoderBackendDesc: 'Select the encoder backend used for WebRTC streaming', backend: 'Backend', autoRecommended: 'Auto (Recommended)', software: 'Software', supportedFormats: 'Supported Codecs', hidSettings: 'HID Settings', hidSettingsDesc: 'Configure backend, device, descriptors, and functions in order', hidBackend: 'HID Backend', serialDevice: 'Serial Device', baudRate: 'Baud Rate', otgUdc: 'OTG Device Controller', ch9329Options: 'CH9329 Options', ch9329OptionsDesc: 'Configure runtime compatibility for the CH9329 serial HID chip', ch9329HybridMouse: 'Linux Absolute Mouse Compatibility', ch9329HybridMouseDesc: 'Keep absolute movement on absolute packets, but send buttons and wheel through relative packets', ch9329Descriptor: 'CH9329 USB Device Descriptor', ch9329DescriptorDesc: 'Read USB identification fields from the CH9329 chip before editing', ch9329DescriptorLoading: 'Reading CH9329 descriptor...', ch9329DescriptorLoadFailed: 'Failed to read CH9329 descriptor', ch9329ConfigModeUnavailable: 'CH9329 configuration mode is unavailable. Pull SET low to read or write chip parameters; showing the last saved descriptor.', ch9329DescriptorReadRequired: 'Read the CH9329 descriptor successfully before saving', ch9329DescriptorWarning: 'Saving writes CH9329 parameters; changes may not show until the device is power-cycled or reconnected', ch9329StringLengthWarning: 'CH9329 strings are limited to 23 bytes', otgHidProfile: 'OTG Functions', otgFunctionKeyboard: 'Standard Keyboard', otgKeyboardLeds: 'Keyboard LED Status', otgFunctionMouseRelative: 'Relative Positioning Mouse', otgFunctionMouseAbsolute: 'Absolute Positioning Mouse', otgFunctionConsumer: 'Consumer Control Keyboard', otgFunctionMsd: 'Mass Storage (MSD)', otgProfileWarning: 'Saving reconnects the USB device; unsupported combinations show an error and restore the previous configuration', otgFunctionMinWarning: 'Enable at least one HID function before saving', otgNetwork: 'USB Virtual Ethernet Bridge', otgRuntimeDegraded: 'OTG runtime is degraded', otgNetworkDriver: 'Host Driver Mode', otgNetworkInterface: 'Bridge Interface', otgNetworkNone: 'None', otgNetworkInterfacesLoadFailed: 'Failed to load bridge interfaces', uacMic: 'USB Microphone', otgDescriptor: 'USB Device Descriptor', vendorId: 'Vendor ID (VID)', productId: 'Product ID (PID)', manufacturer: 'Manufacturer', productName: 'Product Name', serialNumber: 'Serial Number', serialNumberAuto: 'Auto-generated', descriptorWarning: 'Changing these settings will reconnect the USB device', otgSelfCheck: { title: 'OTG Self-Check', desc: 'Check UDC, gadget binding, and link status', run: 'Run Self-Check', failed: 'Failed to run OTG self-check', overall: 'Overall Status', ok: 'Healthy', hasIssues: 'Issues Found', counts: '{errors} errors, {warnings} warnings', groupCounts: '{ok} passed, {warnings} warnings, {errors} errors', notRun: 'Not run', status: { ok: 'Healthy', warn: 'Warning', error: 'Error', skipped: 'Skipped', }, groups: { udc: 'UDC Basics', gadgetConfig: 'Gadget Config', oneKvm: 'one-kvm Gadget', functions: 'Functions & Nodes', link: 'Link State', }, values: { missing: 'Missing', notConfigured: 'Not configured', mounted: 'Mounted', unmounted: 'Unmounted', available: 'Available', unavailable: 'Unavailable', exists: 'Exists', none: 'None', unbound: 'Unbound', noConflict: 'No conflict', conflict: 'Conflict', unknown: 'Unknown', normal: 'Normal', abnormal: 'Abnormal', }, selectedUdc: 'Target UDC', boundUdc: 'Bound UDC', messages: { udc_dir_exists: 'UDC directory check', udc_has_entries: 'UDC check', configfs_mounted: 'configfs check', usb_gadget_dir_exists: 'usb_gadget check', libcomposite_loaded: 'libcomposite check', one_kvm_gadget_exists: 'one-kvm gadget check', other_gadgets: 'Other gadget check', configured_udc_valid: 'Configured UDC check', one_kvm_bound_udc: 'Bound UDC check', hid_functions_present: 'HID function check', config_c1_exists: 'configs/c.1 check', function_links_ok: 'Function link check', hid_device_nodes: 'HID node check', udc_conflict: 'UDC conflict check', udc_state: 'UDC state check', udc_speed: 'UDC speed check', }, hints: { udc_dir_exists: 'Ensure UDC/OTG kernel drivers are enabled', udc_has_entries: 'Ensure OTG controller is enabled in device tree', configfs_mounted: 'Try: mount -t configfs none /sys/kernel/config', usb_gadget_dir_exists: 'Ensure configfs and USB gadget support are enabled', libcomposite_loaded: 'Try: modprobe libcomposite', one_kvm_gadget_exists: 'Enable OTG HID or MSD to let one-kvm gadget be created automatically', other_gadgets: 'Potential UDC contention with one-kvm; check other OTG services', configured_udc_valid: 'Please reselect UDC in HID OTG settings', one_kvm_bound_udc: 'Ensure HID/MSD is enabled and initialized successfully', hid_functions_present: 'Check OTG HID config and enable at least one HID function', config_c1_exists: 'Gadget structure is incomplete; try restarting One-KVM', function_links_ok: 'Reinitialize OTG (toggle HID backend once or restart service)', hid_device_nodes: 'Ensure gadget is bound and check kernel logs', udc_conflict: 'Stop other OTG services or switch one-kvm to an idle UDC', udc_state: 'Ensure target host is connected and has recognized the USB device', udc_speed: 'Device may not be fully enumerated; try reconnecting USB', }, }, encoderSelfCheck: { title: 'Hardware Encoding Capability Test', desc: 'Test hardware encoding capability across 720p, 1080p, 2K, and 4K', run: 'Start Test', failed: 'Failed to run hardware encoding capability test', resolution: 'Resolution', currentHardwareEncoder: 'Current Hardware Encoder', none: 'None', }, usbDevices: { title: 'USB Device Reset', desc: 'View connected USB devices and reset them to recover from errors', refresh: 'Refresh', loadFailed: 'Failed to load USB device list', noDevices: 'No USB devices found', colDevice: 'Device', colSpeed: 'Speed', colVideo: 'Video', colAction: 'Action', reset: 'Reset', resetConfirmTitle: 'Confirm USB Device Reset', resetConfirmDesc: 'This will reset USB device "{device}" by cycling its authorized attribute. All connections to this device will be temporarily interrupted. Continue?', resetAction: 'Reset Device', }, webrtcSettings: 'WebRTC Signaling', webrtcSettingsDesc: 'Configure STUN/TURN servers; changes apply to newly established WebRTC sessions after saving', stunServer: 'STUN Server', stunServerPlaceholder: 'stun:stun.l.google.com:19302', turnServer: 'TURN Server', turnServerPlaceholder: 'turn:turn.example.com:3478', turnUsername: 'TURN Username', turnPassword: 'TURN Password', }, virtualKeyboard: { title: 'Virtual Keyboard', attach: 'Attach', detach: 'Detach', hide: 'Hide', }, config: { loadDevicesFailed: 'Failed to load device list', updateFailed: 'Update failed', }, computerUse: { title: 'Computer Use', status: { waitingScreenshot: 'Capturing screen', thinking: 'Thinking', executing: 'Executing', completed: 'Completed', failed: 'Failed', stopped: 'Stopped', idle: 'Idle', }, connection: { connected: 'Connected', disconnected: 'Disconnected', socketFailed: 'Computer Use WebSocket connection failed', messageFailed: 'Failed to process Computer Use WebSocket message', }, buttons: { settings: 'Settings', clear: 'Clear', close: 'Close', send: 'Send', stop: 'Stop', save: 'Save', clearKey: 'Clear Key', }, reasoning: { failed: 'Thinking failed', process: 'Reasoning', thinking: 'Thinking', }, trace: { screenshot: 'Screenshot', screenshotAlt: 'Computer Use screenshot', executed: 'Executed', }, input: { placeholder: 'Enter a task. Press Enter for a new line; press Ctrl+Enter to send.', apiKeyRequired: 'Configure an API Key first.', }, settings: { title: 'Computer Use Settings', enableAi: 'Enable AI control', model: 'Model', apiUrl: 'API URL', apiKey: 'API Key', configured: 'Configured: {source}', sourceEnv: 'environment variable', sourceConfig: 'configuration file', sourceNone: 'not configured', }, actions: { click: 'Click ({x}, {y}) {button}', doubleClick: 'Double-click ({x}, {y}) {button}', move: 'Move to ({x}, {y})', drag: 'Drag through {count} points', scroll: 'Scroll at ({x}, {y}) dx={dx} dy={dy}', typeAscii: 'Type {count} ASCII characters', keypress: 'Press {keys}', wait: 'Wait {ms}ms', screenshot: 'Request screenshot', }, mouseButtons: { left: 'left button', middle: 'middle button', right: 'right button', }, errors: { configLoadFailed: 'Failed to load Computer Use settings', taskFailed: 'Computer Use task failed', startFailed: 'Failed to start Computer Use', stopFailed: 'Failed to stop Computer Use', captureUnavailable: 'The current video frame is unavailable', screenshotFailed: 'Screenshot capture failed', }, success: { configSaved: 'Computer Use settings saved', apiKeyCleared: 'API Key cleared', }, }, statusCard: { device: 'Device', video: 'Video', hid: 'HID', audio: 'Audio', msd: 'MSD', online: 'Online', offline: 'Offline', connecting: 'Connecting...', format: 'Format', resolution: 'Resolution', fps: 'FPS', fpsTarget: 'Target FPS', fpsActual: 'Actual FPS', paused: 'Paused', backend: 'Backend', currentMode: 'Current Mode', absolute: 'Absolute', relative: 'Relative', channel: 'Channel', networkError: 'Network Error', disconnected: 'Disconnected', hidUnavailable: 'HID Unavailable', audioPlayback: 'Audio Playback', audioTransfer: 'Audio Transfer', playbackActive: 'Playing', playbackStopped: 'Stopped', transferIdle: 'Not Transmitting', transferStarting: 'Starting', transferWaiting: 'Waiting for Target', transferActive: 'Transmitting', transferStalled: 'Target Not Receiving', transferStopping: 'Stopping', transferError: 'Transfer Error', quality: 'Quality', streaming: 'Streaming', off: 'Off', defaultDevice: 'Default', connected: 'Connected', msdStatus: 'Status', msdStandby: 'Idle', msdDriveMode: 'Virtual USB', msdCurrentImage: 'Current Image', msdNoImage: 'None', }, extensions: { available: 'Available', unavailable: 'Unavailable', running: 'Running', starting: 'Starting', stopped: 'Stopped', failed: 'Failed', start: 'Start', stop: 'Stop', autoStart: 'Auto Start', thirdPartyAccess: { title: 'Third-party Access', }, viewLogs: 'View Logs', noLogs: 'No logs available', binaryNotFound: '{path} not found, please install the required program', remoteAccess: { title: 'Remote Access', }, ttyd: { title: 'Ttyd Web Terminal', desc: 'Web terminal access via ttyd', open: 'Open Terminal', openInNewTab: 'Open in New Tab', shell: 'Shell', }, gostc: { title: 'GOSTC NAT Traversal', desc: 'NAT traversal via GOSTC', addr: 'Server Address', addrPlaceholder: 'Hostname or IP (required)', addrRequired: 'Enter the GOSTC server address', key: 'Client Key', keyRequired: 'Enter the GOSTC client key', tls: 'Enable TLS', }, easytier: { title: 'Easytier Network', desc: 'P2P VPN networking via EasyTier', quickConfig: 'Quick Config', fullConfig: 'Full Config', fullConfigHint: 'Paste the full easytier.toml configuration file here', fullConfigRequired: 'Enter the full easytier.toml configuration', networkName: 'Network Name', networkNameRequired: 'Enter the EasyTier network name', networkSecret: 'Network Secret', peers: 'Peer Nodes', addPeer: 'Add Peer', virtualIp: 'Virtual IP', }, frpc: { title: 'FRPC NAT Traversal', desc: 'Use the FRP client for NAT traversal', quickConfig: 'Quick Config', fullConfig: 'Full Config', fullConfigHint: 'Paste the provider TOML configuration file here', fullConfigRequired: 'Enter the full frpc.toml configuration', proxyType: 'Proxy Type', proxyName: 'Proxy Name', proxyNamePlaceholder: 'one-kvm-ssh', proxyNameRequired: 'Enter the FRPC proxy name', serverAddr: 'Server Address', serverAddrPlaceholder: 'frps.example.com', serverAddrRequired: 'Enter the FRPC server address', serverPort: 'Server Port', token: 'Token', tokenRequired: 'Enter the FRPC token', localIp: 'Local Address', localIpRequired: 'Enter the FRPC local address', localPort: 'Local Port', remotePort: 'Remote Port', remotePortRequired: 'TCP/UDP proxies require a remote port', customDomain: 'Custom Domain', customDomainPlaceholder: 'kvm.example.com', secretKey: 'Secret Key', tls: 'Enable TLS', }, rustdesk: { title: 'RustDesk Remote', desc: 'Configure the RustDesk service; the selected codec will be locked', mode: 'Access Mode', modeId: 'ID Service', modeIdDesc: 'Register with an ID server and use the configured relay when direct connections fail', modeDirectIp: 'Direct IP', modeDirectIpDesc: 'Listen on the device only, without connecting to an ID or relay server', directAccessPort: 'Direct Access Port', directAccessPortInvalid: 'The direct access port must be between 1 and 65535', rendezvousServer: 'ID Server', rendezvousServerPlaceholder: 'hbbs.example.com:21116', rendezvousServerRequired: 'Enter the RustDesk ID server', relayServer: 'Relay Server', relayServerPlaceholder: 'hbbr.example.com:21117', relayKey: 'Relay Key', codec: 'Codec', deviceId: 'Device ID', devicePassword: 'Device Password', showPassword: 'Show Password', hidePassword: 'Hide Password', regenerateId: 'Regenerate ID', regeneratePassword: 'Regenerate Password', confirmRegenerateId: 'Are you sure you want to regenerate the device ID? Existing clients will need to reconnect with the new ID.', confirmRegeneratePassword: 'Are you sure you want to regenerate the password? Existing clients will need to reconnect with the new password.', registered: 'Registered', disconnected: 'Disconnected', connecting: 'Connecting', notConfigured: 'Not Configured', notInitialized: 'Not Initialized', copyId: 'Copy ID', copyPassword: 'Copy Password', }, rtsp: { title: 'RTSP Streaming', desc: 'Configure the RTSP streaming service; the selected codec will be locked', bind: 'Bind Address', port: 'Port', path: 'Stream Path', pathPlaceholder: 'live', codec: 'Codec', allowOneClient: 'Allow One Client Only', username: 'Username', usernamePlaceholder: 'Empty means no authentication', password: 'Password', passwordPlaceholder: 'Enter new password', urlPreview: 'RTSP URL Preview', }, vnc: { title: 'VNC Remote', desc: 'Configure the VNC service; the selected codec will be locked', bind: 'Bind Address', port: 'Port', encoding: 'Video Encoding', encodingTightJpeg: 'Tight JPEG', encodingH264: 'H.264', allowOneClient: 'Allow One Client Only', password: 'Password', passwordPlaceholder: 'Leave empty to keep current', passwordRequiredPlaceholder: 'Up to 8 characters', passwordRequired: 'Set a VNC password', passwordMaxLength: 'VNC passwords are limited to 8 characters', clients: '{count} clients', urlPreview: 'VNC Address Preview', }, }, stats: { title: 'Connection Stats', video: 'Video Information', stability: 'Network Stability', delay: 'Playback Delay', packetLoss: 'Packet Loss', total: 'total', frameRate: 'Frame Rate', bitrate: 'Bitrate', resolution: 'Resolution', packetsLost: 'Packets Lost', connection: 'Connection Info', connectionType: 'Connection Type', transport: 'Transport', localCandidate: 'Local Candidate', remoteCandidate: 'Remote Candidate', p2p: 'P2P Direct', relay: 'TURN Relay', }, help: { videoBitratePreset: 'Speed: lowest latency, best for slow networks. Balanced: good quality and latency. Quality: best visual, needs good bandwidth', 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', }, }