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:
ZacharyZcR authored and GitHub committed 2026-10-03 21:37:00 +08:00
1 parent 13f5736d8f
commit 0214a81e5d
78 files changed
+2423 -1833

No files matched your search

+15 -3
View File
@@ -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"
}
}
+135 -123
View File
@@ -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 (&gt; 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>
)}