From 11dd2e7238846229abfadc33b6e83e17b7247f01 Mon Sep 17 00:00:00 2001 From: Kuingsmile <96409857+Kuingsmile@users.noreply.github.com> Date: Fri, 1 Aug 2025 22:09:20 +0800 Subject: [PATCH] :sparkles: Feature(custom): rewrite titlebar and navigation UI --- .vscode/settings.json | 15 +- package.json | 2 + src/main/apis/app/uploader/index.ts | 2 +- src/main/apis/app/window/constants.ts | 20 +- src/main/apis/app/window/windowList.ts | 19 +- src/renderer/App.vue | 14 +- src/renderer/components/NavigationPage.vue | 746 ++++++++++++++++++ src/renderer/components/ui/ThemeSwitcher.vue | 94 +++ src/renderer/components/ui/TitleBar.vue | 241 ++++++ src/renderer/hooks/appStore.ts | 83 ++ src/renderer/i18n/locales/en.json | 42 +- src/renderer/i18n/locales/zh-CN.json | 43 +- src/renderer/i18n/locales/zh-TW.json | 43 +- src/renderer/layouts/Main.vue | 758 +++++++------------ src/renderer/main.ts | 5 + src/renderer/manage/utils/constants.ts | 18 +- src/renderer/manage/utils/newBucketConfig.ts | 18 +- src/renderer/pages/DocumentPage.vue | 35 - src/renderer/router/index.ts | 66 +- yarn.lock | 24 + 20 files changed, 1692 insertions(+), 596 deletions(-) create mode 100644 src/renderer/components/NavigationPage.vue create mode 100644 src/renderer/components/ui/ThemeSwitcher.vue create mode 100644 src/renderer/components/ui/TitleBar.vue create mode 100644 src/renderer/hooks/appStore.ts delete mode 100644 src/renderer/pages/DocumentPage.vue diff --git a/.vscode/settings.json b/.vscode/settings.json index 68c6b8d1..687e2026 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -8,10 +8,17 @@ "githubPullRequests.ignoredPullRequestBranches": [ "dev" ], - "[go]": { - "editor.codeActionsOnSave": { - "source.fixAll.eslint": "explicit" - } + "[json]": { + "editor.defaultFormatter": "esbenp.prettier-vscode", + "editor.formatOnSave": true + }, + "[html]": { + "editor.defaultFormatter": "esbenp.prettier-vscode", + "editor.formatOnSave": true + }, + "[css]": { + "editor.defaultFormatter": "esbenp.prettier-vscode", + "editor.formatOnSave": true }, "typescript.tsdk": "node_modules\\typescript\\lib" } \ No newline at end of file diff --git a/package.json b/package.json index b4d73303..9f9a5595 100644 --- a/package.json +++ b/package.json @@ -44,6 +44,7 @@ "@aws-sdk/s3-request-presigner": "^3.857.0", "@electron-toolkit/preload": "^3.0.2", "@element-plus/icons-vue": "^2.3.1", + "@headlessui/vue": "^1.7.23", "@highlightjs/vue-plugin": "^2.1.2", "@nodelib/fs.walk": "^3.0.1", "@octokit/rest": "^22.0.0", @@ -67,6 +68,7 @@ "hpagent": "^1.2.0", "js-yaml": "^4.1.0", "lodash-es": "^4.17.21", + "lucide-vue-next": "^0.535.0", "marked": "^16.1.1", "mime-types": "^2.1.35", "mitt": "^3.0.1", diff --git a/src/main/apis/app/uploader/index.ts b/src/main/apis/app/uploader/index.ts index 06ebcd85..fe52e803 100644 --- a/src/main/apis/app/uploader/index.ts +++ b/src/main/apis/app/uploader/index.ts @@ -8,7 +8,7 @@ import windowManager from 'apis/app/window/windowManager' import dayjs from 'dayjs' import { BrowserWindow, clipboard, ipcMain, IpcMainEvent, Notification, WebContents } from 'electron' import fs from 'fs-extra' -import { IPicGo } from 'piclist' +import type { IPicGo } from 'piclist' import writeFile from 'write-file-atomic' import { GET_RENAME_FILE_NAME, RENAME_FILE_NAME } from '#/events/constants' diff --git a/src/main/apis/app/window/constants.ts b/src/main/apis/app/window/constants.ts index 1bbec259..e0043445 100644 --- a/src/main/apis/app/window/constants.ts +++ b/src/main/apis/app/window/constants.ts @@ -2,21 +2,21 @@ const isDevelopment = process.env.NODE_ENV !== 'production' export const MANUAL_WINDOW_URL = process.env.NODE_ENV === 'development' - ? 'http://localhost:3000#documents' - : 'index.html#documents' + ? 'http://localhost:3000/documents' + : 'index.html/documents' export const MINI_WINDOW_URL = isDevelopment - ? 'http://localhost:3000#mini-page' - : 'index.html#mini-page' + ? 'http://localhost:3000/mini-page' + : 'index.html/mini-page' export const RENAME_WINDOW_URL = process.env.NODE_ENV === 'development' - ? 'http://localhost:3000#rename-page' - : 'index.html#rename-page' + ? 'http://localhost:3000/rename-page' + : 'index.html/rename-page' export const SETTING_WINDOW_URL = isDevelopment - ? 'http://localhost:3000#main-page/upload' - : 'index.html#main-page/upload' + ? 'http://localhost:3000/main-page/upload' + : 'index.html/main-page/upload' export const TRAY_WINDOW_URL = isDevelopment ? 'http://localhost:3000' : 'index.html' @@ -24,5 +24,5 @@ console.log(TRAY_WINDOW_URL) export const TOOLBOX_WINDOW_URL = process.env.NODE_ENV === 'development' - ? 'http://localhost:3000#toolbox-page' - : 'index.html#toolbox-page' + ? 'http://localhost:3000/toolbox-page' + : 'index.html/toolbox-page' diff --git a/src/main/apis/app/window/windowList.ts b/src/main/apis/app/window/windowList.ts index 31157ebc..2fddf5ab 100644 --- a/src/main/apis/app/window/windowList.ts +++ b/src/main/apis/app/window/windowList.ts @@ -24,8 +24,6 @@ import { const windowList = new Map() -const handleWindowParams = (windowURL: string) => windowURL - const getDefaultWindowSizes = (): { width: number; height: number } => { const [mainWindowWidth, mainWindowHeight] = db.get([ configPaths.settings.mainWindowWidth, @@ -92,8 +90,8 @@ const settingWindowOptions = { fullscreenable: true, resizable: true, title: 'PicList', - vibrancy: 'ultra-dark', - transparent: true, + transparent: false, + backgroundColor: '#ebeef5', titleBarStyle: 'hidden', webPreferences: { sandbox: false, @@ -108,10 +106,7 @@ const settingWindowOptions = { } as IBrowserWindowOptions if (process.platform !== 'darwin') { - settingWindowOptions.show = false settingWindowOptions.frame = false - settingWindowOptions.backgroundColor = '#3f3c37' - settingWindowOptions.transparent = false settingWindowOptions.icon = '../../../../../resources/logo.png' } @@ -196,7 +191,7 @@ windowList.set(IWindowList.TRAY_WINDOW, { multiple: false, options: () => trayWindowOptions, callback (window) { - window.loadURL(handleWindowParams(TRAY_WINDOW_URL)) + window.loadURL(TRAY_WINDOW_URL) window.on('blur', () => { window.hide() }) @@ -208,7 +203,7 @@ windowList.set(IWindowList.MANUAL_WINDOW, { multiple: false, options: () => manualWindowOptions, callback (window) { - window.loadURL(handleWindowParams(MANUAL_WINDOW_URL)) + window.loadURL(MANUAL_WINDOW_URL) window.focus() } }) @@ -218,7 +213,7 @@ windowList.set(IWindowList.SETTING_WINDOW, { multiple: false, options: () => settingWindowOptions, callback (window, windowManager) { - window.loadURL(handleWindowParams(SETTING_WINDOW_URL)) + window.loadURL(SETTING_WINDOW_URL) window.webContents.openDevTools({ mode: 'detach' }) window.on('closed', () => { bus.emit(TOGGLE_SHORTKEY_MODIFIED_MODE, false) @@ -238,7 +233,7 @@ windowList.set(IWindowList.MINI_WINDOW, { multiple: false, options: () => miniWindowOptions, callback (window) { - window.loadURL(handleWindowParams(MINI_WINDOW_URL)) + window.loadURL(MINI_WINDOW_URL) } }) @@ -247,7 +242,7 @@ windowList.set(IWindowList.RENAME_WINDOW, { multiple: true, options: () => renameWindowOptions, async callback (window, windowManager) { - window.loadURL(handleWindowParams(RENAME_WINDOW_URL)) + window.loadURL(RENAME_WINDOW_URL) const currentWindow = windowManager.getAvailableWindow(true) if (currentWindow && currentWindow.isVisible()) { const { x, y, width, height } = currentWindow.getBounds() diff --git a/src/renderer/App.vue b/src/renderer/App.vue index df4cf52b..442261a0 100644 --- a/src/renderer/App.vue +++ b/src/renderer/App.vue @@ -9,15 +9,18 @@ + + diff --git a/src/renderer/components/ui/ThemeSwitcher.vue b/src/renderer/components/ui/ThemeSwitcher.vue new file mode 100644 index 00000000..1fae419f --- /dev/null +++ b/src/renderer/components/ui/ThemeSwitcher.vue @@ -0,0 +1,94 @@ + + + + + diff --git a/src/renderer/components/ui/TitleBar.vue b/src/renderer/components/ui/TitleBar.vue new file mode 100644 index 00000000..10178c1a --- /dev/null +++ b/src/renderer/components/ui/TitleBar.vue @@ -0,0 +1,241 @@ + + + + + diff --git a/src/renderer/hooks/appStore.ts b/src/renderer/hooks/appStore.ts new file mode 100644 index 00000000..9aa10424 --- /dev/null +++ b/src/renderer/hooks/appStore.ts @@ -0,0 +1,83 @@ +import { defineStore } from 'pinia' +import { ref } from 'vue' + +import { IStringKeyMap } from '#/types/types' + +export const useAppStore = defineStore('app', () => { + const settings = ref({ + app: { + theme: 'light' + } + }) + const loading = ref(false) + const error = ref() + + function clearError () { + error.value = undefined + } + + const loadSettings = () => { + const savedTheme = localStorage.getItem('theme') + if (savedTheme) { + settings.value.app.theme = savedTheme + } + applyTheme(settings.value.app.theme || 'light') + } + + function applyTheme (theme: string) { + const root = document.documentElement + root.classList.remove('light', 'dark', 'auto') + + if (theme === 'auto') { + root.classList.add('auto') + const prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches + root.classList.add(prefersDark ? 'dark' : 'light') + + const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)') + mediaQuery.addEventListener('change', e => { + if (settings.value.app.theme === 'auto') { + root.classList.remove('light', 'dark') + root.classList.add(e.matches ? 'dark' : 'light') + } + }) + } else { + root.classList.add(theme) + } + } + + function setTheme (theme: 'light' | 'dark' | 'auto') { + settings.value.app.theme = theme + localStorage.setItem('theme', theme) + applyTheme(theme) + } + + function toggleTheme () { + const currentTheme = settings.value.app.theme || 'light' + const themes = ['light', 'dark', 'auto'] as const + const currentIndex = themes.indexOf(currentTheme as any) + const nextTheme = themes[(currentIndex + 1) % themes.length] + setTheme(nextTheme) + } + + function init () { + try { + loadSettings() + } catch (err) { + console.error('Application initialization failed:', err) + throw err + } + } + + return { + init, + loadSettings, + settings, + loading, + error, + clearError, + setTheme, + toggleTheme, + applyTheme + + } +}) diff --git a/src/renderer/i18n/locales/en.json b/src/renderer/i18n/locales/en.json index 2fecdd6f..d0ae1d5b 100644 --- a/src/renderer/i18n/locales/en.json +++ b/src/renderer/i18n/locales/en.json @@ -1,4 +1,39 @@ { + "app": { + "title": "PicList" + }, + "titleBar": { + "alwaysOnTop": "Always On Top", + "close": "Close", + "minimize": "Minimize", + "miniWindow": "Mini Window" + }, + "navigation": { + "upload": "Upload", + "manage": "Manage", + "gallery": "Gallery", + "settings": "Settings", + "plugins": "Plugins", + "picbed": "PicBed", + "close": "Close", + "copyPicBedConfig": "Copy PicBed Config", + "selected": "Selected", + "moreOptions": "More Options", + "picBedQrCode": "PicBed QR Code", + "choosePicBed": "Choose PicBed", + "selectPicBeds": "Select PicBeds" + }, + "settings": { + "theme": { + "light": "Light", + "dark": "Dark", + "auto": "Auto", + "lightDesc": "Light Mode", + "darkDesc": "Dark Mode", + "autoDesc": "Auto Mode", + "toggle": "Toggle Theme" + } + }, "OPEN_MAIN_WINDOW": "Open Main Window", "OPERATION_SUCCEED": "Operation Succeed", "QUICK_UPLOAD": "Quick Upload", @@ -21,7 +56,6 @@ "MANUAL_PAGE_OPEN_BY_BROWSER": "Browser", "MANUAL_PAGE_OPEN_BY_BUILD_IN": "Built-in Window", "MANUAL_PAGE_OPEN_SETTING_TIP": "Select the way to open the manual", - "UPLOAD_AREA": "Upload", "UPLOAD_VIEW_HINT": "Click to open picbeds settings", "MANAGE_PAGE": "Manage", "GALLERY": "Gallery", @@ -432,8 +466,8 @@ "MANAGE_CONSTANT_GITHUB_PROXY_TIPS": "If the access speed is slow, you can try configuring a proxy", "MANAGE_CONSTANT_GITHUB_PAGING_DESC": "Enable pagination", "MANAGE_CONSTANT_GITHUB_CUSTOM_URL_DESC": "CDN acceleration domain name - Optional", - "MANAGE_CONSTANT_GITHUB_CUSTOM_URL_PLACEHOLDER": "Support using {username}, {repo}, {branch}, and {path} as replacement placeholders", - "MANAGE_CONSTANT_GITHUB_CUSTOM_URL_TIPS": "For example: https://cdn.staticaly.com/gh/{username}/{repo}@{branch}/{path}", + "MANAGE_CONSTANT_GITHUB_CUSTOM_URL_PLACEHOLDER": "Support using {'{'}username{'}'}, {'{'}repo{'}'}, {'{'}branch{'}'}, and {'{'}path{'}'} as replacement placeholders", + "MANAGE_CONSTANT_GITHUB_CUSTOM_URL_TIPS": "eg. https://cdn.staticaly.com/gh/{'{'}username{'}'}/{'{'}repo{'}'}{'@'}{'{'}branch{'}'}/{'{'}path{'}'}", "MANAGE_CONSTANT_GITHUB_CUSTOM_URL_RULE_MESSAGE_A": "The acceleration domain name must start with http:// or https://", "MANAGE_CONSTANT_GITHUB_CUSTOM_URL_RULE_MESSAGE_B": "The braces in the acceleration domain name must appear in pairs", "MANAGE_CONSTANT_GITHUB_EXPLAIN": "There is an hourly limit for API calls, and uploading files larger than 100M is not supported", @@ -873,4 +907,4 @@ "MANAGE_NEW_BUCKET_S3PLIST_ACL_AUTHENTICATED_READ": "Authenticated Read", "PLUGIN_UPDATE_SUCCEED": "Plugin update succeed", "TIPS_NOTICE": "Tips" -} \ No newline at end of file +} diff --git a/src/renderer/i18n/locales/zh-CN.json b/src/renderer/i18n/locales/zh-CN.json index f8fca21f..8b7acbe8 100644 --- a/src/renderer/i18n/locales/zh-CN.json +++ b/src/renderer/i18n/locales/zh-CN.json @@ -1,4 +1,40 @@ { + "app": { + "title": "PicList" + }, + "titleBar": { + "alwaysOnTop": "置顶", + "close": "关闭", + "minimize": "最小化", + "miniWindow": "迷你窗口" + }, + "navigation": { + "upload": "上传", + "manage": "管理", + "gallery": "相册", + "settings": "设置", + "plugins": "插件", + "manual": "手册", + "picbed": "图床", + "close": "关闭", + "copyPicBedConfig": "复制图床设置", + "selected": "已选中", + "moreOptions": "更多选项", + "picBedQrCode": "图床配置二维码", + "choosePicBed": "选择图床", + "selectPicBeds": "请选择图床" + }, + "settings": { + "theme": { + "light": "浅色", + "dark": "深色", + "auto": "自动", + "lightDesc": "明亮模式", + "darkDesc": "黑暗模式", + "autoDesc": "自动模式", + "toggle": "切换主题" + } + }, "OPEN_MAIN_WINDOW": "打开主窗口", "OPERATION_SUCCEED": "操作成功", "QUICK_UPLOAD": "快捷上传", @@ -21,7 +57,6 @@ "MANUAL_PAGE_OPEN_BY_BROWSER": "浏览器", "MANUAL_PAGE_OPEN_BY_BUILD_IN": "内置窗口", "MANUAL_PAGE_OPEN_SETTING_TIP": "选择手册打开方式", - "UPLOAD_AREA": "上传", "UPLOAD_VIEW_HINT": "点击打开图床设置", "MANAGE_PAGE": "管理", "GALLERY": "相册", @@ -432,8 +467,8 @@ "MANAGE_CONSTANT_GITHUB_PROXY_TIPS": "如果访问速度较慢,可以尝试配置代理", "MANAGE_CONSTANT_GITHUB_PAGING_DESC": "是否开启分页", "MANAGE_CONSTANT_GITHUB_CUSTOM_URL_DESC": "CDN加速域名-可选", - "MANAGE_CONSTANT_GITHUB_CUSTOM_URL_PLACEHOLDER": "支持使用{username}、{repo}、{branch}和{path}作为替换占位符,用于适配不同仓库和分支", - "MANAGE_CONSTANT_GITHUB_CUSTOM_URL_TIPS": "例如: https://cdn.staticaly.com/gh/{username}/{repo}@{branch}/{path}", + "MANAGE_CONSTANT_GITHUB_CUSTOM_URL_PLACEHOLDER": "支持使用{'{'}username{'}'}、{'{'}repo{'}'}、{'{'}branch{'}'}和{'{'}path{'}'}作为替换占位符,用于适配不同仓库和分支", + "MANAGE_CONSTANT_GITHUB_CUSTOM_URL_TIPS": "例如:`https://cdn.staticaly.com/gh/{'{'}username{'}'}/{'{'}repo{'}'}{'@'}{'{'}branch{'}'}/{'{'}path{'}'}`", "MANAGE_CONSTANT_GITHUB_CUSTOM_URL_RULE_MESSAGE_A": "加速域名请以http://或https://开头", "MANAGE_CONSTANT_GITHUB_CUSTOM_URL_RULE_MESSAGE_B": "加速域名中的大括号必须成对出现", "MANAGE_CONSTANT_GITHUB_EXPLAIN": "API调用有每小时上限,此外不支持上传超过100M的文件", @@ -873,4 +908,4 @@ "MANAGE_NEW_BUCKET_S3PLIST_ACL_AUTHENTICATED_READ": "授权读", "PLUGIN_UPDATE_SUCCEED": "插件更新成功", "TIPS_NOTICE": "注意" -} \ No newline at end of file +} diff --git a/src/renderer/i18n/locales/zh-TW.json b/src/renderer/i18n/locales/zh-TW.json index 7829cf8f..024c8ddf 100644 --- a/src/renderer/i18n/locales/zh-TW.json +++ b/src/renderer/i18n/locales/zh-TW.json @@ -1,4 +1,40 @@ { + "app": { + "title": "PicList" + }, + "titleBar": { + "alwaysOnTop": "置頂", + "close": "關閉", + "minimize": "最小化", + "miniWindow": "迷你視窗" + }, + "navigation": { + "upload": "上傳", + "manage": "管理", + "gallery": "相簿", + "settings": "設定", + "plugins": "插件", + "manual": "手冊", + "picbed": "圖床", + "close": "關閉", + "copyPicBedConfig": "複製圖床設定", + "selected": "已選中", + "moreOptions": "更多選項", + "picBedQrCode": "圖床配置 QRCODE", + "choosePicBed": "選擇圖床", + "selectPicBeds": "請選擇圖床" + }, + "settings": { + "theme": { + "light": "淺色", + "dark": "深色", + "auto": "自動", + "lightDesc": "明亮模式", + "darkDesc": "黑暗模式", + "autoDesc": "自動模式", + "toggle": "切換主題" + } + }, "OPEN_MAIN_WINDOW": "打開主視窗", "OPERATION_SUCCEED": "操作成功", "QUICK_UPLOAD": "快速上傳", @@ -21,7 +57,6 @@ "MANUAL_PAGE_OPEN_BY_BROWSER": "瀏覽器", "MANUAL_PAGE_OPEN_BY_BUILD_IN": "內置窗口", "MANUAL_PAGE_OPEN_SETTING_TIP": "選擇打開手冊方式", - "UPLOAD_AREA": "上傳", "UPLOAD_VIEW_HINT": "點擊打開圖床設定", "MANAGE_PAGE": "管理", "GALLERY": "相簿", @@ -432,8 +467,8 @@ "MANAGE_CONSTANT_GITHUB_PROXY_TIPS": "如果訪問速度較慢,可以嘗試配置代理", "MANAGE_CONSTANT_GITHUB_PAGING_DESC": "是否開啟分頁", "MANAGE_CONSTANT_GITHUB_CUSTOM_URL_DESC": "CDN加速域名-可選", - "MANAGE_CONSTANT_GITHUB_CUSTOM_URL_PLACEHOLDER": "支持使用{username}、{repo}、{branch}和{path}作為替換占位符,用於適配不同倉庫和分支", - "MANAGE_CONSTANT_GITHUB_CUSTOM_URL_TIPS": "例如: https://cdn.staticaly.com/gh/{username}/{repo}@{branch}/{path}", + "MANAGE_CONSTANT_GITHUB_CUSTOM_URL_PLACEHOLDER": "支持使用{'{'}username{'}'}、{'{'}repo{'}'}、{'{'}branch{'}'}和{'{'}path{'}'}作為替換占位符,用於適配不同倉庫和分支", + "MANAGE_CONSTANT_GITHUB_CUSTOM_URL_TIPS": "例如:`https://cdn.staticaly.com/gh/{'{'}username{'}'}/{'{'}repo{'}'}{'@'}{'{'}branch{'}'}/{'{'}path{'}'}`", "MANAGE_CONSTANT_GITHUB_CUSTOM_URL_RULE_MESSAGE_A": "加速域名請以http://或https://開頭", "MANAGE_CONSTANT_GITHUB_CUSTOM_URL_RULE_MESSAGE_B": "加速域名中的大括號必須成對出現", "MANAGE_CONSTANT_GITHUB_EXPLAIN": "API調用有每小時上限,此外不支持上傳超過100M的文件", @@ -873,4 +908,4 @@ "MANAGE_NEW_BUCKET_S3PLIST_ACL_AUTHENTICATED_READ": "授權讀", "PLUGIN_UPDATE_SUCCEED": "插件更新成功", "TIPS_NOTICE": "注意" -} \ No newline at end of file +} diff --git a/src/renderer/layouts/Main.vue b/src/renderer/layouts/Main.vue index eead26a9..0fb87d09 100644 --- a/src/renderer/layouts/Main.vue +++ b/src/renderer/layouts/Main.vue @@ -1,519 +1,297 @@ + - diff --git a/src/renderer/main.ts b/src/renderer/main.ts index 84d612eb..e25749d7 100644 --- a/src/renderer/main.ts +++ b/src/renderer/main.ts @@ -34,6 +34,7 @@ app.config.globalProperties.sendRPC = window.electron.sendRPC app.config.globalProperties.sendToMain = window.electron.sendToMain const i18n = createI18n({ + legacy: false, locale: localStorage.getItem('currentLanguage') || 'zh-CN', fallbackLocale: 'zh-CN', messages: { @@ -58,3 +59,7 @@ app.use(pinia) app.use(hljsVuePlugin) app.use(VueVideoPlayer) app.mount('#app') + +export { + i18n +} diff --git a/src/renderer/manage/utils/constants.ts b/src/renderer/manage/utils/constants.ts index 1573e990..b9e9af2c 100644 --- a/src/renderer/manage/utils/constants.ts +++ b/src/renderer/manage/utils/constants.ts @@ -1,8 +1,22 @@ -import { useI18n } from 'vue-i18n' +import { createI18n } from 'vue-i18n' +import en from '@/i18n/locales/en.json' +import zhCN from '@/i18n/locales/zh-CN.json' +import zhTW from '@/i18n/locales/zh-TW.json' import { IStringKeyMap } from '#/types/types' +type MessageSchema = typeof en -const { t } = useI18n() +const i18n = createI18n({ + legacy: false, + locale: localStorage.getItem('currentLanguage') || 'zh-CN', + fallbackLocale: 'zh-CN', + messages: { + en, + 'zh-CN': zhCN, + 'zh-TW': zhTW + } +}) +const { t } = i18n.global const defaultBaseRule = (name: string) => { return [ { diff --git a/src/renderer/manage/utils/newBucketConfig.ts b/src/renderer/manage/utils/newBucketConfig.ts index 7443f470..e0a7778f 100644 --- a/src/renderer/manage/utils/newBucketConfig.ts +++ b/src/renderer/manage/utils/newBucketConfig.ts @@ -1,10 +1,24 @@ -import { useI18n } from 'vue-i18n' +import { createI18n } from 'vue-i18n' +import en from '@/i18n/locales/en.json' +import zhCN from '@/i18n/locales/zh-CN.json' +import zhTW from '@/i18n/locales/zh-TW.json' import { IStringKeyMap } from '#/types/types' import { AliyunAreaCodeName, QiniuAreaCodeName, TencentAreaCodeName } from './bucketConfigCons' +type MessageSchema = typeof en -const { t } = useI18n() +const i18n = createI18n({ + legacy: false, + locale: localStorage.getItem('currentLanguage') || 'zh-CN', + fallbackLocale: 'zh-CN', + messages: { + en, + 'zh-CN': zhCN, + 'zh-TW': zhTW + } +}) +const { t } = i18n.global export const newBucketConfig: IStringKeyMap = { tcyun: { diff --git a/src/renderer/pages/DocumentPage.vue b/src/renderer/pages/DocumentPage.vue deleted file mode 100644 index 9b379485..00000000 --- a/src/renderer/pages/DocumentPage.vue +++ /dev/null @@ -1,35 +0,0 @@ - - - - - diff --git a/src/renderer/router/index.ts b/src/renderer/router/index.ts index 03a279f7..8418a3cd 100644 --- a/src/renderer/router/index.ts +++ b/src/renderer/router/index.ts @@ -1,110 +1,122 @@ -import { createRouter, createWebHashHistory } from 'vue-router' +import { createRouter, createWebHistory } from 'vue-router' +import MainPage from '@/layouts/Main.vue' +import ManageBucketPage from '@/manage/pages/BucketPage.vue' +import ManageEmptyPage from '@/manage/pages/EmptyPage.vue' +import ManageLoginPage from '@/manage/pages/LogInPage.vue' +import ManageMainPage from '@/manage/pages/ManageMain.vue' +import ManageSettingPage from '@/manage/pages/ManageSetting.vue' +import GalleryPage from '@/pages/Gallery.vue' +import MiniPage from '@/pages/MiniPage.vue' +import PicBedsPage from '@/pages/picbeds/index.vue' +import SettingPage from '@/pages/PicGoSetting.vue' +import PluginPage from '@/pages/Plugin.vue' +import RenamePage from '@/pages/RenamePage.vue' +import ShortKeyPage from '@/pages/ShortKey.vue' +import Toolbox from '@/pages/Toolbox.vue' +import TrayPage from '@/pages/TrayPage.vue' +import UploadPage from '@/pages/Upload.vue' +import UploaderConfigPage from '@/pages/UploaderConfigPage.vue' import * as config from '@/router/config' export default createRouter({ - history: createWebHashHistory(), + history: createWebHistory(), routes: [ { path: '/', name: config.TRAY_PAGE, - component: () => import('@/pages/TrayPage.vue') + component: TrayPage }, { path: '/rename-page', name: config.RENAME_PAGE, - component: () => import('@/pages/RenamePage.vue') + component: RenamePage }, { path: '/mini-page', name: config.MINI_PAGE, - component: () => import('@/pages/MiniPage.vue') + component: MiniPage }, { path: '/main-page', name: config.MAIN_PAGE, - component: () => import('@/layouts/Main.vue'), + component: MainPage, children: [ { path: 'upload', - component: () => import('@/pages/Upload.vue'), + component: UploadPage, name: config.UPLOAD_PAGE }, { path: 'manage-main-page', name: config.MANAGE_MAIN_PAGE, - component: () => import('@/manage/pages/ManageMain.vue'), + component: ManageMainPage, children: [ { path: '', name: config.MANAGE_EMPTY_PAGE, - component: () => import('@/manage/pages/EmptyPage.vue') + component: ManageEmptyPage }, { path: 'manage-setting-page', name: config.MANAGE_SETTING_PAGE, - component: () => import('@/manage/pages/ManageSetting.vue') + component: ManageSettingPage }, { path: 'manage-bucket-page', name: config.MANAGE_BUCKET_PAGE, - component: () => import('@/manage/pages/BucketPage.vue') + component: ManageBucketPage } ] }, { path: 'manage-login-page', name: config.MANAGE_LOGIN_PAGE, - component: () => import('@/manage/pages/LogInPage.vue') + component: ManageLoginPage }, { path: 'picbeds/:type/:configId?', name: config.PICBEDS_PAGE, - component: () => import('@/pages/picbeds/index.vue') + component: PicBedsPage }, { path: 'gallery', - component: () => import('@/pages/Gallery.vue'), + component: GalleryPage, name: config.GALLERY_PAGE, meta: { keepAlive: true } }, { - path: 'setting', + path: 'settings', name: config.SETTING_PAGE, - component: () => import('@/pages/PicGoSetting.vue') + component: SettingPage }, { - path: 'plugin', - component: () => import('@/pages/Plugin.vue'), + path: 'plugins', + component: PluginPage, name: config.PLUGIN_PAGE }, { path: 'shortKey', - component: () => import('@/pages/ShortKey.vue'), + component: ShortKeyPage, name: config.SHORTKEY_PAGE }, { path: 'uploader-config-page/:type', - component: () => import('@/pages/UploaderConfigPage.vue'), + component: UploaderConfigPage, name: config.UPLOADER_CONFIG_PAGE } ] }, - { - path: '/documents', - component: () => import('@/pages/DocumentPage.vue'), - name: config.DocumentPage - }, { path: '/toolbox-page', name: config.TOOLBOX_CONFIG_PAGE, - component: () => import('@/pages/Toolbox.vue') + component: Toolbox }, { path: '/:pathMatch(.*)*', - redirect: '/' + redirect: '/main-page/upload' } ] }) diff --git a/yarn.lock b/yarn.lock index 130cbe56..e68503ba 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1808,6 +1808,13 @@ resolved "https://registry.yarnpkg.com/@gar/promisify/-/promisify-1.1.3.tgz#555193ab2e3bb3b6adc3d551c9c030d9e860daf6" integrity sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw== +"@headlessui/vue@^1.7.23": + version "1.7.23" + resolved "https://registry.yarnpkg.com/@headlessui/vue/-/vue-1.7.23.tgz#7fe19dbeca35de9e6270c82c78c4864e6a6f7391" + integrity sha512-JzdCNqurrtuu0YW6QaDtR2PIYCKPUWq28csDyMvN4zmGccmE7lz40Is6hc3LA4HFeCI7sekZ/PQMTNmn9I/4Wg== + dependencies: + "@tanstack/vue-virtual" "^3.0.0-beta.60" + "@highlightjs/vue-plugin@^2.1.2": version "2.1.2" resolved "https://registry.yarnpkg.com/@highlightjs/vue-plugin/-/vue-plugin-2.1.2.tgz#b7deaaa03452da659a39859437ae0c4bca037600" @@ -3207,6 +3214,18 @@ dependencies: defer-to-connect "^2.0.1" +"@tanstack/virtual-core@3.13.12": + version "3.13.12" + resolved "https://registry.yarnpkg.com/@tanstack/virtual-core/-/virtual-core-3.13.12.tgz#1dff176df9cc8f93c78c5e46bcea11079b397578" + integrity sha512-1YBOJfRHV4sXUmWsFSf5rQor4Ss82G8dQWLRbnk3GA4jeP8hQt1hxXh0tmflpC0dz3VgEv/1+qwPyLeWkQuPFA== + +"@tanstack/vue-virtual@^3.0.0-beta.60": + version "3.13.12" + resolved "https://registry.yarnpkg.com/@tanstack/vue-virtual/-/vue-virtual-3.13.12.tgz#a66daac9e6822ce4bcba76a3954937440697c264" + integrity sha512-vhF7kEU9EXWXh+HdAwKJ2m3xaOnTTmgcdXcF2pim8g4GvI7eRrk2YRuV5nUlZnd/NbCIX4/Ja2OZu5EjJL06Ww== + dependencies: + "@tanstack/virtual-core" "3.13.12" + "@tokenizer/inflate@^0.2.7": version "0.2.7" resolved "https://registry.yarnpkg.com/@tokenizer/inflate/-/inflate-0.2.7.tgz#32dd9dfc9abe457c89b3d9b760fc0690c85a103b" @@ -8272,6 +8291,11 @@ lru-cache@^7.14.1, lru-cache@^7.7.1: resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.18.3.tgz#f793896e0fd0e954a59dfdd82f0773808df6aa89" integrity sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA== +lucide-vue-next@^0.535.0: + version "0.535.0" + resolved "https://registry.yarnpkg.com/lucide-vue-next/-/lucide-vue-next-0.535.0.tgz#4ba16582f6d5f5388e17b77b4c6f23430d4a8a38" + integrity sha512-B79vTrPyVgp+yfnQe0xU0OcA5+xa9fz24psR8z01NZhbmn5VoxfYMwRm5E4iSk9mCRYgyFWqtx8DMp/bydiTcg== + m3u8-parser@^6.0.0: version "6.0.0" resolved "https://registry.npmjs.org/m3u8-parser/-/m3u8-parser-6.0.0.tgz#e9143313b44f07bb25fdea1c8aac1098d9ada192"