diff --git a/backend/i18n/i18n.go b/backend/i18n/i18n.go index 10e5c6feb..1331deef0 100644 --- a/backend/i18n/i18n.go +++ b/backend/i18n/i18n.go @@ -60,7 +60,7 @@ func GinI18nLocalize() gin.HandlerFunc { return ginI18n.Localize( ginI18n.WithBundle(&ginI18n.BundleCfg{ RootPath: "./lang", - AcceptLanguage: []language.Tag{language.Chinese, language.English}, + AcceptLanguage: []language.Tag{language.Chinese, language.English, language.TraditionalChinese}, DefaultLanguage: language.Chinese, FormatBundleFile: "yaml", UnmarshalFunc: yaml.Unmarshal, diff --git a/backend/i18n/lang/zh-tw.yaml b/backend/i18n/lang/zh-Hant.yaml similarity index 92% rename from backend/i18n/lang/zh-tw.yaml rename to backend/i18n/lang/zh-Hant.yaml index c0bc93ea1..1a8a57889 100644 --- a/backend/i18n/lang/zh-tw.yaml +++ b/backend/i18n/lang/zh-Hant.yaml @@ -1,17 +1,13 @@ ErrInvalidParams: "請求參數錯誤: {{ .detail }}" -ErrToken: "Token 訊息錯誤: {{ .detail }}" ErrTokenParse: "Token 產生錯誤: {{ .detail }}" -ErrTokenTimeOut: "登入資料已過期: {{ .detail }}" ErrInitialPassword: "原密碼錯誤" ErrInternalServer: "伺服器內部錯誤: {{ .detail }}" -ErrRecordExist: "紀錄已存在" -ErrRecordNotFound: "紀錄未找到" +ErrRecordExist: "記錄已存在" +ErrRecordNotFound: "記錄未找到" ErrStructTransform: "類型轉換失敗: {{ .detail }}" ErrNotLogin: "用戶未登入: {{ .detail }}" -ErrNotSafety: "當前用戶登入狀態不安全: {{ .detail }}" ErrPasswordExpired: "當前密碼已過期: {{ .detail }}" ErrNotSupportType: "系統暫不支持當前類型: {{ .detail }}" -ErrRepoNotValid: "遠程倉庫驗證失敗!" #common ErrNameIsExist: "名稱已存在" diff --git a/frontend/src/api/index.ts b/frontend/src/api/index.ts index 6e8b1834c..08ef20f64 100644 --- a/frontend/src/api/index.ts +++ b/frontend/src/api/index.ts @@ -18,11 +18,13 @@ class RequestHttp { service: AxiosInstance; public constructor(config: AxiosRequestConfig) { this.service = axios.create(config); + let language = globalStore.language === 'tw' ? 'zh-Hant' : globalStore.language; this.service.interceptors.request.use( (config: AxiosRequestConfig) => { if (config.method != 'get') { config.headers = { 'X-CSRF-TOKEN': globalStore.csrfToken, + 'Accept-Language': language, ...config.headers, }; } diff --git a/frontend/src/lang/index.ts b/frontend/src/lang/index.ts index 360f376be..ebb702830 100644 --- a/frontend/src/lang/index.ts +++ b/frontend/src/lang/index.ts @@ -1,5 +1,6 @@ import { createI18n } from 'vue-i18n'; import zh from './modules/zh'; +import tw from './modules/tw'; import en from './modules/en'; const i18n = createI18n({ @@ -8,6 +9,7 @@ const i18n = createI18n({ globalInjection: true, messages: { zh, + tw, en, }, warnHtmlMessage: false, diff --git a/frontend/src/lang/modules/en.ts b/frontend/src/lang/modules/en.ts index 58a597bae..61a5d40b6 100644 --- a/frontend/src/lang/modules/en.ts +++ b/frontend/src/lang/modules/en.ts @@ -135,6 +135,7 @@ const message = { licenseHelper: 'Agree « Community License Agreement »', errorAgree: 'Please click to agree to the Community Software License Agreement', + logout: 'Logout', }, rule: { username: 'Please enter a username', @@ -182,18 +183,6 @@ const message = { notFound: 'The resource does not exist', commonError: 'The request failed', }, - header: { - language: 'Internationalization', - zh: '简体中文', - en: 'English', - theme: 'Layout Settings', - globalTheme: 'Global', - themeColor: 'Theme Color', - darkTheme: 'Dark Theme', - personalData: 'Personal Data', - changePassword: 'Change Password', - logout: 'Logout', - }, service: { serviceNotStarted: 'The {0} service is not currently started', }, diff --git a/frontend/src/lang/modules/tw.ts b/frontend/src/lang/modules/tw.ts new file mode 100644 index 000000000..5c21bd65a --- /dev/null +++ b/frontend/src/lang/modules/tw.ts @@ -0,0 +1,1503 @@ +import fit2cloudTwLocale from 'fit2cloud-ui-plus/src/locale/lang/zh-cn'; +const message = { + commons: { + true: '是', + false: '否', + example: '例:', + button: { + create: '創建', + add: '添加', + save: '保存', + set: '設置', + sync: '同步', + delete: '刪除', + edit: '編輯', + enable: '啟用', + disable: '禁用', + confirm: '確認', + cancel: '取消', + reset: '重置', + restart: '重啟', + conn: '連接', + disconn: '斷開', + clean: '清空', + login: '登錄', + close: '關閉', + stop: '關閉', + start: '開啟', + view: '詳情', + watch: '追蹤', + handle: '執行', + expand: '展開', + log: '日誌', + back: '返回', + backup: '備份', + recover: '恢復', + retry: '重試', + upload: '上傳', + download: '下載', + init: '初始化', + verify: '驗證', + saveAndEnable: '保存並啟用', + import: '導入', + search: '搜索', + refresh: '刷新', + get: '獲取', + upgrade: '升級', + }, + search: { + timeStart: '開始時間', + timeEnd: '結束時間', + timeRange: '至', + dateStart: '開始日期', + dateEnd: '結束日期', + }, + table: { + all: '所有', + total: '共 {0} 條', + name: '名稱', + type: '類型', + status: '狀態', + statusSuccess: '成功', + statusFailed: '失敗', + statusWaiting: '進行中...', + records: '任務輸出', + group: '分組', + createdAt: '創建時間', + publishedAt: '發布時間', + date: '時間', + updatedAt: '更新時間', + operate: '操作', + message: '信息', + description: '描述信息', + interval: '耗時', + user: '用戶', + title: '標題', + port: '端口', + protocol: '協議', + tableSetting: '列表設置', + autoRefresh: '定時刷新', + refreshRate: '刷新頻率', + }, + loadingText: { + Upgrading: '系統升級中,請稍候...', + Restarting: '系統重啟中,請稍候...', + Snapshoting: '製作快照中,請稍候...', + Recovering: '從快照恢復中,請稍候...', + Rollbacking: '快照回滾中,請稍候...', + }, + msg: { + delete: '刪除 操作不可回滾,是否繼續?', + clean: '清空 操作不可回滾,是否繼續?', + deleteTitle: '刪除', + deleteSuccess: '刪除成功', + loginSuccess: '登錄成功', + operationSuccess: '操作成功', + copySuccess: '復製成功', + notSupportOperation: '不支持的當前操作', + requestTimeout: '請求超時,請稍後重試', + infoTitle: '提示', + notRecords: '當前任務未產生執行記錄', + sureLogOut: '您是否確認退出登錄?', + createSuccess: '創建成功', + updateSuccess: '更新成功', + uploadSuccess: '上傳成功', + operate: '操作', + operateConfirm: '如果確認操作,請手動輸入', + inputOrSelect: '請選擇或輸入', + copyfailed: '復製失敗', + backupSuccess: '備份成功', + restoreSuccess: '備份成功', + notFound: '抱歉,您訪問的頁面不存在', + unSupportType: '不支持當前文件類型!', + unSupportSize: '上傳文件超過 {0}M,請確認!', + fileExist: '當前文件夾已存在該文件,不支持重復上傳!', + fileNameErr: '僅支持上傳名稱包含英文、中文、數字或者 .-_ ,長度 1-256 位的文件', + confirmNoNull: '請確認 {0} 值不為空', + }, + login: { + username: '用戶名', + password: '密碼', + welcome: '歡迎回來,請輸入用戶名和密碼登錄!', + errorAuthInfo: '您輸入的用戶名或密碼不正確,請重新輸入!', + errorMfaInfo: '錯誤的驗證信息,請重試!', + captchaHelper: '驗證碼', + errorCaptcha: '驗證碼錯誤!', + notSafe: '暫無權限訪問', + safeEntrance1: '當前環境已經開啟了安全入口登錄', + safeEntrance2: '在 SSH 終端輸入以下命令來查看面板入口: 1pctl user-info', + errIP1: '當前環境已經開啟了授權 IP 訪問', + errDomain1: '當前環境已經開啟了訪問域名綁定', + errHelper: '可在 SSH 終端輸入以下命令來重置綁定信息: ', + codeInput: '請輸入 MFA 驗證器的 6 位驗證碼', + mfaTitle: 'MFA 認證', + mfaCode: 'MFA 驗證碼', + title: 'Linux 服務器運維管理面板', + licenseHelper: + '同意 « 飛致雲社區軟件許可協議 »', + errorAgree: '請點擊同意社區軟件許可協議', + logout: '退出登錄', + }, + rule: { + username: '請輸入用戶名', + password: '請輸入密碼', + rePassword: '密碼不一致,請檢查後重新輸入', + requiredInput: '請填寫必填項', + requiredSelect: '請選擇必選項', + illegalInput: '輸入框中存在不合法字符', + commonName: '支持英文、中文、數字、.-和_,長度1-30', + userName: '支持英文、中文、數字和_,長度3-30', + simpleName: '支持英文、數字、_,長度1-30', + dbName: '支持英文、中文、數字、.-_,長度1-16', + imageName: '支持英文、數字、:/.-_,長度1-150', + volumeName: '支持英文、數字、.-和_,長度2-30', + complexityPassword: '請輸入長度大於 8 位且包含字母、數字、特殊字符至少兩項的密碼組合', + commonPassword: '請輸入 6 位以上長度密碼', + linuxName: '長度1-30,名稱不能含有{0}等符號', + email: '請輸入正確的郵箱', + number: '請輸入正確的數字', + integer: '請輸入正確的正整數', + ip: '請輸入正確的 IP 地址', + host: '請輸入正確的 IP 或者域名', + port: '請輸入正確的端口,1-65535', + selectHelper: '請選擇正確的 {0} 文件', + domain: '域名格式錯誤', + databaseName: '支持英文、數字、_,長度1-30', + ipErr: 'IP [{0}] 格式錯誤,請檢查', + numberRange: '數字範圍: {0} - {1}', + paramName: '支持英文、數字、.-和_,長度2-64', + paramComplexity: '支持英文、數字、{0},長度6-128,特殊字符不能在首尾', + paramUrlAndPort: '格式為 http(s)://(域名/ip):(端口)', + nginxDoc: '僅支持英文大小寫,數字,和.', + appName: '支持英文、數字、-和_,長度2-30,並且不能以-_開頭和結尾', + containerName: '支持字母、數字、下劃線、連字符和點,不能以連字符-或點.結尾,長度1-127', + disableFunction: '僅支持字母和,', + leechExts: '僅支持字母數字和,', + paramSimple: '支持小寫字母和數字,長度1-64', + }, + res: { + paramError: '請求失敗,請稍後重試!', + forbidden: '當前用戶無權限', + serverError: '服務異常', + notFound: '資源不存在', + commonError: '請求失敗', + }, + service: { + serviceNotStarted: '當前未啟動 {0} 服務', + }, + status: { + running: '已啟動', + success: '成功', + waiting: '執行中', + failed: '失敗', + stopped: '已停止', + error: '失敗', + created: '已創建', + restarting: '重啟中', + uploading: '上傳中', + unhealthy: '異常', + removing: '遷移中', + paused: '暫停', + exited: '停止', + installing: '安裝中', + enabled: '已啟用', + disabled: '已停止', + normal: '正常', + building: '製作鏡像中', + downloaderr: '下載失敗', + upgrading: '升級中', + upgradeerr: '升級失敗', + }, + units: { + second: '秒', + minute: '分鐘', + hour: '小時', + day: '天', + week: '周', + month: '月', + year: '年', + time: '次', + core: '核', + }, + }, + menu: { + home: '概覽', + apps: '應用商店', + website: '網站', + project: '項目', + config: '配置', + ssh: 'SSH 配置', + firewall: '防火墻', + ssl: '證書', + database: '數據庫', + container: '容器', + cronjob: '計劃任務', + host: '主機', + files: '文件', + monitor: '監控', + terminal: '終端', + settings: '面板設置', + toolbox: '工具箱', + logs: '日誌審計', + runtime: '運行環境', + processManage: '進程管理', + process: '進程', + }, + home: { + overview: '概覽', + entranceHelper: '設置安全入口有利於提高系統的安全性,如有需要,前往 面板設置-安全 中,啟用安全入口', + appInstalled: '已安裝應用', + systemInfo: '系統信息', + hostname: '主機名稱', + platformVersion: '發行版本', + kernelVersion: '內核版本', + kernelArch: '系統類型', + network: '流量', + io: '磁盤 IO', + baseInfo: '基本信息', + totalSend: '總發送', + totalRecv: '總接收', + rwPerSecond: '讀寫次數', + ioDelay: '讀寫延遲', + uptime: '啟動時間', + runningTime: '運行時間', + + runSmoothly: '運行流暢', + runNormal: '運行正常', + runSlowly: '運行緩慢', + runJam: '運行堵塞', + + core: '物理核心', + logicCore: '邏輯核心', + loadAverage: '最近 {0} 分鐘平均負載', + load: '負載', + mount: '掛載點', + fileSystem: '文件系統', + total: '總數', + used: '已用', + free: '可用', + percent: '使用率', + app: '推薦應用', + goInstall: '去安裝', + + networkCard: '網卡', + disk: '磁盤', + }, + tabs: { + more: '更多', + hide: '收起', + closeCurrent: '關閉當前', + closeOther: '關閉其它', + closeAll: '關閉所有', + }, + header: { + logout: '退出登錄', + }, + database: { + database: '數據庫', + delete: '刪除操作無法回滾,請輸入 "', + deleteHelper: '" 刪除此數據庫', + create: '創建數據庫', + noMysql: '當前未檢測到 {0} 數據庫,請進入應用商店點擊安裝!', + mysqlBadStatus: '當前 mysql 應用狀態異常,請在', + adjust: '中查看原因或修改配置', + goInstall: '去應用商店安裝', + source: '來源', + permission: '權限', + permissionForIP: '指定 IP', + permissionAll: '所有人(%)', + databaseConnInfo: '連接信息', + rootPassword: 'root 密碼', + serviceName: '服務名稱', + serviceNameHelper: '用於同一 network 下的容器間訪問', + backupList: '備份列表', + loadBackup: '導入備份', + remoteAccess: '遠程訪問', + remoteHelper: '多個 ip 以逗號分隔,例:172.16.10.111,172.16.10.112', + remoteConnHelper: 'root 帳號遠程連接 mysql 有安全風險,開啟需謹慎!', + changePassword: '改密', + changePasswordHelper: '當前數據庫已經關聯應用,修改密碼將同步修改應用中數據庫密碼,修改後重啟生效。', + + portHelper: '該端口為容器對外暴露端口,修改需要單獨保存並且重啟容器!', + + confChange: '配置修改', + + selectFile: '選擇文件', + dropHelper: '將上傳文件拖拽到此處,或者', + clickHelper: '點擊上傳', + supportUpType: '僅支持 sql、sql.gz、tar.gz 文件', + zipFormat: 'tar.gz 壓縮包結構:test.tar.gz 壓縮包內,必需包含 test.sql', + + currentStatus: '當前狀態', + baseParam: '基礎參數', + performanceParam: '性能參數', + runTime: '啟動時間', + connections: '總連接數', + bytesSent: '發送', + bytesReceived: '接收', + queryPerSecond: '每秒查詢', + txPerSecond: '每秒事務', + connInfo: '活動/峰值連接數', + connInfoHelper: '若值過大,增加 max_connections', + threadCacheHit: '線程緩存命中率', + threadCacheHitHelper: '若過低,增加 thread_cache_size', + indexHit: '索引命中率', + indexHitHelper: '若過低,增加 key_buffer_size', + innodbIndexHit: 'Innodb 索引命中率', + innodbIndexHitHelper: '若過低,增加 innodb_buffer_pool_size', + cacheHit: '查詢緩存命中率', + cacheHitHelper: '若過低,增加 query_cache_size', + tmpTableToDB: '創建臨時表到磁盤', + tmpTableToDBHelper: '若過大,嘗試增加 tmp_table_size', + openTables: '已打開的表', + openTablesHelper: 'table_open_cache 配置值應大於等於此值', + selectFullJoin: '沒有使用索引的量', + selectFullJoinHelper: '若不為0,請檢查數據表的索引是否合理', + selectRangeCheck: '沒有索引的 JOIN 量', + selectRangeCheckHelper: '若不為0,請檢查數據表的索引是否合理', + sortMergePasses: '排序後的合並次數', + sortMergePassesHelper: '若值過大,增加sort_buffer_size', + tableLocksWaited: '鎖表次數', + tableLocksWaitedHelper: '若值過大,請考慮增加您的數據庫性能', + + performanceTuning: '性能調整', + optimizationScheme: '優化方案', + keyBufferSizeHelper: '用於索引的緩沖區大小', + queryCacheSizeHelper: '查詢緩存,不開啟請設為0', + tmpTableSizeHelper: '臨時表緩存大小', + innodbBufferPoolSizeHelper: 'Innodb 緩沖區大小', + innodbLogBufferSizeHelper: 'Innodb 日誌緩沖區大小', + sortBufferSizeHelper: '* 連接數, 每個線程排序的緩沖大小', + readBufferSizeHelper: '* 連接數, 讀入緩沖區大小', + readRndBufferSizeHelper: '* 連接數, 隨機讀取緩沖區大小', + joinBufferSizeHelper: '* 連接數, 關聯表緩存大小', + threadStackelper: '* 連接數, 每個線程的堆棧大小', + binlogCacheSizeHelper: '* 連接數, 二進製日誌緩存大小(4096的倍數)', + threadCacheSizeHelper: '線程池大小', + tableOpenCacheHelper: '表緩存', + maxConnectionsHelper: '最大連接數', + restart: '重啟數據庫', + + log: '日誌', + slowLog: '慢日誌', + noData: '暫無慢日誌...', + + isOn: '開啟', + longQueryTime: '閾值(秒)', + thresholdRangeHelper: '請輸入正確的閾值(1 - 600)', + + timeout: '超時時間', + timeoutHelper: '空閑連接超時時間,0表示不斷開', + maxclients: '最大連接數', + requirepassHelper: '留空代表沒有設置密碼,修改需要單獨保存並且重啟容器!', + databases: '數據庫數量', + maxmemory: '最大內存使用', + maxmemoryHelper: '0 表示不做限製', + tcpPort: '當前監聽端口', + uptimeInDays: '已運行天數', + connectedClients: '連接的客戶端數量', + usedMemory: 'Redis 歷史分配內存的峰值', + usedMemoryRss: 'Redis 當前占用的系統內存總量', + memFragmentationRatio: '內存碎片比率', + totalConnectionsReceived: '運行以來連接過的客戶端的總數量', + totalCommandsProcessed: '運行以來執行過的命令的總數量', + instantaneousOpsPerSec: '服務器每秒鐘執行的命令數量', + keyspaceHits: '查找數據庫鍵成功的次數', + keyspaceMisses: '查找數據庫鍵失敗的次數', + hit: '查找數據庫鍵命中率', + latestForkUsec: '最近一次 fork() 操作耗費的微秒數', + + recoverHelper: '即將使用 [{0}] 對數據進行覆蓋,是否繼續?', + submitIt: '覆蓋數據', + + baseConf: '基礎配置', + allConf: '全部配置', + restartNow: '立即重啟', + restartNowHelper1: '修改配置後需要重啟生效,若您的數據需要持久化請先執行 save 操作。', + restartNowHelper: '修改配置後需要重啟生效。', + + persistence: '持久化', + rdbHelper1: '秒內,插入', + rdbHelper2: '條數據', + rdbHelper3: '符合任意一個條件將會觸發RDB持久化', + rdbInfo: '請確認規則列表中值在 1-100000 之間', + + containerConn: '容器連接地址', + containerConnHelper: 'PHP 運行環境/容器安裝的應用使用此連接地址', + remoteConn: '外部連接地址', + remoteConnHelper2: '非容器或外部連接使用此地址', + localIP: '本機 IP', + }, + container: { + createContainer: '創建容器', + updateContaienrHelper: '容器編輯需要重建容器,任何未持久化的數據將會丟失,是否繼續?', + containerList: '容器列表', + operatorHelper: '將對選中容器進行 {0} 操作,是否繼續?', + operatorAppHelper: '存在來源於應用商店的容器,{0} 操作可能會影響到該服務的正常使用,是否確認?', + start: '啟動', + stop: '停止', + restart: '重啟', + kill: '強製停止', + pause: '暫停', + unpause: '恢復', + rename: '重命名', + remove: '刪除', + containerPrune: '清理容器', + containerPruneHelper: '清理容器 將刪除所有處於停止狀態的容器,該操作無法回滾,是否繼續?', + imagePrune: '清理鏡像', + imagePruneSome: '未標簽鏡像', + imagePruneSomeHelper: '清理標簽為 none 且未被任何容器使用的鏡像。', + imagePruneAll: '未使用鏡像', + imagePruneAllHelper: '清理所有未被任何容器使用的鏡像。', + networkPrune: '清理網絡', + networkPruneHelper: '清理網絡 將刪除所有未被使用的網絡,該操作無法回滾,是否繼續?', + volumePrune: '清理存儲卷', + volumePruneHelper: '清理存儲卷 將刪除所有未被使用的本地存儲卷,該操作無法回滾,是否繼續?', + cleanSuccess: '操作成功,本次清理數量: {0} 個!', + cleanSuccessWithSpace: '操作成功,本次清理數量: {0} 個,釋放磁盤空間: {1}!', + container: '容器', + upTime: '運行時長', + all: '全部', + fetch: '過濾', + lines: '條數', + linesHelper: '請輸入正確的日誌獲取條數!', + lastDay: '最近一天', + last4Hour: '最近 4 小時', + lastHour: '最近 1 小時', + last10Min: '最近 10 分鐘', + cleanLog: '清空日誌', + newName: '新名稱', + source: '資源使用率', + cpuShare: 'CPU 權重', + cpuShareHelper: '容器默認份額為 1024 個 CPU,增大可使當前容器獲得更多的 CPU 時間', + + command: '命令', + custom: '自定義', + containerTerminal: '終端', + emptyUser: '為空時,將使用容器默認的用戶登錄', + + upgradeHelper: '該操作僅支持容器版本升級', + upgradeWarning: '當前目標版本低於原鏡像版本,請重新輸入!', + upgradeWarning2: '升級操作需要重建容器,任何未持久化的數據將會丟失,是否繼續?', + oldImage: '當前鏡像', + targetImage: '目標鏡像', + appHelper: '該容器來源於應用商店,升級可能導致該服務不可用,是否繼續?', + + server: '服務器', + serverExample: '例: 80, 80-88, ip:80 或者 ip:80-88', + containerExample: '例: 80 或者 80-88', + exposePort: '暴露端口', + exposeAll: '暴露所有', + cmd: '啟動命令', + cmdHelper: '例:echo "hello"', + autoRemove: '容器退出後自動刪除容器', + cpuQuota: 'CPU 限製', + memoryLimit: '內存限製', + limitHelper: '限製為 0 則關閉限製,最大可用為 {0}', + mount: '掛載卷', + serverPath: '服務器目錄', + containerDir: '容器目錄', + volumeHelper: '請確認存儲卷內容輸入正確', + modeRW: '讀寫', + modeR: '只讀', + mode: '權限', + env: '環境變量', + restartPolicy: '重啟規則', + always: '一直重啟', + unlessStopped: '關閉後重啟', + onFailure: '失敗後重啟(默認重啟 5 次)', + no: '不重啟', + + monitor: '監控', + refreshTime: '刷新間隔', + cache: '緩存', + + image: '鏡像', + imagePull: '拉取鏡像', + imagePush: '推送鏡像', + imageDelete: '刪除鏡像', + imageDeleteTag: '刪除 Tag', + repoName: '倉庫名', + imageName: '鏡像名', + httpRepo: 'http 倉庫添加授信需要重啟 docker 服務', + delInsecure: '刪除授信', + delInsecureHelper: '刪除授信需要重啟 docker 服務,是否刪除?', + pull: '拉取', + path: '路徑', + importImage: '導入鏡像', + imageBuild: '構建鏡像', + build: '構建鏡像', + pathSelect: '路徑選擇', + label: '標簽', + imageTag: '鏡像標簽', + push: '推送', + fileName: '文件名', + export: '導出', + exportImage: '導出鏡像', + version: '版本', + size: '大小', + from: '來源', + tag: '標簽', + tagHelper: '一行一個,例: \nkey1=value1\nkey2=value2', + imageNameHelper: '鏡像名稱及 Tag,例:nginx:latest', + + network: '網絡', + createNetwork: '創建網絡', + networkName: '網絡名', + driver: '模式', + option: '參數', + attachable: '可用', + subnet: '子網', + scope: 'IP 範圍', + gateway: '網關', + + volume: '存儲卷', + volumeDir: '存儲卷目錄', + nfsEnable: '啟用 NFS 存儲', + nfsAddress: '地址', + nfsAddressHelper: '支持輸入 ip 或者域名', + mountpoint: '掛載點', + mountpointNFSHelper: '例:/nfs, /nfs-share', + options: '可選參數', + createVolume: '創建存儲卷', + + repo: '倉庫', + createRepo: '添加倉庫', + downloadUrl: '下載地址', + imageRepo: '鏡像倉庫', + repoHelper: '是否包含鏡像倉庫/組織/項目?', + auth: '認證', + mirrorHelper: + '當存在多個加速器時,需要換行顯示,例: \nhttp://xxxxxx.m.daocloud.io \nhttps://xxxxxx.mirror.aliyuncs.com', + registrieHelper: '當存在多個私有倉庫時,需要換行顯示,例:\n172.16.10.111:8081 \n172.16.10.112:8081', + + compose: '編排', + fromChangeHelper: '切換來源將清空當前已編輯內容,是否繼續?', + composePathHelper: '配置文件保存路徑: {0}', + composeHelper: '通過 1Panel 編輯或者模版創建的編排,將保存在 {0}/docker/compose 路徑下', + deleteFile: '刪除文件', + deleteComposeHelper: '刪除編排文件所在目錄下所有文件,包括該文件下的持久化文件等,請謹慎操作!', + deleteCompose: '" 刪除此編排', + apps: '應用商店', + local: '本地', + createCompose: '創建編排', + template: '模版', + composeTemplate: '編排模版', + createComposeTemplate: '創建編排模版', + description: '描述', + content: '內容', + containerNumber: '容器數量', + down: '刪除', + up: '啟動', + composeDetailHelper: '該 compose 為 1Panel 編排外部創建。暫不支持啟停操作。', + composeOperatorHelper: '將對 {0} 進行 {1} 操作,是否繼續?', + + setting: '配置', + operatorStatusHelper: '此操作將{0}Docker 服務,是否繼續?', + dockerStatus: 'Docker 服務', + daemonJsonPathHelper: '請保證配置路徑與 docker.service 中指定的配置路徑保持一致。', + mirrors: '鏡像加速', + mirrorsHelper: '優先使用加速 URL 執行操作,設置為空則取消鏡像加速。', + mirrorsHelper2: '具體操作配置請參照官方文檔', + registries: '私有倉庫', + cutLog: '日誌切割', + cutLogHelper1: '當前配置只會影響新創建的容器;', + cutLogHelper2: '已經創建的容器需要重新創建使配置生效;', + cutLogHelper3: + '註意,重新創建容器可能會導致數據丟失。如果你的容器中有重要數據,確保在執行重建操作之前進行備份。', + maxSize: '文件大小', + maxFile: '保留份數', + liveHelper: '允許在 Docker 守護進程發生意外停機或崩潰時保留正在運行的容器狀態', + liveWithSwarmHelper: 'live-restore 守護進程配置與 Swarm 模式不兼容', + iptablesDisable: '關閉 iptables', + iptablesHelper1: 'Docker 對 iptables 規則的自動配置', + iptablesHelper2: '關閉 iptables 會導致容器無法與外部網絡通信。', + daemonJsonPath: '配置路徑', + serviceUnavailable: '當前未啟動 Docker 服務,請在', + startIn: '中開啟', + }, + cronjob: { + cronTask: '計劃任務', + changeStatus: '狀態修改', + disableMsg: '停止計劃任務會導致該任務不再自動執行。是否繼續?', + enableMsg: '啟用計劃任務會讓該任務定期自動執行。是否繼續?', + taskType: '任務類型', + record: '報告', + shell: 'Shell 腳本', + containerCheckBox: '在容器中執行(無需再輸入進入容器命令)', + containerName: '容器名稱', + ntp: '時間同步', + website: '備份網站', + rulesHelper: '當存在多個壓縮排除規則時,需要換行顯示,例:\n*.log \n*.sql', + lastRecordTime: '上次執行時間', + database: '備份數據庫', + missBackupAccount: '未能找到備份賬號', + syncDate: '同步時間 ', + releaseMemory: '釋放內存', + curl: '訪問 URL', + taskName: '任務名稱', + cronSpec: '執行周期', + cronSpecHelper: '請輸入正確的執行周期', + cleanHelper: '該操作將所有任務執行記錄、備份文件和日誌文件,是否繼續?', + directory: '備份目錄', + sourceDir: '備份目錄', + allOptionHelper: '當前計劃任務為備份所有【{0}】,暫不支持直接下載,可在【{0}】備份列表中查看', + exclusionRules: '排除規則', + saveLocal: '同時保留本地備份(和雲存儲保留份數一致)', + url: 'URL 地址', + target: '備份到', + targetHelper: '第三方備份賬號在面板設置中維護', + retainCopies: '保留份數', + retainCopiesHelper: '執行記錄、日誌文件、備份文件保留份數', + cronSpecRule: '請輸入正確的執行周期', + perMonth: '每月', + perWeek: '每周', + perHour: '每小時', + perNDay: '每隔 N 日', + perDay: '每天', + perNHour: '每隔 N 時', + perNMinute: '每隔 N 分鐘', + perNSecond: '每隔 N 秒', + per: '每隔', + handle: '執行', + day: '日', + monday: '周一', + tuesday: '周二', + wednesday: '周三', + thursday: '周四', + friday: '周五', + saturday: '周六', + sunday: '周日', + shellContent: '腳本內容', + errRecord: '錯誤的日誌記錄', + errHandle: '任務執行失敗', + noRecord: '當前計劃任務暫未產生記錄', + cleanData: '刪除備份文件', + cleanDataHelper: '刪除該任務執行過程中產生的備份文件', + noLogs: '暫無任務輸出...', + errPath: '備份路徑 [{0}] 錯誤,無法下載!', + cutWebsiteLog: '切割網站日誌', + cutWebsiteLogHelper: '切割的日誌文件會備份到 1Panel 的 backup 目錄下', + }, + monitor: { + monitor: '監控', + globalFilter: '全局過濾', + enableMonitor: '監控狀態', + storeDays: '保存天數', + cleanMonitor: '清空監控記錄', + + avgLoad: '平均負載', + loadDetail: '負載詳情', + resourceUsage: '資源使用率', + networkCard: '網卡', + read: '讀取', + write: '寫入', + readWriteCount: '讀寫次數', + readWriteTime: '讀寫延遲', + today: '今天', + yesterday: '昨天', + lastNDay: '近 {0} 天', + memory: '內存', + cache: '緩存', + disk: '磁盤', + network: '網絡', + up: '上行', + down: '下行', + interval: '采集間隔(分鐘)', + }, + terminal: { + conn: '連接', + connLocalErr: '無法自動認證,請填寫本地服務器的登錄信息!', + testConn: '連接測試', + saveAndConn: '保存並連接', + connTestOk: '連接信息可用', + connTestFailed: '連接不可用,請檢查連接信息!', + host: '主機', + createConn: '新建連接', + group: '分組', + noHost: '暫無主機', + groupChange: '切換分組', + expand: '全部展開', + fold: '全部收縮', + batchInput: '批量輸入', + quickCommand: '快速命令', + groupDeleteHelper: '移除組後,組內所有連接將遷移到 default 組內,是否確認', + command: '命令', + addHost: '添加主機', + localhost: '本地服務器', + ip: '主機地址', + authMode: '認證方式', + passwordMode: '密碼認證', + rememberPassword: '記住密碼', + keyMode: '私鑰認證', + key: '私鑰', + keyPassword: '私鑰密碼', + emptyTerminal: '暫無終端連接', + }, + logs: { + panelLog: '面板日誌', + operation: '操作日誌', + login: '訪問日誌', + loginIP: '登錄 IP', + loginAddress: '登錄地址', + loginAgent: '用戶代理', + loginStatus: '登錄狀態', + system: '系統日誌', + deleteLogs: '清空日誌', + resource: '資源', + operate: '操作', + detail: { + hosts: '主機', + apps: '應用', + websites: '網站', + containers: '容器', + files: '文件管理', + logs: '日誌審計', + settings: '面板設置', + cronjobs: '計劃任務', + databases: '數據庫', + }, + websiteLog: '網站日誌', + runLog: '運行日誌', + errLog: '錯誤日誌', + }, + file: { + dir: '文件夾', + upload: '上傳', + download: '下載', + fileName: '文件名', + search: '在當前目錄下查找', + mode: '權限', + owner: '所有者', + file: '文件', + remoteFile: '遠程下載', + share: '分享', + sync: '數據同步', + size: '大小', + updateTime: '修改時間', + open: '打開', + rename: '重命名', + role: '權限', + info: '屬性', + linkFile: '軟連接文件', + terminal: '終端', + shareList: '分享列表', + zip: '壓縮', + group: '用戶組', + path: '路徑', + public: '公共', + setRole: '設置權限', + link: '是否鏈接', + rRole: '讀取', + wRole: '寫入', + xRole: '可執行', + compress: '壓縮', + deCompress: '解壓', + compressType: '壓縮格式', + compressDst: '壓縮路徑', + replace: '覆蓋已存在的文件', + compressSuccess: '壓縮成功', + deCompressSuccess: '解壓成功', + deCompressDst: '解壓路徑', + linkType: '鏈接類型', + softLink: '軟鏈接', + hardLink: '硬鏈接', + linkPath: '鏈接路徑', + selectFile: '選擇文件', + downloadSuccess: '下載成功', + downloadUrl: '下載地址', + downloadStart: '下載開始!', + moveSuccess: '移動成功', + copySuccess: '復製成功', + move: '移動', + copy: '復製', + calculate: '計算', + canNotDeCompress: '無法解壓此文件', + uploadSuccess: '上傳成功!', + downloadProcess: '下載進度', + downloading: '正在下載...', + infoDetail: '文件屬性', + root: '根目錄', + list: '文件列表', + sub: '包含子目錄', + downlodSuccess: '下載完成', + theme: '主題', + language: '語言', + eol: '行尾符', + copyDir: '復製路徑', + paste: '粘貼', + cancel: '取消', + changeOwner: '修改用戶和用戶組', + containSub: '同時修改子文件屬性', + ownerHelper: 'PHP 運行環境默認用戶:用戶組為 1000:1000, 容器內外用戶顯示不一致為正常現象', + searchHelper: '支持 * 等通配符', + uploadFailed: '[{0}] 文件上傳失敗', + fileUploadStart: '正在上傳[{0}]....', + }, + ssh: { + sshAlert: '列表數據根據登錄時間排序,但請註意,切換時區或其他操作可能導致登錄日誌的時間出現偏差。', + sshOperate: '對 SSH 服務進行 [{0}] 操作,是否繼續?', + sshChange: 'SSH 配置修改', + sshChangeHelper: '此操作將 {0} 修改為 [{1}] ,是否繼續?', + sshFileChangeHelper: '直接修改配置文件可能會導致服務不可用,請謹慎操作,是否繼續?', + port: '連接端口', + portHelper: '指定 SSH 服務監聽的端口號,默認為 22。', + listenAddress: '監聽地址', + addressHelper: '指定 SSH 服務監聽的 IP 地址,默認為 0.0.0.0,即所有的網絡接口都會被監聽。', + permitRootLogin: 'root 用戶', + rootSettingHelper: 'root 用戶 SSH 登錄方式,默認所有 SSH 登錄。', + rootHelper1: '允許 SSH 登錄', + rootHelper2: '禁止 SSH 登錄', + rootHelper3: '僅允許密鑰登錄', + rootHelper4: '僅允許執行預先定義的命令,不能進行其他操作', + passwordAuthentication: '密碼認證', + pwdAuthHelper: '是否啟用密碼認證,默認啟用。', + pubkeyAuthentication: '密鑰認證', + key: '密鑰', + pubkey: '密鑰信息', + encryptionMode: '加密方式', + passwordHelper: '支持大小寫英文、數字,長度6-10', + generate: '生成密鑰', + reGenerate: '重新生成密鑰', + keyAuthHelper: '是否啟用密鑰認證,默認啟用。', + useDNS: '反向解析', + dnsHelper: '控製 SSH 服務器是否啟用 DNS 解析功能,從而驗證連接方的身份。', + loginLogs: 'SSH 登錄日誌', + loginMode: '登錄方式', + authenticating: '密鑰', + publickey: '密鑰', + belong: '歸屬地', + local: '內網', + remote: '外網', + }, + setting: { + all: '全部', + panel: '面板', + user: '用戶名稱', + userChange: '修改用戶名', + userChangeHelper: '修改用戶名將退出登陸,是否繼續?', + passwd: '用戶密碼', + emailHelper: '用於密碼找回', + title: '面板別名', + panelPort: '面板端口', + portHelper: '建議端口範圍8888 - 65535,註意:有安全組的服務器請提前在安全組放行新端口', + portChange: '端口修改', + portChangeHelper: '服務端口修改需要重啟服務,是否繼續?', + theme: '主題顏色', + componentSize: '組件大小', + dark: '暗色', + light: '亮色', + language: '系統語言', + languageHelper: '默認跟隨瀏覽器語言,設置後只對當前瀏覽器生效,更換瀏覽器後需要重新設置', + sessionTimeout: '超時時間', + sessionTimeoutError: '最小超時時間為 300 秒', + sessionTimeoutHelper: '如果用戶超過 {0} 秒未操作面板,面板將自動退出登錄', + systemIP: '服務器 IP', + systemIPWarning: '請先在面板設置中設置服務器 IP', + syncTime: '服務器時間', + timeZone: '系統時區', + timeZoneChangeHelper: '系統時區修改需要重啟服務,是否繼續?', + timeZoneHelper: '時區修改依賴於系統 timedatectl 服務,重啟 1Panel 服務後生效。', + timeZoneCN: '北京', + timeZoneAM: '洛杉磯', + timeZoneNY: '紐約', + ntpALi: '阿裏', + ntpGoogle: '谷歌', + syncSite: 'NTP 服務器', + syncSiteHelper: '該操作將使用 {0} 作為源進行系統時間同步,是否繼續?', + changePassword: '密碼修改', + oldPassword: '原密碼', + newPassword: '新密碼', + retryPassword: '確認密碼', + duplicatePassword: '新密碼不能與原始密碼一致,請重新輸入!', + + thirdParty: '第三方賬號', + createBackupAccount: '添加 {0}', + noTypeForCreate: '當前無可創建備份類型', + LOCAL: '服務器磁盤', + currentPath: '當前路徑', + OSS: '阿裏雲 OSS', + S3: '亞馬遜 S3 雲存儲', + MINIO: 'MINIO', + SFTP: 'SFTP', + OneDrive: '微軟 OneDrive', + backupDir: '備份路徑', + isCN: '國內版', + code: '授權碼', + loadCode: '獲取', + COS: '騰訊雲 COS', + KODO: '七牛雲 Kodo', + scType: '存儲類型', + typeStandard: '標準存儲', + typeStandard_IA: '低頻存儲', + typeArchive: '歸檔存儲', + typeDeep_Archive: '深度歸檔存儲', + scStandard: '標準存儲,適用於實時訪問的大量熱點文件、頻繁的數據交互等業務場景。', + scStandard_IA: '低頻存儲,適用於較低訪問頻率(例如平均每月訪問頻率1到2次)的業務場景,最少存儲30天。', + scArchive: '歸檔存儲,適用於極低訪問頻率(例如半年訪問1次)的業務場景。', + scDeep_Archive: '深度歸檔存儲,適用於極低訪問頻率(例如1年訪問1~2次)的業務場景。', + archiveHelper: '歸檔存儲的文件無法直接下載,需要先在對應的雲服務商網站進行恢復操作,請謹慎使用!', + domainHelper: '加速域名必須包含 http:// 或者 https://', + backupAlert: + "理論上只要雲廠商兼容 S3 協議,就可以用現有的亞馬遜 S3 雲存儲來備份,具體配置參考 官方文檔 ", + domain: '加速域名', + backupAccount: '備份賬號', + loadBucket: '獲取桶', + accountName: '賬戶名稱', + accountKey: '賬戶密鑰', + address: '地址', + path: '路徑', + + snapshot: '快照', + thirdPartySupport: '僅支持第三方賬號', + recoverDetail: '恢復詳情', + createSnapshot: '創建快照', + importSnapshot: '同步快照', + recover: '恢復', + noRecoverRecord: '暫無恢復記錄', + lastRecoverAt: '上次恢復時間', + lastRollbackAt: '上次回滾時間', + noRollbackRecord: '暫無回滾記錄', + reDownload: '重新下載備份文件', + statusAll: '全部', + statusSuccess: '成功', + statusFailed: '失敗', + versionChange: '版本變化', + snapshotFrom: '快照存儲位置', + recoverHelper: '即將從快照 {0} 開始恢復,恢復需要重啟 docker 以及 1panel 服務,是否繼續?', + rollback: '回滾', + rollbackHelper: + '即將回滾本次恢復,回滾將替換所有本次恢復的文件,過程中可能需要重啟 docker 以及 1panel 服務,是否繼續?', + + upgrading: '正在升級中,請稍候...', + upgradeHelper: '升級操作需要重啟服務,是否繼續?', + noUpgrade: '當前已經是最新版本', + versionHelper: '1Panel 版本號命名規則為: [大版本].[功能版本].[Bug 修復版本],例:', + versionHelper1: 'v1.0.1 是 v1.0.0 之後的 Bug 修復版本', + versionHelper2: 'v1.1.0 是 v1.0.0 之後的功能版本', + newVersion: '(Bug 修復版本)', + latestVersion: '(功能版本)', + upgradeCheck: '檢查更新', + upgradeNotes: '更新內容', + upgradeNow: '立即更新', + source: '下載源', + hasNewVersion: '有新版本', + + safe: '安全', + entrance: '安全入口', + entranceHelper: '開啟安全入口後只能通過指定安全入口登錄面板', + entranceError: '請輸入 6-10 位安全登錄入口,僅支持輸入數字或字母', + entranceInputHelper: '安全入口設置為空時,則取消安全入口', + expirationTime: '密碼過期時間', + unSetting: '未設置', + noneSetting: '為面板密碼設置過期時間,過期後需要重新設置密碼', + expirationHelper: '密碼過期時間為 [0] 天時,則關閉密碼過期功能', + days: '過期天數', + expiredHelper: '當前密碼已過期,請重新修改密碼:', + timeoutHelper: '【 {0} 天後 】面板密碼即將過期,過期後需要重新設置密碼', + complexity: '密碼復雜度驗證', + complexityHelper: '開啟後密碼必須滿足密碼長度大於 8 位且包含字母、數字及特殊字符', + bindDomain: '域名綁定', + unBindDomain: '域名解綁', + unBindDomainHelper: '解除域名綁定可能造成系統不安全,是否繼續?', + bindDomainHelper: '設置域名綁定後,僅能通過設置中域名訪問 1Panel 服務', + bindDomainHelper1: '綁定域名為空時,則取消域名綁定', + bindDomainWarning: '設置域名綁定後,將退出當前登錄,且僅能通過設置中域名訪問 1Panel 服務,是否繼續?', + allowIPs: '授權 IP', + unAllowIPs: '取消授權', + unAllowIPsWarning: '授權 IP 為空將允許所有 IP 訪問系統,可能造成系統不安全,是否繼續?', + allowIPsHelper: '設置授權 IP 後,僅有設置中的 IP 可以訪問 1Panel 服務', + allowIPsWarning: '設置授權 IP 後,僅有設置中的 IP 可以訪問 1Panel 服務,是否繼續?', + allowIPsHelper1: '授權 IP 為空時,則取消授權 IP', + allowIPEgs: '當存在多個授權 IP 時,需要換行顯示,例: \n172.16.10.111 \n172.16.10.112', + mfa: '兩步驗證', + secret: '密鑰', + mfaAlert: '兩步驗證密碼是基於當前時間生成,請確保服務器時間已同步', + mfaHelper: '開啟後會驗證手機應用驗證碼', + mfaHelper1: '下載兩步驗證手機應用 如:', + mfaHelper2: '使用手機應用掃描以下二維碼,獲取 6 位驗證碼', + mfaHelper3: '輸入手機應用上的 6 位數字', + mfaCode: '驗證碼', + mfaInterval: '刷新時間(秒)', + mfaIntervalHelper: '修改刷新時間後,請重新掃描或手動添加密鑰信息!', + sslChangeHelper: 'https 設置修改需要重啟服務,是否繼續?', + sslDisable: '禁用', + sslDisableHelper: '禁用 https 服務,需要重啟面板才能生效,是否繼續?', + + https: '為面板設置 https 協議訪問,提升面板訪問安全性', + certType: '證書類型', + selfSigned: '自簽名', + selfSignedHelper: '自簽證書,不被瀏覽器信任,顯示不安全是正常現象', + select: '選擇已有', + domainOrIP: '域名或 IP:', + timeOut: '過期時間:', + rootCrtDownload: '根證書下載', + primaryKey: '密鑰', + certificate: '證書', + + about: '關於', + project: '項目地址', + issue: '問題反饋', + doc: '官方文檔', + star: '點亮 Star', + description: '1Panel,現代化、開源的 Linux 服務器運維管理面板。', + forum: '論壇', + doc2: '文檔', + currentVersion: '當前運行版本:', + }, + app: { + app: '應用', + installName: '安裝名稱', + installed: '已安裝', + all: '全部', + version: '版本', + detail: '詳情', + params: '參數', + install: '安裝', + author: '作者', + source: '來源', + sync: '同步', + appName: '應用名稱', + status: '狀態', + container: '容器', + restart: '重啟', + start: '啟動', + stop: '停止', + rebuild: '重建', + description: '描述', + deleteWarn: '刪除操作會把所有數據和備份一並刪除,此操作不可回滾,是否繼續?', + syncSuccess: '同步成功', + canUpgrade: '可升級', + backupName: '文件名稱', + backupPath: '文件路徑', + backupdate: '備份時間', + update: '更新', + versionSelect: '請選擇版本', + operatorHelper: '將對選中應用進行 {0} 操作,是否繼續?', + checkInstalledWarn: '未檢測到 {0} ,請進入應用商店點擊安裝!', + gotoInstalled: '去安裝', + search: '搜索', + limitHelper: '該應用已安裝,不支持重復安裝', + deleteHelper: '{0}已經關聯以下資源,無法刪除', + checkTitle: '提示', + website: '網站', + database: '數據庫', + defaultConfig: '默認配置', + defaultConfigHelper: '已恢復為默認配置,保存後生效', + forceDelete: '強製刪除', + forceDeleteHelper: '強製刪除,會忽略刪除過程中產生的錯誤並最終刪除元數據', + deleteBackup: '刪除備份', + deleteBackupHelper: '同時刪除應用備份', + deleteDB: '刪除數據庫', + deleteDBHelper: '同時刪除與應用關聯的數據庫', + noService: '無{0}', + toInstall: '去安裝', + param: '參數配置', + syncAppList: '更新應用列表', + alreadyRun: '已安裝', + less1Minute: '小於1分鐘', + appOfficeWebsite: '官方網站', + github: '開源社區', + document: '文檔說明', + updatePrompt: '當前應用均為最新版本', + installPrompt: '尚未安裝任何應用', + updateHelper: '更新參數可能導致應用無法啟動,請提前備份並謹慎操作', + updateWarn: '更新參數需要重建應用,是否繼續?', + busPort: '服務端口', + syncStart: '開始同步!請稍後刷新應用商店', + advanced: '高級設置', + cpuCore: '核心數', + containerName: '容器名稱', + containerNameHelper: '可以為空,為空自動生成', + allowPort: '端口外部訪問', + allowPortHelper: '允許端口外部訪問會放開防火墻端口,php運行環境請勿放開', + appInstallWarn: '應用端口默認不允許外部訪問,可以在下方高級設置中選擇放開', + upgradeStart: '開始升級!請稍後刷新頁面', + toFolder: '進入安裝目錄', + editCompose: '編輯 compose 文件', + editComposeHelper: '編輯 compose 文件可能導致軟件安裝失敗', + composeNullErr: 'compose 不能為空', + takeDown: '已廢棄', + allReadyInstalled: '已安裝', + installHelper: '配置鏡像加速可以解決鏡像拉取失敗的問題', + upgradeHelper: '異常應用需要先同步到正常狀態', + }, + website: { + website: '網站', + primaryDomain: '主域名', + otherDomains: '其他域名', + static: '靜態網站', + deployment: '一鍵部署', + supportUpType: '僅支持 .tar.gz 文件', + zipFormat: '.tar.gz 壓縮包結構:test.tar.gz 壓縮包內,必需包含 {0} 文件', + proxy: '反向代理', + alias: '代號', + remark: '備註', + group: '分組', + groupSetting: '分組管理', + createGroup: '創建分組', + app: '應用', + appNew: '新裝應用', + appInstalled: '已裝應用', + create: '創建網站', + delete: '刪除網站', + deleteApp: '刪除應用', + deleteBackup: '刪除備份', + domain: '域名', + domainHelper: '一行一個域名,支持*和IP地址,支持域名:端口', + addDomain: '新增域名', + domainConfig: '域名設置', + defaultDoc: '默認文檔', + perserver: '並發限製', + perserverHelper: '限製當前站點最大並發數', + perip: '單IP限製', + peripHelper: '限製單個IP訪問最大並發數', + rate: '流量限製', + rateHelper: '限製每個請求的流量上(單位:KB)', + limitHelper: '啟用流量控製', + other: '其他', + currentSSL: '當前證書', + dnsAccount: 'DNS賬號', + applySSL: '證書申請', + SSLList: '證書列表', + createDnsAccount: 'DNS賬戶', + aliyun: '阿裏雲DNS', + manual: '手動解析', + key: '密鑰', + check: '查看', + acmeAccountManage: 'Acme 賬戶', + email: '郵箱', + addAccount: '創建賬戶', + acmeAccount: 'Acme 賬戶', + provider: '驗證方式', + dnsManual: '手動解析', + expireDate: '過期時間', + brand: '頒發者', + deploySSL: '部署', + deploySSLHelper: '確定部署證書?', + ssl: '證書', + dnsAccountManage: 'DNS 賬戶', + renewSSL: '續簽', + renewHelper: '確定續簽證書?', + renewSuccess: '續簽證書', + config: '配置', + enableHTTPS: '啟用 HTTPS', + aliasHelper: '代號是網站目錄的文件夾名稱', + lastBackupAt: '上次備份時間', + null: '無', + nginxConfig: 'Nginx配置', + websiteConfig: '網站設置', + basic: '基本', + source: '配置文件', + security: '安全', + log: '日誌', + nginxPer: '性能調整', + neverExpire: '永不過期', + setDefault: '設為默認', + default: '默認', + deleteHelper: '相關應用狀態不正常,請檢查', + toApp: '去已安裝列表', + cycle: '周期', + frequency: '頻率', + ccHelper: '{0} 秒內累計請求同一URL超過 {1} 次,觸發CC防禦,封鎖此IP', + mustSave: '修改之後需要保存才能生效', + fileExt: '文件擴展名', + fileExtBlock: '文件擴展名黑名單', + value: '值', + enable: '開啟', + proxyAddress: '代理地址', + proxyHelper: '例: http://127.0.0.1:8080', + forceDelete: '強製刪除', + forceDeleteHelper: '強製刪除,會忽略刪除過程中產生的錯誤並最終刪除元數據', + deleteAppHelper: '同時刪除關聯應用、數據庫以及應用備份', + deleteBackupHelper: '同時刪除網站備份', + deleteConfirmHelper: '刪除操作無法回滾,請輸入 "{0}" 刪除', + staticPath: '對應主目錄:', + limit: '限製方案', + blog: '論壇/博客', + imageSite: '圖片站', + downloadSite: '下載站', + shopSite: '商城', + doorSite: '門戶', + qiteSite: '企業', + videoSite: '視頻', + errLog: '錯誤日誌', + accessLog: '網站日誌', + stopHelper: '停止站點後將無法正常訪問,用戶訪問會顯示當前站點停止頁面,是否繼續操作?', + startHelper: '啟用站點後,用戶可以正常訪問網站內容,是否繼續操作?', + sitePath: '網站目錄', + siteAlias: '網站代號', + primaryPath: '主目錄', + folderTitle: '網站主目錄主要包含四個文件夾', + wafFolder: '防火墻規則', + indexFolder: '網站root目錄', + logFolder: '網站日誌', + sslFolder: '網站證書', + enableOrNot: '是否啟用', + oldSSL: '選擇已有證書', + manualSSL: '手動導入證書', + select: '選擇', + selectSSL: '選擇證書', + privateKey: '密鑰(KEY)', + certificate: '證書(PEM格式)', + HTTPConfig: 'HTTP 選項', + HTTPSOnly: '禁止 HTTP', + HTTPToHTTPS: '訪問HTTP自動跳轉到HTTPS', + HTTPAlso: 'HTTP可直接訪問', + sslConfig: 'SSL 選項', + disbaleHTTPS: '禁用 HTTPS', + disbaleHTTPSHelper: '禁用 HTTPS會刪除證書相關配置,是否繼續?', + SSLHelper: '註意:請勿將SSL證書用於非法網站 \n 如開啟後無法使用HTTPS訪問,請檢查安全組是否正確放行443端口', + SSLConfig: '證書設置', + SSLProConfig: 'SSL 協議設置', + supportProtocol: '支持的協議版本', + encryptionAlgorithm: '加密算法', + notSecurity: '(不安全)', + encryptHelper: + "Let's Encrypt 簽發證書有頻率限製,但足以滿足正常需求,過於頻繁操作會導致簽發失敗。具體限製請看 官方文檔 ", + ipValue: '值', + ext: '文件擴展名', + wafInputHelper: '按行輸入數據,一行一個', + data: '數據', + ever: '永久', + nextYear: '一年後', + noLog: '當前沒有日誌...', + defaultServer: '默認站點', + noDefaultServer: '未設置', + defaultServerHelper: '設置默認站點後,所有未綁定的域名和IP都被定向到默認站點\n可有效防止惡意解析', + websiteDeploymentHelper: '使用從 1Panel 部署的應用創建網站', + websiteStatictHelper: '在主機上創建網站目錄', + websiteProxyHelper: + '代理已有服務,例如本機已安裝使用 8080 端口的 halo 服務,那麼代理地址為 http://127.0.0.1:8080', + restoreHelper: '確認使用此備份恢復?', + wafValueHelper: '值', + wafRemarkHelper: '描述', + runtimeProxyHelper: '使用從 1Panel 創建的運行環境', + runtime: '運行環境', + deleteRuntimeHelper: '運行環境應用需要跟網站一並刪除,請謹慎處理', + proxyType: '監聽網絡類型', + unix: 'Unix 網絡', + tcp: 'TCP/IP 網絡', + phpFPM: 'FPM 配置文件', + phpConfig: 'PHP 配置文件', + updateConfig: '配置修改', + isOn: '開啟', + isOff: '關閉', + rewrite: '偽靜態', + rewriteMode: '方案', + current: '當前', + rewriteHelper: '若設置偽靜態後,網站無法正常訪問,請嘗試設置回default', + runDir: '運行目錄', + runDirHelper: '部分程序需要指定二級目錄作為運行目錄,如ThinkPHP5,Laravel', + runUserHelper: + '通過 PHP 運行環境部署的網站,需要將 index 和子目錄下的所有文件、文件夾所有者和用戶組設置為 1000', + userGroup: '運行用戶/組', + uGroup: '用戶組', + proxyPath: '前端請求路徑', + proxyPass: '後端代理地址', + cache: '緩存', + createProxy: '創建反向代理', + editProxy: '編輯反向代理', + cacheTime: '緩存時間', + enableCache: '開啟緩存', + proxyHost: '後端域名', + disabled: '已停止', + startProxy: '開啟反向代理', + stopProxy: '關閉反向代理', + proxyFile: '源文', + proxyHelper1: '訪問這個目錄時將會把目標URL的內容返回並顯示', + proxyPassHelper: '代理的站點,必須為可正常訪問的URL', + proxyHostHelper: '將域名添加到請求頭傳遞到代理服務器', + replacementHelper: '最多可以添加5條替換內容,如果不需要替換請留空', + modifier: '匹配規則', + modifierHelper: '例:= 精確匹配,~ 正則匹配,^~ 匹配路徑開頭 等', + replace: '文本替換', + addReplace: '添加文本替換', + replaced: '搜索字符串(不能為空)', + replaceText: '替換為字符串', + replacedErr: '搜索字符串不能為空', + replacedErr2: '搜索字符串不能重復', + basicAuth: '密碼訪問', + editBasicAuthHelper: '密碼為非對稱加密,無法回顯,編輯需要重新設置密碼', + createPassword: '生成密碼', + antiLeech: '防盜鏈', + extends: '擴展名', + browserCache: '瀏覽器緩存', + leechLog: '記錄防盜鏈日誌', + accessDomain: '允許的域名', + leechReturn: '響應資源', + noneRef: '允許來源為空', + disable: '未啟用', + disableLeechHelper: '是否禁用防盜鏈', + disableLeech: '禁用防盜鏈', + ipv6: '監聽 IPV6 端口', + leechReturnError: '請填寫 HTTP 狀態碼', + }, + php: { + short_open_tag: '短標簽支持', + max_execution_time: '最大腳本運行時間', + max_input_time: '最大輸入時間', + memory_limit: ' 腳本內存限製', + post_max_size: 'POST數據最大尺寸', + file_uploads: '是否允許上傳文件', + upload_max_filesize: '允許上傳文件的最大尺寸', + max_file_uploads: '允許同時上傳文件的最大數量', + default_socket_timeout: 'Socket超時時間', + error_reporting: '錯誤級別', + display_errors: '是否輸出詳細錯誤信息', + cgi_fix_pathinfo: '是否開啟pathinfo', + date_timezone: '時區', + disableFunction: '禁用函數', + disableFunctionHelper: '輸入要禁用的函數,例如exec,多個請用,分割', + uploadMaxSize: '上傳限製', + }, + nginx: { + serverNamesHashBucketSizeHelper: '服務器名字的hash表大小', + clientHeaderBufferSizeHelper: '客戶端請求的頭buffer大小', + clientMaxBodySizeHelper: '最大上傳文件', + keepaliveTimeoutHelper: '連接超時時間', + gzipMinLengthHelper: '最小壓縮文件', + gzipCompLevelHelper: '壓縮率', + gzipHelper: '是否開啟壓縮傳輸', + connections: '活動連接(Active connections)', + accepts: '總連接次數(accepts)', + handled: '總握手次數(handled)', + requests: '總請求數(requests)', + reading: '請求數(Reading)', + writing: '響應數(Writing)', + waiting: '駐留進程(Waiting)', + status: '當前狀態', + nginxConfig: 'OpenResty 設置', + configResource: '配置修改', + saveAndReload: '保存並重載', + }, + ssl: { + create: '創建證書', + provider: '類型', + manualCreate: '手動創建', + acmeAccount: 'Acme 賬號', + resolveDomain: '解析域名', + err: '錯誤', + value: '記錄值', + dnsResolveHelper: '請到DNS解析服務商處添加以下解析記錄:', + detail: '詳情', + msg: '證書信息', + ssl: '證書', + key: '私鑰', + startDate: '生效時間', + organization: '簽發機構', + renewConfirm: '是否確定續簽?', + autoRenew: '自動續簽', + autoRenewHelper: '距離到期時間7天自動續簽', + renewSuccess: '續簽成功', + renewWebsite: '該證書已經和以下網站關聯,續簽會同步應用到這些網站', + createAcme: '創建賬戶', + acmeHelper: 'Acme 賬戶用於申請免費證書', + }, + firewall: { + notSupport: '未檢測到系統防火墻(firewalld 或者 ufw),請參考官方文檔進行安裝', + ccDeny: 'CC 防護', + ipWhiteList: 'IP 白名單', + ipBlockList: 'IP 黑名單', + fileExtBlockList: '文件擴展名黑名單', + urlWhiteList: 'URL 白名單', + urlBlockList: 'URL 黑名單', + argsCheck: 'GET 參數校驗', + postCheck: 'POST 參數校驗', + cookieBlockList: 'Cookie 黑名單', + + firewall: '防火墻', + dockerHelper: 'Linux 防火墻 {0} 無法禁用 Docker 端口映射,應用可以在 [已安裝] 頁面編輯參數來控製端口是否放開', + quickJump: '快速跳轉', + used: '已使用', + unUsed: '未使用', + firewallHelper: '{0}系統防火墻', + firewallNotStart: '當前未開啟系統防火墻,請先開啟!', + stopFirewallHelper: '系統防火墻關閉後,服務器將失去安全防護,是否繼續?', + startFirewallHelper: '系統防火墻開啟後,可以更好的防護服務器安全,是否繼續?', + noPing: '禁 ping', + noPingTitle: '是否禁 ping', + noPingHelper: '禁 ping 後將無法 ping 通服務器,是否繼續?', + onPingHelper: '解除禁 ping 後您的服務器可能會被黑客發現,是否繼續?', + changeStrategy: '修改{0}策略', + changeStrategyIPHelper1: 'IP 策略修改為【屏蔽】,設置後該 IP 將禁止訪問服務器,是否繼續?', + changeStrategyIPHelper2: 'IP 策略修改為【放行】,設置後該 IP 將恢復正常訪問,是否繼續?', + changeStrategyPortHelper1: '端口策略修改為【拒絕】,設置後端口將拒絕外部訪問,是否繼續?', + changeStrategyPortHelper2: '端口策略修改為【允許】,設置後端口將恢復正常訪問,是否繼續?', + stop: '禁止', + portFormatError: '請輸入正確的端口信息!', + portHelper1: '多個端口,如:8080,8081', + portHelper2: '範圍端口,如:8080-8089', + strategy: '策略', + accept: '允許', + drop: '拒絕', + source: '來源', + anyWhere: '所有 IP', + address: '指定 IP', + addressHelper: '支持輸入 IP 或 IP 段', + allow: '放行', + deny: '屏蔽', + addressFormatError: '請輸入合法的 ip 地址!', + addressHelper1: '多個 IP 請用 "," 隔開:172.16.10.11,172.16.10.99', + addressHelper2: 'IP 段:172.16.0.0/24', + allIP: '所有 IP', + portRule: '端口規則', + ipRule: 'IP 規則', + }, + runtime: { + runtime: '運行環境', + image: '鏡像', + workDir: '工作目錄', + create: '創建運行環境', + resource: '來源', + appstore: '應用商店', + local: '本地', + app: '應用', + localHelper: '本地運行環境需要自行安裝', + version: '版本', + versionHelper: 'PHP的版本,例 v8.0', + buildHelper: '選擇的擴展越多,製作鏡像過程中占用 CPU 越多,請盡量避免選擇全部擴展', + openrestryWarn: 'PHP 需要升級 OpenResty 至 1.21.4.1 版本以上才能使用', + toupgrade: '去升級', + edit: '編輯運行環境', + extendHelper: '列表中不存在的擴展,可以手動輸入之後選擇,例:輸入 sockets ,然後在下拉列表中選擇第一個', + rebuildHelper: '編輯擴展後需要去【應用商店-已安裝】頁面【重建】PHP 應用之後才能生效', + }, + process: { + pid: '進程ID', + ppid: '父進程ID', + numThreads: '線程', + memory: '內存', + diskRead: '磁盤讀', + diskWrite: '磁盤寫', + netSent: '上行', + netRecv: '下行', + numConnections: '連接', + startTime: '啟動時間', + status: '狀態', + running: '運行中', + sleep: '睡眠', + stop: '停止', + idle: '空閑', + zombie: '僵屍進程', + wait: '等待', + lock: '鎖定', + blocked: '阻塞', + cmdLine: '啟動命令', + basic: '基本信息', + mem: '內存信息', + openFiles: '文件打開', + file: '文件', + env: '環境變量', + noenv: '無', + net: '網絡連接', + laddr: '源地址/端口', + raddr: '目標地址/端口', + stopProcess: '結束', + stopProcessWarn: '是否確定結束此進程 (PID:{0})?此操作不可回滾', + }, +}; +export default { + ...fit2cloudTwLocale, + ...message, +}; diff --git a/frontend/src/lang/modules/zh.ts b/frontend/src/lang/modules/zh.ts index ddf296c5f..60ba1653f 100644 --- a/frontend/src/lang/modules/zh.ts +++ b/frontend/src/lang/modules/zh.ts @@ -136,6 +136,7 @@ const message = { licenseHelper: '同意 « 飞致云社区软件许可协议 »', errorAgree: '请点击同意社区软件许可协议', + logout: '退出登录', }, rule: { username: '请输入用户名', @@ -181,18 +182,6 @@ const message = { notFound: '资源不存在', commonError: '请求失败', }, - header: { - language: '国际化', - zh: '简体中文', - en: 'English', - theme: '布局设置', - globalTheme: '全局主题', - themeColor: '主题颜色', - darkTheme: '暗黑主题', - personalData: '个人资料', - changePassword: '修改密码', - logout: '退出登录', - }, service: { serviceNotStarted: '当前未启动 {0} 服务', }, diff --git a/frontend/src/layout/components/Sidebar/index.vue b/frontend/src/layout/components/Sidebar/index.vue index 6d6ea50c1..f1e0c4330 100644 --- a/frontend/src/layout/components/Sidebar/index.vue +++ b/frontend/src/layout/components/Sidebar/index.vue @@ -22,7 +22,7 @@ diff --git a/frontend/src/store/interface/index.ts b/frontend/src/store/interface/index.ts index 6d72ba6aa..b5fb7a80c 100644 --- a/frontend/src/store/interface/index.ts +++ b/frontend/src/store/interface/index.ts @@ -13,7 +13,7 @@ export interface GlobalState { isLogin: boolean; entrance: string; csrfToken: string; - language: string; // zh | en + language: string; // zh | en | tw // assemblySize: string; // small | default | large themeConfig: ThemeConfigProp; isFullScreen: boolean; diff --git a/frontend/src/views/app-store/apps/index.vue b/frontend/src/views/app-store/apps/index.vue index 5cfe557ef..3960e1d0f 100644 --- a/frontend/src/views/app-store/apps/index.vue +++ b/frontend/src/views/app-store/apps/index.vue @@ -20,7 +20,7 @@ :type="activeTag === item.key ? 'primary' : ''" :plain="activeTag !== item.key" > - {{ language == 'zh' ? item.name : item.key }} + {{ language == 'zh' || language == 'tw' ? item.name : item.key }} @@ -79,13 +79,17 @@
- {{ language == 'zh' ? app.shortDescZh : app.shortDescEn }} + {{ + language == 'zh' || language == 'tw' + ? app.shortDescZh + : app.shortDescEn + }}
- {{ language == 'zh' ? tag.name : tag.key }} + {{ language == 'zh' || language == 'tw' ? tag.name : tag.key }} diff --git a/frontend/src/views/app-store/detail/index.vue b/frontend/src/views/app-store/detail/index.vue index 41ab47e4e..0a89732ba 100644 --- a/frontend/src/views/app-store/detail/index.vue +++ b/frontend/src/views/app-store/detail/index.vue @@ -15,7 +15,7 @@
- {{ language == 'zh' ? app.shortDescZh : app.shortDescEn }} + {{ language == 'zh' || language == 'tw' ? app.shortDescZh : app.shortDescEn }}
diff --git a/frontend/src/views/app-store/detail/params/index.vue b/frontend/src/views/app-store/detail/params/index.vue index 9aedb4bee..3cc7aa2c3 100644 --- a/frontend/src/views/app-store/detail/params/index.vue +++ b/frontend/src/views/app-store/detail/params/index.vue @@ -237,7 +237,7 @@ const changeService = (value: string, services: App.AppService[]) => { const getLabel = (row: ParamObj): string => { const language = useI18n().locale.value; - if (language == 'zh') { + if (language == 'zh' || language == 'tw') { return row.labelZh; } else { return row.labelEn; diff --git a/frontend/src/views/app-store/installed/detail/index.vue b/frontend/src/views/app-store/installed/detail/index.vue index 81ff773df..bf51f2ec9 100644 --- a/frontend/src/views/app-store/installed/detail/index.vue +++ b/frontend/src/views/app-store/installed/detail/index.vue @@ -223,7 +223,7 @@ const get = async () => { const getLabel = (row: EditForm): string => { const language = useI18n().locale.value; - if (language == 'zh') { + if (language == 'zh' || language == 'tw') { return row.labelZh; } else { return row.labelEn; diff --git a/frontend/src/views/home/app/index.vue b/frontend/src/views/home/app/index.vue index 3bca24b3f..f96a25d9e 100644 --- a/frontend/src/views/home/app/index.vue +++ b/frontend/src/views/home/app/index.vue @@ -15,7 +15,7 @@
- {{ language == 'zh' ? app.shortDescZh : app.shortDescEn }} + {{ language == 'zh' || language == 'tw' ? app.shortDescZh : app.shortDescEn }}
diff --git a/frontend/src/views/log/operation/index.vue b/frontend/src/views/log/operation/index.vue index a2e4ca4e8..691bf6165 100644 --- a/frontend/src/views/log/operation/index.vue +++ b/frontend/src/views/log/operation/index.vue @@ -65,7 +65,9 @@ @@ -143,7 +145,7 @@ const search = async () => { .then((res) => { loading.value = false; data.value = res.data.items || []; - if (globalStore.language === 'zh') { + if (globalStore.language === 'zh' || globalStore.language === 'tw') { for (const item of data.value) { item.detailZH = loadDetail(item.detailZH); } diff --git a/frontend/src/views/setting/panel/index.vue b/frontend/src/views/setting/panel/index.vue index 92c571056..cbc3217d6 100644 --- a/frontend/src/views/setting/panel/index.vue +++ b/frontend/src/views/setting/panel/index.vue @@ -55,7 +55,8 @@ @change="onSave('Language', form.language)" v-model="form.language" > - 中文 + 中文(简体) + 中文(繁體) English diff --git a/frontend/src/views/website/runtime/edit/index.vue b/frontend/src/views/website/runtime/edit/index.vue index 82a8a7e76..861e3f3ee 100644 --- a/frontend/src/views/website/runtime/edit/index.vue +++ b/frontend/src/views/website/runtime/edit/index.vue @@ -98,7 +98,7 @@ const handleParams = () => { const getLabel = (row: ParamObj): string => { const language = useI18n().locale.value; - if (language == 'zh') { + if (language == 'zh' || language == 'tw') { return row.labelZh; } else { return row.labelEn; diff --git a/frontend/src/views/website/runtime/param/index.vue b/frontend/src/views/website/runtime/param/index.vue index 5dbed1a63..1bbb52139 100644 --- a/frontend/src/views/website/runtime/param/index.vue +++ b/frontend/src/views/website/runtime/param/index.vue @@ -93,7 +93,7 @@ const handleParams = () => { const getLabel = (row: ParamObj): string => { const language = useI18n().locale.value; - if (language == 'zh') { + if (language == 'zh' || language == 'tw') { return row.labelZh; } else { return row.labelEn;