Feature(custom): update i18n force update

This commit is contained in:
Kuingsmile
2024-06-13 11:13:58 +08:00
parent 5ddc182bd1
commit e9c386d5d8
14 changed files with 54 additions and 91 deletions
+1 -1
View File
@@ -38,7 +38,7 @@
"@aws-sdk/lib-storage": "^3.421.0", "@aws-sdk/lib-storage": "^3.421.0",
"@aws-sdk/s3-request-presigner": "^3.421.0", "@aws-sdk/s3-request-presigner": "^3.421.0",
"@element-plus/icons-vue": "^2.3.1", "@element-plus/icons-vue": "^2.3.1",
"@highlightjs/vue-plugin": "^2.1.0", "@highlightjs/vue-plugin": "^2.1.2",
"@nodelib/fs.walk": "^2.0.0", "@nodelib/fs.walk": "^2.0.0",
"@octokit/rest": "^19.0.7", "@octokit/rest": "^19.0.7",
"@picgo/i18n": "^1.0.0", "@picgo/i18n": "^1.0.0",
+2 -2
View File
@@ -49,13 +49,13 @@ TOOLBOX_CHECK_PROXY_SUCCESS_TIPS: 代理設置正常
TOOLBOX_CHECK_PROXY_NO_PROXY_TIPS: 無代理設置 TOOLBOX_CHECK_PROXY_NO_PROXY_TIPS: 無代理設置
TOOLBOX_CHECK_PROXY_PROXY_IS_NOT_CORRECT: 代理設置不正確 TOOLBOX_CHECK_PROXY_PROXY_IS_NOT_CORRECT: 代理設置不正確
TOOLBOX_CHECK_PROXY_PROXY_IS_NOT_WORKING: 代理設置不可用 TOOLBOX_CHECK_PROXY_PROXY_IS_NOT_WORKING: 代理設置不可用
TOOLBOX_CHECK_CLIPBOARD_FILE_PATH_TIPS: 剪貼板圖片臨時文件夾路徑是:${path} TOOLBOX_CHECK_CLIPBOARD_FILE_PATH_TIPS: 剪貼板圖片臨時文件夾路徑是:${path}
TOOLBOX_CHECK_CLIPBOARD_FILE_PATH_NOT_EXIST_TIPS: 剪貼板圖片臨時文件夾不存在:${path} TOOLBOX_CHECK_CLIPBOARD_FILE_PATH_NOT_EXIST_TIPS: 剪貼板圖片臨時文件夾不存在:${path}
TOOLBOX_CHECK_CLIPBOARD_FILE_PATH_ERROR_TIPS: 請自行創建文件夾:${path} TOOLBOX_CHECK_CLIPBOARD_FILE_PATH_ERROR_TIPS: 請自行創建文件夾:${path}
MANUAL_PAGE_OPEN_TIP: 請選擇打開方式 MANUAL_PAGE_OPEN_TIP: 請選擇打開方式
MANUAL_PAGE_OPEN_TIP_TITLE: Tips MANUAL_PAGE_OPEN_TIP_TITLE: Tips
MANUAL_PAGE_OPEN_BY_BROWSER: 瀏覽器 MANUAL_PAGE_OPEN_BY_BROWSER: 瀏覽器
MANUAL_PAGE_OPEN_BY_BUILD_IN: 內置窗口s MANUAL_PAGE_OPEN_BY_BUILD_IN: 內置窗口
MANUAL_PAGE_OPEN_SETTING_TIP: 選擇打開手冊方式 MANUAL_PAGE_OPEN_SETTING_TIP: 選擇打開手冊方式
# ---renderer i18n begin--- # ---renderer i18n begin---
+9 -7
View File
@@ -1,27 +1,31 @@
import { webFrame } from 'electron' import { webFrame } from 'electron'
import ElementUI from 'element-plus' import ElementUI from 'element-plus'
import 'element-plus/dist/index.css' import 'element-plus/dist/index.css'
import { createPinia } from 'pinia' import { createPinia } from 'pinia'
import piniaPluginPersistedstate from 'pinia-plugin-persistedstate' import piniaPluginPersistedstate from 'pinia-plugin-persistedstate'
import { createApp } from 'vue' import { createApp } from 'vue'
import VueLazyLoad from 'vue3-lazyload' import VueLazyLoad from 'vue3-lazyload'
import vue3PhotoPreview from 'vue3-photo-preview' import vue3PhotoPreview from 'vue3-photo-preview'
import 'vue3-photo-preview/dist/index.css' import 'vue3-photo-preview/dist/index.css'
import VueVideoPlayer from '@videojs-player/vue' import VueVideoPlayer from '@videojs-player/vue'
import 'highlight.js/styles/atom-one-dark.css'
import hljsVuePlugin from '@highlightjs/vue-plugin'
import hljsCommon from 'highlight.js/lib/common'
import 'video.js/dist/video-js.css' import 'video.js/dist/video-js.css'
import 'highlight.js/styles/stackoverflow-light.css'
import hljsVuePlugin from '@highlightjs/vue-plugin'
import 'highlight.js/lib/common'
import App from '@/App.vue' import App from '@/App.vue'
import router from '@/router' import router from '@/router'
import { sendRPC, sendToMain, triggerRPC } from '@/utils/common'
import db from '@/utils/db' import db from '@/utils/db'
import { T } from '@/i18n/index' import { T } from '@/i18n/index'
import { store } from '@/store' import { store } from '@/store'
import { initTalkingData } from '@/utils/analytic' import { initTalkingData } from '@/utils/analytic'
import { mainMixin } from '@/utils/mainMixin'
import { dragMixin } from '@/utils/mixin' import { dragMixin } from '@/utils/mixin'
import { sendRPC, sendToMain, triggerRPC } from '@/utils/common'
webFrame.setVisualZoomLevelLimits(1, 1) webFrame.setVisualZoomLevelLimits(1, 1)
@@ -33,7 +37,6 @@ app.config.globalProperties.triggerRPC = triggerRPC
app.config.globalProperties.sendRPC = sendRPC app.config.globalProperties.sendRPC = sendRPC
app.config.globalProperties.sendToMain = sendToMain app.config.globalProperties.sendToMain = sendToMain
app.mixin(mainMixin)
app.mixin(dragMixin) app.mixin(dragMixin)
const pinia = createPinia() const pinia = createPinia()
pinia.use(piniaPluginPersistedstate) pinia.use(piniaPluginPersistedstate)
@@ -45,7 +48,6 @@ app.use(router)
app.use(store) app.use(store)
app.use(vue3PhotoPreview) app.use(vue3PhotoPreview)
app.use(pinia) app.use(pinia)
console.log(hljsCommon.highlightAuto('<h1>Highlight.js has been registered successfully!</h1>').value)
app.use(hljsVuePlugin) app.use(hljsVuePlugin)
app.use(VueVideoPlayer) app.use(VueVideoPlayer)
app.mount('#app') app.mount('#app')
+3 -3
View File
@@ -6,7 +6,7 @@ import windowManager from 'apis/app/window/windowManager'
import { i18nManager } from '~/i18n' import { i18nManager } from '~/i18n'
import { IRPCActionType, IWindowList } from '#/types/enum' import { IRPCActionType, IWindowList } from '#/types/enum'
import { GET_CURRENT_LANGUAGE, GET_LANGUAGE_LIST, SET_CURRENT_LANGUAGE } from '#/events/constants' import { SET_CURRENT_LANGUAGE } from '#/events/constants'
export default [ export default [
{ {
@@ -31,14 +31,14 @@ export default [
{ {
action: IRPCActionType.GET_LANGUAGE_LIST, action: IRPCActionType.GET_LANGUAGE_LIST,
handler: async (event: IIPCEvent) => { handler: async (event: IIPCEvent) => {
event.sender.send(GET_LANGUAGE_LIST, i18nManager.languageList) event.returnValue = i18nManager.languageList
} }
}, },
{ {
action: IRPCActionType.GET_CURRENT_LANGUAGE, action: IRPCActionType.GET_CURRENT_LANGUAGE,
handler: async (event: IIPCEvent) => { handler: async (event: IIPCEvent) => {
const { lang, locales } = i18nManager.getCurrentLocales() const { lang, locales } = i18nManager.getCurrentLocales()
event.sender.send(GET_CURRENT_LANGUAGE, lang, locales) event.returnValue = [lang, locales]
} }
}, },
{ {
+7 -16
View File
@@ -1,19 +1,20 @@
<template> <template>
<div id="app"> <div
id="app"
:key="pageReloadCount"
>
<router-view /> <router-view />
</div> </div>
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import { useStore } from '@/hooks/useStore'
import type { IConfig } from 'piclist' import type { IConfig } from 'piclist'
import { onBeforeMount, onMounted, onUnmounted } from 'vue' import { onBeforeMount } from 'vue'
import { useStore } from '@/hooks/useStore'
import { useATagClick } from '@/hooks/useATagClick' import { useATagClick } from '@/hooks/useATagClick'
import bus from '@/utils/bus'
import { getConfig } from '@/utils/dataSender' import { getConfig } from '@/utils/dataSender'
import { pageReloadCount } from '@/utils/global'
import { FORCE_UPDATE } from '#/events/constants'
useATagClick() useATagClick()
const store = useStore() const store = useStore()
@@ -25,16 +26,6 @@ onBeforeMount(async () => {
} }
}) })
onMounted(() => {
bus.on(FORCE_UPDATE, () => {
store?.updateForceUpdateTime()
})
})
onUnmounted(() => {
bus.off(FORCE_UPDATE)
})
</script> </script>
<script lang="ts"> <script lang="ts">
+7 -13
View File
@@ -1,12 +1,12 @@
import { ipcRenderer } from 'electron' import { ipcRenderer } from 'electron'
import { ObjectAdapter, I18n } from '@picgo/i18n' import { ObjectAdapter, I18n } from '@picgo/i18n'
import bus from '@/utils/bus' import { sendRPC, sendRpcSync } from '@/utils/common'
import { sendRPC } from '@/utils/common'
import { GET_CURRENT_LANGUAGE, SET_CURRENT_LANGUAGE, FORCE_UPDATE, GET_LANGUAGE_LIST } from '#/events/constants' import { SET_CURRENT_LANGUAGE } from '#/events/constants'
import { builtinI18nList } from '#/i18n' import { builtinI18nList } from '#/i18n'
import { IRPCActionType } from '#/types/enum' import { IRPCActionType } from '#/types/enum'
import { updatePageReloadCount } from '@/utils/global'
export class I18nManager { export class I18nManager {
#i18n: I18n | null = null #i18n: I18n | null = null
@@ -17,23 +17,17 @@ export class I18nManager {
this.#getLanguageList() this.#getLanguageList()
ipcRenderer.on(SET_CURRENT_LANGUAGE, (_, lang: string, locales: ILocales) => { ipcRenderer.on(SET_CURRENT_LANGUAGE, (_, lang: string, locales: ILocales) => {
this.#setLocales(lang, locales) this.#setLocales(lang, locales)
bus.emit(FORCE_UPDATE) updatePageReloadCount()
}) })
} }
#getLanguageList () { #getLanguageList () {
sendRPC(IRPCActionType.GET_LANGUAGE_LIST) this.#i18nFileList = sendRpcSync(IRPCActionType.GET_LANGUAGE_LIST)
ipcRenderer.once(GET_LANGUAGE_LIST, (_, list: II18nItem[]) => {
this.#i18nFileList = list
})
} }
#getCurrentLanguage () { #getCurrentLanguage () {
sendRPC(IRPCActionType.GET_CURRENT_LANGUAGE) const [lang, locales] = sendRpcSync(IRPCActionType.GET_CURRENT_LANGUAGE)
ipcRenderer.once(GET_CURRENT_LANGUAGE, (_, lang: string, locales: ILocales) => { this.#setLocales(lang, locales)
this.#setLocales(lang, locales)
bus.emit(FORCE_UPDATE)
})
} }
#setLocales (lang: string, locales: ILocales) { #setLocales (lang: string, locales: ILocales) {
+2 -11
View File
@@ -1,4 +1,4 @@
import { reactive, InjectionKey, readonly, App, UnwrapRef, ref } from 'vue' import { reactive, InjectionKey, readonly, App, UnwrapRef } from 'vue'
import { saveConfig } from '@/utils/dataSender' import { saveConfig } from '@/utils/dataSender'
import { configPaths } from '#/utils/configPaths' import { configPaths } from '#/utils/configPaths'
@@ -9,7 +9,6 @@ export interface IState {
export interface IStore { export interface IStore {
state: UnwrapRef<IState> state: UnwrapRef<IState>
setDefaultPicBed: (type: string) => void setDefaultPicBed: (type: string) => void
updateForceUpdateTime: () => void
} }
export const storeKey: InjectionKey<IStore> = Symbol('store') export const storeKey: InjectionKey<IStore> = Symbol('store')
@@ -19,8 +18,6 @@ const state: IState = reactive({
defaultPicBed: 'smms' defaultPicBed: 'smms'
}) })
const forceUpdateTime = ref<number>(Date.now())
// methods // methods
const setDefaultPicBed = (type: string) => { const setDefaultPicBed = (type: string) => {
saveConfig({ saveConfig({
@@ -30,17 +27,11 @@ const setDefaultPicBed = (type: string) => {
state.defaultPicBed = type state.defaultPicBed = type
} }
const updateForceUpdateTime = () => {
forceUpdateTime.value = Date.now()
}
export const store = { export const store = {
install (app: App) { install (app: App) {
app.provide(storeKey, { app.provide(storeKey, {
state: readonly(state), state: readonly(state),
setDefaultPicBed, setDefaultPicBed
updateForceUpdateTime
}) })
app.provide('forceUpdateTime', forceUpdateTime)
} }
} }
+2 -4
View File
@@ -1,8 +1,7 @@
import mitt from 'mitt' import mitt from 'mitt'
import { import {
SHOW_INPUT_BOX, SHOW_INPUT_BOX,
SHOW_INPUT_BOX_RESPONSE, SHOW_INPUT_BOX_RESPONSE
FORCE_UPDATE
} from '#/events/constants' } from '#/events/constants'
type IEvent ={ type IEvent ={
@@ -11,8 +10,7 @@ type IEvent ={
value: string value: string
title: string title: string
placeholder: string placeholder: string
}, }
[FORCE_UPDATE]: void
} }
const emitter = mitt<IEvent>() const emitter = mitt<IEvent>()
+5
View File
@@ -51,6 +51,11 @@ export function sendRPC (action: IRPCActionType, ...args: any[]): void {
ipcRenderer.send(RPC_ACTIONS, action, data) ipcRenderer.send(RPC_ACTIONS, action, data)
} }
export function sendRpcSync (action: IRPCActionType, ...args: any[]) {
const data = getRawData(args)
return ipcRenderer.sendSync(RPC_ACTIONS, action, data)
}
export function invokeToMain (channel: string, ...args: any[]) { export function invokeToMain (channel: string, ...args: any[]) {
const data = getRawData(args) const data = getRawData(args)
return ipcRenderer.invoke(channel, ...data) return ipcRenderer.invoke(channel, ...data)
+8 -1
View File
@@ -4,13 +4,20 @@ import { IRPCActionType } from '#/types/enum'
const osGlobal = ref<string>(process.platform) const osGlobal = ref<string>(process.platform)
const picBedGlobal = ref<IPicBedType[]>([]) const picBedGlobal = ref<IPicBedType[]>([])
const pageReloadCount = ref(0)
async function updatePicBedGlobal () { async function updatePicBedGlobal () {
picBedGlobal.value = (await triggerRPC<IPicBedType[]>(IRPCActionType.MAIN_GET_PICBED))! picBedGlobal.value = (await triggerRPC<IPicBedType[]>(IRPCActionType.MAIN_GET_PICBED))!
} }
async function updatePageReloadCount () {
pageReloadCount.value++
}
export { export {
osGlobal, osGlobal,
pageReloadCount,
picBedGlobal, picBedGlobal,
updatePicBedGlobal updatePicBedGlobal,
updatePageReloadCount
} }
-24
View File
@@ -1,24 +0,0 @@
import { ComponentOptions } from 'vue'
import bus from '@/utils/bus'
import { FORCE_UPDATE } from '#/events/constants'
export const mainMixin: ComponentOptions = {
inject: ['forceUpdateTime'],
created () {
// FIXME: may be memory leak
this?.$watch('forceUpdateTime', (newVal: number, oldVal: number) => {
if (oldVal !== newVal) {
this?.$forceUpdate()
}
})
},
methods: {
forceUpdate () {
bus.emit(FORCE_UPDATE)
}
}
}
+4 -4
View File
@@ -1,20 +1,20 @@
export const SHOW_INPUT_BOX = 'SHOW_INPUT_BOX' export const SHOW_INPUT_BOX = 'SHOW_INPUT_BOX'
export const SHOW_INPUT_BOX_RESPONSE = 'SHOW_INPUT_BOX_RESPONSE' export const SHOW_INPUT_BOX_RESPONSE = 'SHOW_INPUT_BOX_RESPONSE'
export const TOGGLE_SHORTKEY_MODIFIED_MODE = 'TOGGLE_SHORTKEY_MODIFIED_MODE' export const TOGGLE_SHORTKEY_MODIFIED_MODE = 'TOGGLE_SHORTKEY_MODIFIED_MODE'
// talking data
export const TALKING_DATA_APPID = 'B743C16E2989419A9B02EDE9D1E6A530' export const TALKING_DATA_APPID = 'B743C16E2989419A9B02EDE9D1E6A530'
export const TALKING_DATA_EVENT = 'TALKING_DATA_EVENT' export const TALKING_DATA_EVENT = 'TALKING_DATA_EVENT'
// picgo plugin
export const PICGO_CONFIG_PLUGIN = 'PICGO_CONFIG_PLUGIN' export const PICGO_CONFIG_PLUGIN = 'PICGO_CONFIG_PLUGIN'
export const PICGO_HANDLE_PLUGIN_ING = 'PICGO_HANDLE_PLUGIN_ING' export const PICGO_HANDLE_PLUGIN_ING = 'PICGO_HANDLE_PLUGIN_ING'
export const PICGO_HANDLE_PLUGIN_DONE = 'PICGO_HANDLE_PLUGIN_DONE' export const PICGO_HANDLE_PLUGIN_DONE = 'PICGO_HANDLE_PLUGIN_DONE'
export const PICGO_TOGGLE_PLUGIN = 'PICGO_TOGGLE_PLUGIN' export const PICGO_TOGGLE_PLUGIN = 'PICGO_TOGGLE_PLUGIN'
// picgo uploader
export const RENAME_FILE_NAME = 'RENAME_FILE_NAME' export const RENAME_FILE_NAME = 'RENAME_FILE_NAME'
export const GET_RENAME_FILE_NAME = 'GET_RENAME_FILE_NAME' export const GET_RENAME_FILE_NAME = 'GET_RENAME_FILE_NAME'
export const SHOW_MAIN_PAGE_QRCODE = 'SHOW_MAIN_PAGE_QRCODE' export const SHOW_MAIN_PAGE_QRCODE = 'SHOW_MAIN_PAGE_QRCODE'
export const FORCE_UPDATE = 'FORCE_UPDATE' // rpc
export const GET_PICBEDS = 'GET_PICBEDS'
export const RPC_ACTIONS = 'RPC_ACTIONS' export const RPC_ACTIONS = 'RPC_ACTIONS'
export const RPC_ACTIONS_INVOKE = 'RPC_ACTIONS_INVOKE' export const RPC_ACTIONS_INVOKE = 'RPC_ACTIONS_INVOKE'
// i18n // i18n
export const GET_CURRENT_LANGUAGE = 'GET_CURRENT_LANGUAGE'
export const GET_LANGUAGE_LIST = 'GET_LANGUAGE_LIST'
export const SET_CURRENT_LANGUAGE = 'SET_CURRENT_LANGUAGE' export const SET_CURRENT_LANGUAGE = 'SET_CURRENT_LANGUAGE'
-1
View File
@@ -22,7 +22,6 @@ declare module 'vue' {
triggerRPC<T> (action: import('#/types/enum').IRPCActionType, ...args: any[]): Promise<T | undefined> triggerRPC<T> (action: import('#/types/enum').IRPCActionType, ...args: any[]): Promise<T | undefined>
sendRPC (action: import('#/types/enum').IRPCActionType, ...args: any[]): void sendRPC (action: import('#/types/enum').IRPCActionType, ...args: any[]): void
defaultPicBed: string defaultPicBed: string
forceUpdate(): void
sendToMain(channel: string, ...args: any[]): void sendToMain(channel: string, ...args: any[]): void
} }
interface GlobalComponents { interface GlobalComponents {
+4 -4
View File
@@ -2070,10 +2070,10 @@
dependencies: dependencies:
"@hapi/hoek" "^9.0.0" "@hapi/hoek" "^9.0.0"
"@highlightjs/vue-plugin@^2.1.0": "@highlightjs/vue-plugin@^2.1.2":
version "2.1.0" version "2.1.2"
resolved "https://registry.npmjs.org/@highlightjs/vue-plugin/-/vue-plugin-2.1.0.tgz#b7c41e3597a46975665b10cad57882cbde1d1594" resolved "https://registry.yarnpkg.com/@highlightjs/vue-plugin/-/vue-plugin-2.1.2.tgz#b7deaaa03452da659a39859437ae0c4bca037600"
integrity sha512-E+bmk4ncca+hBEYRV2a+1aIzIV0VSY/e5ArjpuSN9IO7wBJrzUE2u4ESCwrbQD7sAy+jWQjkV5qCCWgc+pu7CQ== integrity sha512-P7s9DLBGpBsbltk3ZKuYUu9lwDCEfpttjJ5ErI6Wco6GQWIsjcSCJzCoMHgXhRUNkFDtZo7ZgeF8M10POPbDLw==
"@humanwhocodes/config-array@^0.11.14": "@humanwhocodes/config-array@^0.11.14":
version "0.11.14" version "0.11.14"