From 58225d74247d9859e0ebecf7d842767a017a7eff Mon Sep 17 00:00:00 2001 From: hellonone <1771143956@qq.com> Date: Thu, 6 Nov 2025 19:17:06 +0800 Subject: [PATCH] feat: support wsl file transfer --- .../app/termora/plugin/PluginManager.kt | 6 + .../plugin/internal/wsl/WSLHostOptionsPane.kt | 13 +- .../protocol/TransferProtocolProvider.kt | 6 + .../app/termora/transfer/TransportPanel.kt | 5 +- .../termora/transfer/TransportPopupMenu.kt | 2 + .../transfer/internal/wsl/WSLFileSystem.kt | 43 + .../internal/wsl/WSLFileSystemFactory.kt | 14 + .../transfer/internal/wsl/WSLPlugin.kt | 20 + .../wsl/WSLProtocolProviderExtension.kt | 14 + .../wsl/WSLTransferProtocolProvider.kt | 30 + src/main/resources/i18n/messages.properties | 9 +- .../resources/i18n/messages_zh_CN.properties | 734 +++++++++--------- 12 files changed, 523 insertions(+), 373 deletions(-) create mode 100644 src/main/kotlin/app/termora/transfer/internal/wsl/WSLFileSystem.kt create mode 100644 src/main/kotlin/app/termora/transfer/internal/wsl/WSLFileSystemFactory.kt create mode 100644 src/main/kotlin/app/termora/transfer/internal/wsl/WSLPlugin.kt create mode 100644 src/main/kotlin/app/termora/transfer/internal/wsl/WSLProtocolProviderExtension.kt create mode 100644 src/main/kotlin/app/termora/transfer/internal/wsl/WSLTransferProtocolProvider.kt diff --git a/src/main/kotlin/app/termora/plugin/PluginManager.kt b/src/main/kotlin/app/termora/plugin/PluginManager.kt index 1dfda355..0348364d 100644 --- a/src/main/kotlin/app/termora/plugin/PluginManager.kt +++ b/src/main/kotlin/app/termora/plugin/PluginManager.kt @@ -18,6 +18,7 @@ import app.termora.swingCoroutineScope import app.termora.terminal.panel.vw.FloatingToolbarPlugin import app.termora.transfer.internal.local.LocalPlugin import app.termora.transfer.internal.sftp.SFTPPlugin +import app.termora.transfer.internal.wsl.WSLPlugin import com.formdev.flatlaf.util.SystemInfo import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch @@ -135,6 +136,11 @@ internal class PluginManager private constructor() { // sftp transfer plugin plugins.add(PluginDescriptor(SFTPPlugin(), origin = PluginOrigin.Internal, version = version)) + // wsl transfer plugin + if (SystemUtils.IS_OS_WINDOWS) { + plugins.add(PluginDescriptor(WSLPlugin(), origin = PluginOrigin.Internal, version = version)) + } + // floating plugins.add(PluginDescriptor(FloatingToolbarPlugin(), origin = PluginOrigin.Internal, version = version)) } diff --git a/src/main/kotlin/app/termora/plugin/internal/wsl/WSLHostOptionsPane.kt b/src/main/kotlin/app/termora/plugin/internal/wsl/WSLHostOptionsPane.kt index feecabfc..13cdd476 100644 --- a/src/main/kotlin/app/termora/plugin/internal/wsl/WSLHostOptionsPane.kt +++ b/src/main/kotlin/app/termora/plugin/internal/wsl/WSLHostOptionsPane.kt @@ -39,6 +39,7 @@ internal open class WSLHostOptionsPane : OptionsPane() { val protocol = WSLProtocolProvider.PROTOCOL val wsl = generalOption.hostComboBox.selectedItem as WSLDistribution val host = wsl.distributionName + val wslPath = generalOption.pathTextField.text val options = Options.Companion.Default.copy( encoding = terminalOption.charsetComboBox.selectedItem as String, @@ -50,6 +51,7 @@ internal open class WSLHostOptionsPane : OptionsPane() { ?: AltKeyModifier.EightBit.name), "keywordHighlightSetId" to ((terminalOption.highlightSetComboBox.selectedItem as? KeywordHighlight)?.id ?: "-1"), + "wslPath" to wslPath ) ) @@ -68,6 +70,7 @@ internal open class WSLHostOptionsPane : OptionsPane() { generalOption.hostComboBox.selectedItem = host.host generalOption.remarkTextArea.text = host.remark generalOption.hostComboBox.selectedItem = null + generalOption.pathTextField.text = host.options.extras["wslPath"] ?: StringUtils.EMPTY terminalOption.startupCommandTextField.text = host.options.startupCommand terminalOption.environmentTextArea.text = host.options.env terminalOption.charsetComboBox.selectedItem = host.options.encoding @@ -134,6 +137,7 @@ internal open class WSLHostOptionsPane : OptionsPane() { val nameTextField = OutlineTextField(128) val hostComboBox = OutlineComboBox() val remarkTextArea = FixedLengthTextArea(512) + val pathTextField = OutlineTextField(512) init { initView() @@ -141,8 +145,6 @@ internal open class WSLHostOptionsPane : OptionsPane() { } private fun initView() { - - hostComboBox.renderer = object : DefaultListCellRenderer() { override fun getListCellRendererComponent( list: JList<*>?, @@ -171,6 +173,8 @@ internal open class WSLHostOptionsPane : OptionsPane() { } } + pathTextField.placeholderText = I18n.getString("termora.new-host.wsl.explorer-path.placeholder") + add(getCenterComponent(), BorderLayout.CENTER) } @@ -204,7 +208,7 @@ internal open class WSLHostOptionsPane : OptionsPane() { private fun getCenterComponent(): JComponent { val layout = FormLayout( "left:pref, $FORM_MARGIN, default:grow", - "pref, $FORM_MARGIN, pref, $FORM_MARGIN, pref" + "pref, $FORM_MARGIN, pref, $FORM_MARGIN, pref,$FORM_MARGIN, pref" ) remarkTextArea.setFocusTraversalKeys( KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS, @@ -230,6 +234,9 @@ internal open class WSLHostOptionsPane : OptionsPane() { .add("${I18n.getString("termora.new-host.wsl.distribution")}:").xy(1, rows) .add(hostComboBox).xy(3, rows).apply { rows += step } + .add("${I18n.getString("termora.new-host.wsl.explorer-path")}:").xy(1, rows) + .add(pathTextField).xy(3, rows).apply { rows += step } + .add("${I18n.getString("termora.new-host.general.remark")}:").xy(1, rows) .add(JScrollPane(remarkTextArea).apply { border = FlatTextBorder() }) .xy(3, rows).apply { rows += step } diff --git a/src/main/kotlin/app/termora/protocol/TransferProtocolProvider.kt b/src/main/kotlin/app/termora/protocol/TransferProtocolProvider.kt index a1a1caf6..1f45a25b 100644 --- a/src/main/kotlin/app/termora/protocol/TransferProtocolProvider.kt +++ b/src/main/kotlin/app/termora/protocol/TransferProtocolProvider.kt @@ -3,9 +3,11 @@ package app.termora.protocol import app.termora.plugin.internal.local.LocalProtocolProvider import app.termora.plugin.internal.sftppty.SFTPPtyProtocolProvider import app.termora.plugin.internal.ssh.SSHProtocolProvider +import app.termora.plugin.internal.wsl.WSLProtocolProvider import app.termora.protocol.ProtocolProvider.Companion.providers import app.termora.transfer.internal.local.LocalTransferProtocolProvider import app.termora.transfer.internal.sftp.SFTPTransferProtocolProvider +import app.termora.transfer.internal.wsl.WSLTransferProtocolProvider import org.apache.commons.lang3.StringUtils interface TransferProtocolProvider : ProtocolProvider { @@ -23,6 +25,10 @@ interface TransferProtocolProvider : ProtocolProvider { StringUtils.equalsIgnoreCase(protocol, LocalTransferProtocolProvider.PROTOCOL) ) { p = "file" + } else if (StringUtils.equalsIgnoreCase(protocol, WSLProtocolProvider.PROTOCOL) || + StringUtils.equalsIgnoreCase(protocol, WSLTransferProtocolProvider.PROTOCOL) + ) { + p = "wsl" } return providers.filterIsInstance() diff --git a/src/main/kotlin/app/termora/transfer/TransportPanel.kt b/src/main/kotlin/app/termora/transfer/TransportPanel.kt index 781f4234..e4496808 100644 --- a/src/main/kotlin/app/termora/transfer/TransportPanel.kt +++ b/src/main/kotlin/app/termora/transfer/TransportPanel.kt @@ -9,6 +9,7 @@ import app.termora.plugin.ExtensionManager import app.termora.plugin.internal.wsl.WSLHostTerminalTab import app.termora.terminal.DataKey import app.termora.transfer.TransportTableModel.Attributes +import app.termora.transfer.internal.wsl.WSLFileSystem import app.termora.transfer.s3.S3FileAttributes import com.formdev.flatlaf.FlatClientProperties import com.formdev.flatlaf.extras.components.FlatToolBar @@ -313,7 +314,9 @@ internal open class TransportPanel( if (state != TransferTreeTableNode.State.Done && state != TransferTreeTableNode.State.Failed) return val target = transfer.target() if (loader.isLoaded()) { - if (target.fileSystem != loader.getSyncTransportSupport().getFileSystem()) return + if (target.fileSystem != loader.getSyncTransportSupport().getFileSystem() && + loader.getSyncTransportSupport().getFileSystem() !is WSLFileSystem + ) return } if (target.pathString == workdir?.pathString || target.parent.pathString == workdir?.pathString) { val c = { diff --git a/src/main/kotlin/app/termora/transfer/TransportPopupMenu.kt b/src/main/kotlin/app/termora/transfer/TransportPopupMenu.kt index 7063c647..2834f2c5 100644 --- a/src/main/kotlin/app/termora/transfer/TransportPopupMenu.kt +++ b/src/main/kotlin/app/termora/transfer/TransportPopupMenu.kt @@ -10,6 +10,7 @@ import org.apache.commons.io.IOUtils import org.apache.commons.lang3.StringUtils import org.apache.sshd.sftp.client.fs.SftpFileSystem import java.awt.Window +import java.awt.datatransfer.DataFlavor import java.awt.datatransfer.StringSelection import java.awt.event.ActionEvent import java.awt.event.ActionListener @@ -192,6 +193,7 @@ internal class TransportPopupMenu( override fun popupMenuWillBecomeVisible(e: PopupMenuEvent?) { pasteMenu.isEnabled = toolkit.systemClipboard .isDataFlavorAvailable(TransportPanel.TransferTransferable.FLAVOR) + || toolkit.systemClipboard.isDataFlavorAvailable(DataFlavor.javaFileListFlavor) } override fun popupMenuWillBecomeInvisible(e: PopupMenuEvent?) { diff --git a/src/main/kotlin/app/termora/transfer/internal/wsl/WSLFileSystem.kt b/src/main/kotlin/app/termora/transfer/internal/wsl/WSLFileSystem.kt new file mode 100644 index 00000000..3bc27f1d --- /dev/null +++ b/src/main/kotlin/app/termora/transfer/internal/wsl/WSLFileSystem.kt @@ -0,0 +1,43 @@ +package app.termora.transfer.internal.wsl + +import java.nio.file.* +import java.nio.file.attribute.UserPrincipalLookupService +import java.nio.file.spi.FileSystemProvider +import java.util.concurrent.atomic.AtomicBoolean + +class WSLFileSystem : FileSystem() { + private val defaultFs = FileSystems.getDefault() + + private val isOpen = AtomicBoolean(true) + + + override fun provider(): FileSystemProvider? = defaultFs.provider() + override fun close() { + isOpen.compareAndSet(true, false) + + } + + override fun isOpen(): Boolean { + return isOpen.get() + } + + override fun isReadOnly() = defaultFs.isReadOnly + override fun getSeparator(): String? = defaultFs.separator + override fun getRootDirectories(): Iterable? = defaultFs.rootDirectories + override fun getFileStores(): Iterable? = defaultFs.fileStores + override fun supportedFileAttributeViews(): Set? = defaultFs.supportedFileAttributeViews() + override fun getPath(first: String, vararg more: String): Path = + defaultFs.getPath(first, *more) + + override fun getPathMatcher(syntaxAndPattern: String): PathMatcher? = + defaultFs.getPathMatcher(syntaxAndPattern) + + override fun getUserPrincipalLookupService(): UserPrincipalLookupService = + defaultFs.userPrincipalLookupService + + override fun newWatchService(): WatchService = + defaultFs.newWatchService() + +// override fun equals(other: Any?) = other == defaultFs +// override fun hashCode() = defaultFs.hashCode() +} \ No newline at end of file diff --git a/src/main/kotlin/app/termora/transfer/internal/wsl/WSLFileSystemFactory.kt b/src/main/kotlin/app/termora/transfer/internal/wsl/WSLFileSystemFactory.kt new file mode 100644 index 00000000..cb500e89 --- /dev/null +++ b/src/main/kotlin/app/termora/transfer/internal/wsl/WSLFileSystemFactory.kt @@ -0,0 +1,14 @@ +package app.termora.transfer.internal.wsl + +import java.nio.file.FileSystem + + +class WSLFileSystemFactory { + companion object { + val instance by lazy { WSLFileSystemFactory() } + } + + fun createWSLFileSystem(): FileSystem { + return WSLFileSystem() + } +} \ No newline at end of file diff --git a/src/main/kotlin/app/termora/transfer/internal/wsl/WSLPlugin.kt b/src/main/kotlin/app/termora/transfer/internal/wsl/WSLPlugin.kt new file mode 100644 index 00000000..70a9a933 --- /dev/null +++ b/src/main/kotlin/app/termora/transfer/internal/wsl/WSLPlugin.kt @@ -0,0 +1,20 @@ +package app.termora.transfer.internal.wsl + +import app.termora.plugin.Extension +import app.termora.plugin.InternalPlugin +import app.termora.protocol.ProtocolProviderExtension + +internal class WSLPlugin : InternalPlugin() { + init { + support.addExtension(ProtocolProviderExtension::class.java) { WSLProtocolProviderExtension.instance } + } + + override fun getName(): String { + return "WSL Transfer" + } + + override fun getExtensions(clazz: Class): List { + return support.getExtensions(clazz) + } + +} \ No newline at end of file diff --git a/src/main/kotlin/app/termora/transfer/internal/wsl/WSLProtocolProviderExtension.kt b/src/main/kotlin/app/termora/transfer/internal/wsl/WSLProtocolProviderExtension.kt new file mode 100644 index 00000000..e4a099db --- /dev/null +++ b/src/main/kotlin/app/termora/transfer/internal/wsl/WSLProtocolProviderExtension.kt @@ -0,0 +1,14 @@ +package app.termora.transfer.internal.wsl + +import app.termora.protocol.ProtocolProvider +import app.termora.protocol.ProtocolProviderExtension + +internal class WSLProtocolProviderExtension private constructor() : ProtocolProviderExtension { + companion object { + val instance by lazy { WSLProtocolProviderExtension() } + } + + override fun getProtocolProvider(): ProtocolProvider { + return WSLTransferProtocolProvider.instance + } +} \ No newline at end of file diff --git a/src/main/kotlin/app/termora/transfer/internal/wsl/WSLTransferProtocolProvider.kt b/src/main/kotlin/app/termora/transfer/internal/wsl/WSLTransferProtocolProvider.kt new file mode 100644 index 00000000..9b47923e --- /dev/null +++ b/src/main/kotlin/app/termora/transfer/internal/wsl/WSLTransferProtocolProvider.kt @@ -0,0 +1,30 @@ +package app.termora.transfer.internal.wsl + +import app.termora.database.DatabaseManager +import app.termora.protocol.PathHandler +import app.termora.protocol.PathHandlerRequest +import app.termora.protocol.TransferProtocolProvider +import org.apache.commons.lang3.StringUtils +import java.nio.file.FileSystems + +internal class WSLTransferProtocolProvider : TransferProtocolProvider { + companion object { + val instance by lazy { WSLTransferProtocolProvider() } + const val PROTOCOL = "wsl" + } + + override fun isTransient(): Boolean { + return true + } + + override fun getProtocol(): String { + return PROTOCOL + } + + override fun createPathHandler(requester: PathHandlerRequest): PathHandler { + val wslPath = requester.host.options.extras["wslPath"] ?: StringUtils.EMPTY +// val fileSystem = FileSystems.getDefault() + val fileSystem = WSLFileSystemFactory.instance.createWSLFileSystem() + return PathHandler(fileSystem, fileSystem.getPath(wslPath)) + } +} \ No newline at end of file diff --git a/src/main/resources/i18n/messages.properties b/src/main/resources/i18n/messages.properties index 01434c41..4048f86d 100644 --- a/src/main/resources/i18n/messages.properties +++ b/src/main/resources/i18n/messages.properties @@ -1,6 +1,6 @@ termora.title=Termora termora.confirm=OK -termora.exit=退出 +termora.exit=\u9000\u51FA termora.cancel=Cancel termora.copy=Copy termora.paste=Paste @@ -114,7 +114,7 @@ termora.settings.keymap=Keymap termora.settings.keymap.shortcut=Shortcut termora.settings.keymap.action=Action termora.settings.keymap.already-exists=The shortcut [{0}] is already in use by [{1}] -termora.settings.keymap.question=Select a line, press the ⌫ (Backspace) key to remove the shortcut +termora.settings.keymap.question=Select a line, press the \u232B (Backspace) key to remove the shortcut termora.settings.sftp.edit-command=Edit Command termora.settings.sftp.db-click-behavior=Double-click @@ -212,11 +212,14 @@ termora.new-host.tunneling.add=Add termora.new-host.tunneling.edit=${termora.keymgr.edit} termora.new-host.tunneling.delete=${termora.remove} -termora.new-host.rdp.desktop-placeholder=Default full screen (e.g. 1920×1080) +termora.new-host.rdp.desktop-placeholder=Default full screen (e.g. 1920\u00D71080) termora.new-host.rdp.resolution=Resolution termora.new-host.wsl.distribution=DistroName +termora.new-host.wsl.explorer-path=Explorer Path +termora.new-host.wsl.explorer-path.placeholder=The path to the Windows Explorer + termora.new-host.test-connection=Test Connection termora.new-host.test-connection-successful=Connection successful diff --git a/src/main/resources/i18n/messages_zh_CN.properties b/src/main/resources/i18n/messages_zh_CN.properties index a374b354..a1131523 100644 --- a/src/main/resources/i18n/messages_zh_CN.properties +++ b/src/main/resources/i18n/messages_zh_CN.properties @@ -1,448 +1,450 @@ -termora.confirm=确认 -termora.exit=退出 -termora.cancel=取消 -termora.copy=复制 -termora.paste=粘贴 -termora.apply=应用 -termora.save=保存 -termora.remove=删除 -termora.yes=是 -termora.no=否 +termora.confirm=\u786E\u8BA4 +termora.exit=\u9000\u51FA +termora.cancel=\u53D6\u6D88 +termora.copy=\u590D\u5236 +termora.paste=\u7C98\u8D34 +termora.apply=\u5E94\u7528 +termora.save=\u4FDD\u5B58 +termora.remove=\u5220\u9664 +termora.yes=\u662F +termora.no=\u5426 termora.date-format=yyyy-MM-dd HH:mm:ss -termora.finder=访达 -termora.folder=文件夹 -termora.file=文件 -termora.explorer=文件管理器 -termora.quit-confirm=你要退出 {0} 吗? +termora.finder=\u8BBF\u8FBE +termora.folder=\u6587\u4EF6\u5939 +termora.file=\u6587\u4EF6 +termora.explorer=\u6587\u4EF6\u7BA1\u7406\u5668 +termora.quit-confirm=\u4F60\u8981\u9000\u51FA {0} \u5417\uFF1F -termora.regex=正则表达式 -termora.match-case=匹配大小写 -termora.optional=可选的 +termora.regex=\u6B63\u5219\u8868\u8FBE\u5F0F +termora.match-case=\u5339\u914D\u5927\u5C0F\u5199 +termora.optional=\u53EF\u9009\u7684 # update -termora.update.title=新版本 -termora.update.update=更新 +termora.update.title=\u65B0\u7248\u672C +termora.update.update=\u66F4\u65B0 # Hosts -termora.host.modified-server-key.title=主机 [{0}] 身份已发生变化 -termora.host.modified-server-key.thumbprint=主机密钥指纹 -termora.host.modified-server-key.expected=期待 -termora.host.modified-server-key.actual=实际 -termora.host.modified-server-key.are-you-sure=你确定要继续连接吗? - -termora.setting=设置 - -termora.settings.restart.title=重启 -termora.settings.restart.message=设置修改将在重启后生效 -termora.settings.restart.manually=请手动重启软件 - -termora.settings.appearance=常规 -termora.settings.appearance.theme=主题 -termora.settings.appearance.layout=布局 -termora.settings.appearance.layout.screen=全屏 -termora.settings.appearance.layout.fence=分割 -termora.settings.appearance.language=语言 -termora.settings.appearance.i-want-to-translate=我想要翻译 -termora.settings.appearance.follow-system=跟随系统 -termora.settings.appearance.opacity=透明度 -termora.settings.appearance.background-running=后台运行 -termora.settings.appearance.tab-order=标签序号 -termora.settings.appearance.confirm-tab-close=标签关闭前确认 +termora.host.modified-server-key.title=\u4E3B\u673A [{0}] \u8EAB\u4EFD\u5DF2\u53D1\u751F\u53D8\u5316 +termora.host.modified-server-key.thumbprint=\u4E3B\u673A\u5BC6\u94A5\u6307\u7EB9 +termora.host.modified-server-key.expected=\u671F\u5F85 +termora.host.modified-server-key.actual=\u5B9E\u9645 +termora.host.modified-server-key.are-you-sure=\u4F60\u786E\u5B9A\u8981\u7EE7\u7EED\u8FDE\u63A5\u5417? + +termora.setting=\u8BBE\u7F6E + +termora.settings.restart.title=\u91CD\u542F +termora.settings.restart.message=\u8BBE\u7F6E\u4FEE\u6539\u5C06\u5728\u91CD\u542F\u540E\u751F\u6548 +termora.settings.restart.manually=\u8BF7\u624B\u52A8\u91CD\u542F\u8F6F\u4EF6 + +termora.settings.appearance=\u5E38\u89C4 +termora.settings.appearance.theme=\u4E3B\u9898 +termora.settings.appearance.layout=\u5E03\u5C40 +termora.settings.appearance.layout.screen=\u5168\u5C4F +termora.settings.appearance.layout.fence=\u5206\u5272 +termora.settings.appearance.language=\u8BED\u8A00 +termora.settings.appearance.i-want-to-translate=\u6211\u60F3\u8981\u7FFB\u8BD1 +termora.settings.appearance.follow-system=\u8DDF\u968F\u7CFB\u7EDF +termora.settings.appearance.opacity=\u900F\u660E\u5EA6 +termora.settings.appearance.background-running=\u540E\u53F0\u8FD0\u884C +termora.settings.appearance.tab-order=\u6807\u7B7E\u5E8F\u53F7 +termora.settings.appearance.confirm-tab-close=\u6807\u7B7E\u5173\u95ED\u524D\u786E\u8BA4 # Find everywhere -termora.find-everywhere=查找 -termora.find-everywhere.search-for-something=搜索点什么 ... -termora.find-everywhere.groups.quick-actions=快速操作 -termora.find-everywhere.groups.open-new-hosts=打开新的主机 -termora.find-everywhere.groups.opened-hosts=已打开的主机 -termora.find-everywhere.groups.tools=工具 +termora.find-everywhere=\u67E5\u627E +termora.find-everywhere.search-for-something=\u641C\u7D22\u70B9\u4EC0\u4E48 ... +termora.find-everywhere.groups.quick-actions=\u5FEB\u901F\u64CD\u4F5C +termora.find-everywhere.groups.open-new-hosts=\u6253\u5F00\u65B0\u7684\u4E3B\u673A +termora.find-everywhere.groups.opened-hosts=\u5DF2\u6253\u5F00\u7684\u4E3B\u673A +termora.find-everywhere.groups.tools=\u5DE5\u5177 termora.find-everywhere.groups.settings=${termora.setting} -termora.find-everywhere.quick-command.local-terminal=本地终端 - -termora.settings.terminal=终端 -termora.settings.terminal.font=字体 -termora.settings.terminal.fallback-font=回退字体 -termora.settings.terminal.size=大小 -termora.settings.terminal.max-rows=最大行数 -termora.settings.terminal.debug=调试模式 -termora.settings.terminal.beep=蜂鸣声 -termora.settings.terminal.hyperlink=超链接 -termora.settings.terminal.select-copy=选中复制 -termora.settings.terminal.right-click=右键点击 -termora.settings.terminal.right-click.copy-and-paste=复制 & 粘贴 -termora.settings.terminal.cursor-style=光标样式 -termora.settings.terminal.cursor-blink=光标闪烁 -termora.settings.terminal.local-shell=本地终端 -termora.settings.terminal.floating-toolbar=悬浮工具栏 -termora.settings.terminal.auto-close-tab=自动关闭标签 -termora.settings.terminal.auto-close-tab-description=当终端正常断开连接时自动关闭标签页 - - -termora.settings.about=关于 -termora.settings.about.author=作者 -termora.settings.about.source=源代码 -termora.settings.about.issue=报告问题 -termora.settings.about.third-party=第三方依赖 -termora.settings.about.termora=${termora.title} ({0}) 是一个跨平台的 SSH 客户端。 - -termora.settings.plugin=插件 -termora.settings.plugin.install=安装 -termora.settings.plugin.installed=已安装 -termora.settings.plugin.marketplace=市场 -termora.settings.plugin.uninstall=卸载 -termora.settings.plugin.uninstall-confirm=你确定要卸载 {0} 吗? -termora.settings.plugin.uninstall-failed=卸载失败 -termora.settings.plugin.install-from-disk=从磁盘安装插件... -termora.settings.plugin.manage-plugin-repository=管理插件仓库... -termora.settings.plugin.install-failed=安装失败,请稍后再试 -termora.settings.plugin.install-from-disk-warning={0} 插件可以访问你的所有数据,你确定要安装吗? -termora.settings.plugin.not-compatible=插件 {0} 与当前版本不兼容,请重新安装 {0} - -termora.settings.account=账号 -termora.settings.account.login=登录 -termora.settings.account.server=服务器 -termora.settings.account.wait-login=正在等待默认浏览器中登录... -termora.settings.account.locally=本地的 -termora.settings.account.lifetime=长期 -termora.settings.account.verify=验证 -termora.settings.account.subscription=订阅 -termora.settings.account.valid-to=有效期 -termora.settings.account.synchronization-on=同步时间 -termora.settings.account.sync-now=同步 -termora.settings.account.logout=退出 -termora.settings.account.logout-confirm=你确定要退出登录吗? -termora.settings.account.unsynced-logout-confirm=数据尚未同步完毕,你确定要退出登录吗? -termora.settings.account.server-singapore=新加坡 -termora.settings.account.server-china=中国大陆 -termora.settings.account.new-server=新建服务器 -termora.settings.account.deploy-server=部署 -termora.settings.account.login-failed=登录失败,请稍后再试 - -termora.settings.keymap=键盘 -termora.settings.keymap.shortcut=快捷键 -termora.settings.keymap.action=操作 -termora.settings.keymap.already-exists=快捷键 [{0}] 已经被 [{1}] 占用 -termora.settings.keymap.question=选中一行,按下 ⌫ (退格键) 移除快捷键 - -termora.settings.sftp.edit-command=编辑命令 -termora.settings.sftp.db-click-behavior=双击行为 -termora.settings.sftp.fixed-tab=固定标签 -termora.settings.sftp.default-directory=默认目录 -termora.settings.sftp.preserve-time=保留原始文件修改时间 +termora.find-everywhere.quick-command.local-terminal=\u672C\u5730\u7EC8\u7AEF + +termora.settings.terminal=\u7EC8\u7AEF +termora.settings.terminal.font=\u5B57\u4F53 +termora.settings.terminal.fallback-font=\u56DE\u9000\u5B57\u4F53 +termora.settings.terminal.size=\u5927\u5C0F +termora.settings.terminal.max-rows=\u6700\u5927\u884C\u6570 +termora.settings.terminal.debug=\u8C03\u8BD5\u6A21\u5F0F +termora.settings.terminal.beep=\u8702\u9E23\u58F0 +termora.settings.terminal.hyperlink=\u8D85\u94FE\u63A5 +termora.settings.terminal.select-copy=\u9009\u4E2D\u590D\u5236 +termora.settings.terminal.right-click=\u53F3\u952E\u70B9\u51FB +termora.settings.terminal.right-click.copy-and-paste=\u590D\u5236 & \u7C98\u8D34 +termora.settings.terminal.cursor-style=\u5149\u6807\u6837\u5F0F +termora.settings.terminal.cursor-blink=\u5149\u6807\u95EA\u70C1 +termora.settings.terminal.local-shell=\u672C\u5730\u7EC8\u7AEF +termora.settings.terminal.floating-toolbar=\u60AC\u6D6E\u5DE5\u5177\u680F +termora.settings.terminal.auto-close-tab=\u81EA\u52A8\u5173\u95ED\u6807\u7B7E +termora.settings.terminal.auto-close-tab-description=\u5F53\u7EC8\u7AEF\u6B63\u5E38\u65AD\u5F00\u8FDE\u63A5\u65F6\u81EA\u52A8\u5173\u95ED\u6807\u7B7E\u9875 + + +termora.settings.about=\u5173\u4E8E +termora.settings.about.author=\u4F5C\u8005 +termora.settings.about.source=\u6E90\u4EE3\u7801 +termora.settings.about.issue=\u62A5\u544A\u95EE\u9898 +termora.settings.about.third-party=\u7B2C\u4E09\u65B9\u4F9D\u8D56 +termora.settings.about.termora=${termora.title} ({0}) \u662F\u4E00\u4E2A\u8DE8\u5E73\u53F0\u7684 SSH \u5BA2\u6237\u7AEF\u3002 + +termora.settings.plugin=\u63D2\u4EF6 +termora.settings.plugin.install=\u5B89\u88C5 +termora.settings.plugin.installed=\u5DF2\u5B89\u88C5 +termora.settings.plugin.marketplace=\u5E02\u573A +termora.settings.plugin.uninstall=\u5378\u8F7D +termora.settings.plugin.uninstall-confirm=\u4F60\u786E\u5B9A\u8981\u5378\u8F7D {0} \u5417\uFF1F +termora.settings.plugin.uninstall-failed=\u5378\u8F7D\u5931\u8D25 +termora.settings.plugin.install-from-disk=\u4ECE\u78C1\u76D8\u5B89\u88C5\u63D2\u4EF6... +termora.settings.plugin.manage-plugin-repository=\u7BA1\u7406\u63D2\u4EF6\u4ED3\u5E93... +termora.settings.plugin.install-failed=\u5B89\u88C5\u5931\u8D25\uFF0C\u8BF7\u7A0D\u540E\u518D\u8BD5 +termora.settings.plugin.install-from-disk-warning={0} \u63D2\u4EF6\u53EF\u4EE5\u8BBF\u95EE\u4F60\u7684\u6240\u6709\u6570\u636E\uFF0C\u4F60\u786E\u5B9A\u8981\u5B89\u88C5\u5417\uFF1F +termora.settings.plugin.not-compatible=\u63D2\u4EF6 {0} \u4E0E\u5F53\u524D\u7248\u672C\u4E0D\u517C\u5BB9\uFF0C\u8BF7\u91CD\u65B0\u5B89\u88C5 {0} + +termora.settings.account=\u8D26\u53F7 +termora.settings.account.login=\u767B\u5F55 +termora.settings.account.server=\u670D\u52A1\u5668 +termora.settings.account.wait-login=\u6B63\u5728\u7B49\u5F85\u9ED8\u8BA4\u6D4F\u89C8\u5668\u4E2D\u767B\u5F55... +termora.settings.account.locally=\u672C\u5730\u7684 +termora.settings.account.lifetime=\u957F\u671F +termora.settings.account.verify=\u9A8C\u8BC1 +termora.settings.account.subscription=\u8BA2\u9605 +termora.settings.account.valid-to=\u6709\u6548\u671F +termora.settings.account.synchronization-on=\u540C\u6B65\u65F6\u95F4 +termora.settings.account.sync-now=\u540C\u6B65 +termora.settings.account.logout=\u9000\u51FA +termora.settings.account.logout-confirm=\u4F60\u786E\u5B9A\u8981\u9000\u51FA\u767B\u5F55\u5417\uFF1F +termora.settings.account.unsynced-logout-confirm=\u6570\u636E\u5C1A\u672A\u540C\u6B65\u5B8C\u6BD5\uFF0C\u4F60\u786E\u5B9A\u8981\u9000\u51FA\u767B\u5F55\u5417\uFF1F +termora.settings.account.server-singapore=\u65B0\u52A0\u5761 +termora.settings.account.server-china=\u4E2D\u56FD\u5927\u9646 +termora.settings.account.new-server=\u65B0\u5EFA\u670D\u52A1\u5668 +termora.settings.account.deploy-server=\u90E8\u7F72 +termora.settings.account.login-failed=\u767B\u5F55\u5931\u8D25\uFF0C\u8BF7\u7A0D\u540E\u518D\u8BD5 + +termora.settings.keymap=\u952E\u76D8 +termora.settings.keymap.shortcut=\u5FEB\u6377\u952E +termora.settings.keymap.action=\u64CD\u4F5C +termora.settings.keymap.already-exists=\u5FEB\u6377\u952E [{0}] \u5DF2\u7ECF\u88AB [{1}] \u5360\u7528 +termora.settings.keymap.question=\u9009\u4E2D\u4E00\u884C\uFF0C\u6309\u4E0B \u232B (\u9000\u683C\u952E) \u79FB\u9664\u5FEB\u6377\u952E + +termora.settings.sftp.edit-command=\u7F16\u8F91\u547D\u4EE4 +termora.settings.sftp.db-click-behavior=\u53CC\u51FB\u884C\u4E3A +termora.settings.sftp.fixed-tab=\u56FA\u5B9A\u6807\u7B7E +termora.settings.sftp.default-directory=\u9ED8\u8BA4\u76EE\u5F55 +termora.settings.sftp.preserve-time=\u4FDD\u7559\u539F\u59CB\u6587\u4EF6\u4FEE\u6539\u65F6\u95F4 # Welcome -termora.welcome.my-hosts=我的主机 -termora.welcome.toggle-sidebar=显示/隐藏侧边栏 -termora.welcome.contextmenu.connect=连接 -termora.welcome.contextmenu.connect-with=连接到 +termora.welcome.my-hosts=\u6211\u7684\u4E3B\u673A +termora.welcome.toggle-sidebar=\u663E\u793A/\u9690\u85CF\u4FA7\u8FB9\u680F +termora.welcome.contextmenu.connect=\u8FDE\u63A5 +termora.welcome.contextmenu.connect-with=\u8FDE\u63A5\u5230 termora.welcome.contextmenu.copy=${termora.copy} termora.welcome.contextmenu.remove=${termora.remove} -termora.welcome.contextmenu.rename=重命名 -termora.welcome.contextmenu.expand-all=展开全部 -termora.welcome.contextmenu.collapse-all=全部收缩 -termora.welcome.contextmenu.new=新建 -termora.welcome.contextmenu.new.folder=文件夹 -termora.welcome.contextmenu.new.host=主机 -termora.welcome.contextmenu.new.folder.name=新建文件夹 -termora.welcome.contextmenu.property=属性 -termora.welcome.contextmenu.show=显示 -termora.welcome.contextmenu.show.more-info=更多信息 - -termora.welcome.contextmenu.download=下载 -termora.welcome.contextmenu.import.csv.download-template=您要导入还是下载模板? -termora.welcome.contextmenu.import.csv.download-template-done=下载成功 -termora.welcome.contextmenu.import.csv.download-template-done-open-folder=下载成功, 是否需要打开所在文件夹? -termora.welcome.contextmenu.import.xshell-folder-empty=该文件夹不包含 *.xsh 文件,请选择正确的 Xshell 会话目录 -termora.welcome.contextmenu.import.finalshell-folder-empty=该文件夹不包含 *_connect_config.json 文件,请选择正确的 FinalShell 配置目录 +termora.welcome.contextmenu.rename=\u91CD\u547D\u540D +termora.welcome.contextmenu.expand-all=\u5C55\u5F00\u5168\u90E8 +termora.welcome.contextmenu.collapse-all=\u5168\u90E8\u6536\u7F29 +termora.welcome.contextmenu.new=\u65B0\u5EFA +termora.welcome.contextmenu.new.folder=\u6587\u4EF6\u5939 +termora.welcome.contextmenu.new.host=\u4E3B\u673A +termora.welcome.contextmenu.new.folder.name=\u65B0\u5EFA\u6587\u4EF6\u5939 +termora.welcome.contextmenu.property=\u5C5E\u6027 +termora.welcome.contextmenu.show=\u663E\u793A +termora.welcome.contextmenu.show.more-info=\u66F4\u591A\u4FE1\u606F + +termora.welcome.contextmenu.download=\u4E0B\u8F7D +termora.welcome.contextmenu.import.csv.download-template=\u60A8\u8981\u5BFC\u5165\u8FD8\u662F\u4E0B\u8F7D\u6A21\u677F\uFF1F +termora.welcome.contextmenu.import.csv.download-template-done=\u4E0B\u8F7D\u6210\u529F +termora.welcome.contextmenu.import.csv.download-template-done-open-folder=\u4E0B\u8F7D\u6210\u529F\uFF0C \u662F\u5426\u9700\u8981\u6253\u5F00\u6240\u5728\u6587\u4EF6\u5939\uFF1F +termora.welcome.contextmenu.import.xshell-folder-empty=\u8BE5\u6587\u4EF6\u5939\u4E0D\u5305\u542B *.xsh \u6587\u4EF6\uFF0C\u8BF7\u9009\u62E9\u6B63\u786E\u7684 Xshell \u4F1A\u8BDD\u76EE\u5F55 +termora.welcome.contextmenu.import.finalshell-folder-empty=\u8BE5\u6587\u4EF6\u5939\u4E0D\u5305\u542B *_connect_config.json \u6587\u4EF6\uFF0C\u8BF7\u9009\u62E9\u6B63\u786E\u7684 FinalShell \u914D\u7F6E\u76EE\u5F55 # New Host -termora.new-host.title=新建主机 -termora.new-host.general=属性 -termora.new-host.general.name=名称 -termora.new-host.general.protocol=协议 -termora.new-host.general.host=主机 -termora.new-host.general.port=端口 -termora.new-host.general.username=用户名 -termora.new-host.general.authentication=认证类型 -termora.new-host.general.password=密码 -termora.new-host.general.remark=备注 -termora.new-host.general.remember=记住 -termora.new-host.proxy=代理 +termora.new-host.title=\u65B0\u5EFA\u4E3B\u673A +termora.new-host.general=\u5C5E\u6027 +termora.new-host.general.name=\u540D\u79F0 +termora.new-host.general.protocol=\u534F\u8BAE +termora.new-host.general.host=\u4E3B\u673A +termora.new-host.general.port=\u7AEF\u53E3 +termora.new-host.general.username=\u7528\u6237\u540D +termora.new-host.general.authentication=\u8BA4\u8BC1\u7C7B\u578B +termora.new-host.general.password=\u5BC6\u7801 +termora.new-host.general.remark=\u5907\u6CE8 +termora.new-host.general.remember=\u8BB0\u4F4F +termora.new-host.proxy=\u4EE3\u7406 termora.new-host.terminal=${termora.settings.terminal} -termora.new-host.terminal.encoding=编码 -termora.new-host.terminal.backspace=退格键 -termora.new-host.terminal.character-mode=单字符模式 -termora.new-host.terminal.heartbeat-interval=心跳间隔 -termora.new-host.terminal.timeout=超时时间 -termora.new-host.terminal.startup-commands=启动命令 -termora.new-host.terminal.alt-modifier=Alt 键修饰 -termora.new-host.terminal.alt-modifier.eight-bit=8 位字符 -termora.new-host.terminal.alt-modifier.by-esc=ESC 键作为前缀 -termora.new-host.terminal.env=环境 -termora.new-host.terminal.login-scripts=登录脚本 -termora.new-host.terminal.expect=预期 -termora.new-host.terminal.send=发送 - - - -termora.new-host.serial=串口 -termora.new-host.serial.port=端口 -termora.new-host.serial.baud-rate=波特率 -termora.new-host.serial.data-bits=数据位 -termora.new-host.serial.parity=校验位 -termora.new-host.serial.stop-bits=停止位 -termora.new-host.serial.flow-control=流控 - - -termora.new-host.test-connection=测试连接 -termora.new-host.test-connection-successful=连接成功 - -termora.new-host.tunneling=隧道 -termora.new-host.tunneling.table.name=名称 -termora.new-host.tunneling.table.type=类型 -termora.new-host.tunneling.table.source=本地地址 -termora.new-host.tunneling.table.destination=远程地址 -termora.new-host.tunneling.add=添加 +termora.new-host.terminal.encoding=\u7F16\u7801 +termora.new-host.terminal.backspace=\u9000\u683C\u952E +termora.new-host.terminal.character-mode=\u5355\u5B57\u7B26\u6A21\u5F0F +termora.new-host.terminal.heartbeat-interval=\u5FC3\u8DF3\u95F4\u9694 +termora.new-host.terminal.timeout=\u8D85\u65F6\u65F6\u95F4 +termora.new-host.terminal.startup-commands=\u542F\u52A8\u547D\u4EE4 +termora.new-host.terminal.alt-modifier=Alt \u952E\u4FEE\u9970 +termora.new-host.terminal.alt-modifier.eight-bit=8 \u4F4D\u5B57\u7B26 +termora.new-host.terminal.alt-modifier.by-esc=ESC \u952E\u4F5C\u4E3A\u524D\u7F00 +termora.new-host.terminal.env=\u73AF\u5883 +termora.new-host.terminal.login-scripts=\u767B\u5F55\u811A\u672C +termora.new-host.terminal.expect=\u9884\u671F +termora.new-host.terminal.send=\u53D1\u9001 + + + +termora.new-host.serial=\u4E32\u53E3 +termora.new-host.serial.port=\u7AEF\u53E3 +termora.new-host.serial.baud-rate=\u6CE2\u7279\u7387 +termora.new-host.serial.data-bits=\u6570\u636E\u4F4D +termora.new-host.serial.parity=\u6821\u9A8C\u4F4D +termora.new-host.serial.stop-bits=\u505C\u6B62\u4F4D +termora.new-host.serial.flow-control=\u6D41\u63A7 + + +termora.new-host.test-connection=\u6D4B\u8BD5\u8FDE\u63A5 +termora.new-host.test-connection-successful=\u8FDE\u63A5\u6210\u529F + +termora.new-host.tunneling=\u96A7\u9053 +termora.new-host.tunneling.table.name=\u540D\u79F0 +termora.new-host.tunneling.table.type=\u7C7B\u578B +termora.new-host.tunneling.table.source=\u672C\u5730\u5730\u5740 +termora.new-host.tunneling.table.destination=\u8FDC\u7A0B\u5730\u5740 +termora.new-host.tunneling.add=\u6DFB\u52A0 termora.new-host.tunneling.edit=${termora.keymgr.edit} termora.new-host.tunneling.delete=${termora.remove} -termora.new-host.rdp.desktop-placeholder=默认全屏(例如:1920×1080) -termora.new-host.rdp.resolution=分辨率 +termora.new-host.rdp.desktop-placeholder=\u9ED8\u8BA4\u5168\u5C4F\uFF08\u4F8B\u5982\uFF1A1920\u00D71080\uFF09 +termora.new-host.rdp.resolution=\u5206\u8FA8\u7387 -termora.new-host.wsl.distribution=分发版 +termora.new-host.wsl.distribution=\u5206\u53D1\u7248 +termora.new-host.wsl.explorer-path=\u8D44\u6E90\u7BA1\u7406\u5668\u8DEF\u5F84 +termora.new-host.wsl.explorer-path.placeholder=WSL \u5728 Windows \u4E0A\u7684\u8D44\u6E90\u7BA1\u7406\u5668\u4E2D\u663E\u793A\u7684\u5730\u5740 -termora.new-host.jump-hosts=跳板机 +termora.new-host.jump-hosts=\u8DF3\u677F\u673A # Key manager -termora.keymgr.title=密钥管理器 -termora.keymgr.my-keys=我的密钥 -termora.keymgr.generate=生成 -termora.keymgr.import=导入 -termora.keymgr.export=导出 -termora.keymgr.edit=编辑 -termora.keymgr.private-key=私钥 -termora.keymgr.delete-warning=确定要删除吗? -termora.keymgr.table.name=名称 -termora.keymgr.table.type=类型 -termora.keymgr.table.length=长度 -termora.keymgr.table.remark=备注 -termora.keymgr.export-done=导出成功 -termora.keymgr.export-done-open-folder=导出成功,是否需要打开所在文件夹? - -termora.keymgr.ssh-copy-id.number=主机数量 [{0}] 公钥数量 [{1}] -termora.keymgr.ssh-copy-id.failed=复制失败 -termora.keymgr.ssh-copy-id.end=复制公钥结束 +termora.keymgr.title=\u5BC6\u94A5\u7BA1\u7406\u5668 +termora.keymgr.my-keys=\u6211\u7684\u5BC6\u94A5 +termora.keymgr.generate=\u751F\u6210 +termora.keymgr.import=\u5BFC\u5165 +termora.keymgr.export=\u5BFC\u51FA +termora.keymgr.edit=\u7F16\u8F91 +termora.keymgr.private-key=\u79C1\u94A5 +termora.keymgr.delete-warning=\u786E\u5B9A\u8981\u5220\u9664\u5417\uFF1F +termora.keymgr.table.name=\u540D\u79F0 +termora.keymgr.table.type=\u7C7B\u578B +termora.keymgr.table.length=\u957F\u5EA6 +termora.keymgr.table.remark=\u5907\u6CE8 +termora.keymgr.export-done=\u5BFC\u51FA\u6210\u529F +termora.keymgr.export-done-open-folder=\u5BFC\u51FA\u6210\u529F\uFF0C\u662F\u5426\u9700\u8981\u6253\u5F00\u6240\u5728\u6587\u4EF6\u5939\uFF1F + +termora.keymgr.ssh-copy-id.number=\u4E3B\u673A\u6570\u91CF [{0}] \u516C\u94A5\u6570\u91CF [{1}] +termora.keymgr.ssh-copy-id.failed=\u590D\u5236\u5931\u8D25 +termora.keymgr.ssh-copy-id.end=\u590D\u5236\u516C\u94A5\u7ED3\u675F # Tools -termora.tools.multiple=将命令发送到当前窗口会话 +termora.tools.multiple=\u5C06\u547D\u4EE4\u53D1\u9001\u5230\u5F53\u524D\u7A97\u53E3\u4F1A\u8BDD # Tabbed -termora.tabbed.contextmenu.rename=重命名 -termora.tabbed.contextmenu.select-host=选中主机 -termora.tabbed.contextmenu.sftp-command=SFTP 终端 -termora.tabbed.contextmenu.sftp-not-install=没有找到 SFTP 程序,请安装后重试 -termora.tabbed.contextmenu.clone=克隆 -termora.tabbed.contextmenu.clone-session=克隆会话 -termora.tabbed.contextmenu.open-in-new-window=在新窗口打开 -termora.tabbed.contextmenu.close=关闭 -termora.tabbed.contextmenu.close-other-tabs=关闭其他标签页 -termora.tabbed.contextmenu.close-all-tabs=关闭所有标签页 -termora.tabbed.contextmenu.reconnect=重新连接 -termora.tabbed.local-tab.close-prompt=你想要终止这个终端中正在运行的进程吗? -termora.tabbed.tab.close-prompt=你确定要关闭这个标签页吗? +termora.tabbed.contextmenu.rename=\u91CD\u547D\u540D +termora.tabbed.contextmenu.select-host=\u9009\u4E2D\u4E3B\u673A +termora.tabbed.contextmenu.sftp-command=SFTP \u7EC8\u7AEF +termora.tabbed.contextmenu.sftp-not-install=\u6CA1\u6709\u627E\u5230 SFTP \u7A0B\u5E8F\uFF0C\u8BF7\u5B89\u88C5\u540E\u91CD\u8BD5 +termora.tabbed.contextmenu.clone=\u514B\u9686 +termora.tabbed.contextmenu.clone-session=\u514B\u9686\u4F1A\u8BDD +termora.tabbed.contextmenu.open-in-new-window=\u5728\u65B0\u7A97\u53E3\u6253\u5F00 +termora.tabbed.contextmenu.close=\u5173\u95ED +termora.tabbed.contextmenu.close-other-tabs=\u5173\u95ED\u5176\u4ED6\u6807\u7B7E\u9875 +termora.tabbed.contextmenu.close-all-tabs=\u5173\u95ED\u6240\u6709\u6807\u7B7E\u9875 +termora.tabbed.contextmenu.reconnect=\u91CD\u65B0\u8FDE\u63A5 +termora.tabbed.local-tab.close-prompt=\u4F60\u60F3\u8981\u7EC8\u6B62\u8FD9\u4E2A\u7EC8\u7AEF\u4E2D\u6B63\u5728\u8FD0\u884C\u7684\u8FDB\u7A0B\u5417\uFF1F +termora.tabbed.tab.close-prompt=\u4F60\u786E\u5B9A\u8981\u5173\u95ED\u8FD9\u4E2A\u6807\u7B7E\u9875\u5417\uFF1F # Terminal logger -termora.terminal-logger=终端日志 -termora.terminal-logger.start-recording=开始记录 -termora.terminal-logger.plain-text=纯文本 -termora.terminal-logger.styled-text=样式文本 -termora.terminal-logger.stop-recording=停止记录 -termora.terminal-logger.open-log-viewer=打开日志浏览器 -termora.terminal-logger.open-in-folder=在 {0} 中打开 +termora.terminal-logger=\u7EC8\u7AEF\u65E5\u5FD7 +termora.terminal-logger.start-recording=\u5F00\u59CB\u8BB0\u5F55 +termora.terminal-logger.plain-text=\u7EAF\u6587\u672C +termora.terminal-logger.styled-text=\u6837\u5F0F\u6587\u672C +termora.terminal-logger.stop-recording=\u505C\u6B62\u8BB0\u5F55 +termora.terminal-logger.open-log-viewer=\u6253\u5F00\u65E5\u5FD7\u6D4F\u89C8\u5668 +termora.terminal-logger.open-in-folder=\u5728 {0} \u4E2D\u6253\u5F00 # Highlight -termora.highlight=关键词高亮 -termora.highlight.default-set=默认集 -termora.highlight.text-color=文本颜色 -termora.highlight.background-color=背景颜色 -termora.highlight.keyword=关键词 -termora.highlight.my-keyword=我的关键词 -termora.highlight.preview=预览 -termora.highlight.description=备注 -termora.highlight.bold=加粗 -termora.highlight.italic=斜体 -termora.highlight.underline=下划线 -termora.highlight.line-through=删除线 +termora.highlight=\u5173\u952E\u8BCD\u9AD8\u4EAE +termora.highlight.default-set=\u9ED8\u8BA4\u96C6 +termora.highlight.text-color=\u6587\u672C\u989C\u8272 +termora.highlight.background-color=\u80CC\u666F\u989C\u8272 +termora.highlight.keyword=\u5173\u952E\u8BCD +termora.highlight.my-keyword=\u6211\u7684\u5173\u952E\u8BCD +termora.highlight.preview=\u9884\u89C8 +termora.highlight.description=\u5907\u6CE8 +termora.highlight.bold=\u52A0\u7C97 +termora.highlight.italic=\u659C\u4F53 +termora.highlight.underline=\u4E0B\u5212\u7EBF +termora.highlight.line-through=\u5220\u9664\u7EBF # tag -termora.tag=标签 -termora.tag.my-tags=我的标签 -termora.tag.manage-tags=管理标签 +termora.tag=\u6807\u7B7E +termora.tag.my-tags=\u6211\u7684\u6807\u7B7E +termora.tag.manage-tags=\u7BA1\u7406\u6807\u7B7E # Macro -termora.macro=宏 -termora.macro.start-recording=开始录制 -termora.macro.stop-recording=停止录制 -termora.macro.playback=回放 -termora.macro.manager=管理宏 -termora.macro.run=运行 +termora.macro=\u5B8F +termora.macro.start-recording=\u5F00\u59CB\u5F55\u5236 +termora.macro.stop-recording=\u505C\u6B62\u5F55\u5236 +termora.macro.playback=\u56DE\u653E +termora.macro.manager=\u7BA1\u7406\u5B8F +termora.macro.run=\u8FD0\u884C # Snippets -termora.snippet=片段 -termora.snippet.title=代码片段 +termora.snippet=\u7247\u6BB5 +termora.snippet.title=\u4EE3\u7801\u7247\u6BB5 # Transport -termora.transport.local=本机 -termora.transport.file-already-exists=文件 {0} 已存在 +termora.transport.local=\u672C\u673A +termora.transport.file-already-exists=\u6587\u4EF6 {0} \u5DF2\u5B58\u5728 -termora.transport.bookmarks=书签管理 -termora.transport.bookmarks.up=上移 -termora.transport.bookmarks.down=下移 +termora.transport.bookmarks=\u4E66\u7B7E\u7BA1\u7406 +termora.transport.bookmarks.up=\u4E0A\u79FB +termora.transport.bookmarks.down=\u4E0B\u79FB -termora.transport.toolbar.prev=返回 -termora.transport.toolbar.home=默认目录 -termora.transport.toolbar.next=前进 -termora.transport.toolbar.parent=父目录 -termora.transport.toolbar.show-hide=显示/隐藏目录 -termora.transport.toolbar.refresh=刷新 +termora.transport.toolbar.prev=\u8FD4\u56DE +termora.transport.toolbar.home=\u9ED8\u8BA4\u76EE\u5F55 +termora.transport.toolbar.next=\u524D\u8FDB +termora.transport.toolbar.parent=\u7236\u76EE\u5F55 +termora.transport.toolbar.show-hide=\u663E\u793A/\u9690\u85CF\u76EE\u5F55 +termora.transport.toolbar.refresh=\u5237\u65B0 -termora.transport.table.filename=文件名 -termora.transport.table.type=类型 -termora.transport.table.size=大小 -termora.transport.table.type.symbolic-link=软链接 -termora.transport.table.modified-time=修改时间 -termora.transport.table.permissions=权限 -termora.transport.table.owner=所有者 +termora.transport.table.filename=\u6587\u4EF6\u540D +termora.transport.table.type=\u7C7B\u578B +termora.transport.table.size=\u5927\u5C0F +termora.transport.table.type.symbolic-link=\u8F6F\u94FE\u63A5 +termora.transport.table.modified-time=\u4FEE\u6539\u65F6\u95F4 +termora.transport.table.permissions=\u6743\u9650 +termora.transport.table.owner=\u6240\u6709\u8005 # contextmenu -termora.transport.table.contextmenu.transfer=传输 -termora.transport.table.contextmenu.copy-path=复制路径 -termora.transport.table.contextmenu.open-in-folder=在{0}中打开 -termora.transport.table.contextmenu.change-permissions=更改权限... -termora.transport.table.contextmenu.refresh=刷新 -termora.transport.table.contextmenu.compress=压缩 -termora.transport.table.contextmenu.extract=解压 -termora.transport.table.contextmenu.extract.here=解压到当前目录 -termora.transport.table.contextmenu.extract.single=解压到 {0}\\ -termora.transport.table.contextmenu.extract.multi=解压到 *\\* -termora.transport.table.contextmenu.new.file=${termora.transport.table.contextmenu.new}文件 -termora.transport.table.contextmenu.rm-warning=使用 rm -rf 命令删除文件存在很大风险 - -termora.transport.sftp=传输 -termora.transport.sftp.retry=重试 -termora.transport.sftp.select-another-host=选择其他主机 -termora.transport.sftp.select-host=选择主机 -termora.transport.sftp.connecting=连接中... -termora.transport.sftp.closed=连接已经关闭 -termora.transport.sftp.close-tab=传输还处于活动状态,是否删除所有传输任务并关闭此会话? -termora.transport.sftp.close-tab-has-active-session=会话还处于活动状态,是否关闭所有会话? - -termora.transport.sftp.status.transporting=传输中 -termora.transport.sftp.status.deleting=删除中 -termora.transport.sftp.status.waiting=等待中 -termora.transport.sftp.status.done=已完成 -termora.transport.sftp.status.failed=已失败 - - -termora.transport.sftp.already-exists.message1=此文件夹已包含以下名称的对象 -termora.transport.sftp.already-exists.message2=请选择要执行的操作 -termora.transport.sftp.already-exists.overwrite=覆盖 -termora.transport.sftp.already-exists.append=追加 -termora.transport.sftp.already-exists.skip=跳过 -termora.transport.sftp.already-exists.apply-all=应用全部 -termora.transport.sftp.already-exists.name=名称 -termora.transport.sftp.already-exists.destination=目标文件 -termora.transport.sftp.already-exists.source=源文件 -termora.transport.sftp.already-exists.actions=操作 +termora.transport.table.contextmenu.transfer=\u4F20\u8F93 +termora.transport.table.contextmenu.copy-path=\u590D\u5236\u8DEF\u5F84 +termora.transport.table.contextmenu.open-in-folder=\u5728{0}\u4E2D\u6253\u5F00 +termora.transport.table.contextmenu.change-permissions=\u66F4\u6539\u6743\u9650... +termora.transport.table.contextmenu.refresh=\u5237\u65B0 +termora.transport.table.contextmenu.compress=\u538B\u7F29 +termora.transport.table.contextmenu.extract=\u89E3\u538B +termora.transport.table.contextmenu.extract.here=\u89E3\u538B\u5230\u5F53\u524D\u76EE\u5F55 +termora.transport.table.contextmenu.extract.single=\u89E3\u538B\u5230 {0}\\ +termora.transport.table.contextmenu.extract.multi=\u89E3\u538B\u5230 *\\* +termora.transport.table.contextmenu.new.file=${termora.transport.table.contextmenu.new}\u6587\u4EF6 +termora.transport.table.contextmenu.rm-warning=\u4F7F\u7528 rm -rf \u547D\u4EE4\u5220\u9664\u6587\u4EF6\u5B58\u5728\u5F88\u5927\u98CE\u9669 + +termora.transport.sftp=\u4F20\u8F93 +termora.transport.sftp.retry=\u91CD\u8BD5 +termora.transport.sftp.select-another-host=\u9009\u62E9\u5176\u4ED6\u4E3B\u673A +termora.transport.sftp.select-host=\u9009\u62E9\u4E3B\u673A +termora.transport.sftp.connecting=\u8FDE\u63A5\u4E2D... +termora.transport.sftp.closed=\u8FDE\u63A5\u5DF2\u7ECF\u5173\u95ED +termora.transport.sftp.close-tab=\u4F20\u8F93\u8FD8\u5904\u4E8E\u6D3B\u52A8\u72B6\u6001\uFF0C\u662F\u5426\u5220\u9664\u6240\u6709\u4F20\u8F93\u4EFB\u52A1\u5E76\u5173\u95ED\u6B64\u4F1A\u8BDD\uFF1F +termora.transport.sftp.close-tab-has-active-session=\u4F1A\u8BDD\u8FD8\u5904\u4E8E\u6D3B\u52A8\u72B6\u6001\uFF0C\u662F\u5426\u5173\u95ED\u6240\u6709\u4F1A\u8BDD\uFF1F + +termora.transport.sftp.status.transporting=\u4F20\u8F93\u4E2D +termora.transport.sftp.status.deleting=\u5220\u9664\u4E2D +termora.transport.sftp.status.waiting=\u7B49\u5F85\u4E2D +termora.transport.sftp.status.done=\u5DF2\u5B8C\u6210 +termora.transport.sftp.status.failed=\u5DF2\u5931\u8D25 + + +termora.transport.sftp.already-exists.message1=\u6B64\u6587\u4EF6\u5939\u5DF2\u5305\u542B\u4EE5\u4E0B\u540D\u79F0\u7684\u5BF9\u8C61 +termora.transport.sftp.already-exists.message2=\u8BF7\u9009\u62E9\u8981\u6267\u884C\u7684\u64CD\u4F5C +termora.transport.sftp.already-exists.overwrite=\u8986\u76D6 +termora.transport.sftp.already-exists.append=\u8FFD\u52A0 +termora.transport.sftp.already-exists.skip=\u8DF3\u8FC7 +termora.transport.sftp.already-exists.apply-all=\u5E94\u7528\u5168\u90E8 +termora.transport.sftp.already-exists.name=\u540D\u79F0 +termora.transport.sftp.already-exists.destination=\u76EE\u6807\u6587\u4EF6 +termora.transport.sftp.already-exists.source=\u6E90\u6587\u4EF6 +termora.transport.sftp.already-exists.actions=\u64CD\u4F5C # Permission -termora.transport.permissions=更改权限 -termora.transport.permissions.file-folder-permissions=文件/文件夹权限 -termora.transport.permissions.read=读取 -termora.transport.permissions.write=写入 -termora.transport.permissions.execute=执行 -termora.transport.permissions.owner=所有者 -termora.transport.permissions.group=组 -termora.transport.permissions.others=其他 -termora.transport.permissions.include-subfolder=包含子目录 +termora.transport.permissions=\u66F4\u6539\u6743\u9650 +termora.transport.permissions.file-folder-permissions=\u6587\u4EF6/\u6587\u4EF6\u5939\u6743\u9650 +termora.transport.permissions.read=\u8BFB\u53D6 +termora.transport.permissions.write=\u5199\u5165 +termora.transport.permissions.execute=\u6267\u884C +termora.transport.permissions.owner=\u6240\u6709\u8005 +termora.transport.permissions.group=\u7EC4 +termora.transport.permissions.others=\u5176\u4ED6 +termora.transport.permissions.include-subfolder=\u5305\u542B\u5B50\u76EE\u5F55 # transport job -termora.transport.jobs.table.name=名称 -termora.transport.jobs.table.status=状态 -termora.transport.jobs.table.progress=进度 -termora.transport.jobs.table.size=大小 -termora.transport.jobs.table.source-path=源路径 -termora.transport.jobs.table.target-path=目标路径 -termora.transport.jobs.table.speed=速度 -termora.transport.jobs.table.estimated-time=剩余时间 -termora.transport.jobs.table.estimated-time-days-format={0}天{1}小时{2}分{3}秒 -termora.transport.jobs.table.estimated-time-hours-format={0}小时{1}分{2}秒 -termora.transport.jobs.table.estimated-time-minutes-format={0}分{1}秒 -termora.transport.jobs.table.estimated-time-seconds-format={0}秒 - -termora.transport.jobs.contextmenu.delete-all=删除所有 +termora.transport.jobs.table.name=\u540D\u79F0 +termora.transport.jobs.table.status=\u72B6\u6001 +termora.transport.jobs.table.progress=\u8FDB\u5EA6 +termora.transport.jobs.table.size=\u5927\u5C0F +termora.transport.jobs.table.source-path=\u6E90\u8DEF\u5F84 +termora.transport.jobs.table.target-path=\u76EE\u6807\u8DEF\u5F84 +termora.transport.jobs.table.speed=\u901F\u5EA6 +termora.transport.jobs.table.estimated-time=\u5269\u4F59\u65F6\u95F4 +termora.transport.jobs.table.estimated-time-days-format={0}\u5929{1}\u5C0F\u65F6{2}\u5206{3}\u79D2 +termora.transport.jobs.table.estimated-time-hours-format={0}\u5C0F\u65F6{1}\u5206{2}\u79D2 +termora.transport.jobs.table.estimated-time-minutes-format={0}\u5206{1}\u79D2 +termora.transport.jobs.table.estimated-time-seconds-format={0}\u79D2 + +termora.transport.jobs.contextmenu.delete-all=\u5220\u9664\u6240\u6709 # ToolBar -termora.toolbar.customize-toolbar=自定义工具栏... +termora.toolbar.customize-toolbar=\u81EA\u5B9A\u4E49\u5DE5\u5177\u680F... -termora.terminal.size=大小: {0} x {1} -termora.terminal.copied=已复制 -termora.terminal.channel-disconnected=终端断开连接, -termora.terminal.channel-reconnect=按 {0} 进行重连。 +termora.terminal.size=\u5927\u5C0F: {0} x {1} +termora.terminal.copied=\u5DF2\u590D\u5236 +termora.terminal.channel-disconnected=\u7EC8\u7AEF\u65AD\u5F00\u8FDE\u63A5\uFF0C +termora.terminal.channel-reconnect=\u6309 {0} \u8FDB\u884C\u91CD\u8FDE\u3002 # protocol -termora.protocol.not-supported=不支持 {0} 协议,你可能需要安装插件 +termora.protocol.not-supported=\u4E0D\u652F\u6301 {0} \u534F\u8BAE\uFF0C\u4F60\u53EF\u80FD\u9700\u8981\u5B89\u88C5\u63D2\u4EF6 # Actions -termora.actions.copy-from-terminal=从终端复制 -termora.actions.focus-mode=专注模式 -termora.actions.paste-to-terminal=粘贴到终端 -termora.actions.select-all-in-terminal=在终端中全选 -termora.actions.open-terminal-find=打开终端查找 -termora.actions.close-tab=关闭标签页 -termora.actions.zoom-in-terminal=放大终端 -termora.actions.zoom-out-terminal=缩小终端 -termora.actions.zoom-reset-terminal=重置终端缩放 -termora.actions.open-local-terminal=打开本地终端 -termora.actions.quick-connect=快速连接 -termora.actions.open-find-everywhere=打开全局查找 -termora.actions.open-new-window=打开新窗口 -termora.actions.clear-screen=清除终端屏幕 -termora.actions.open-sftp-command=打开 SFTP 终端 -termora.actions.switch-tab=切换到特定标签页 [1..9] +termora.actions.copy-from-terminal=\u4ECE\u7EC8\u7AEF\u590D\u5236 +termora.actions.focus-mode=\u4E13\u6CE8\u6A21\u5F0F +termora.actions.paste-to-terminal=\u7C98\u8D34\u5230\u7EC8\u7AEF +termora.actions.select-all-in-terminal=\u5728\u7EC8\u7AEF\u4E2D\u5168\u9009 +termora.actions.open-terminal-find=\u6253\u5F00\u7EC8\u7AEF\u67E5\u627E +termora.actions.close-tab=\u5173\u95ED\u6807\u7B7E\u9875 +termora.actions.zoom-in-terminal=\u653E\u5927\u7EC8\u7AEF +termora.actions.zoom-out-terminal=\u7F29\u5C0F\u7EC8\u7AEF +termora.actions.zoom-reset-terminal=\u91CD\u7F6E\u7EC8\u7AEF\u7F29\u653E +termora.actions.open-local-terminal=\u6253\u5F00\u672C\u5730\u7EC8\u7AEF +termora.actions.quick-connect=\u5FEB\u901F\u8FDE\u63A5 +termora.actions.open-find-everywhere=\u6253\u5F00\u5168\u5C40\u67E5\u627E +termora.actions.open-new-window=\u6253\u5F00\u65B0\u7A97\u53E3 +termora.actions.clear-screen=\u6E05\u9664\u7EC8\u7AEF\u5C4F\u5E55 +termora.actions.open-sftp-command=\u6253\u5F00 SFTP \u7EC8\u7AEF +termora.actions.switch-tab=\u5207\u6362\u5230\u7279\u5B9A\u6807\u7B7E\u9875 [1..9] # Visual Window -termora.visual-window.system-information=系统信息 -termora.visual-window.system-information.mem=内存 -termora.visual-window.system-information.swap=交换 -termora.visual-window.system-information.filesystem=文件系统 -termora.visual-window.system-information.used-total=使用 / 大小 -termora.visual-window.toggle-window=切换窗口 -termora.visual-window.transport.question=更多功能 +termora.visual-window.system-information=\u7CFB\u7EDF\u4FE1\u606F +termora.visual-window.system-information.mem=\u5185\u5B58 +termora.visual-window.system-information.swap=\u4EA4\u6362 +termora.visual-window.system-information.filesystem=\u6587\u4EF6\u7CFB\u7EDF +termora.visual-window.system-information.used-total=\u4F7F\u7528 / \u5927\u5C0F +termora.visual-window.toggle-window=\u5207\u6362\u7A97\u53E3 +termora.visual-window.transport.question=\u66F4\u591A\u529F\u80FD -termora.floating-toolbar.close-in-current-tab=在当前标签页关闭 +termora.floating-toolbar.close-in-current-tab=\u5728\u5F53\u524D\u6807\u7B7E\u9875\u5173\u95ED # zmodem -termora.addons.zmodem.skip=跳过 +termora.addons.zmodem.skip=\u8DF3\u8FC7