From 8a2423f9d2f6cc3602547aeeb213d0abdf17cf68 Mon Sep 17 00:00:00 2001 From: xianyunleo Date: Sun, 4 Feb 2024 18:12:16 +0800 Subject: [PATCH] =?UTF-8?q?=E6=89=98=E7=9B=98=E5=92=8C=E7=AA=97=E5=8F=A3?= =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/MainWindow.js | 6 +++-- src/main/TrayManage.js | 23 +++++++++-------- src/main/common/call.js | 13 +++++++--- src/main/index.js | 11 ++++---- src/renderer/App.vue | 8 +++--- src/renderer/components/SetLanguage.vue | 7 +++--- src/renderer/components/Settings/App.vue | 5 ++-- src/renderer/components/TitleBar.vue | 26 ++++++++----------- src/renderer/i18n/I18n.js | 20 --------------- src/renderer/main.js | 3 +-- src/renderer/utils/language.js | 7 ++++++ src/shared/i18n/I18n.js | 32 ++++++++++++++++++++++++ src/{renderer => shared}/i18n/en.js | 0 src/{renderer => shared}/i18n/zh.js | 0 src/shared/utils/i18n.js | 20 +++++++-------- src/shared/utils/utils.js | 4 ++- 16 files changed, 103 insertions(+), 82 deletions(-) delete mode 100644 src/renderer/i18n/I18n.js create mode 100644 src/renderer/utils/language.js create mode 100644 src/shared/i18n/I18n.js rename src/{renderer => shared}/i18n/en.js (100%) rename src/{renderer => shared}/i18n/zh.js (100%) diff --git a/src/main/MainWindow.js b/src/main/MainWindow.js index 8a544f36..4f7a7015 100644 --- a/src/main/MainWindow.js +++ b/src/main/MainWindow.js @@ -1,6 +1,6 @@ export default class MainWindow { - static #instance; + static _instance; static forceQuit = false; /** @@ -8,6 +8,8 @@ export default class MainWindow { * @param mainWindow {BrowserWindow} */ static init(mainWindow) { + if (this._instance) return + this._instance = mainWindow mainWindow.on('close', (event) => { if (!this.forceQuit) { event.preventDefault(); @@ -23,7 +25,7 @@ export default class MainWindow { } static show() { - this.#instance.isMinimized() ? this.#instance.restore() : this.#instance.show() + this._instance.isMinimized() ? this._instance.restore() : this._instance.show() } } diff --git a/src/main/TrayManage.js b/src/main/TrayManage.js index faf15ea1..0864bc26 100644 --- a/src/main/TrayManage.js +++ b/src/main/TrayManage.js @@ -1,25 +1,27 @@ -import { electronRequireMulti } from '@/main/utils/electron' +import { app, Tray, Menu, nativeImage } from 'electron' import { APP_NAME } from '@/shared/utils/constant' -const { app, Tray, Menu, nativeImage, getGlobal } = electronRequireMulti() import { isMacOS, isWindows } from '@/main/utils/utils' -import {t} from '@/shared/utils/i18n' +import { t } from '@/shared/utils/i18n' import Path from '@/main/utils/Path' import GetAppPath from '@/main/utils/GetAppPath' +import MainWindow from '@/main/MainWindow' export default class TrayManage { - static #_instance; + static _instance + static init() { - let iconPath = this.getIconPath(); + if (this._instance) return + let iconPath = this.getIconPath() let icon = nativeImage.createFromPath(iconPath).resize({ width: 18, height: 18 }) icon.setTemplateImage(true) let tray = new Tray(icon) - const contextMenu = this.getContextMenu(); + const contextMenu = this.getContextMenu() tray.setToolTip(APP_NAME) tray.setContextMenu(contextMenu) if (isWindows) { tray.on('click', () => this.showMainWindow()) } - this.#_instance = tray; + this._instance = tray } static getContextMenu() { @@ -36,12 +38,11 @@ export default class TrayManage { } static showMainWindow() { - const electron = getGlobal('electron') - electron.mainWindow.show() + MainWindow.show() } - static refresh() { - this.#_instance.setContextMenu(this.getContextMenu()) + static updateContextMenu() { + this._instance.setContextMenu(this.getContextMenu()) } static getIconPath() { diff --git a/src/main/common/call.js b/src/main/common/call.js index 207e5a11..687d3427 100644 --- a/src/main/common/call.js +++ b/src/main/common/call.js @@ -1,18 +1,25 @@ export async function callStatic(className, methodName, ...args) { let result, importReturn - if (['ProcessLibrary'].includes(className)) { + + const utilsClassArr = ['ProcessLibrary'] + if (utilsClassArr.includes(className)) { importReturn = await import(`@/main/utils/${className}.js`) + } else if (className === 'I18n') { + importReturn = await import(`@/shared/i18n/I18n.js`) + } else { + importReturn = await import(`@/main/${className}.js`) } + const moduleClass = importReturn.default result = args ? await moduleClass[methodName](...args) : await moduleClass[methodName]() return result } export async function callWorker(workName, ...args) { - let createWorker; + let createWorker if (workName === 'processList') { createWorker = await import(`@/main/worker/processList.js?nodeWorker`) - //?nodeWorker 不支持变量 + //?nodeWorker 不支持变量 } return new Promise((resolve, reject) => { const worker = createWorker.default({ workerData: { args } }) diff --git a/src/main/index.js b/src/main/index.js index 2d3f08d4..7ba3589c 100644 --- a/src/main/index.js +++ b/src/main/index.js @@ -6,6 +6,7 @@ import Store from 'electron-store' import MainWindow from '@/main/MainWindow' import { ipcListen } from '@/main/ipc' import { extendPrototype } from '@/shared/utils/utils' +import I18n from '@/shared/i18n/I18n' let mainWindow const gotTheLock = app.isPackaged ? app.requestSingleInstanceLock() : true //仅生产环境生效 @@ -16,11 +17,9 @@ if (!gotTheLock) { onReady() onRunning() onBeforeQuit() - remoteMain.initialize() - Store.initRenderer() } -function createMainWindow() { +async function createMainWindow() { // Create the browser window. mainWindow = new BrowserWindow({ width: is.dev ? 1280 : 900, @@ -64,13 +63,15 @@ function createMainWindow() { } remoteMain.enable(mainWindow.webContents) MainWindow.init(mainWindow) - global.electron = { mainWindow } - Store.initRenderer() } function onReady() { app.on('ready', async () => { createMainWindow() + Store.initRenderer() + remoteMain.initialize() + Store.initRenderer() + I18n.init() }) } diff --git a/src/renderer/App.vue b/src/renderer/App.vue index 4520f576..132a6e83 100644 --- a/src/renderer/App.vue +++ b/src/renderer/App.vue @@ -34,15 +34,13 @@ import {message} from "ant-design-vue"; import DirUtil from "@/main/utils/DirUtil"; import {MAC_USER_CORE_DIR} from "@/main/utils/constant"; import ConfigProvider from "@/renderer/components/Theme/ConfigProvider.vue"; -import TrayManage from '@/main/TrayManage' -import { useI18n } from 'vue-i18n' import SetLanguage from "@/renderer/components/SetLanguage.vue"; import { useMainStore } from '@/renderer/store' import Settings from '@/main/Settings' import { t } from '@/shared/utils/i18n' +import { changeLanguageWrapper } from '@/renderer/utils/language' const store = useMainStore(); -const { locale } = useI18n() const userPwdModalShow = ref(false); const setLanguageShow = ref(false); @@ -63,8 +61,8 @@ store.settings = settings await store.init() store.loadingTip = t('Initializing') - locale.value = store.settings.Language - TrayManage.init() + await window.api.callStatic('TrayManage', 'init') + await changeLanguageWrapper(store.settings.Language) } catch (error) { await MessageBox.error(error.message ?? error, t('errorOccurredDuring', [t('initializing')])) App.exit() diff --git a/src/renderer/components/SetLanguage.vue b/src/renderer/components/SetLanguage.vue index 401fe172..ee8c32ef 100644 --- a/src/renderer/components/SetLanguage.vue +++ b/src/renderer/components/SetLanguage.vue @@ -20,11 +20,11 @@ - diff --git a/src/renderer/i18n/I18n.js b/src/renderer/i18n/I18n.js deleted file mode 100644 index 7b1b3638..00000000 --- a/src/renderer/i18n/I18n.js +++ /dev/null @@ -1,20 +0,0 @@ -import { createI18n } from 'vue-i18n' -import zh from '@/renderer/i18n/zh' -import en from '@/renderer/i18n/en' - -export default class I18n { - static #_instance - static getInstance() { - if (!this.#_instance) { - this.#_instance = createI18n({ - legacy: false, - locale: 'zh', - messages: { - 'zh': zh, - 'en': en - } - }) - } - return this.#_instance - } -} diff --git a/src/renderer/main.js b/src/renderer/main.js index 27e13c1c..12da57c5 100644 --- a/src/renderer/main.js +++ b/src/renderer/main.js @@ -5,13 +5,12 @@ import './assets/css/index.less' import '@vscode/codicons/dist/codicon.css' import router from './router' import { createPinia } from 'pinia' -import I18n from '@/renderer/i18n/I18n' +import I18n from '@/shared/i18n/I18n' import { extendPrototype } from '@/shared/utils/utils' const app = createApp(App) const pinia = createPinia() - app.use(router) app.use(pinia) app.use(I18n.getInstance()) diff --git a/src/renderer/utils/language.js b/src/renderer/utils/language.js new file mode 100644 index 00000000..fbe8266f --- /dev/null +++ b/src/renderer/utils/language.js @@ -0,0 +1,7 @@ +import I18n from '@/shared/i18n/I18n' + +export async function changeLanguageWrapper(lang) { + I18n.setLocale(lang) + await window.api.callStatic('I18n', 'setLocale', lang) + await window.api.callStatic('TrayManage', 'updateContextMenu') +} diff --git a/src/shared/i18n/I18n.js b/src/shared/i18n/I18n.js new file mode 100644 index 00000000..6acea829 --- /dev/null +++ b/src/shared/i18n/I18n.js @@ -0,0 +1,32 @@ +import { createI18n } from 'vue-i18n' +import zh from '@/shared/i18n/zh' +import en from '@/shared/i18n/en' +import { isRendererProcess } from '@/shared/utils/utils' + +export default class I18n { + static _instance + static init() { + if (this._instance) return this._instance + this._instance = createI18n({ + legacy: !isRendererProcess(), + locale: 'zh', + messages: { + 'zh': zh, + 'en': en + } + }) + } + + static getInstance() { + if (!this._instance) this.init() + return this._instance + } + + static setLocale(locale) { + if(isRendererProcess()){ + this._instance.global.locale.value = locale + }else{ + this._instance.global.locale = locale + } + } +} diff --git a/src/renderer/i18n/en.js b/src/shared/i18n/en.js similarity index 100% rename from src/renderer/i18n/en.js rename to src/shared/i18n/en.js diff --git a/src/renderer/i18n/zh.js b/src/shared/i18n/zh.js similarity index 100% rename from src/renderer/i18n/zh.js rename to src/shared/i18n/zh.js diff --git a/src/shared/utils/i18n.js b/src/shared/utils/i18n.js index 4ab966bc..80a6b230 100644 --- a/src/shared/utils/i18n.js +++ b/src/shared/utils/i18n.js @@ -1,17 +1,15 @@ -import I18n from '@/renderer/i18n/i18n' - -const { t: originT } = I18n.getInstance().global +import I18n from '@/shared/i18n/I18n' export function t(...arg) { - return originT(...arg) + const { t: originT } = I18n.getInstance().global + return originT(...arg) } export function mt(...args) { - let str = '' - for (const arg of args) { - str += originT(arg) - } - return str + const { t: originT } = I18n.getInstance().global + let str = '' + for (const arg of args) { + str += originT(arg) + } + return str } - - diff --git a/src/shared/utils/utils.js b/src/shared/utils/utils.js index b49a3adb..b525fa48 100644 --- a/src/shared/utils/utils.js +++ b/src/shared/utils/utils.js @@ -40,7 +40,6 @@ export function sleep(ms) { return new Promise(resolve => setTimeout(resolve, ms)) } - /** * 将字符串里的所有反斜杠替换成正斜杠 * @param str {string} @@ -58,3 +57,6 @@ export function getFileSizeText(byte, defaultVal = 0) { return parseInt(byte / 1024) + 'KB' } +export function isRendererProcess() { + return process.type === 'renderer' +}