mirror of
https://github.com/Termix-SSH/Termix.git
synced 2026-10-30 07:05:24 +00:00
fix(i18n): complete Simplified Chinese core and plugin translations (#1542)
* fix(i18n): complete Chinese onboarding and navigation labels * fix(i18n): translate remaining Chinese core and plugin interfaces * fix(i18n): translate host editor tab overflow controls * fix(i18n): use consistent Chinese fleet terminology * fix(i18n): localize hardcoded controls and plugin views * fix(i18n): translate built-in homepage widget catalog * test(homepage): follow translated timezone placeholder * fix(i18n): translate plugin-provided homepage widgets * fix(i18n): localize feature settings section titles
This commit is contained in:
1 parent
13f5736d8f
commit
0214a81e5d
78 files changed
+2423
-1833
No files matched your search
@@ -323,7 +323,7 @@
|
||||
"sideBySide": "Side by Side",
|
||||
"inline": "Inline",
|
||||
"fileComparison": "File Comparison: {{file1}} vs {{file2}}",
|
||||
"fileTooLarge": "File too large: {{error}}",
|
||||
"fileTooLarge": "File is too large (> 10MB) and cannot be opened as text for security reasons.",
|
||||
"sshConnectionFailed": "SSH connection failed. Please check your connection to {{name}} ({{ip}}:{{port}})",
|
||||
"loadFileFailed": "Failed to load file: {{error}}",
|
||||
"connecting": "Connecting...",
|
||||
@@ -365,7 +365,7 @@
|
||||
"comfortableLayout": "Use comfortable layout",
|
||||
"cannotLoadPdf": "Cannot load PDF",
|
||||
"pdfLoadError": "There was an error loading this PDF file.",
|
||||
"loadingPdf": "Loading PDF...",
|
||||
"loadingPdf": "Loading PDF viewer...",
|
||||
"loadingPage": "Loading page...",
|
||||
"cancel": "Cancel",
|
||||
"copiedItems_one": "Copied {{count}} item",
|
||||
@@ -383,7 +383,16 @@
|
||||
"videoUnsupported": "Your browser cannot play this video format.",
|
||||
"downloadToPlay": "Download to play it elsewhere",
|
||||
"cannotPreviewType": "Cannot preview this file type",
|
||||
"cannotPreviewTypeHint": "This file type has no preview. Download it to open it in another app."
|
||||
"cannotPreviewTypeHint": "This file type has no preview. Download it to open it in another app.",
|
||||
"loadingFile": "Loading file...",
|
||||
"loadingImage": "Loading image...",
|
||||
"loadingEditor": "Loading editor...",
|
||||
"loadingPreview": "Loading preview...",
|
||||
"loadingAudio": "Loading audio player...",
|
||||
"emptyPreview": "Nothing to preview yet...",
|
||||
"revert": "Revert",
|
||||
"openAsText": "Open as Text",
|
||||
"confirmOpenAsText": "Do you want to continue opening this file as text? This may slow down your browser."
|
||||
},
|
||||
"sftpTransfer": {
|
||||
"title": "SFTP",
|
||||
@@ -539,5 +548,8 @@
|
||||
"metricsHopSourceRead": "Source → server: {{throughput}}",
|
||||
"metricsHopDestSftpWrite": "Server → dest (SFTP): {{throughput}}",
|
||||
"metricsHopDestLocalWrite": "Server → dest (local): {{throughput}}"
|
||||
},
|
||||
"plugin": {
|
||||
"name": "File Manager"
|
||||
}
|
||||
}
|
||||
@@ -6,15 +6,15 @@
|
||||
},
|
||||
"permissions": {
|
||||
"use": {
|
||||
"title": "Use file manager",
|
||||
"description": "Browse, edit and transfer files over SFTP."
|
||||
"title": "使用文件管理器",
|
||||
"description": "通过 SFTP 浏览、编辑和传输文件。"
|
||||
}
|
||||
},
|
||||
"settings": {
|
||||
"host": {
|
||||
"enable": {
|
||||
"label": "启用文件管理器",
|
||||
"description": "Browse and edit files on this host over SFTP."
|
||||
"description": "通过 SFTP 浏览和编辑此主机上的文件。"
|
||||
},
|
||||
"defaultPath": {
|
||||
"label": "默认路径"
|
||||
@@ -25,12 +25,12 @@
|
||||
},
|
||||
"user": {
|
||||
"transferConcurrency": {
|
||||
"label": "Simultaneous File Transfers",
|
||||
"description": "How many files the side by side local/remote manager uploads or downloads at the same time. Lower this if your server limits SFTP channels."
|
||||
"label": "同时传输文件数",
|
||||
"description": "本地与远程分栏文件管理器同时上传或下载的文件数。如果服务器限制 SFTP 通道数,请调低此值。"
|
||||
},
|
||||
"confirmBeforeTrash": {
|
||||
"label": "Confirm before moving files to trash",
|
||||
"description": "Ask before moving remote files to trash. Permanent deletion still requires confirmation."
|
||||
"label": "移入回收站前确认",
|
||||
"description": "将远程文件移入回收站前询问。永久删除仍需确认。"
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -72,14 +72,14 @@
|
||||
"rename": "重命名",
|
||||
"uploading": "上传中...",
|
||||
"uploadingFile": "正在上传 {{name}}...",
|
||||
"uploadingChunk": "Uploading {{name}}: {{percent}}% (part {{chunk}} of {{total}})",
|
||||
"uploadingChunk": "正在上传 {{name}}:{{percent}}%(第 {{chunk}} 部分,共 {{total}} 部分)",
|
||||
"fileName": "文件名",
|
||||
"folderName": "文件夹名称",
|
||||
"fileUploadedSuccessfully": "文件 \"{{name}}\" 上传成功",
|
||||
"failedToUploadFile": "上传文件失败",
|
||||
"uploadingFolderFiles": "Uploading {{count}} file(s)...",
|
||||
"uploadedFolderFiles": "Uploaded {{count}} file(s) successfully",
|
||||
"uploadedFolderPartial": "Uploaded {{uploaded}} file(s), {{failed}} failed",
|
||||
"uploadingFolderFiles": "正在上传 {{count}} 个文件……",
|
||||
"uploadedFolderFiles": "成功上传 {{count}} 个文件",
|
||||
"uploadedFolderPartial": "已上传 {{uploaded}} 个文件,{{failed}} 个失败",
|
||||
"fileDownloadedSuccessfully": "文件 \"{{name}}\" 下载成功",
|
||||
"failedToDownloadFile": "下载文件失败",
|
||||
"fileCreatedSuccessfully": "文件 \"{{name}}\" 创建成功",
|
||||
@@ -95,58 +95,58 @@
|
||||
"sudoOperationFailed": "Sudo 操作失败",
|
||||
"sudoAuthFailed": "Sudo 认证失败",
|
||||
"dragFilesToUpload": "将文件拖放到此处以上传",
|
||||
"dropToUploadHere": "Drop to upload here",
|
||||
"dropToDownloadHere": "Drop to download here",
|
||||
"dropToUploadHere": "拖放到此处上传",
|
||||
"dropToDownloadHere": "拖放到此处下载",
|
||||
"localFiles": "本地",
|
||||
"showLocalFiles": "Show local files (split view)",
|
||||
"hideLocalFiles": "Hide local files",
|
||||
"localHome": "Home folder",
|
||||
"localPathPlaceholder": "Local folder path",
|
||||
"localShowHidden": "Show hidden files",
|
||||
"localHideHidden": "Hide hidden files",
|
||||
"localRevealInFileManager": "Reveal in system file manager",
|
||||
"localCannotOpenFolder": "Cannot open folder",
|
||||
"showLocalFiles": "显示本地文件(分栏视图)",
|
||||
"hideLocalFiles": "隐藏本地文件",
|
||||
"localHome": "主目录",
|
||||
"localPathPlaceholder": "本地文件夹路径",
|
||||
"localShowHidden": "显示隐藏文件",
|
||||
"localHideHidden": "隐藏隐藏文件",
|
||||
"localRevealInFileManager": "在系统文件管理器中显示",
|
||||
"localCannotOpenFolder": "无法打开文件夹",
|
||||
"localItemCount": "{{count}} 个项目",
|
||||
"localSelectedCount": "已选择 {{count}} 项",
|
||||
"back": "返回",
|
||||
"forward": "Forward",
|
||||
"up": "Up",
|
||||
"kind": "Kind",
|
||||
"localUploadingProgress": "Uploading {{current}} of {{total}}",
|
||||
"localDownloadingProgress": "Downloading {{current}} of {{total}}",
|
||||
"localTransferInFlight": "{{count}} at once",
|
||||
"localPreparingDownload": "Preparing download...",
|
||||
"forward": "前进",
|
||||
"up": "上一级",
|
||||
"kind": "类型",
|
||||
"localUploadingProgress": "正在上传第 {{current}} 个,共 {{total}} 个",
|
||||
"localDownloadingProgress": "正在下载第 {{current}} 个,共 {{total}} 个",
|
||||
"localTransferInFlight": "同时 {{count}} 个",
|
||||
"localPreparingDownload": "正在准备下载……",
|
||||
"localTransferCancelled": "传输已取消",
|
||||
"localNothingToTransfer": "Nothing to transfer",
|
||||
"localUploadComplete": "Uploaded {{count}} file(s)",
|
||||
"localUploadFailed": "Upload failed",
|
||||
"localUploadPartial": "Uploaded {{done}} file(s), {{failed}} failed",
|
||||
"localDownloadComplete": "Downloaded {{count}} file(s)",
|
||||
"localNothingToTransfer": "没有需要传输的内容",
|
||||
"localUploadComplete": "已上传 {{count}} 个文件",
|
||||
"localUploadFailed": "上传失败",
|
||||
"localUploadPartial": "已上传 {{done}} 个文件,{{failed}} 个失败",
|
||||
"localDownloadComplete": "已下载 {{count}} 个文件",
|
||||
"localDownloadFailed": "下载失败",
|
||||
"localDownloadPartial": "Downloaded {{done}} file(s), {{failed}} failed",
|
||||
"localReplaceExistingPrompt": "{{count}} item(s) already exist in this folder. Replace them?",
|
||||
"localDownloadPartial": "已下载 {{done}} 个文件,{{failed}} 个失败",
|
||||
"localReplaceExistingPrompt": "此文件夹中已有 {{count}} 个同名项目,是否替换?",
|
||||
"localReplace": "替换",
|
||||
"localSkipExisting": "Skip",
|
||||
"localSkippedExisting": "Skipped {{count}} existing item(s)",
|
||||
"localUnsafeNamesSkipped": "Skipped {{count}} item(s) whose names cannot be used on this computer",
|
||||
"localSkipExisting": "跳过",
|
||||
"localSkippedExisting": "已跳过 {{count}} 个现有项目",
|
||||
"localUnsafeNamesSkipped": "已跳过 {{count}} 个名称无法在此计算机上使用的项目",
|
||||
"localOpen": "打开",
|
||||
"localOpenFolder": "Open folder",
|
||||
"localUploadToRemote": "Upload to server",
|
||||
"localUploadToRemoteMany": "Upload {{count}} items to server",
|
||||
"localMoveToTrash": "Move to Trash",
|
||||
"localMoveToTrashMany": "Move {{count}} items to Trash",
|
||||
"localTrashConfirmSingle": "Move \"{{name}}\" to the Trash?",
|
||||
"localTrashConfirmFolder": "Move the folder \"{{name}}\" and all its contents to the Trash?",
|
||||
"localTrashConfirmMany": "Move {{count}} items to the Trash?",
|
||||
"localTrashed": "Moved {{count}} item(s) to the Trash",
|
||||
"localTrashFailed": "Could not move to the Trash",
|
||||
"localRenameFailed": "Rename failed",
|
||||
"localCreateFailed": "Could not create item",
|
||||
"goToParentFolder": "Go to parent folder",
|
||||
"resizeSidebar": "Drag to resize the sidebar (double-click to reset)",
|
||||
"resizeLocalPane": "Drag to resize the local pane (double-click to reset)",
|
||||
"localOpenFolder": "打开文件夹",
|
||||
"localUploadToRemote": "上传到服务器",
|
||||
"localUploadToRemoteMany": "将 {{count}} 个项目上传到服务器",
|
||||
"localMoveToTrash": "移入回收站",
|
||||
"localMoveToTrashMany": "将 {{count}} 个项目移入回收站",
|
||||
"localTrashConfirmSingle": "将“{{name}}”移入回收站?",
|
||||
"localTrashConfirmFolder": "将文件夹“{{name}}”及其中所有内容移入回收站?",
|
||||
"localTrashConfirmMany": "将 {{count}} 个项目移入回收站?",
|
||||
"localTrashed": "已将 {{count}} 个项目移入回收站",
|
||||
"localTrashFailed": "无法移入回收站",
|
||||
"localRenameFailed": "重命名失败",
|
||||
"localCreateFailed": "无法创建项目",
|
||||
"goToParentFolder": "转到父文件夹",
|
||||
"resizeSidebar": "拖动调整侧边栏宽度(双击重置)",
|
||||
"resizeLocalPane": "拖动调整本地窗格大小(双击重置)",
|
||||
"columns": "列",
|
||||
"columnsHint": "Right-click to choose columns",
|
||||
"columnsHint": "右键点击选择显示的列",
|
||||
"emptyFolder": "此文件夹为空",
|
||||
"searchFiles": "搜索文件...",
|
||||
"upload": "上传",
|
||||
@@ -203,25 +203,25 @@
|
||||
"confirmDeleteFolder": "确定要永久删除文件夹“{{name}}”及其所有内容吗?",
|
||||
"permanentDeleteWarning": "此操作无法撤销。项目将从服务器永久删除。",
|
||||
"moveToTrashWarning": "该项目将被移至 Termix 回收站,可在保留期到期前恢复。",
|
||||
"itemsMovedToTrash": "{{count}} item(s) moved to Trash",
|
||||
"itemsMovedToTrash": "已将 {{count}} 个项目移入回收站",
|
||||
"trash": "回收站",
|
||||
"trashDescription": "Deleted items are retained for {{days}} day(s) on this host.",
|
||||
"trashLoadFailed": "Failed to load Trash",
|
||||
"trashDescription": "删除的项目将在此主机上保留 {{days}} 天。",
|
||||
"trashLoadFailed": "加载回收站失败",
|
||||
"trashEmpty": "回收站是空的",
|
||||
"trashRestore": "恢复",
|
||||
"trashRestored": "Restored {{name}}",
|
||||
"trashRestoreFailed": "Failed to restore item. The original path may already exist.",
|
||||
"trashDeletePermanently": "Delete permanently",
|
||||
"trashDeleteConfirm": "Permanently delete {{name}}? This cannot be undone.",
|
||||
"trashPermanentlyDeleted": "Permanently deleted {{name}}",
|
||||
"trashDeleteFailed": "Failed to permanently delete item",
|
||||
"trashRestored": "已恢复 {{name}}",
|
||||
"trashRestoreFailed": "恢复项目失败,原路径可能已存在。",
|
||||
"trashDeletePermanently": "永久删除",
|
||||
"trashDeleteConfirm": "永久删除 {{name}}?此操作无法撤销。",
|
||||
"trashPermanentlyDeleted": "已永久删除 {{name}}",
|
||||
"trashDeleteFailed": "永久删除项目失败",
|
||||
"trashEmptyAction": "清空回收站",
|
||||
"trashEmptyConfirm": "Permanently delete every item in Trash? This cannot be undone.",
|
||||
"trashEmptyConfirm": "永久删除回收站中的所有项目?此操作无法撤销。",
|
||||
"trashEmptied": "回收站已清空",
|
||||
"trashRetention": "自动清理(N 天后)",
|
||||
"trashRetentionSaved": "回收站保留设置已更新",
|
||||
"trashRetentionFailed": "更新回收站保留设置失败",
|
||||
"trashUnavailableConfirm": "This item cannot be moved to Trash, usually because it is on another filesystem or requires elevated permissions. Delete it permanently instead?",
|
||||
"trashUnavailableConfirm": "此项目无法移入回收站,通常是因为它位于其他文件系统中或需要更高权限。是否改为永久删除?",
|
||||
"recent": "最近",
|
||||
"pinned": "已固定",
|
||||
"folderShortcuts": "文件夹快捷方式",
|
||||
@@ -303,7 +303,7 @@
|
||||
"operationCompleted": "{{operation}}了{{count}}个项目",
|
||||
"downloadFileSuccess": "文件 {{name}} 下载成功",
|
||||
"downloadFileFailed": "下载失败",
|
||||
"downloadingFile": "Downloading {{name}}…",
|
||||
"downloadingFile": "正在下载 {{name}}……",
|
||||
"downloadProgressBytes": "{{transferred}} / {{total}}",
|
||||
"moveTo": "移动到 {{name}}",
|
||||
"diffCompareWith": "与 {{name}} 对比差异",
|
||||
@@ -323,13 +323,13 @@
|
||||
"sideBySide": "并排",
|
||||
"inline": "内联",
|
||||
"fileComparison": "文件比较: {{file1}} 对比 {{file2}}",
|
||||
"fileTooLarge": "文件过大: {{error}}",
|
||||
"fileTooLarge": "文件过大(超过 10 MB),出于安全考虑无法作为文本打开。",
|
||||
"sshConnectionFailed": "SSH 连接失败。请检查您到 {{name}} ({{ip}}:{{port}}) 的连接",
|
||||
"loadFileFailed": "加载文件失败: {{error}}",
|
||||
"connecting": "连接中...",
|
||||
"connectedSuccessfully": "连接成功",
|
||||
"totpVerificationFailed": "TOTP 验证失败",
|
||||
"browserSignInFailed": "Sign-in failed. Please try again.",
|
||||
"browserSignInFailed": "登录失败,请重试。",
|
||||
"authenticationFailed": "认证失败",
|
||||
"incorrectPassphrase": "密码错误。请重试。",
|
||||
"verificationCodePrompt": "验证码:",
|
||||
@@ -361,73 +361,82 @@
|
||||
"used": "已用",
|
||||
"of": "/",
|
||||
"toggleSidebar": "切换侧边栏",
|
||||
"compactLayout": "Use compact layout",
|
||||
"comfortableLayout": "Use comfortable layout",
|
||||
"compactLayout": "使用紧凑布局",
|
||||
"comfortableLayout": "使用宽松布局",
|
||||
"cannotLoadPdf": "无法加载 PDF",
|
||||
"pdfLoadError": "加载此 PDF 文件时出错。",
|
||||
"loadingPdf": "正在加载 PDF...",
|
||||
"loadingPdf": "正在加载 PDF 查看器……",
|
||||
"loadingPage": "正在加载页面...",
|
||||
"cancel": "取消",
|
||||
"copiedItems_one": "Copied {{count}} item",
|
||||
"copiedItems_other": "Copied {{count}} items",
|
||||
"deleteCopiedFileFailed": "Could not delete the copy of {{name}}: {{error}}",
|
||||
"dragMovedItems_one": "Moved {{count}} item to {{target}}",
|
||||
"dragMovedItems_other": "Moved {{count}} items to {{target}}",
|
||||
"moveBackFileFailed": "Could not move {{name}} back: {{error}}",
|
||||
"terminal": "Terminal: {{host}} ({{path}})",
|
||||
"dragToDesktop": "Dragging {{name}} to the desktop",
|
||||
"dragFilesToDesktop": "Dragging {{count}} files to the desktop",
|
||||
"folderDragUnsupported": "Dragging folders to the desktop is not supported yet",
|
||||
"saveToDesktopFailed": "Save failed: {{error}}",
|
||||
"dragFailedDetail": "Drag failed: {{error}}",
|
||||
"videoUnsupported": "Your browser cannot play this video format.",
|
||||
"downloadToPlay": "Download to play it elsewhere",
|
||||
"cannotPreviewType": "Cannot preview this file type",
|
||||
"cannotPreviewTypeHint": "This file type has no preview. Download it to open it in another app."
|
||||
"copiedItems_one": "已复制 {{count}} 个项目",
|
||||
"copiedItems_other": "已复制 {{count}} 个项目",
|
||||
"deleteCopiedFileFailed": "无法删除 {{name}} 的副本:{{error}}",
|
||||
"dragMovedItems_one": "已将 {{count}} 个项目移至 {{target}}",
|
||||
"dragMovedItems_other": "已将 {{count}} 个项目移至 {{target}}",
|
||||
"moveBackFileFailed": "无法将 {{name}} 移回原处:{{error}}",
|
||||
"terminal": "终端:{{host}}({{path}})",
|
||||
"dragToDesktop": "正在将 {{name}} 拖到桌面",
|
||||
"dragFilesToDesktop": "正在将 {{count}} 个文件拖到桌面",
|
||||
"folderDragUnsupported": "暂不支持将文件夹拖到桌面",
|
||||
"saveToDesktopFailed": "保存失败:{{error}}",
|
||||
"dragFailedDetail": "拖放失败:{{error}}",
|
||||
"videoUnsupported": "你的浏览器无法播放此视频格式。",
|
||||
"downloadToPlay": "下载后使用其他程序播放",
|
||||
"cannotPreviewType": "无法预览此文件类型",
|
||||
"cannotPreviewTypeHint": "此文件类型不支持预览,请下载后使用其他应用打开。",
|
||||
"loadingFile": "正在加载文件……",
|
||||
"loadingImage": "正在加载图片……",
|
||||
"loadingEditor": "正在加载编辑器……",
|
||||
"loadingPreview": "正在加载预览……",
|
||||
"loadingAudio": "正在加载音频播放器……",
|
||||
"emptyPreview": "暂无可预览内容……",
|
||||
"revert": "还原",
|
||||
"openAsText": "作为文本打开",
|
||||
"confirmOpenAsText": "是否继续将此文件作为文本打开?这可能导致浏览器运行变慢。"
|
||||
},
|
||||
"sftpTransfer": {
|
||||
"title": "SFTP",
|
||||
"description": "Transfer files between two SSH hosts.",
|
||||
"sourceServer": "Source Server",
|
||||
"destinationServer": "Destination Server",
|
||||
"selectHost": "Select host",
|
||||
"description": "在两台 SSH 主机之间传输文件。",
|
||||
"sourceServer": "源服务器",
|
||||
"destinationServer": "目标服务器",
|
||||
"selectHost": "选择主机",
|
||||
"noHostSelected": "未选择主机",
|
||||
"move": "移动",
|
||||
"copy": "复制",
|
||||
"upload": "上传",
|
||||
"itemsSelected": "{{count}} item selected",
|
||||
"itemsSelected_other": "{{count}} items selected",
|
||||
"itemsSelected": "已选择 {{count}} 个项目",
|
||||
"itemsSelected_other": "已选择 {{count}} 个项目",
|
||||
"ready": "就绪",
|
||||
"loadingHosts": "正在加载主机...",
|
||||
"name": "名称",
|
||||
"modified": "修改时间",
|
||||
"size": "大小",
|
||||
"noFiles": "No files",
|
||||
"noFiles": "没有文件",
|
||||
"open": "打开",
|
||||
"up": "Up",
|
||||
"up": "上一级",
|
||||
"refresh": "刷新",
|
||||
"copyToTarget": "Copy to Target Directory",
|
||||
"copyToTarget": "复制到目标目录",
|
||||
"rename": "重命名",
|
||||
"delete": "删除",
|
||||
"editPermissions": "Edit Permissions",
|
||||
"createNewFolder": "Create New Folder",
|
||||
"deleteSelectedItems": "Delete Selected Items",
|
||||
"deleteConfirm": "Delete {{count}} selected item?",
|
||||
"deleteConfirm_other": "Delete {{count}} selected items?",
|
||||
"editPermissions": "编辑权限",
|
||||
"createNewFolder": "新建文件夹",
|
||||
"deleteSelectedItems": "删除所选项目",
|
||||
"deleteConfirm": "删除选中的 {{count}} 个项目?",
|
||||
"deleteConfirm_other": "删除选中的 {{count}} 个项目?",
|
||||
"cancel": "取消",
|
||||
"save": "保存",
|
||||
"folderCreated": "Folder created",
|
||||
"itemRenamed": "Item renamed",
|
||||
"folderCreated": "文件夹已创建",
|
||||
"itemRenamed": "项目已重命名",
|
||||
"actionFailed": "操作失败",
|
||||
"itemsDeleted": "{{count}} item deleted",
|
||||
"itemsDeleted_other": "{{count}} items deleted",
|
||||
"deleteFailed": "Delete failed",
|
||||
"permissionsUpdated": "Permissions updated",
|
||||
"noRemoteSessionConnected": "No remote session connected",
|
||||
"itemsDeleted": "已删除 {{count}} 个项目",
|
||||
"itemsDeleted_other": "已删除 {{count}} 个项目",
|
||||
"deleteFailed": "删除失败",
|
||||
"permissionsUpdated": "权限已更新",
|
||||
"noRemoteSessionConnected": "尚未连接远程会话",
|
||||
"failedToListFiles": "文件列表失败",
|
||||
"failedToRefresh": "Failed to refresh",
|
||||
"destinationInsideSource": "Destination cannot be inside the selected source path.",
|
||||
"sameHostNoOp": "Source and destination are the same folder."
|
||||
"failedToRefresh": "刷新失败",
|
||||
"destinationInsideSource": "目标路径不能位于所选源路径内。",
|
||||
"sameHostNoOp": "源路径与目标路径为同一文件夹。"
|
||||
},
|
||||
"hosts": {
|
||||
"fileManager": "文件管理器",
|
||||
@@ -438,7 +447,7 @@
|
||||
"loadingHost": "正在加载主机..."
|
||||
},
|
||||
"onboarding": {
|
||||
"feature_files": "File manager",
|
||||
"feature_files": "文件管理器",
|
||||
"feature_files_desc": "无需离开应用,即可通过 SFTP 浏览、上传、下载及编辑文件。"
|
||||
},
|
||||
"terminal": {
|
||||
@@ -464,7 +473,7 @@
|
||||
"destinationPath": "目标路径",
|
||||
"destMustBeDirectory": "对于多项目传输,目标必须是一个目录",
|
||||
"goUp": "向上",
|
||||
"hostAuthRequired": "Authentication required. Open File Manager on this host first",
|
||||
"hostAuthRequired": "需要身份验证,请先在此主机上打开文件管理器",
|
||||
"hostConnecting": "连接中…",
|
||||
"hostConnectionFailed": "连接失败",
|
||||
"hostDisconnected": "未连接",
|
||||
@@ -485,12 +494,12 @@
|
||||
"methodReason": {
|
||||
"user_item_sftp": "您选择了逐文件 SFTP。",
|
||||
"user_tar": "您选择了 Tar 归档。",
|
||||
"tar_unavailable": "Tar is not available on one or both hosts, so per-file SFTP will be used instead.",
|
||||
"windows_host": "A Windows host is involved, so tar is not used.",
|
||||
"auto_multi_large": "Auto: multiple files including a large file ({{largestSize}}) with compressible data. Tar bundles them into one transfer.",
|
||||
"auto_single_large_in_archive": "Auto: one large file ({{largestSize}}) in this set, so per-file SFTP.",
|
||||
"auto_many_incompressible": "Auto: mostly incompressible data, so per-file SFTP.",
|
||||
"auto_many_files": "Auto: many files ({{fileCount}}), tar cuts the per-file overhead.",
|
||||
"tar_unavailable": "一台或两台主机未安装 tar,将改为逐文件使用 SFTP 传输。",
|
||||
"windows_host": "传输涉及 Windows 主机,因此不使用 tar。",
|
||||
"auto_multi_large": "自动选择:多个文件中包含可压缩的大文件({{largestSize}}),使用 tar 打包后统一传输。",
|
||||
"auto_single_large_in_archive": "自动选择:文件集中包含一个大文件({{largestSize}}),采用逐文件 SFTP 传输。",
|
||||
"auto_many_incompressible": "自动选择:数据大多不可压缩,采用逐文件 SFTP 传输。",
|
||||
"auto_many_files": "自动选择:文件较多({{fileCount}} 个),使用 tar 减少逐文件传输开销。",
|
||||
"auto_default": "自动:此集合使用逐文件 SFTP。"
|
||||
},
|
||||
"methodTar": "Tar 归档",
|
||||
@@ -498,11 +507,11 @@
|
||||
"metricsCompress": "源端压缩:{{duration}}",
|
||||
"metricsExtract": "目标端解压:{{duration}}",
|
||||
"metricsPrepare": "准备目标:{{duration}}",
|
||||
"metricsRouteBenchmark": "Route probe: direct {{direct}}, relay {{relay}}",
|
||||
"metricsRouteBenchmark": "路径探测:直连 {{direct}},中转 {{relay}}",
|
||||
"metricsSourceDelete": "从源端删除:{{duration}}",
|
||||
"metricsTotal": "总计:{{duration}}",
|
||||
"metricsTransfer": "端到端:{{throughput}} ({{duration}})",
|
||||
"metricsVerify": "SHA-256 verified: {{duration}}",
|
||||
"metricsVerify": "SHA-256 校验通过:{{duration}}",
|
||||
"moveFolderToHost": "移动文件夹到主机…",
|
||||
"moveItemsToHost": "移动 {{count}} 个项目到主机…",
|
||||
"moveToHost": "移动到主机…",
|
||||
@@ -511,7 +520,7 @@
|
||||
"parallelSegmentsHint": "大文件会被拆分为 256 MB 的块。多个通道使用独立连接(如同同时进行多个传输),以获得更高的总吞吐量。",
|
||||
"parallelSegmentsLabel": "并行传输通道",
|
||||
"parallelSegmentsOption": "{{count}} 个通道",
|
||||
"progressBenchmarking": "Selecting the fastest transfer route…",
|
||||
"progressBenchmarking": "正在选择最快的传输路径……",
|
||||
"progressBytes": "{{transferred}} / {{total}}",
|
||||
"progressCancel": "取消",
|
||||
"progressCancelling": "正在取消…",
|
||||
@@ -523,7 +532,7 @@
|
||||
"progressTotalSpeed": "{{speed}} 总计({{lanes}} 通道)",
|
||||
"progressTransferring": "正在传输数据…",
|
||||
"progressTransferringItems": "正在传输文件({{current}}/{{total}})…",
|
||||
"progressVerifying": "Verifying file integrity…",
|
||||
"progressVerifying": "正在校验文件完整性……",
|
||||
"recentDestinations": "最近目标",
|
||||
"resumedHint": "已重新连接到在另一个窗口中启动的进行中的传输。",
|
||||
"retryTransfer": "重试",
|
||||
@@ -539,5 +548,8 @@
|
||||
"metricsHopSourceRead": "源 → 服务器:{{throughput}}",
|
||||
"metricsHopDestSftpWrite": "服务器 → 目标 (SFTP):{{throughput}}",
|
||||
"metricsHopDestLocalWrite": "服务器 → 目标 (本地):{{throughput}}"
|
||||
},
|
||||
"plugin": {
|
||||
"name": "文件管理器"
|
||||
}
|
||||
}
|
||||
@@ -350,7 +350,9 @@ export function FileViewer({
|
||||
<div className="h-full flex items-center justify-center">
|
||||
<div className="text-center">
|
||||
<div className="animate-spin rounded-full h-8 w-8 border-b-2 border-blue-500 mx-auto mb-4"></div>
|
||||
<p className="text-sm text-muted-foreground">Loading file...</p>
|
||||
<p className="text-sm text-muted-foreground">
|
||||
{t("fileManager.loadingFile")}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
@@ -446,7 +448,7 @@ export function FileViewer({
|
||||
className="flex items-center gap-2"
|
||||
>
|
||||
<RotateCcw className="w-4 h-4" />
|
||||
Revert
|
||||
{t("fileManager.revert")}
|
||||
</Button>
|
||||
<Button
|
||||
variant="default"
|
||||
@@ -456,7 +458,7 @@ export function FileViewer({
|
||||
className="flex items-center gap-2"
|
||||
>
|
||||
<Save className="w-4 h-4" />
|
||||
Save
|
||||
{t("common.save")}
|
||||
</Button>
|
||||
</>
|
||||
)}
|
||||
@@ -647,14 +649,12 @@ export function FileViewer({
|
||||
{isTooLarge ? (
|
||||
<div className="bg-destructive/10 border border-destructive/30 rounded p-3 mb-4">
|
||||
<p className="text-sm text-destructive font-medium">
|
||||
File is too large (> 10MB) and cannot be opened as
|
||||
text for security reasons.
|
||||
{t("fileManager.fileTooLarge")}
|
||||
</p>
|
||||
</div>
|
||||
) : (
|
||||
<p className="text-sm text-muted-foreground mb-4">
|
||||
Do you want to continue opening this file as text? This
|
||||
may slow down your browser.
|
||||
{t("fileManager.confirmOpenAsText")}
|
||||
</p>
|
||||
)}
|
||||
</div>
|
||||
@@ -669,7 +669,7 @@ export function FileViewer({
|
||||
className="flex items-center gap-2"
|
||||
>
|
||||
<FileText className="w-4 h-4" />
|
||||
Open as Text
|
||||
{t("fileManager.openAsText")}
|
||||
</Button>
|
||||
)}
|
||||
<Button
|
||||
@@ -686,7 +686,7 @@ export function FileViewer({
|
||||
size="sm"
|
||||
onClick={handleCancelOpenAsText}
|
||||
>
|
||||
Cancel
|
||||
{t("common.cancel")}
|
||||
</Button>
|
||||
</div>
|
||||
</div>
|
||||
@@ -694,7 +694,9 @@ export function FileViewer({
|
||||
)}
|
||||
|
||||
{fileTypeInfo.type === "image" && !showLargeFileWarning && (
|
||||
<Suspense fallback={<PreviewFallback label="Loading image..." />}>
|
||||
<Suspense
|
||||
fallback={<PreviewFallback label={t("fileManager.loadingImage")} />}
|
||||
>
|
||||
<ImagePreview
|
||||
content={content}
|
||||
fileName={file.name}
|
||||
@@ -708,7 +710,9 @@ export function FileViewer({
|
||||
<div className="h-full flex flex-col">
|
||||
{isEditable ? (
|
||||
<Suspense
|
||||
fallback={<PreviewFallback label="Loading editor..." />}
|
||||
fallback={
|
||||
<PreviewFallback label={t("fileManager.loadingEditor")} />
|
||||
}
|
||||
>
|
||||
<CodeEditor
|
||||
ref={editorRef}
|
||||
@@ -857,12 +861,16 @@ export function FileViewer({
|
||||
<div className="p-4">
|
||||
<Suspense
|
||||
fallback={
|
||||
<PreviewFallback label="Loading preview..." />
|
||||
<PreviewFallback
|
||||
label={t("fileManager.loadingPreview")}
|
||||
/>
|
||||
}
|
||||
>
|
||||
<MarkdownRenderer
|
||||
compact
|
||||
content={editedContent || "Nothing to preview yet..."}
|
||||
content={
|
||||
editedContent || t("fileManager.emptyPreview")
|
||||
}
|
||||
/>
|
||||
</Suspense>
|
||||
</div>
|
||||
@@ -872,7 +880,11 @@ export function FileViewer({
|
||||
<div className="flex-1 overflow-auto thin-scrollbar p-6">
|
||||
<div className="max-w-4xl mx-auto">
|
||||
<Suspense
|
||||
fallback={<PreviewFallback label="Loading preview..." />}
|
||||
fallback={
|
||||
<PreviewFallback
|
||||
label={t("fileManager.loadingPreview")}
|
||||
/>
|
||||
}
|
||||
>
|
||||
<MarkdownRenderer content={editedContent} />
|
||||
</Suspense>
|
||||
@@ -885,7 +897,7 @@ export function FileViewer({
|
||||
|
||||
{fileTypeInfo.type === "pdf" && !showLargeFileWarning && (
|
||||
<Suspense
|
||||
fallback={<PreviewFallback label="Loading PDF viewer..." />}
|
||||
fallback={<PreviewFallback label={t("fileManager.loadingPdf")} />}
|
||||
>
|
||||
<PdfPreview
|
||||
content={content}
|
||||
@@ -897,7 +909,7 @@ export function FileViewer({
|
||||
|
||||
{fileTypeInfo.type === "audio" && !showLargeFileWarning && (
|
||||
<Suspense
|
||||
fallback={<PreviewFallback label="Loading audio player..." />}
|
||||
fallback={<PreviewFallback label={t("fileManager.loadingAudio")} />}
|
||||
>
|
||||
<AudioPreview
|
||||
file={file}
|
||||
@@ -940,7 +952,7 @@ export function FileViewer({
|
||||
<span>{file.path}</span>
|
||||
{hasChanges && (
|
||||
<span className="text-orange-600 font-medium">
|
||||
● Unsaved changes
|
||||
● {t("common.unsavedChanges")}
|
||||
</span>
|
||||
)}
|
||||
</div>
|
||||
|
||||
@@ -103,7 +103,9 @@ export function ImagePreview({
|
||||
<div className="absolute inset-0 flex items-center justify-center bg-background/80">
|
||||
<div className="text-center">
|
||||
<div className="animate-spin rounded-full h-8 w-8 border-b-2 border-blue-500 mx-auto mb-2"></div>
|
||||
<p className="text-sm text-muted-foreground">Loading image...</p>
|
||||
<p className="text-sm text-muted-foreground">
|
||||
{t("fileManager.loadingImage")}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
|
||||
Reference in new issue
Block a user