From 71f4a91c3c0aec49d38652f190298813dd555110 Mon Sep 17 00:00:00 2001 From: kura Date: Mon, 11 May 2026 15:42:03 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9Ei18n?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/i18n/index.ts | 20 ++ src/i18n/locales/en-US.ts | 219 +++++++++++++++ src/i18n/locales/ja-JP.ts | 219 +++++++++++++++ src/i18n/locales/zh-CN.ts | 219 +++++++++++++++ src/main.ts | 2 + src/pages/file/index.vue | 264 +++++++++++++----- src/pages/file/item/clipboard.vue | 21 +- src/pages/file/item/desptopView.vue | 111 +++++--- .../file/item/filePermissionSetDialog.vue | 29 +- src/pages/file/item/fileReader.vue | 47 ++-- src/pages/file/item/fileTranserView.vue | 21 +- src/pages/file/item/fileView.vue | 132 +++++---- src/pages/pointShader/pointShader.vue | 2 +- src/pages/voice/webrtcVoice.vue | 228 ++++++++------- 14 files changed, 1196 insertions(+), 338 deletions(-) create mode 100644 src/i18n/index.ts create mode 100644 src/i18n/locales/en-US.ts create mode 100644 src/i18n/locales/ja-JP.ts create mode 100644 src/i18n/locales/zh-CN.ts diff --git a/src/i18n/index.ts b/src/i18n/index.ts new file mode 100644 index 0000000..8da071b --- /dev/null +++ b/src/i18n/index.ts @@ -0,0 +1,20 @@ +import { createI18n } from "vue-i18n"; +import zhCN from "./locales/zh-CN"; +import enUS from "./locales/en-US"; +import jaJP from "./locales/ja-JP"; + +const messages = { + "zh-CN": zhCN, + "en-US": enUS, + "ja-JP": jaJP, +}; + +const i18n = createI18n({ + locale: 'zh-CN', + fallbackLocale: "zh-CN", + messages, + legacy: false, + globalInjection: true, +}); + +export default i18n; diff --git a/src/i18n/locales/en-US.ts b/src/i18n/locales/en-US.ts new file mode 100644 index 0000000..a310657 --- /dev/null +++ b/src/i18n/locales/en-US.ts @@ -0,0 +1,219 @@ +export default { + common: { + confirm: 'Confirm', + cancel: 'Cancel', + copy: 'Copy', + delete: 'Delete', + create: 'Create', + save: 'Save', + edit: 'Edit', + close: 'Close', + rename: 'Rename', + refresh: 'Refresh', + download: 'Download', + send: 'Send', + receive: 'Receive', + share: 'Share', + connect: 'Connect', + connected: 'Connected', + connecting: 'Connecting...', + disconnect: 'Disconnect', + loading: 'Loading...', + noContent: 'No Content', + success: 'Success', + failed: 'Failed', + error: 'Error', + unknownError: 'Unknown Error', + pleaseWait: 'Please wait...', + inputPlaceholder: 'Please enter', + search: 'Search', + okText: 'OK', + cancelText: 'Cancel', + warning: 'Warning', + createSuccess: 'Created successfully', + deleteSuccess: 'Deleted successfully', + renameSuccess: 'Renamed successfully', + copySuccess: 'Copied successfully', + operationFailed: 'Operation failed', + }, + + fileView: { + parentDir: 'Parent Directory', + sortByName: 'By Name', + sortBySize: 'By Size', + sortByType: 'By Type', + sortByDate: 'By Date', + permissionSettings: 'Permission Settings', + initialize: 'Initialize', + selectDirHint: 'Please select a directory', + selectDirectory: 'Select Directory', + refresh: 'Refresh', + newFolder: 'New Folder', + newFile: 'New File', + delete: 'Delete', + rename: 'Rename', + download: 'Download', + selectLocalDir: 'Select Local Directory', + confirmDelete: 'Confirm Delete', + deleteConfirmContent: 'Are you sure to delete the following files?
{files}
Total {count} file(s)', + renameTitle: 'Rename', + inputNewName: 'Please enter a new name', + inputFolderName: 'Please enter folder name', + inputFileName: 'Please enter file name', + createFolderTitle: 'New Folder', + createFileTitle: 'New File', + warningInputFolderName: 'Please enter folder name', + warningInputFileName: 'Please enter file name', + deleteBtn: 'Delete', + cancelBtn: 'Cancel', + createBtn: 'Create', + }, + + fileReader: { + remoteTransfer: 'Remote Transfer', + browserDownload: 'Browser Download', + save: 'Save', + edit: 'Edit', + close: 'Close', + autoDetect: 'Auto Detect', + other: 'Other', + videoNotSupported: 'Your browser does not support video playback', + audioNotSupported: 'Your browser does not support audio playback', + fileTooLarge: 'File too large to preview, please transfer to view', + unsupportedType: 'Preview not supported for this file type', + openAsText: 'Open as Text', + downloadTitle: 'Download File', + downloadConfirm: 'Are you sure to download {name}?', + saveFailed: 'Failed to save file', + editor: 'Editor', + preview: 'Preview', + }, + + index: { + myId: 'My ID', + waitingForConnection: 'Waiting for connection...', + copy: 'Copy', + share: 'Share', + connectedBy: 'Connected By', + connected: 'Connected', + traffic: 'Traffic', + packets: 'Packets', + enterPeerId: 'Enter peer ID', + connect: 'Connect', + connectedBtn: 'Connected', + send: 'Send', + receive: 'Receive', + desktopPreview: 'Desktop Preview', + voiceCall: 'Voice Call', + camera: 'Camera', + linkCopied: 'Link Copied', + linkCopiedDesc: 'Successfully copied to clipboard', + idCopied: 'ID Copied', + idCopiedDesc: 'Successfully copied to clipboard', + idCopiedConnectDesc: 'Successfully copied to clipboard, ready to connect', + copyFailed: 'Copy failed', + notCompleted: 'Not Completed', + inDevelopment: 'In development...', + connectSuccess: 'Connected successfully', + newConnection: 'New connection appeared', + errorOccurred: 'An error occurred', + disconnected: 'Disconnected', + receiveFilesFailed: 'Failed to receive files', + kuraaFooter: 'kuraa', + shareUrl: 'Share Link', + }, + + clipboard: { + getRemoteClipboard: 'Get Remote Clipboard', + noContent: 'No Content', + fetchSuccess: 'Fetched successfully', + fetchFailed: 'Failed to fetch', + unknownError: 'Unknown Error', + }, + + transfer: { + title: 'Transfer List', + clear: 'Clear', + waiting: 'Waiting', + sending: 'Sending', + receiving: 'Receiving', + completed: 'Completed', + error: 'Error', + paused: 'Paused', + }, + + permission: { + title: 'Permission Settings', + edit: 'Edit Permission', + view: 'View Permission', + download: 'Download Permission', + desktop: 'Desktop Preview Permission', + call: 'Voice Call Permission', + camera: 'Camera Permission', + editDesc: 'Allow creating, modifying and deleting files and folders', + viewDesc: 'Allow viewing file contents and directory structure', + downloadDesc: 'Allow transferring files to local', + desktopDesc: 'Allow peer to request desktop preview', + callDesc: 'Allow peer to request voice call', + cameraDesc: 'Allow peer to request camera access', + }, + + desktop: { + remoteDesktop: 'Remote Desktop', + waitingForDesktop: 'Waiting for desktop sharing...', + endSharing: 'End Sharing', + collapseDesktop: 'Collapse Desktop', + expandDesktop: 'Expand Desktop', + soundOn: 'Sound On', + soundOff: 'Mute', + fullscreen: 'Fullscreen', + exitFullscreen: 'Exit', + enableSound: 'Enable Sound', + disableSound: 'Mute', + desktopBeingViewed: 'Desktop is being viewed', + peerViewingDesktop: 'Peer is viewing your desktop', + expandDesktopHint: 'Expand desktop preview hint', + remoteCamera: 'Remote Camera', + waitingForCamera: 'Waiting for camera feed...', + collapseCamera: 'Collapse Camera', + endCamera: 'End Camera', + expandCamera: 'Expand Camera', + cameraBeingViewed: 'Camera is being viewed', + peerViewingCamera: 'Peer is viewing your camera', + expandCameraHint: 'Expand camera preview hint', + cameraRequest: 'Camera Request', + voiceCallRequest: 'Voice Call Request', + peerRequestCamera: 'Peer requests to view your camera', + peerRequestCall: 'Peer requests a voice call', + reject: 'Reject', + accept: 'Accept', + voiceCall: 'Voice Call', + collapseCall: 'Collapse Call', + endCall: 'End Call', + inCall: 'In Call', + connecting: 'Connecting...', + unmute: 'Unmute', + mute: 'Mute', + expandCall: 'Expand Call', + }, + + voice: { + myId: 'My ID', + preparing: 'Preparing connection...', + ready: 'Ready', + inCall: 'In Call', + enterPeerId: 'Enter peer ID', + call: 'Call', + endCall: 'End Call', + unmute: 'Unmute', + mute: 'Mute', + delay: 'Delay', + copy: 'Copy', + cannotAccessMic: 'Cannot access microphone', + connectionError: 'Connection Error', + }, + + shader: { + uploadImageVideo: 'Upload Image/Video', + }, +} diff --git a/src/i18n/locales/ja-JP.ts b/src/i18n/locales/ja-JP.ts new file mode 100644 index 0000000..ba5df9b --- /dev/null +++ b/src/i18n/locales/ja-JP.ts @@ -0,0 +1,219 @@ +export default { + common: { + confirm: '確認', + cancel: 'キャンセル', + copy: 'コピー', + delete: '削除', + create: '作成', + save: '保存', + edit: '編集', + close: '閉じる', + rename: '名前変更', + refresh: '更新', + download: 'ダウンロード', + send: '送信', + receive: '受信', + share: '共有', + connect: '接続', + connected: '接続済み', + connecting: '接続中...', + disconnect: '切断', + loading: '読み込み中...', + noContent: 'コンテンツなし', + success: '成功', + failed: '失敗', + error: 'エラー', + unknownError: '不明なエラー', + pleaseWait: 'しばらくお待ちください...', + inputPlaceholder: '入力してください', + search: '検索', + okText: '確認', + cancelText: 'キャンセル', + warning: '注意', + createSuccess: '作成しました', + deleteSuccess: '削除しました', + renameSuccess: '名前を変更しました', + copySuccess: 'コピーしました', + operationFailed: '操作に失敗しました', + }, + + fileView: { + parentDir: '親ディレクトリ', + sortByName: '名前順', + sortBySize: 'サイズ順', + sortByType: '種類順', + sortByDate: '日付順', + permissionSettings: '権限設定', + initialize: '初期化', + selectDirHint: 'ディレクトリを選択してください', + selectDirectory: 'ディレクトリを選択', + refresh: '更新', + newFolder: '新しいフォルダ', + newFile: '新しいファイル', + delete: '削除', + rename: '名前変更', + download: 'ダウンロード', + selectLocalDir: 'ローカルディレクトリを選択', + confirmDelete: '削除の確認', + deleteConfirmContent: '以下のファイルを削除してもよろしいですか?
{files}
合計 {count} 個のファイル', + renameTitle: '名前変更', + inputNewName: '新しい名前を入力してください', + inputFolderName: 'フォルダ名を入力してください', + inputFileName: 'ファイル名を入力してください', + createFolderTitle: '新しいフォルダ', + createFileTitle: '新しいファイル', + warningInputFolderName: 'フォルダ名を入力してください', + warningInputFileName: 'ファイル名を入力してください', + deleteBtn: '削除', + cancelBtn: 'キャンセル', + createBtn: '作成', + }, + + fileReader: { + remoteTransfer: 'リモート転送', + browserDownload: 'ブラウザダウンロード', + save: '保存', + edit: '編集', + close: '閉じる', + autoDetect: '自動検出', + other: 'その他', + videoNotSupported: 'お使いのブラウザは動画再生に対応していません', + audioNotSupported: 'お使いのブラウザは音声再生に対応していません', + fileTooLarge: 'ファイルが大きすぎるためプレビューできません。転送してご確認ください', + unsupportedType: 'このファイル形式はプレビューに対応していません', + openAsText: 'テキストとして開く', + downloadTitle: 'ファイルのダウンロード', + downloadConfirm: '{name}をダウンロードしてもよろしいですか?', + saveFailed: 'ファイルの保存に失敗しました', + editor: 'エディタ', + preview: 'プレビュー', + }, + + index: { + myId: 'マイID', + waitingForConnection: '接続を待っています...', + copy: 'コピー', + share: '共有', + connectedBy: '接続されました', + connected: '接続済み', + traffic: 'トラフィック', + packets: 'パケット数', + enterPeerId: '相手のIDを入力', + connect: '接続', + connectedBtn: '接続済み', + send: '送信', + receive: '受信', + desktopPreview: 'デスクトッププレビュー', + voiceCall: '音声通話', + camera: 'カメラ', + linkCopied: 'リンクをコピーしました', + linkCopiedDesc: 'クリップボードにコピーしました', + idCopied: 'IDをコピーしました', + idCopiedDesc: 'クリップボードにコピーしました', + idCopiedConnectDesc: 'クリップボードにコピーしました。接続に使用できます', + copyFailed: 'コピーに失敗しました', + notCompleted: '未完了', + inDevelopment: '開発中...', + connectSuccess: '接続しました', + newConnection: '新しい接続がありました', + errorOccurred: 'エラーが発生しました', + disconnected: '切断されました', + receiveFilesFailed: 'ファイルの受信に失敗しました', + kuraaFooter: 'kuraa', + shareUrl: 'リンクを共有', + }, + + clipboard: { + getRemoteClipboard: '相手のクリップボードを取得', + noContent: 'コンテンツなし', + fetchSuccess: '取得成功', + fetchFailed: '取得に失敗しました', + unknownError: '不明なエラー', + }, + + transfer: { + title: '転送リスト', + clear: 'クリア', + waiting: '待機中', + sending: '送信中', + receiving: '受信中', + completed: '完了', + error: 'エラー', + paused: '一時停止', + }, + + permission: { + title: '権限設定', + edit: '編集権限', + view: '閲覧権限', + download: 'ダウンロード権限', + desktop: 'デスクトッププレビュー権限', + call: '音声通話権限', + camera: 'カメラ権限', + editDesc: 'ファイルとフォルダの作成、変更、削除を許可', + viewDesc: 'ファイルの内容とディレクトリ構成の表示を許可', + downloadDesc: 'ローカルへのファイル転送を許可', + desktopDesc: '相手からのデスクトッププレビュー要求を許可', + callDesc: '相手からの音声通話要求を許可', + cameraDesc: '相手からのカメラアクセス要求を許可', + }, + + desktop: { + remoteDesktop: 'リモートデスクトップ', + waitingForDesktop: 'デスクトップ共有を待っています...', + endSharing: '共有を終了', + collapseDesktop: 'デスクトップを折りたたむ', + expandDesktop: 'デスクトップを展開', + soundOn: '音声ON', + soundOff: 'ミュート', + fullscreen: '全画面', + exitFullscreen: '終了', + enableSound: '音声を有効にする', + disableSound: 'ミュート', + desktopBeingViewed: 'デスクトップが表示されています', + peerViewingDesktop: '相手があなたのデスクトップを表示しています', + expandDesktopHint: 'デスクトッププレビューヒントを展開', + remoteCamera: 'リモートカメラ', + waitingForCamera: 'カメラ映像を待っています...', + collapseCamera: 'カメラを折りたたむ', + endCamera: 'カメラを終了', + expandCamera: 'カメラを展開', + cameraBeingViewed: 'カメラが表示されています', + peerViewingCamera: '相手があなたのカメラを表示しています', + expandCameraHint: 'カメラプレビューヒントを展開', + cameraRequest: 'カメラリクエスト', + voiceCallRequest: '音声通話リクエスト', + peerRequestCamera: '相手がカメラの表示を要求しています', + peerRequestCall: '相手が音声通話を要求しています', + reject: '拒否', + accept: '応答', + voiceCall: '音声通話', + collapseCall: '通話を折りたたむ', + endCall: '通話を終了', + inCall: '通話中', + connecting: '接続を確立しています...', + unmute: 'ミュート解除', + mute: 'ミュート', + expandCall: '通話を展開', + }, + + voice: { + myId: 'マイID', + preparing: '接続準備中...', + ready: '準備完了', + inCall: '通話中', + enterPeerId: '相手のIDを入力', + call: '発信', + endCall: '通話を終了', + unmute: 'ミュート解除', + mute: 'ミュート', + delay: '遅延時間', + copy: 'コピー', + cannotAccessMic: 'マイクにアクセスできません', + connectionError: '接続エラー', + }, + + shader: { + uploadImageVideo: '画像/動画をアップロード', + }, +} diff --git a/src/i18n/locales/zh-CN.ts b/src/i18n/locales/zh-CN.ts new file mode 100644 index 0000000..6769abd --- /dev/null +++ b/src/i18n/locales/zh-CN.ts @@ -0,0 +1,219 @@ +export default { + common: { + confirm: '确定', + cancel: '取消', + copy: '复制', + delete: '删除', + create: '创建', + save: '保存', + edit: '编辑', + close: '关闭', + rename: '重命名', + refresh: '刷新', + download: '下载', + send: '发送', + receive: '接收', + share: '分享', + connect: '连接', + connected: '已连接', + connecting: '连接中...', + disconnect: '断开', + loading: '加载中...', + noContent: '暂无内容', + success: '成功', + failed: '失败', + error: '错误', + unknownError: '未知错误', + pleaseWait: '请稍后...', + inputPlaceholder: '请输入', + search: '搜索', + okText: '确定', + cancelText: '取消', + warning: '提示', + createSuccess: '创建成功', + deleteSuccess: '删除成功', + renameSuccess: '重命名成功', + copySuccess: '复制成功', + operationFailed: '操作失败', + }, + + fileView: { + parentDir: '上级目录', + sortByName: '按名称', + sortBySize: '按大小', + sortByType: '按类型', + sortByDate: '按日期', + permissionSettings: '权限设置', + initialize: '初始化', + selectDirHint: '请选择一个目录', + selectDirectory: '选择目录', + refresh: '刷新', + newFolder: '新建文件夹', + newFile: '新建文件', + delete: '删除', + rename: '重命名', + download: '下载', + selectLocalDir: '选择本地目录', + confirmDelete: '确认删除', + deleteConfirmContent: '确定要删除以下文件吗?
{files}
共 {count} 个文件', + renameTitle: '重命名', + inputNewName: '请输入新的名称', + inputFolderName: '请输入文件夹名称', + inputFileName: '请输入文件名称', + createFolderTitle: '新建文件夹', + createFileTitle: '新建文件', + warningInputFolderName: '请输入文件夹名称', + warningInputFileName: '请输入文件名称', + deleteBtn: '删除', + cancelBtn: '取消', + createBtn: '创建', + }, + + fileReader: { + remoteTransfer: '远程传输', + browserDownload: '浏览器下载', + save: '保存', + edit: '编辑', + close: '关闭', + autoDetect: '自动检测', + other: '其他', + videoNotSupported: '您的浏览器不支持视频播放', + audioNotSupported: '您的浏览器不支持音频播放', + fileTooLarge: '文件过大,无法预览,请传输后查看', + unsupportedType: '不支持预览该类型的文件', + openAsText: '以文本打开', + downloadTitle: '下载文件', + downloadConfirm: '确定要下载{name}吗?', + saveFailed: '保存文件失败', + editor: '编辑器', + preview: '预览', + }, + + index: { + myId: '我的ID', + waitingForConnection: '等待连接...', + copy: '复制', + share: '分享', + connectedBy: '被连接', + connected: '已连接', + traffic: '流量', + packets: '包数', + enterPeerId: '输入对方ID', + connect: '连接', + connectedBtn: '已连接', + send: '发送', + receive: '接收', + desktopPreview: '桌面预览', + voiceCall: '语音通话', + camera: '摄像头', + linkCopied: '链接已复制', + linkCopiedDesc: '已成功复制到剪贴板', + idCopied: 'ID已复制', + idCopiedDesc: '已成功复制到剪贴板', + idCopiedConnectDesc: '已成功复制到剪贴板,可用于发起连接', + copyFailed: '复制失败', + notCompleted: '未完成', + inDevelopment: '开发中...', + connectSuccess: '连接成功', + newConnection: '出现新的连接', + errorOccurred: '发生错误', + disconnected: '连接已断开', + receiveFilesFailed: '接收文件失败', + kuraaFooter: 'kuraa', + shareUrl: '分享链接', + }, + + clipboard: { + getRemoteClipboard: '获取对方粘贴板', + noContent: '暂无内容', + fetchSuccess: '获取成功', + fetchFailed: '获取失败', + unknownError: '未知错误', + }, + + transfer: { + title: '传输列表', + clear: '清理', + waiting: '等待中', + sending: '发送中', + receiving: '接收中', + completed: '已完成', + error: '失败', + paused: '已暂停', + }, + + permission: { + title: '权限设置', + edit: '编辑权限', + view: '查看权限', + download: '下载权限', + desktop: '桌面预览权限', + call: '语音通话权限', + camera: '摄像头权限', + editDesc: '允许创建、修改、删除文件和文件夹', + viewDesc: '允许查看文件内容和目录结构', + downloadDesc: '允许传输文件到本地', + desktopDesc: '允许对方请求预览当前桌面', + callDesc: '允许对方请求语音通话', + cameraDesc: '允许对方请求查看当前摄像头', + }, + + desktop: { + remoteDesktop: '远程桌面', + waitingForDesktop: '等待桌面共享...', + endSharing: '结束共享', + collapseDesktop: '收起桌面', + expandDesktop: '展开桌面', + soundOn: '出声', + soundOff: '静音', + fullscreen: '全屏', + exitFullscreen: '退出', + enableSound: '开启声音', + disableSound: '静音', + desktopBeingViewed: '桌面正在被预览', + peerViewingDesktop: '对方正在查看你的桌面', + expandDesktopHint: '展开桌面预览提示', + remoteCamera: '远程摄像头', + waitingForCamera: '等待摄像头画面...', + collapseCamera: '收起摄像头', + endCamera: '结束摄像头', + expandCamera: '展开摄像头', + cameraBeingViewed: '摄像头正在被预览', + peerViewingCamera: '对方正在查看你的摄像头', + expandCameraHint: '展开摄像头预览提示', + cameraRequest: '摄像头请求', + voiceCallRequest: '语音通话请求', + peerRequestCamera: '对方请求查看摄像头', + peerRequestCall: '对方请求语音通话', + reject: '拒绝', + accept: '接听', + voiceCall: '语音通话', + collapseCall: '收起通话', + endCall: '结束通话', + inCall: '通话中', + connecting: '正在建立连接...', + unmute: '取消静音', + mute: '静音', + expandCall: '展开通话', + }, + + voice: { + myId: '我的ID', + preparing: '准备连接...', + ready: '准备就绪', + inCall: '通话中', + enterPeerId: '输入对方的ID', + call: '呼叫', + endCall: '结束通话', + unmute: '取消静音', + mute: '静音', + delay: '延迟时间', + copy: '复制', + cannotAccessMic: '无法访问麦克风', + connectionError: '连接错误', + }, + + shader: { + uploadImageVideo: '上传图片/视频', + }, +} diff --git a/src/main.ts b/src/main.ts index a28e35e..14f903f 100644 --- a/src/main.ts +++ b/src/main.ts @@ -3,6 +3,7 @@ import App from './App.vue' import 'ant-design-vue/dist/reset.css'; import Antd from 'ant-design-vue'; import router from './router/router'; +import i18n from './i18n'; import { registerSW } from 'virtual:pwa-register' import { isPwa, showPwaInstallPrompt } from './utils/pwa'; @@ -25,4 +26,5 @@ const updateSW = registerSW({ const app = createApp(App); app.use(Antd); app.use(router); +app.use(i18n); app.mount('#app') diff --git a/src/pages/file/index.vue b/src/pages/file/index.vue index 5fb14ad..4f64943 100644 --- a/src/pages/file/index.vue +++ b/src/pages/file/index.vue @@ -4,84 +4,127 @@
- 我的ID: {{ myId || "等待连接..." }} - - + {{ $t("index.myId") }}: + {{ + myId || $t("index.waitingForConnection") + }} + + - {{ isInboundConnected ? "被连接" : "已连接" }}: + {{ + isInboundConnected + ? $t("index.connectedBy") + : $t("index.connected") + }}: {{ connectedPeerLabel }} {{ $t("index.copy") }}
- 流量: + {{ $t("index.traffic") }}: {{ formatSize(transInfo.bytes) }}/s
- 包数: + {{ $t("index.packets") }}: {{ transInfo.packets }}/s
-
-
-
- 桌面 -
-
- 通话 -
-
- +
+
+
- - + +
+
+ +
+
+ + + + +
+
+ + +
+ +
+ +
-
- - + +
@@ -106,7 +149,7 @@ :disabled="!isConnected || selectedLocalFiles.length === 0" @click="handleSend" > - 发送 + {{ $t("index.send") }}
@@ -123,7 +166,9 @@ @@ -131,6 +176,7 @@