import type { Messages } from '../types'; export const enVaultMessages: Messages = { // Notes 'notes.search.placeholder': 'Search notes, hosts, tags...', 'notes.action.newNote': 'New Note', 'notes.action.newGroup': 'New Folder', 'notes.action.importMarkdown': 'Import Markdown', 'notes.action.exportNote': 'Export Note', 'notes.action.exportGroup': 'Export Folder', 'notes.action.exportAll': 'Export Notes', 'notes.import.toast.success': 'Imported {count} note(s)', 'notes.import.toast.noNotes': 'No Markdown files were imported.', 'notes.import.toast.failed': 'Failed to import Markdown files.', 'notes.import.toast.inProgress': 'A Markdown import is already in progress.', 'notes.import.toast.skipped': 'Skipped {count} unsupported file(s).', 'notes.export.toast.success': 'Exported {count} note(s)', 'notes.export.toast.empty': 'No notes to export.', 'notes.export.toast.failed': 'Failed to export notes.', 'notes.codeBlock.copied': 'Copied', 'notes.codeBlock.copyFailed': 'Failed to copy code block.', 'notes.group.prompt': 'Folder path', 'notes.group.all': 'Notebook', 'notes.group.ungrouped': 'Ungrouped', 'notes.section.notebooks': 'Notebook', 'notes.section.notes': 'Notes', 'notes.mode.edit': 'Edit', 'notes.mode.split': 'Split', 'notes.mode.preview': 'Preview', 'notes.title.placeholder': 'Note title', 'notes.editor.placeholder': 'Write Markdown notes here...', 'notes.editor.unrenderableMarkdown': 'This note contains Markdown the rich editor cannot display (for example unbalanced text). Showing the raw Markdown source instead — the content is intact.', 'notes.editor.retryRichView': 'Retry rich view', 'notes.preview.empty': 'Nothing to preview yet.', 'notes.empty.title': 'No notes yet', 'notes.empty.desc': 'Create Markdown notes for runbooks, reminders, and server handoff details.', 'notes.empty.group': 'No notes in this notebook.', 'notes.search.noResults': 'No notes found.', 'notes.toolbar.modeLive': 'Live Preview', 'notes.toolbar.modeLiveTitle': 'Live Preview Mode (WYSIWYG)', 'notes.toolbar.modeSource': 'Source Mode', 'notes.toolbar.modeSourceTitle': 'Source Mode (Markdown code)', 'notes.toolbar.modePreview': 'Reading Mode', 'notes.toolbar.modePreviewTitle': 'Reading Mode (Read-only)', 'notes.toolbar.undo': 'Undo (Ctrl+Z)', 'notes.toolbar.redo': 'Redo (Ctrl+Y)', 'notes.toolbar.typography': 'Code font and typography settings', 'notes.toolbar.customCodeFont': 'Custom Code Font', 'notes.toolbar.fontsAvailable': '{count} fonts available', 'notes.toolbar.searchFont': 'Search fonts...', 'notes.toolbar.noFontsFound': 'No matching monospace fonts found', 'notes.toolbar.defaultFont': 'Default Monospace (Default)', 'notes.toolbar.bodyFontSize': 'Body Font Size', 'notes.toolbar.codeFontSize': 'Code Font Size', 'notes.toolbar.headingLevel': 'Heading Level', 'notes.toolbar.h1': 'Heading 1', 'notes.toolbar.h2': 'Heading 2', 'notes.toolbar.h3': 'Heading 3', 'notes.toolbar.h4': 'Heading 4', 'notes.toolbar.bold': 'Bold (Ctrl+B)', 'notes.toolbar.italic': 'Italic (Ctrl+I)', 'notes.toolbar.strikethrough': 'Strikethrough', 'notes.toolbar.underline': 'Underline', 'notes.toolbar.inlineCode': 'Inline Code', 'notes.toolbar.bulletList': 'Bullet List', 'notes.toolbar.orderedList': 'Numbered List', 'notes.toolbar.taskList': 'Task List', 'notes.toolbar.quote': 'Quote', 'notes.toolbar.codeBlock': 'Code Block', 'notes.toolbar.mathFormula': 'Math Formula (LaTeX / Math)', 'notes.toolbar.table': 'Insert Table', 'notes.toolbar.divider': 'Divider', 'notes.toolbar.link': 'Insert Link', 'notes.toolbar.image': 'Insert Image', 'notes.action.pin': 'Pin Note', 'notes.action.unpin': 'Unpin Note', 'notes.tag.remove': 'Remove tag', 'notes.tag.placeholder': 'Tag name...', 'notes.tag.add': 'Add tag', 'notes.outline.title': 'Table of Contents', 'notes.outline.titleWithCount': 'Table of Contents ({count})', 'notes.outline.empty': 'No outline headings', 'notes.outline.emptyHint': 'Use # and ## in Markdown to create headings', 'notes.export.share': 'Export & Share', 'notes.export.currentNote': 'Current Note', 'notes.export.exportMarkdown': 'Export as Markdown (.md)', 'notes.export.exportHtml': 'Export as HTML (.html)', 'notes.export.copyMarkdown': 'Copy Markdown Source', 'notes.export.allNotes': 'All Notes', 'notes.export.exportAllZip': 'Export All as ZIP Archive', 'notes.export.toast.markdownSuccess': 'Markdown file exported', 'notes.export.toast.htmlSuccess': 'HTML file exported', 'notes.export.toast.zipSuccess': 'All notes exported as ZIP backup', // Vault import 'vault.import.title': 'Add data to your vault', 'vault.import.desc': 'Transfer your connections from popular clients. Select a file format to start the migration.', 'vault.import.chooseFormat': 'Select a file format', 'vault.import.destination.title': 'Where should imported hosts go?', 'vault.import.destination.preserve': 'Keep original groups', 'vault.import.destination.existing': 'Choose a group', 'vault.import.destination.new': 'Create a group', 'vault.import.destination.noGroups': 'No groups available', 'vault.import.destination.newPlaceholder': 'New group name', 'vault.import.destination.settings': 'Import location', 'vault.import.destination.settingsHint': 'Choose where new hosts are placed', 'vault.import.destination.done': 'Done', 'vault.import.securecrt.directoryHint': 'Select the SecureCRT Sessions folder.', 'vault.import.securecrt.chooseSource': 'Choose a SecureCRT import source.', 'vault.import.securecrt.sourceQuestion': 'What would you like to import?', 'vault.import.securecrt.promptTitle': 'Import from SecureCRT', 'vault.import.securecrt.promptDesc': 'Pick the SecureCRT Sessions folder to import every session while keeping the folder structure, or choose a single .ini session file.', 'vault.import.securecrt.folder': 'Sessions folder', 'vault.import.securecrt.folderDesc': 'Import every session and keep the folder structure.', 'vault.import.securecrt.file': 'Single session file', 'vault.import.securecrt.fileDesc': 'Import one SecureCRT .ini session.', 'vault.import.csv.tip': 'Bulk import: use the CSV template.', 'vault.import.csv.downloadTemplate': 'Download CSV template', 'vault.import.toast.start': 'Importing from {format}...', 'vault.import.toast.completedTitle': 'Import completed', 'vault.import.toast.failedTitle': 'Import failed', 'vault.import.toast.noEntries': 'No importable entries found in {format}.', 'vault.import.toast.noNewHosts': 'No new hosts imported from {format}.', 'vault.import.toast.summary': 'Imported {count} hosts (skipped {skipped}, duplicates {duplicates}).', 'vault.import.toast.firstIssue': 'First issue: {issue}', 'vault.import.progress.title': 'Importing hosts', 'vault.import.progress.reading': 'Reading file', 'vault.import.progress.parsing': 'Parsing hosts', 'vault.import.progress.preparing': 'Preparing changes', 'vault.import.progress.saving': 'Saving hosts', 'vault.import.progress.complete': 'Import complete', 'vault.import.progress.failed': 'Import failed', 'vault.import.progress.persistFailed': 'Imported hosts could not be saved. Free some local storage space and try again.', 'vault.import.progress.rollbackFailed': 'The import could not be rolled back safely. Some imported hosts may remain; review the Vault before retrying.', 'vault.import.progress.summary': 'Imported {count} hosts; skipped {skipped}; duplicates {duplicates}.', 'vault.import.progress.keepOpen': 'Keep NetMesh open while the import runs in the background.', 'vault.import.progress.fileSummary': '{name} · {count} files', 'vault.import.progress.fileCount': '{completed} of {total} files', 'vault.import.mobaxterm.chooseEncoding': 'Choose how to read your MobaXterm file.', 'vault.import.mobaxterm.encodingQuestion': 'Which text encoding does this file use?', 'vault.import.mobaxterm.auto': 'Auto Detect', 'vault.import.mobaxterm.autoDesc': 'Recommended. Uses UTF-8 when valid, otherwise Chinese Windows encoding.', 'vault.import.mobaxterm.utf8': 'UTF-8', 'vault.import.mobaxterm.utf8Desc': 'Use for files saved or converted as UTF-8.', 'vault.import.mobaxterm.gb18030': 'Chinese Windows', 'vault.import.mobaxterm.gb18030Desc': 'Use for legacy files exported on Chinese Windows.', 'vault.import.mobaxterm.masterPassword': 'Master password (optional)', 'vault.import.mobaxterm.masterPasswordPlaceholder': 'Enter the MobaXterm master password', 'vault.import.mobaxterm.masterPasswordHint': 'Needed to import saved passwords from .mobaconf or MobaXterm.ini. Leave blank to import sessions only.', 'vault.import.sshConfig.chooseMode': 'Choose how to import your SSH config file.', 'vault.import.sshConfig.modeQuestion': 'How would you like to import?', 'vault.import.sshConfig.importOnly': 'Import Only', 'vault.import.sshConfig.importOnlyDesc': 'One-time import. Changes won\'t sync back to the file.', 'vault.import.sshConfig.managed': 'Managed Sync', 'vault.import.sshConfig.managedDesc': 'Keep in sync. Changes will be saved back to the file.', 'vault.import.sshConfig.managedDestinationHint': 'Managed sync always uses its own managed group; the destination above applies to one-time import only.', 'vault.import.sshConfig.managedGroup': 'ssh config', 'vault.import.sshConfig.managedSuccess': 'Imported {count} hosts. File is now managed.', 'vault.import.sshConfig.alreadyManaged': 'This file is already being managed.', 'vault.import.sshConfig.alreadyManagedDesc': 'This file is already managed under group "{group}". Remove the existing managed source first if you want to re-import.', 'vault.import.sshConfig.noFilePath': 'Cannot manage this file.', 'vault.import.sshConfig.noFilePathDesc': 'Unable to determine the file path. Managed sync requires access to the file system.', // Known Hosts 'knownHosts.search.placeholder': 'Search known hosts...', 'knownHosts.action.scanSystem': 'Scan System', 'knownHosts.action.importFile': 'Import File', 'knownHosts.action.browseFile': 'Browse File', 'knownHosts.empty.title': 'No Known Hosts', 'knownHosts.empty.desc': "Known hosts are SSH servers you've connected to before. Import from your system's known_hosts file to get started.", 'knownHosts.results.showingLimited': 'Showing {shown} of {total} hosts. Use search to find specific hosts.', 'knownHosts.toast.scanUnavailable': 'System scan is unavailable on this platform.', 'knownHosts.toast.scanNoFile': 'No system known_hosts file found.', 'knownHosts.toast.scanNoEntries': 'No usable entries found in known_hosts.', 'knownHosts.toast.scanImported': 'Imported {count} new hosts.', 'knownHosts.toast.scanNoNew': 'No new hosts found.', 'knownHosts.toast.scanFailed': 'Failed to scan system known_hosts.', // Port Forwarding 'pf.empty.title': 'Set up port forwarding', 'pf.empty.desc': 'Save port forwarding to access databases, web apps, and other services.', 'pf.title': 'Port Forwarding', 'pf.rulesCount': '{count} rules', 'pf.wizard.editTitle': 'Edit Port Forwarding', 'pf.wizard.newTitle': 'New Port Forwarding', 'pf.wizard.saveChanges': 'Save Changes', 'pf.wizard.done': 'Done', 'pf.wizard.continue': 'Continue', 'pf.wizard.cancel': 'Cancel', 'pf.wizard.skipWizard': 'Skip wizard', 'pf.error.hostNotFound': 'Host not found', 'pf.toast.titleWithLabel': 'Port Forwarding: {label}', 'pf.type.local': 'Local', 'pf.type.remote': 'Remote', 'pf.type.dynamic': 'Dynamic', 'pf.type.menu.local': 'Local Forwarding', 'pf.type.menu.remote': 'Remote Forwarding', 'pf.type.menu.dynamic': 'Dynamic Forwarding', 'pf.type.local.desc': "Local forwarding lets you access a remote server's listening port as though it were local.", 'pf.type.remote.desc': 'Remote forwarding opens a port on the remote machine and forwards connections to the local (current) host.', 'pf.type.dynamic.desc': 'Dynamic port forwarding turns NetMesh into a SOCKS proxy server.', 'pf.wizard.type.title': 'Select the port forwarding type:', 'pf.wizard.localConfig.title': 'Set the local port and binding address:', 'pf.wizard.localConfig.desc': 'This port will be open on the local (current) device, and it will receive the traffic.', 'pf.wizard.localConfig.localPort': 'Local port number *', 'pf.wizard.bindAddress': 'Bind address', 'pf.wizard.remoteHost.title': 'Select the remote host:', 'pf.wizard.remoteHost.desc': 'Select a host where the port will be open. Traffic from this port will be forwarded to the destination host.', 'pf.wizard.remoteConfig.title': 'Set the port and binding address:', 'pf.wizard.remoteConfig.desc': 'Traffic will be forwarded from the specified port and interface address of the selected host.', 'pf.wizard.remoteConfig.remotePort': 'Remote port number *', 'pf.wizard.destination.title': 'Select the destination host:', 'pf.wizard.destination.desc.local': 'Enter the remote destination that you want to access through the tunnel.', 'pf.wizard.destination.desc.remote': 'The destination address and port where the traffic will be forwarded.', 'pf.wizard.destination.address': 'Destination address *', 'pf.wizard.destination.addressPlaceholder': 'e.g. 127.0.0.1 or 192.168.1.100', 'pf.wizard.destination.port': 'Destination port number *', 'pf.wizard.sshServer.title': 'Select the SSH server:', 'pf.wizard.sshServer.desc.dynamic': 'Select the SSH server that will act as your SOCKS proxy.', 'pf.wizard.sshServer.desc.default': 'Select the SSH server that will tunnel your traffic to the destination.', 'pf.wizard.label.title': 'Select the label:', 'pf.wizard.label.placeholder.dynamic': 'e.g. SOCKS Proxy', 'pf.wizard.label.placeholder.default': 'e.g. MySQL Production', 'pf.wizard.label.placeholder.remoteRule': 'e.g. Remote Rule', 'pf.wizard.placeholders.portExample': 'e.g. {port}', 'pf.action.newForwarding': 'New Forwarding', 'pf.action.startAll': 'Start all', 'pf.action.stopAll': 'Stop all', 'pf.toast.startAll.success': 'Started {count} rules', 'pf.toast.startAll.partial': 'Started {started} rules ({failed} failed)', 'pf.toast.startAll.failed': 'Failed to start {count} rules', 'pf.toast.stopAll.success': 'Stopped {count} tunnels', 'pf.toast.stopAll.partial': 'Stopped {stopped} tunnels ({failed} failed)', 'pf.toast.stopAll.failed': 'Failed to stop {count} tunnels', 'pf.form.labelPlaceholder': 'Rule label', 'pf.form.intermediateHost': 'Intermediate host *', 'pf.form.createRule': 'Create Rule', 'pf.form.openWizard': 'Open Wizard', 'pf.form.openWizardTitle': 'Open Port Forwarding Wizard', 'pf.view.grid': 'Grid', 'pf.view.list': 'List', 'pf.rule.summary.local': 'Local {bindAddress}:{localPort} -> SSH tunnel -> {remoteHost}:{remotePort}', 'pf.rule.summary.remote': 'Remote {bindAddress}:{localPort} -> SSH tunnel -> local {remoteHost}:{remotePort}', 'pf.rule.summary.dynamic': 'SOCKS on {bindAddress}:{localPort}', 'pf.tooltip.relayHost': 'Relay Host', 'pf.tooltip.hostLabel': 'Host', 'pf.tooltip.hostAddress': 'Address', 'pf.tooltip.noHost': 'No relay host configured', 'pf.tooltip.localDesc': 'Local port forwarding: Access remote services through SSH tunnel', 'pf.tooltip.remoteDesc': 'Remote port forwarding: Expose local services to remote host', 'pf.tooltip.dynamicDesc': 'Dynamic SOCKS proxy: Route traffic through SSH tunnel', 'pf.deleteActive.title': 'Delete Active Port Forwarding?', 'pf.deleteActive.desc': 'This port forwarding rule "{label}" is currently active. Deleting it will stop the tunnel first.', 'pf.deleteActive.confirm': 'Stop and Delete', 'pf.form.autoStart': 'Auto Start', 'pf.form.autoStartDesc': 'Automatically start this rule when the app launches', // SFTP 'sftp.newFolder': 'New Folder', 'sftp.newFile': 'New File', 'sftp.filter': 'Filter', 'sftp.filter.placeholder': 'Filter by filename...', 'sftp.bookmark.add': 'Bookmark this path', 'sftp.bookmark.remove': 'Remove bookmark', 'sftp.bookmark.list': 'Bookmarked paths', 'sftp.bookmark.addGlobal': '+Global', 'sftp.bookmark.addGlobalTooltip': 'Save as global bookmark (shared across all hosts)', 'sftp.bookmark.empty': 'No bookmarks yet', 'sftp.bookmark.removeConfirm': 'Remove bookmark {path}?', 'sftp.bookmark.manage': 'Manage', 'sftp.bookmark.rename': 'Rename bookmark', 'sftp.bookmark.done': 'Done', 'sftp.bookmark.moveUp': 'Move {label} up', 'sftp.bookmark.moveDown': 'Move {label} down', 'sftp.columns.name': 'Name', 'sftp.columns.modified': 'Modified', 'sftp.columns.size': 'Size', 'sftp.columns.kind': 'Kind', 'sftp.columns.owner': 'Owner', 'sftp.columns.configure': 'Choose visible columns', 'sftp.columns.actions': 'Actions', 'sftp.sort.directoriesFirst': 'Folders first', 'sftp.emptyDirectory': 'Empty directory', 'sftp.nav.up': 'Go up', 'sftp.nav.home': 'Go to home', 'sftp.nav.refresh': 'Refresh', 'sftp.upload': 'Upload', 'sftp.uploadFiles': 'Upload files', 'sftp.uploadFolder': 'Upload folder', 'sftp.dragDropToUpload': 'Drag and drop files here to upload', 'sftp.retry': 'Retry', 'sftp.context.open': 'Open', 'sftp.context.navigateTo': 'Navigate to', 'sftp.context.moveTo': 'Move to...', 'sftp.context.moveToParent': 'Move to parent directory', 'sftp.moveTo.title': 'Move to directory', 'sftp.moveTo.placeholder': 'Enter target directory path', 'sftp.moveTo.confirm': 'Move', 'sftp.moveTo.pathNotFound': 'Directory not found or inaccessible', 'sftp.context.download': 'Download', 'sftp.context.extract': 'Extract here', 'sftp.extract.extracting': 'Extracting {fileName}...', 'sftp.extract.success': 'Extracted {fileName}', 'sftp.extract.error': 'Failed to extract {fileName}: {error}', 'sftp.context.copyToOtherPane': 'Copy to other pane', 'sftp.copyToOtherPane.unavailable': 'Open the two-pane SFTP view and connect the destination pane before copying files.', 'sftp.copyCurrentPath': 'Copy current path', 'sftp.copyCurrentPath.success': 'Current path copied', 'sftp.copyCurrentPath.error': 'Could not copy current path', 'sftp.viewMode.label': 'View mode', 'sftp.viewMode.list': 'List view', 'sftp.viewMode.tree': 'Tree view', 'sftp.viewMode.switchToList': 'Switch to list view', 'sftp.viewMode.switchToTree': 'Switch to tree view', 'sftp.listDensity.compact': 'Compact list', 'sftp.listDensity.comfortable': 'Comfortable list', 'sftp.listDensity.switchToCompact': 'Switch to compact list', 'sftp.listDensity.switchToComfortable': 'Switch to comfortable list', 'sftp.tree.loadError': 'Failed to load directory', 'sftp.tree.loading': 'Loading...', 'sftp.kind.folder': 'Folder', 'sftp.context.rename': 'Rename', 'sftp.context.permissions': 'Permissions', 'sftp.context.delete': 'Delete', 'sftp.context.refresh': 'Refresh', 'sftp.context.uploadFiles': 'Upload File(s)...', 'sftp.context.uploadFilesHere': 'Upload File(s) Here...', 'sftp.context.uploadFolder': 'Upload Folder...', 'sftp.context.uploadFolderHere': 'Upload Folder Here...', 'sftp.context.downloadSelected': 'Download selected ({count})', 'sftp.context.deleteSelected': 'Delete selected ({count})', 'sftp.dropFilesHere': 'Drop files here', 'sftp.itemsCount': '{count} items', 'sftp.selectedCount': '{count} selected', 'sftp.path.doubleClickToEdit': 'Double-click to edit path', 'sftp.showHiddenPaths': 'Hidden paths', 'sftp.task.waiting': 'Waiting...', 'sftp.transfer.preparing': 'preparing...', 'sftp.status.loading': 'Loading...', 'sftp.status.uploading': 'Uploading...', 'sftp.status.ready': 'Ready', 'sftp.transfers': 'Transfers', 'sftp.transfers.active': '{count} active', 'sftp.transfers.clearCompleted': 'Clear completed', 'sftp.transfers.calculatingTotal': 'Calculating total size...', 'sftp.transfers.filesCount': '{count} files', 'sftp.transfers.filesProgress': '{current}/{total} files', // Progressive folder walk: total is "found so far", not a fixed grand total. 'sftp.transfers.filesDiscoveredProgress': '{completed} done · {discovered} found', 'sftp.transfers.expandChildren': 'Show files', 'sftp.transfers.collapseChildren': 'Hide files', 'sftp.transfers.expandChildList': 'Show detail', 'sftp.transfers.collapseChildList': 'Hide', 'sftp.transfers.retryAction': 'Retry', 'sftp.transfers.dismissAction': 'Dismiss', 'sftp.transfers.openTargetFolder': 'Open target folder', 'sftp.transfers.openTargetFolderError': 'Could not open target folder', 'sftp.transfers.copyTargetPath': 'Copy target path', 'sftp.transfers.copyTargetPathSuccess': 'Target path copied', 'sftp.transfers.copyTargetPathError': 'Could not copy target path', 'sftp.transfers.pathConflict.title': 'Transfer blocked', 'sftp.transfers.pathConflict.paused': 'Another transfer for "{name}" is paused. Resume or cancel it first.', 'sftp.transfers.pathConflict.inProgress': 'Another transfer for "{name}" is already in progress.', 'sftp.transferCenter.title': 'File Transfers', 'sftp.transferCenter.quitConfirm': '{count} file transfer(s) are unfinished. Progress will be saved and must be resumed manually next time. Quit anyway?', 'sftp.transferCenter.phase.scanning': 'Scanning', 'sftp.transferCenter.phase.compressing': 'Compressing', 'sftp.transferCenter.phase.uploading': 'Uploading', 'sftp.transferCenter.phase.transferring': 'Transferring', 'sftp.transferCenter.phase.extracting': 'Extracting', 'sftp.transferCenter.phase.verifying': 'Verifying', 'sftp.transferCenter.bucket.active': 'In Progress', 'sftp.transferCenter.bucket.all': 'All', 'sftp.transferCenter.bucket.queued': 'Queued', 'sftp.transferCenter.bucket.paused': 'Paused', 'sftp.transferCenter.bucket.failed': 'Failed', 'sftp.transferCenter.bucket.attention': 'Needs attention', 'sftp.transferCenter.bucket.completed': 'Completed', 'sftp.transferCenter.status.pending': 'Preparing', 'sftp.transferCenter.status.resuming': 'Reconnecting and resuming…', 'sftp.transferCenter.status.queued': 'Queued', 'sftp.transferCenter.status.transferring': 'Transferring', 'sftp.transferCenter.status.pausing': 'Pausing', 'sftp.transferCenter.status.paused': 'Paused', 'sftp.transferCenter.status.attention': 'Needs attention', 'sftp.transferCenter.status.interrupted': 'Interrupted — resume manually', 'sftp.transferCenter.status.completed': 'Completed', 'sftp.transferCenter.status.failed': 'Failed', 'sftp.transferCenter.status.cancelled': 'Cancelled', 'sftp.transferCenter.background': 'Background', 'sftp.transferCenter.pause': 'Pause', 'sftp.transferCenter.resume': 'Resume', 'sftp.transferCenter.prioritize': 'Transfer next', 'sftp.transferCenter.pauseAll': 'Pause all', 'sftp.transferCenter.resumeAll': 'Resume all', 'sftp.transferCenter.empty': 'No transfers in this category', 'sftp.transferCenter.showBackground': 'Show {count} background transfers', 'sftp.transferCenter.hideBackground': 'Hide background transfers', 'sftp.transferCenter.clear': 'Clear records', 'sftp.transferCenter.applyAll': 'Apply to all', 'sftp.transfers.resizeNameColumn': 'Resize file name column', 'sftp.transfers.dragToResize': 'Drag to resize', 'sftp.goUp': 'Go up', 'sftp.goToTerminalCwd': 'Go to terminal directory', 'sftp.locatePathInTerminal': 'Open path in terminal', 'sftp.followTerminalCwd': 'Follow terminal directory', 'sftp.followTerminalCwd.enable': 'Enable follow terminal directory', 'sftp.followTerminalCwd.disable': 'Disable follow terminal directory', 'sftp.encoding.label': 'Filename Encoding', 'sftp.encoding.auto': 'Auto', 'sftp.encoding.utf8': 'UTF-8', 'sftp.encoding.gb18030': 'GB18030', 'sftp.goHome': 'Go to home', 'sftp.goRoot': 'Go to root', 'sftp.folderName': 'Folder name', 'sftp.folderName.placeholder': 'Enter folder name', 'sftp.fileName': 'File name', 'sftp.fileName.placeholder': 'Enter file name', 'sftp.prompt.newFolderName': 'New folder name?', 'sftp.rename.title': 'Rename', 'sftp.rename.newName': 'New name', 'sftp.rename.placeholder': 'Enter new name', 'sftp.confirm.deleteOne': 'Delete "{name}"?', 'sftp.deleteConfirm.single': 'Delete "{name}"?', 'sftp.deleteConfirm.title': 'Delete {count} item(s)?', 'sftp.deleteConfirm.desc': 'This action cannot be undone. The following will be deleted:', 'sftp.deleteConfirm.descSingle': 'This action cannot be undone.', 'sftp.deleteConfirm.host': 'Host', 'sftp.deleteConfirm.path': 'Path', 'sftp.error.loadFailed': 'Failed to load directory', 'sftp.error.downloadFailed': 'Download failed', 'sftp.error.uploadFailed': 'Upload failed', 'sftp.error.deleteFailed': 'Delete failed', 'sftp.error.createFolderFailed': 'Failed to create folder', 'sftp.error.createFileFailed': 'Failed to create file', 'sftp.error.invalidFileName': 'Filename contains invalid characters: {chars}', 'sftp.error.reservedName': 'This filename is reserved by the system', 'sftp.overwrite.title': 'File Already Exists', 'sftp.overwrite.desc': 'A file named "{name}" already exists. Do you want to replace it?', 'sftp.overwrite.confirm': 'Replace', 'sftp.error.renameFailed': 'Failed to rename', 'sftp.picker.title': 'Select Host', 'sftp.picker.desc': 'Pick a host for the {side} pane', 'sftp.picker.searchPlaceholder': 'Search hosts...', 'sftp.picker.local.title': 'Local filesystem', 'sftp.picker.local.desc': 'Browse local files', 'sftp.picker.local.badge': 'Local', 'sftp.picker.connected.section': 'Connected', 'sftp.picker.connected.badge': 'Live', 'sftp.picker.connected.connecting': 'Connecting', 'sftp.picker.noMatch': 'No matching hosts', 'sftp.permissions.title': 'Edit Permissions', 'sftp.permissions.owner': 'Owner', 'sftp.permissions.group': 'Group', 'sftp.permissions.others': 'Others', 'sftp.permissions.octal': 'Octal', 'sftp.permissions.symbolic': 'Symbolic', 'sftp.permissions.success': 'Permissions updated successfully', 'sftp.permissions.failed': 'Failed to update permissions', 'sftp.pane.local': 'Local', 'sftp.pane.remote': 'Remote', 'sftp.pane.selectHost': 'Select host', 'sftp.pane.selectHostToStart': 'Select a host to start', 'sftp.pane.chooseFilesystem': 'Choose a local or remote filesystem to browse', 'sftp.tabs.addTab': 'Add new tab', 'sftp.tabs.closeTab': 'Close tab', 'sftp.tabs.newTab': 'New Tab', 'sftp.tabs.copyDefaultPath': 'Copy tab (default path)', 'sftp.tabs.copyCurrentPath': 'Copy and go to current path', 'sftp.conflict.title': 'File Conflict', 'sftp.conflict.desc': 'A file with the same name already exists at the destination', 'sftp.conflict.folderTitle': 'Folder Conflict', 'sftp.conflict.folderDesc': 'Choose how to continue.', 'sftp.conflict.folderFileDesc': 'A file with the same name already exists at the destination. A folder cannot be merged with a file.', 'sftp.conflict.folderSymlinkDesc': 'A symbolic link with the same name already exists at the destination. A folder cannot be merged with a symbolic link.', 'sftp.conflict.folderUnknownDesc': 'An item with the same name exists at the destination, but its type could not be confirmed. Replace is unavailable to protect destination data.', 'sftp.conflict.folderMergeHint': 'Merge: keeps destination-only content.', 'sftp.conflict.folderReplaceWarning': 'Replace: deletes destination-only content and cannot be undone.', 'sftp.conflict.alreadyExistsSuffix': 'already exists', 'sftp.conflict.existingFile': 'Existing file', 'sftp.conflict.newFile': 'New file', 'sftp.conflict.size': 'Size:', 'sftp.conflict.modified': 'Modified:', 'sftp.conflict.applyToAll': 'Apply this action to all {count} remaining conflicts', 'sftp.conflict.action.stop': 'Stop', 'sftp.conflict.action.skip': 'Skip', 'sftp.conflict.action.keepBoth': 'Keep Both', 'sftp.conflict.action.duplicate': 'Duplicate', 'sftp.conflict.action.merge': 'Merge', 'sftp.conflict.action.replace': 'Replace', // SFTP Upload Phases 'sftp.upload.phase.compressing': 'Compressing', 'sftp.upload.phase.uploading': 'Uploading', 'sftp.upload.phase.extracting': 'Extracting', 'sftp.upload.phase.compressed': 'Compressed', // SFTP File Opener 'sftp.context.copyPath': 'Copy file path', 'sftp.context.openWithDefault': 'Open with system default', 'sftp.context.openWith': 'Open with...', 'sftp.context.edit': 'Edit', 'sftp.context.preview': 'Preview', 'sftp.opener.title': 'Open with', 'sftp.opener.desc': 'Choose an application to open this file', 'sftp.opener.builtInEditor': 'Built-in Editor', 'sftp.opener.editDescription': 'Edit text files', 'sftp.opener.builtInImageViewer': 'Built-in Image Viewer', 'sftp.opener.previewDescription': 'Preview images', 'sftp.opener.systemApp': 'Choose Application...', 'sftp.opener.systemAppDescription': 'Select an application from your computer', 'sftp.opener.onlySystemApp': 'This file can only be opened with an external application', 'sftp.opener.noAppsAvailable': 'No applications available', 'sftp.opener.noExtension': 'files without extension', 'sftp.opener.setDefault': 'Always use this for {ext} files', 'sftp.opener.confirmTitle': 'Set as Default?', 'sftp.opener.confirmDescription': 'Do you want to always use {app} for {ext} files?', 'sftp.opener.yesRemember': 'Yes, remember this choice', 'sftp.opener.justOnce': 'Just this once', 'sftp.opener.confirm.title': 'Set Default Application', 'sftp.opener.confirm.desc': 'Do you want to always open .{ext} files with this application?', 'sftp.editor.title': 'Text Editor', 'sftp.editor.save': 'Save to Remote', 'sftp.editor.saving': 'Saving...', 'sftp.editor.saved': 'Saved successfully', 'sftp.editor.saveFailed': 'Failed to save file', 'sftp.editor.unsavedChanges': 'You have unsaved changes. Close anyway?', 'sftp.editor.syntaxHighlight': 'Syntax Highlighting', 'sftp.preview.title': 'Image Preview', 'sftp.preview.zoomIn': 'Zoom In', 'sftp.preview.zoomOut': 'Zoom Out', 'sftp.preview.resetZoom': 'Reset Zoom', 'sftp.preview.fitToWindow': 'Fit to Window', // Settings > SFTP File Associations 'settings.tab.sftpFileAssociations': 'SFTP', 'settings.sftp.transferConcurrency': 'Transfer Concurrency', 'settings.sftp.transferConcurrency.desc': 'Maximum number of files transferred in parallel for the same endpoint, including folder contents and separately selected files. Higher values may improve speed but can overwhelm some servers.', 'settings.sftp.transferPoolIdleTtl': 'Transfer connection keep-alive', 'settings.sftp.transferPoolIdleTtl.desc': 'How long dedicated transfer SFTP connections stay warm after idle. Longer values reduce cold-start delay before the next upload or download. Busy transfers are never closed.', 'settings.sftp.transferPoolIdleTtl.1m': '1 minute', 'settings.sftp.transferPoolIdleTtl.5m': '5 minutes', 'settings.sftp.transferPoolIdleTtl.15m': '15 minutes', 'settings.sftp.transferPoolIdleTtl.30m': '30 minutes', 'settings.sftp.transferPoolIdleTtl.never': 'Until app quit', 'settings.ssh.transportIdleTtl': 'SSH connection keep-alive', 'settings.ssh.transportIdleTtl.desc': 'How long a shared SSH connection stays warm after the last terminal, SFTP browse, bulk transfer, or port-forward lease is released. While warm, reconnecting to the same host can skip re-authentication (including MFA). Active sessions and transfers are never closed.', 'settings.ssh.transportIdleTtl.1m': '1 minute', 'settings.ssh.transportIdleTtl.5m': '5 minutes', 'settings.ssh.transportIdleTtl.15m': '15 minutes', 'settings.ssh.transportIdleTtl.30m': '30 minutes', 'settings.ssh.transportIdleTtl.never': 'Until app quit', 'settings.sftp.defaultOpener': 'Default File Opener', 'settings.sftp.defaultOpener.desc': 'Choose the default application for opening files without a specific file association', 'settings.sftp.defaultOpener.ask': 'Always ask', 'settings.sftp.defaultOpener.askDesc': 'Show a dialog to choose an application each time', 'settings.sftp.defaultOpener.builtInDesc': 'Open text files in the built-in editor by default', 'settings.sftp.defaultOpener.systemApp': 'Choose Application...', 'settings.sftp.defaultOpener.systemAppDesc': 'Open files with a specific application by default', 'settings.sftpFileAssociations.title': 'SFTP File Associations', 'settings.sftpFileAssociations.desc': 'Configure default applications for opening files by extension', 'settings.sftpFileAssociations.extension': 'Extension', 'settings.sftpFileAssociations.application': 'Application', 'settings.sftpFileAssociations.noAssociations': 'No file associations configured', 'settings.sftpFileAssociations.remove': 'Remove', 'settings.sftpFileAssociations.removeConfirm': 'Remove association for .{ext}?', // Settings > SFTP Behavior 'settings.sftp.doubleClickBehavior': 'Double-click behavior', 'settings.sftp.doubleClickBehavior.desc': 'Choose the action when double-clicking a file in SFTP View', 'settings.sftp.doubleClickBehavior.open': 'Open file', 'settings.sftp.doubleClickBehavior.transfer': 'Transfer to other pane', 'settings.sftp.doubleClickBehavior.openDesc': 'Open the file in the default application', 'settings.sftp.doubleClickBehavior.transferDesc': 'Transfer the file to the other pane\'s active host', 'settings.sshDeepLink.title': 'SSH and Telnet links', 'settings.sshDeepLink.enable': 'Open ssh:// and telnet:// links with NetMesh', 'settings.sshDeepLink.enableDesc': 'Allow NetMesh to handle ssh:// and telnet:// links from browsers and other apps, plus PuTTY-style launches such as -ssh user@host -P 22 -pw password.', 'settings.explorerContextMenu.title': 'Windows Explorer', 'settings.explorerContextMenu.enable': 'Show “Open in NetMesh” in folder context menus', 'settings.explorerContextMenu.enableDesc': 'Adds a right-click item for folders and folder backgrounds so you can open a local terminal there. Applies immediately; no reinstall needed.', 'settings.jmsDeepLink.title': 'JumpServer Links', 'settings.jmsDeepLink.enable': 'Handle jms:// links', 'settings.jmsDeepLink.enableDesc': 'Register NetMesh as the handler for JumpServer jms:// client links. May conflict with the official JumpServer client.', // Settings > SFTP Auto Sync 'settings.sftp.autoSync': 'Auto-sync to remote', 'settings.sftp.autoSync.desc': 'Automatically sync file changes back to the remote server when opening files with external applications', 'settings.sftp.autoSync.enable': 'Enable auto-sync', 'settings.sftp.autoSync.enableDesc': 'When you save a file in an external application, changes will be automatically uploaded to the remote server', // Settings > SFTP Auto Open Sidebar 'settings.sftp.autoOpenSidebar': 'Auto-open sidebar on connect', 'settings.sftp.autoOpenSidebar.desc': 'Automatically open the SFTP file browser sidebar when connecting to a host', 'settings.sftp.autoOpenSidebar.enable': 'Enable auto-open sidebar', 'settings.sftp.autoOpenSidebar.enableDesc': 'The SFTP sidebar will open automatically when a terminal session connects to a remote host', 'settings.sftp.followTerminalCwd': 'Follow terminal directory', 'settings.sftp.followTerminalCwd.desc': 'Automatically sync the sidebar SFTP browser with the terminal working directory (toggle in toolbar)', 'settings.sftp.followTerminalCwd.enable': 'Enable follow terminal directory by default', 'settings.sftp.followTerminalCwd.enableDesc': 'When the SFTP sidebar is open, follow mode stays on by default and updates after terminal cd commands', 'settings.sftp.defaultViewMode': 'Default View Mode', 'settings.sftp.defaultViewMode.desc': 'Choose the default view mode when opening a new SFTP tab. Per-host preferences override this setting.', 'settings.sftp.defaultViewMode.list': 'List View', 'settings.sftp.defaultViewMode.listDesc': 'Display files in a flat list for the current directory', 'settings.sftp.defaultViewMode.tree': 'Tree View', 'settings.sftp.defaultViewMode.treeDesc': 'Display files in a hierarchical tree structure', 'sftp.autoSync.success': 'File synced to remote: {fileName}', 'sftp.autoSync.error': 'Failed to sync file: {error}', // SFTP Folder Upload Progress 'sftp.upload.progress': 'Uploading {current} of {total} files...', 'sftp.upload.uploading': 'Uploading...', 'sftp.upload.compressing': 'Compressing...', 'sftp.upload.extracting': 'Extracting...', 'sftp.upload.scanning': 'Scanning files...', 'sftp.upload.completed': 'Completed', 'sftp.upload.compressed': 'Compressed Transfer', 'sftp.upload.currentFile': 'Current: {fileName}', 'sftp.upload.cancelled': 'Upload cancelled', 'sftp.upload.noFiles': 'No files to upload', 'sftp.upload.partialSuccess': 'Uploaded {success} file(s); {failed} failed', 'sftp.upload.cancel': 'Cancel', 'sftp.upload.completedToPath': 'Uploaded to {path}', // SFTP Download 'sftp.download.completed': 'Downloaded', 'sftp.download.cancelled': 'Download cancelled', // SFTP Reconnecting 'sftp.reconnecting.title': 'Reconnecting...', 'sftp.reconnecting.desc': 'Connection lost, attempting to reconnect', 'sftp.reconnected': 'Connection restored', 'sftp.error.reconnectFailed': 'Failed to reconnect. Please try again.', 'sftp.error.connectionLostManual': 'Connection lost. Please reconnect manually.', 'sftp.error.connectionLostReconnecting': 'Connection lost. Reconnecting...', 'sftp.error.sessionLost': 'SFTP session lost. Please reconnect.', // Settings > SFTP Show Hidden Files 'settings.sftp.showHiddenFiles': 'Show hidden files', 'settings.sftp.showHiddenFiles.desc': 'Display hidden files (dotfiles on Unix/macOS and files with the hidden attribute on Windows) in the SFTP file browser.', 'settings.sftp.showHiddenFiles.enable': 'Show hidden files', 'settings.sftp.showHiddenFiles.enableDesc': 'Display hidden files when browsing both local and remote filesystems', // Settings > SFTP Compressed Upload 'settings.sftp.compressedUpload': 'Folder Compression Transfer', 'settings.sftp.compressedUpload.desc': 'Compress folders before uploading to significantly reduce transfer time.', 'settings.sftp.compressedUpload.enable': 'Enable folder compression', 'settings.sftp.compressedUpload.enableDesc': 'Automatically compress folders using tar before transfer. Requires tar support on the server. Falls back to regular transfer if not available.', 'settings.sftp.skipUnchanged.enable': 'Skip unchanged files', 'settings.sftp.skipUnchanged.enableDesc': 'Skip files whose size and modification time already match the destination (rsync-style). Disabled when replacing a folder into a staging path.', // Quick Switcher 'qs.search.placeholder': 'Search hosts or tabs', 'qs.jumpTo': 'Jump To', 'qs.localTerminal': 'Local Terminal', 'qs.localShells': 'Local Shells', 'qs.default': 'Default', // Select Host panel 'selectHost.title': 'Select Host', 'selectHost.noHostsFound': 'No hosts found', 'selectHost.newHost': 'New Host', 'selectHost.continue': 'Continue', 'selectHost.continueWithCount': 'Continue ({count} selected)', 'selectHost.toggleGroup': 'Toggle all hosts in {name}', 'selectHost.toggleHost': 'Toggle {name}', // Quick Connect 'quickConnect.knownHost.title': 'Are you sure you want to connect?', 'quickConnect.knownHost.authenticity': 'The authenticity of {hostname} can not be established.', 'quickConnect.knownHost.fingerprintLabel': '{keyType} fingerprint is SHA256:', 'quickConnect.knownHost.addQuestion': 'Do you want to add it to the list of known hosts?', 'quickConnect.knownHost.addAndContinue': 'Add and continue', 'quickConnect.addKey': 'Add key', 'quickConnect.warning.unparsedOptions': 'Some SSH arguments were ignored: {options}', 'quickConnect.identity.label': 'Credential preset', 'quickConnect.identity.placeholder': 'Choose a saved identity', 'quickConnect.identity.empty': 'No saved identities found', 'quickConnect.identity.hint': 'Choose an identity to fill in its username and authentication automatically.', 'quickConnect.identity.selectedHint': 'Ready to connect as {username}.', 'quickConnect.identity.method.password': 'Password', 'quickConnect.identity.method.key': 'SSH key', 'quickConnect.identity.method.certificate': 'Certificate', 'quickConnect.identity.unavailable': 'This identity is missing usable credentials on this device.', 'quickConnect.identity.useCustom': 'Use custom credentials', 'quickConnect.identity.connect': 'Connect with preset', 'quickConnect.connectTitle': 'Connect to {host}', // Terminal 'terminal.connectionErrorTitle': 'Connection Error', // Protocol select dialog 'protocolSelect.chooseProtocol': 'Choose protocol', 'protocolSelect.port': 'port:', // Host Details 'hostDetails.title.details': 'Host Details', 'hostDetails.title.new': 'New Host', 'vault.panel.resizeWidth': 'Resize panel width', 'hostDetails.saveAria': 'Save', 'hostDetails.section.address': 'Address', 'hostDetails.hostname.placeholder': 'IP or Hostname', 'hostDetails.section.general': 'General', 'hostDetails.os.title': 'System identification', 'hostDetails.os.desc': 'Prefer automatic detection. Override only when the detected system is incorrect. Network Device Mode is configured separately.', 'hostDetails.os.auto': 'Automatic', 'hostDetails.os.unknown': 'Other / unknown', 'hostDetails.os.selection': 'System selection', 'hostDetails.os.current': 'Current system', 'hostDetails.os.freebsd': 'FreeBSD', 'hostDetails.os.linux': 'Linux', 'hostDetails.os.windows': 'Windows', 'hostDetails.os.macos': 'macOS', 'hostDetails.section.sftp': 'SFTP Settings', 'hostDetails.sftp.fileProtocol': 'File Protocol', 'hostDetails.sftp.fileProtocol.desc': 'Auto tries SFTP, then falls back to SCP mode when the SFTP subsystem is unavailable (e.g. some NAS). Force SCP for hosts that only support SCP.', 'hostDetails.sftp.fileProtocol.auto': 'Auto', 'hostDetails.sftp.fileProtocol.sftp': 'SFTP only', 'hostDetails.sftp.fileProtocol.scp': 'SCP mode', 'hostDetails.sftp.sudo': 'Sudo Mode', 'hostDetails.sftp.sudo.desc': 'Automatically acquire Root privileges using stored password', 'hostDetails.sftp.sudo.passwordWarning': 'Sudo mode requires a password. Configure one above, or ensure the server allows passwordless sudo.', 'hostDetails.sftp.encoding': 'Filename Encoding', 'hostDetails.sftp.encoding.desc': 'Select the encoding used to decode and send SFTP filenames.', 'hostDetails.label.placeholder': 'Label (e.g., Production Server)', 'hostDetails.notes.label': 'Notes', 'hostDetails.notes.placeholder': 'Hardware, project, customer, region, role...', 'hostDetails.notes.help': 'Supports Markdown. Do not store passwords or private keys here.', 'hostDetails.notes.tab.edit': 'Edit', 'hostDetails.notes.tab.preview': 'Preview', 'hostDetails.notes.preview.empty': 'Nothing to preview yet.', 'hostDetails.notes.toggle.show': 'Show notes editor', 'hostDetails.notes.toggle.hide': 'Hide notes editor', 'hostDetails.group.placeholder': 'Parent Group', 'hostDetails.section.credentials': 'Credentials', 'hostDetails.section.portCredentials': 'Port & Credentials', 'hostDetails.section.appearance': 'Appearance', 'hostDetails.distro.title': 'Linux Distribution', 'hostDetails.distro.desc': 'Auto-detect on connect, or override the distro icon manually.', 'hostDetails.icon.title': 'Host Icon', 'hostDetails.icon.sectionTitle': 'Color & Icon', 'hostDetails.icon.desc': 'Choose the icon source and color for this host.', 'hostDetails.icon.source': 'Source', 'hostDetails.icon.manualLabel': 'Manual icon', 'hostDetails.icon.tab.brand': 'Brand', 'hostDetails.icon.tab.type': 'Type', 'hostDetails.icon.mode.auto': 'Automatic', 'hostDetails.icon.mode.custom': 'Custom', 'hostDetails.icon.reset': 'Reset host icon', 'hostDetails.icon.colorLabel': 'Icon color', 'hostDetails.icon.colorDefault': 'Default', 'hostDetails.icon.colorAuto': 'Automatic', 'hostDetails.icon.colorManual': 'Manual', 'hostDetails.icon.colorChoice': 'Color', 'hostDetails.icon.autoColorLabel': 'Current color', 'hostDetails.icon.preview': 'Icon preview', 'hostDetails.icon.showLibrary': 'Show icon library', 'hostDetails.icon.hideLibrary': 'Hide icon library', 'hostDetails.icon.autoUsesDistro': 'Use Linux Distribution icon and selected color for this host.', 'hostDetails.icon.customOverridesDistro': 'Built-in icon replaces Linux Distribution for this host.', 'hostDetails.icon.option.server': 'Server', 'hostDetails.icon.option.terminal': 'Terminal', 'hostDetails.icon.option.database': 'Database', 'hostDetails.icon.option.cloud': 'Cloud', 'hostDetails.icon.option.router': 'Router', 'hostDetails.icon.option.shield': 'Shield', 'hostDetails.icon.option.code': 'Code', 'hostDetails.icon.option.box': 'Box', 'hostDetails.icon.option.globe': 'Globe', 'hostDetails.icon.option.cpu': 'CPU', 'hostDetails.icon.option.hard-drive': 'Storage', 'hostDetails.icon.option.network': 'Network', 'hostDetails.icon.option.wifi': 'Wireless', 'hostDetails.icon.option.lock': 'Lock', 'hostDetails.icon.option.key': 'Key', 'hostDetails.icon.option.monitor': 'Monitor', 'hostDetails.icon.option.container': 'Container', 'hostDetails.icon.option.activity': 'Activity', 'hostDetails.icon.option.zap': 'Fast', 'hostDetails.icon.option.server-cog': 'Server settings', 'hostDetails.icon.color.blue': 'Blue', 'hostDetails.icon.color.green': 'Green', 'hostDetails.icon.color.red': 'Red', 'hostDetails.icon.color.amber': 'Amber', 'hostDetails.icon.color.purple': 'Purple', 'hostDetails.icon.color.cyan': 'Cyan', 'hostDetails.icon.color.orange': 'Orange', 'hostDetails.icon.color.slate': 'Slate', 'hostDetails.icon.color.violet': 'Violet', 'hostDetails.icon.color.pink': 'Pink', 'hostDetails.icon.color.rose': 'Rose', 'hostDetails.icon.color.lime': 'Lime', 'hostDetails.icon.color.teal': 'Teal', 'hostDetails.icon.color.sky': 'Sky', 'hostDetails.icon.color.indigo': 'Indigo', 'hostDetails.icon.color.zinc': 'Zinc', 'hostDetails.icon.color.custom': 'Custom color', 'hostDetails.distro.mode': 'Source', 'hostDetails.distro.mode.auto': 'Auto-detect', 'hostDetails.distro.mode.manual': 'Manual override', 'hostDetails.distro.detectedLabel': 'Current', 'hostDetails.distro.manualLabel': 'Override', 'hostDetails.distro.pending': 'Detect after first connection', 'hostDetails.distro.unknown': 'Unknown', 'hostDetails.distro.option.linux': 'Generic Linux', 'hostDetails.distro.option.ubuntu': 'Ubuntu', 'hostDetails.distro.option.debian': 'Debian', 'hostDetails.distro.option.centos': 'CentOS', 'hostDetails.distro.option.rocky': 'Rocky Linux', 'hostDetails.distro.option.fedora': 'Fedora', 'hostDetails.distro.option.arch': 'Arch Linux', 'hostDetails.distro.option.alpine': 'Alpine', 'hostDetails.distro.option.amazon': 'Amazon Linux', 'hostDetails.distro.option.opensuse': 'openSUSE / SLES', 'hostDetails.distro.option.redhat': 'Red Hat / RHEL', 'hostDetails.distro.option.almalinux': 'AlmaLinux', 'hostDetails.distro.option.alinux': 'Alibaba Cloud Linux', 'hostDetails.distro.option.openeuler': 'openEuler', 'hostDetails.distro.option.freebsd': 'FreeBSD', 'hostDetails.distro.option.oracle': 'Oracle Linux', 'hostDetails.distro.option.kali': 'Kali Linux', 'hostDetails.distro.option.cisco': 'Cisco', 'hostDetails.distro.option.juniper': 'Juniper Networks', 'hostDetails.distro.option.huawei': 'Huawei', 'hostDetails.distro.option.h3c': 'H3C', 'hostDetails.distro.option.hpe': 'HPE', 'hostDetails.distro.option.mikrotik': 'MikroTik', 'hostDetails.distro.option.fortinet': 'Fortinet', 'hostDetails.distro.option.paloalto': 'Palo Alto Networks', 'hostDetails.distro.option.zyxel': 'ZyXEL', 'hostDetails.distro.option.ruijie': 'Ruijie', 'hostDetails.section.mosh': 'Mosh', 'hostDetails.section.et': 'EternalTerminal', 'hostDetails.et.port': 'ET server port', 'hostDetails.et.port.desc': 'Port etserver listens on (default 2022)', 'hostDetails.username.placeholder': 'Username', 'hostDetails.password.placeholder': 'Password', 'hostDetails.password.show': 'Show password', 'hostDetails.password.hide': 'Hide password', 'hostDetails.password.save': 'Save password', 'hostDetails.auth.method': 'Login method', 'hostDetails.auth.auto': 'Automatic', 'hostDetails.auth.auto.desc': 'Try the SSH agent and local keys, then use the saved password.', 'hostDetails.auth.passwordOnly': 'Password only', 'hostDetails.auth.password.desc': 'Use only the saved password and interactive password prompts.', 'hostDetails.auth.key': 'Key', 'hostDetails.auth.key.desc': 'Use the selected key, with the saved password as a fallback when present.', 'hostDetails.auth.certificate': 'Certificate', 'hostDetails.auth.certificate.desc': 'Use the selected SSH certificate, with the saved password as a fallback when present.', 'hostDetails.auth.mfaFirst': 'Prefer interactive auth', 'hostDetails.auth.mfaFirst.desc': 'For servers that require password and MFA through keyboard-interactive.', 'hostDetails.auth.credentialRequired': 'Select a key or certificate before saving this login method.', 'hostDetails.identity.suggestions': 'Identities', 'hostDetails.identity.missing': 'Identity not found', 'hostDetails.credential.keyCertificate': 'Key, Certificate, Local Key File', 'hostDetails.credential.key': 'Key', 'hostDetails.credential.certificate': 'Certificate', 'hostDetails.credential.localKeyFile': 'Local Key File', 'hostDetails.credential.localKeyFilePlaceholder': '~/.ssh/id_ed25519', 'hostDetails.credential.browseKeyFile': 'Browse...', 'hostDetails.credential.missing': 'Credential not found', 'hostDetails.section.systemSshAgent': 'System SSH Agent', 'hostDetails.systemSshAgent': 'Use System SSH Agent to Sign In', 'hostDetails.systemSshAgent.desc': 'Use keys already unlocked by macOS, Linux, Windows, 1Password, or another compatible SSH agent', 'hostDetails.systemSshAgent.socket': 'Agent Socket', 'hostDetails.systemSshAgent.socket.desc': 'Leave empty to use SSH_AUTH_SOCK', 'hostDetails.systemSshAgent.identitiesOnly': 'Only Use Configured Keys', 'hostDetails.systemSshAgent.identitiesOnly.desc': 'Do not try unrelated keys currently loaded in the agent', 'hostDetails.systemSshAgent.notRunning': 'System SSH agent is unavailable', 'hostDetails.systemSshAgent.notRunningHint': 'Start or unlock your SSH agent, or provide its socket path above.', 'hostDetails.keys.search': 'Search keys...', 'hostDetails.keys.empty': 'No keys available', 'hostDetails.certs.search': 'Search certificates...', 'hostDetails.certs.empty': 'No certificates available', 'hostDetails.agentForwarding': 'Forward SSH Agent', 'hostDetails.agentForwarding.desc': 'Allow remote server to use your local SSH keys (e.g., for git operations)', 'hostDetails.agentForwarding.agentNotRunning': 'SSH Agent is not available', 'hostDetails.agentForwarding.agentNotRunningHint': 'No SSH agent detected. Enable OpenSSH Authentication Agent in Windows Services, or use a compatible agent such as Bitwarden, 1Password, or gpg-agent.', 'hostDetails.section.agentForwarding': 'SSH Agent', 'hostDetails.x11Forwarding': 'Forward X11 apps', 'hostDetails.x11Forwarding.desc': 'Show remote graphical apps on your local desktop when a local X server is running.', 'hostDetails.section.x11Forwarding': 'X11 Forwarding', 'hostDetails.section.deviceType': 'Device Type', 'hostDetails.deviceType': 'Network Device Mode', 'hostDetails.deviceType.desc': 'Enable for network equipment (switches, routers, firewalls) connected via SSH. Commands are sent as-is without shell wrapping, compatible with vendor CLIs like Huawei VRP and Cisco IOS.', 'hostDetails.deviceType.warning': 'AI agent commands will be sent directly without exit code tracking. Only enable for devices that do not run a standard shell.', 'hostDetails.section.sshAlgorithms': 'SSH Algorithms', 'hostDetails.section.terminalBehavior': 'Terminal Behavior', 'hostDetails.lineTimestamps': 'Show output timestamps', 'hostDetails.lineTimestamps.desc': 'Show local time beside visible output lines for this host without changing terminal text.', 'hostDetails.legacyAlgorithms': 'Allow Legacy Algorithms', 'hostDetails.legacyAlgorithms.desc': 'Enable deprecated SSH algorithms (diffie-hellman-group1, ssh-dss, 3des-cbc, etc.) for connecting to older network equipment.', 'hostDetails.legacyAlgorithms.warning': 'These algorithms have known security weaknesses. Only enable for legacy devices that do not support modern cryptography.', 'hostDetails.skipEcdsaHostKey': 'Skip ECDSA host key', 'hostDetails.skipEcdsaHostKey.desc': 'Some old Huawei / Cisco switches produce non-standard ECDSA host-key signatures that cause "signature verification failed". Turning this on drops every ecdsa-sha2-* from the client offer so negotiation falls back to RSA / Ed25519.', 'hostDetails.algorithms.advanced': 'Advanced algorithm overrides', 'hostDetails.algorithms.advanced.desc': 'Replace the offered algorithm list for any category on a per-host basis. Leaving a category untouched uses the default; selecting a subset fully replaces the default list. Incorrect values can make the host unreachable.', 'hostDetails.algorithms.inheritedNotice': 'The current group has algorithm overrides set for: {categories}. The "Reset" button here falls back to the group\'s lists, not NetMesh\'s defaults. To ignore the group restriction, clear the override in the group\'s algorithm settings.', 'hostDetails.algorithms.customized': 'customized', 'hostDetails.algorithms.reset': 'Reset', 'hostDetails.algorithms.category.kex': 'Key Exchange (KEX)', 'hostDetails.algorithms.category.cipher': 'Cipher', 'hostDetails.algorithms.category.hmac': 'MAC (HMAC)', 'hostDetails.algorithms.category.serverHostKey': 'Host Key', 'hostDetails.algorithms.category.compress': 'Compression', 'hostDetails.section.keepalive': 'Keepalive', 'hostDetails.keepalive.override': 'Override global keepalive', 'hostDetails.keepalive.desc': 'Use a custom keepalive policy for this host instead of the global setting. Useful for older routers or switches whose SSH server does not reply to keepalive@openssh.com requests — set interval to 0 to disable keepalive entirely on this host.', 'hostDetails.keepalive.interval': 'Interval (seconds)', 'hostDetails.keepalive.countMax': 'Max unanswered keepalives', 'hostDetails.keepalive.disabledHint': 'Interval = 0 disables keepalive for this host. The session will rely on TCP-level timeouts to detect a dead connection.', 'hostDetails.section.sshTimeouts': 'SSH Connection Timeouts', 'hostDetails.sshTimeouts.tcpConnect': 'TCP timeout', 'hostDetails.sshTimeouts.tcpConnect.desc': 'Seconds to wait for the network connection to this host.', 'hostDetails.sshTimeouts.authReady': 'SSH auth timeout', 'hostDetails.sshTimeouts.authReady.desc': 'Seconds to wait after connecting for SSH negotiation and authentication to finish.', 'hostDetails.backspaceBehavior': 'Backspace Behavior', 'hostDetails.backspaceBehavior.default': 'Default', 'hostDetails.jumpHosts': 'Proxy via Hosts', 'hostDetails.jumpHosts.hops': '{count} hop(s)', 'hostDetails.jumpHosts.direct': 'Direct', 'hostDetails.jumpHosts.configure': 'Configure Proxy Hosts', 'hostDetails.proxy': 'Proxy via HTTP/SOCKS5/Command', 'hostDetails.proxy.none': 'None', 'hostDetails.proxy.edit': 'Edit Proxy', 'hostDetails.proxy.configure': 'Configure Proxy', 'hostDetails.proxyPanel.title': 'Proxy via HTTP/SOCKS5/Command', 'hostDetails.proxyPanel.hostPlaceholder': 'Proxy host', 'hostDetails.proxyPanel.command': 'ProxyCommand', 'hostDetails.proxyPanel.commandPlaceholder': 'cloudflared access ssh --hostname %h', 'hostDetails.proxyPanel.commandHelp': 'Use %h for the target host, %p for the target port, and %% for a literal percent.', 'hostDetails.proxyPanel.credentials': 'Credentials', 'hostDetails.proxyPanel.usernamePlaceholder': 'Username', 'hostDetails.proxyPanel.passwordPlaceholder': 'Password', 'hostDetails.proxyPanel.identities': 'Identities', 'hostDetails.proxyPanel.keychainIdentity': 'Keychain identity', 'hostDetails.proxyPanel.manualCredentials': 'Manual credentials', 'hostDetails.proxyPanel.remove': 'Remove Proxy', 'hostDetails.proxyPanel.savedProxy': 'Saved proxy', 'hostDetails.proxyPanel.selectSaved': 'Select saved proxy', 'hostDetails.proxyPanel.customProxy': 'Custom proxy', 'hostDetails.proxyPanel.missing': 'Missing', 'hostDetails.proxyPanel.missingSaved': 'Missing saved proxy', 'hostDetails.proxyPanel.missingIdentity': 'Missing keychain identity', 'hostDetails.proxyPanel.incompleteIdentity': 'Proxy identity needs a username and password', 'hostDetails.proxyPanel.unreadableIdentity': 'Proxy identity password cannot be read on this device', 'hostDetails.proxyPanel.error.required': 'Proxy host and port, or a ProxyCommand, are required.', 'hostDetails.envVars': 'Environment Variables', 'hostDetails.envVars.add': 'Add Environment Variable', 'hostDetails.envVars.title': 'Environment Variables', 'hostDetails.envVars.desc': 'Set an environment variable for {host}.', 'hostDetails.envVars.note': 'Some SSH servers by default only allow variables with prefix LC_ and LANG_.', 'hostDetails.envVars.variable': 'Variable', 'hostDetails.envVars.value': 'Value', 'hostDetails.envVars.newVariable': 'New Variable', 'hostDetails.envVars.variableName': 'Variable name', 'hostDetails.chain.title': 'Edit Chain', 'hostDetails.chain.desc': 'Adding another host will create a connection to {host}.', 'hostDetails.chain.addHost': 'Add a Host', 'hostDetails.chain.target': 'Target', 'hostDetails.chain.availableHosts': 'Available Hosts', 'hostDetails.chain.clear': 'Clear', 'hostDetails.group.title': 'New Group', 'hostDetails.group.general': 'General', 'hostDetails.group.namePlaceholder': 'Group name', 'hostDetails.group.parentPlaceholder': 'Parent Group', 'hostDetails.group.cloudSync': 'Cloud Sync', 'hostDetails.group.addProtocol': 'Add protocol', 'hostDetails.startupCommand': 'Startup Command', 'hostDetails.startupCommand.placeholder': 'Command to run on connect (e.g., cd /app && ls)', 'hostDetails.startupCommand.help': 'This command will be executed automatically after SSH connection is established.', 'hostDetails.startupCommand.runMode': 'Multi-line run', 'hostDetails.startupCommand.runMode.help': 'Choose how multi-line startup commands are sent after connection.', 'hostDetails.startupCommand.runMode.lineDelay': 'Send line by line', 'hostDetails.startupCommand.runMode.paste': 'Send all at once', 'hostDetails.otherProtocols': 'Other Protocols', 'hostDetails.telnetOn': 'Telnet on', 'hostDetails.port': 'port', 'hostDetails.telnet.credentials': 'Credentials', 'hostDetails.telnet.identity.placeholder': 'Manual identity', 'hostDetails.telnet.username': 'Telnet Username', 'hostDetails.telnet.password': 'Telnet Password', 'hostDetails.charset.placeholder': 'Charset (e.g. UTF-8)', 'hostDetails.telnet.add': 'Add Telnet Protocol', 'hostDetails.telnet.setDefault': 'Connect with Telnet by default', 'hostDetails.tags': 'Tags', 'hostDetails.group': 'Group', 'hostDetails.selectGroup': 'Select Group', 'hostDetails.addTag': 'Add a tag...', 'hostDetails.createTag': 'Create tag', 'hostDetails.createGroup': 'Create group', 'hostDetails.plugin.title': 'Plugin connection', 'hostDetails.plugin.provider.placeholder': 'Select a connection provider', 'hostDetails.plugin.provider.empty': 'No connection providers are installed', 'hostDetails.plugin.authentication.placeholder': 'Select an authentication provider', 'hostDetails.plugin.authentication.none': 'Provider-managed or no authentication', 'hostDetails.plugin.credential.placeholder': 'Select a host-owned credential', 'hostDetails.plugin.credential.none': 'No saved credential', 'hostDetails.plugin.credential.password': 'Password identity', 'hostDetails.plugin.credential.privateKey': 'Private key', 'hostDetails.plugin.credential.unavailable': 'Saved credential unavailable', 'hostDetails.plugin.configuration.label': 'Provider configuration (JSON)', 'hostDetails.plugin.configuration.invalid': 'Configuration must be valid JSON.', 'hostDetails.plugin.configuration.schemaInvalid': 'Configuration does not match the provider schema.', 'hostDetails.plugin.unavailable': 'The configured provider is unavailable. Configuration is preserved until the plugin is restored.', 'hostDetails.plugin.useSsh': 'Use SSH instead', // Host form (legacy modal) 'hostForm.title.edit': 'Edit Host', 'hostForm.title.new': 'New Host', 'hostForm.desc.edit': 'Update connection details for this host', 'hostForm.desc.new': 'Create a new SSH host entry', 'hostForm.field.label': 'Label', 'hostForm.placeholder.label': 'My Production Server', 'hostForm.field.hostname': 'Hostname / IP', 'hostForm.placeholder.hostname': '192.168.1.1', 'hostForm.field.port': 'Port', 'hostForm.field.username': 'Username', 'hostForm.field.osType': 'OS Type', 'hostForm.placeholder.selectOs': 'Select OS', 'hostForm.field.group': 'Group', 'hostForm.placeholder.group': 'e.g. AWS, DigitalOcean', 'hostForm.field.tags': 'Tags', 'hostForm.placeholder.addTag': 'Add a tag...', 'hostForm.auth.method': 'Authentication Method', 'hostForm.auth.password': 'Password', 'hostForm.auth.sshKey': 'SSH Key', 'hostForm.auth.selectKey': 'Select an SSH Key', 'hostForm.auth.noKeys': 'No keys available', 'hostForm.auth.noKeysHint': 'No SSH keys found in Keychain. Please create one first.', 'hostForm.saveHost': 'Save Host', // Connection logs 'logs.table.date': 'Date', 'logs.table.user': 'User', 'logs.table.host': 'Host', 'logs.table.saved': 'Saved', 'logs.empty.title': 'No Connection Logs', 'logs.empty.desc': 'Your connection history will appear here when you connect to hosts or open local terminals.', 'logs.loadMore': 'Load {count} more logs', 'logs.ongoing': 'ongoing', 'logs.localTerminal': 'Local Terminal', 'logs.action.save': 'Save', 'logs.action.unsave': 'Unsave', 'logs.action.delete': 'Delete', // Log view 'logView.customizeAppearance': 'Customize appearance', 'logView.appearance': 'Appearance', 'logView.readOnly': 'Read-only', 'logView.export': 'Export', 'vault.import.plugins.title': 'Plugin importers', 'vault.import.plugins.loading': 'Building a secure import preview…', 'vault.import.plugins.progress': '{completed} of {total} processed {message}', 'vault.import.plugins.preview': 'Import preview', 'vault.import.plugins.empty': 'No importable drafts were returned.', 'vault.import.plugins.summary': '{parsed} drafts · {warnings} warnings · {errors} errors', 'vault.import.plugins.commit': 'Import preview', 'vault.import.plugins.fileUnavailable': 'The selected file is not available to the desktop importer bridge.', 'vault.import.plugins.notRecognized': 'This importer did not recognize the selected file.', 'vault.import.plugins.containsErrors': 'The import preview contains errors and cannot be committed.', 'vault.import.plugins.committed': 'Imported {count} validated items.', 'vault.import.plugins.duplicates': '{count} duplicate items will be skipped.', 'vault.import.plugins.validationErrors': '{count} drafts failed host validation and must be fixed by the importer.', 'vault.import.plugins.kind.host': 'Host', 'vault.import.plugins.kind.identity': 'Identity', 'vault.import.plugins.kind.key': 'Key', 'vault.import.plugins.kind.snippet': 'Snippet', 'vault.import.plugins.kind.group': 'Group', 'vault.import.plugins.moreItems': '{count} more items are included in this import.', 'vault.import.plugins.moreDiagnostics': '{count} more diagnostics were omitted from this preview.', };