Feature(custom): split i18n in main and renderer, use vue-i18n

This commit is contained in:
Kuingsmile
2025-08-01 13:10:05 +08:00
parent ff95e0f6fe
commit 236b7c6e7d
76 changed files with 4310 additions and 5986 deletions
+25 -25
View File
@@ -22,7 +22,7 @@ import { IPasteStyle, IWindowList } from '#/types/enum'
import { IBounds, ImgInfo } from '#/types/types'
import { configPaths } from '#/utils/configPaths'
import { buildPicBedListMenu } from '~/events/remotes/menu'
import { T } from '~/i18n'
import { T as $t } from '~/i18n'
import clipboardPoll from '~/utils/clipboardPoll'
import { ensureFilePath, handleCopyUrl, setTray, tray } from '~/utils/common'
import { isMacOSVersionGreaterThanOrEqualTo } from '~/utils/getMacOSVersion'
@@ -40,11 +40,11 @@ export function setDockMenu () {
const isListeningClipboard = db.get(configPaths.settings.isListeningClipboard) || false
const dockMenu = Menu.buildFromTemplate([
{
label: T('OPEN_MAIN_WINDOW'),
label: $t('OPEN_MAIN_WINDOW'),
click: openMainWindow
},
{
label: T('START_WATCH_CLIPBOARD'),
label: $t('START_WATCH_CLIPBOARD'),
click () {
db.set(configPaths.settings.isListeningClipboard, true)
clipboardPoll.startListening()
@@ -57,7 +57,7 @@ export function setDockMenu () {
visible: !isListeningClipboard
},
{
label: T('STOP_WATCH_CLIPBOARD'),
label: $t('STOP_WATCH_CLIPBOARD'),
click () {
db.set(configPaths.settings.isListeningClipboard, false)
clipboardPoll.stopListening()
@@ -76,9 +76,9 @@ export function createMenu () {
{
label: 'PicList',
submenu: [
{ label: T('OPEN_MAIN_WINDOW'), click: openMainWindow },
{ label: $t('OPEN_MAIN_WINDOW'), click: openMainWindow },
{
label: T('RELOAD_APP'),
label: $t('RELOAD_APP'),
click () {
app.relaunch()
app.exit(0)
@@ -86,7 +86,7 @@ export function createMenu () {
}
]
},
{ label: T('CHOOSE_DEFAULT_PICBED'), type: 'submenu', submenu },
{ label: $t('CHOOSE_DEFAULT_PICBED'), type: 'submenu', submenu },
{
label: 'Edit',
submenu: [
@@ -100,8 +100,8 @@ export function createMenu () {
]
},
{
label: T('QUIT'),
submenu: [{ label: T('QUIT'), role: 'quit' }]
label: $t('QUIT'),
submenu: [{ label: $t('QUIT'), role: 'quit' }]
}
])
Menu.setApplicationMenu(appMenu)
@@ -133,40 +133,40 @@ export function createContextMenu () {
if (process.platform === 'darwin' || process.platform === 'win32') {
const submenu = buildPicBedListMenu()
const template: (MenuItemConstructorOptions | MenuItem)[] = [
{ label: T('OPEN_MAIN_WINDOW'), click: openMainWindow },
{ label: T('CHOOSE_DEFAULT_PICBED'), type: 'submenu', submenu },
{ label: $t('OPEN_MAIN_WINDOW'), click: openMainWindow },
{ label: $t('CHOOSE_DEFAULT_PICBED'), type: 'submenu', submenu },
{
label: T('START_WATCH_CLIPBOARD'),
label: $t('START_WATCH_CLIPBOARD'),
click: startWatchClipboard,
visible: !isListeningClipboard
},
{
label: T('STOP_WATCH_CLIPBOARD'),
label: $t('STOP_WATCH_CLIPBOARD'),
click: stopWatchClipboard,
visible: isListeningClipboard
},
{
label: T('RELOAD_APP'),
label: $t('RELOAD_APP'),
click () {
app.relaunch()
app.exit(0)
}
},
{ label: T('QUIT'), role: 'quit' }
{ label: $t('QUIT'), role: 'quit' }
]
if (process.platform === 'win32') {
template.splice(
2,
0,
{
label: T('OPEN_MINI_WINDOW'),
label: $t('OPEN_MINI_WINDOW'),
click () {
openMiniWindow(false)
},
visible: !isMiniWindowVisible
},
{
label: T('HIDE_MINI_WINDOW'),
label: $t('HIDE_MINI_WINDOW'),
click: hideMiniWindow,
visible: isMiniWindowVisible
}
@@ -182,31 +182,31 @@ export function createContextMenu () {
// 目前的实现无法正常工作
contextMenu = Menu.buildFromTemplate([
{ label: T('OPEN_MAIN_WINDOW'), click: openMainWindow },
{ label: $t('OPEN_MAIN_WINDOW'), click: openMainWindow },
{
label: T('OPEN_MINI_WINDOW'),
label: $t('OPEN_MINI_WINDOW'),
click () {
openMiniWindow(false)
},
visible: !isMiniWindowVisible
},
{
label: T('HIDE_MINI_WINDOW'),
label: $t('HIDE_MINI_WINDOW'),
click: hideMiniWindow,
visible: isMiniWindowVisible
},
{
label: T('START_WATCH_CLIPBOARD'),
label: $t('START_WATCH_CLIPBOARD'),
click: startWatchClipboard,
visible: !isListeningClipboard
},
{
label: T('STOP_WATCH_CLIPBOARD'),
label: $t('STOP_WATCH_CLIPBOARD'),
click: stopWatchClipboard,
visible: isListeningClipboard
},
{
label: T('ABOUT'),
label: $t('ABOUT'),
click () {
dialog.showMessageBox({
title: 'PicList',
@@ -216,7 +216,7 @@ export function createContextMenu () {
})
}
},
{ label: T('QUIT'), role: 'quit' }
{ label: $t('QUIT'), role: 'quit' }
])
}
}
@@ -343,7 +343,7 @@ export function createTray (tooltip: string) {
: !!db.get(configPaths.settings.uploadResultNotification)
if (isShowResultNotification) {
const notification = new Notification({
title: T('UPLOAD_SUCCEED'),
title: $t('UPLOAD_SUCCEED'),
body: shortUrl || imgs[i].imgUrl!
// icon: files[i]
})
+5 -5
View File
@@ -10,7 +10,7 @@ import { IPicGo } from 'piclist'
import { IPasteStyle, IWindowList } from '#/types/enum'
import { IFileWithPath, ImgInfo, IStringKeyMap, IUploadOption } from '#/types/types'
import { configPaths } from '#/utils/configPaths'
import { T } from '~/i18n/index'
import { T as $t } from '~/i18n/index'
import { handleCopyUrl, handleUrlEncodeWithSetting } from '~/utils/common'
import { changeCurrentUploader } from '~/utils/handleUploaderConfig'
import pasteTemplate from '~/utils/pasteTemplate'
@@ -61,7 +61,7 @@ export const uploadClipboardFiles = async (): Promise<IStringKeyMap> => {
: !!db.get(configPaths.settings.uploadResultNotification)
if (isShowResultNotification) {
const notification = new Notification({
title: T('UPLOAD_SUCCEED'),
title: $t('UPLOAD_SUCCEED'),
body: shortUrl || img[0].imgUrl!
// icon: img[0].imgUrl
})
@@ -82,8 +82,8 @@ export const uploadClipboardFiles = async (): Promise<IStringKeyMap> => {
}
} else {
const notification = new Notification({
title: T('UPLOAD_FAILED'),
body: T('TIPS_UPLOAD_NOT_PICTURES')
title: $t('UPLOAD_FAILED'),
body: $t('TIPS_UPLOAD_NOT_PICTURES')
})
notification.show()
return {
@@ -141,7 +141,7 @@ export const uploadChoosedFiles = async (
: !!db.get(configPaths.settings.uploadResultNotification)
if (isShowResultNotification) {
const notification = new Notification({
title: T('UPLOAD_SUCCEED'),
title: $t('UPLOAD_SUCCEED'),
body: shortUrl || imgs[i].imgUrl!
// icon: files[i].path
})
+8 -43
View File
@@ -11,13 +11,13 @@ import fs from 'fs-extra'
import { IPicGo } from 'piclist'
import writeFile from 'write-file-atomic'
import { GET_RENAME_FILE_NAME, RENAME_FILE_NAME, TALKING_DATA_EVENT } from '#/events/constants'
import { GET_RENAME_FILE_NAME, RENAME_FILE_NAME } from '#/events/constants'
import { ICOREBuildInEvent, IWindowList } from '#/types/enum'
import { IAnalyticsData, ImgInfo, ITalkingDataOptions, IUploadOption } from '#/types/types'
import { ImgInfo, IUploadOption } from '#/types/types'
import { configPaths } from '#/utils/configPaths'
import { CLIPBOARD_IMAGE_FOLDER } from '#/utils/static'
import { T } from '~/i18n'
import { calcDurationRange, getClipboardFilePath, showNotification } from '~/utils/common'
import { T as $t } from '~/i18n'
import { getClipboardFilePath, showNotification } from '~/utils/common'
const waitForRename = (window: BrowserWindow, id: number): Promise<string | null> => {
return new Promise(resolve => {
@@ -33,21 +33,6 @@ const waitForRename = (window: BrowserWindow, id: number): Promise<string | null
})
}
const handleTalkingData = (webContents: WebContents, options: IAnalyticsData) => {
const { type, fromClipboard, count, duration } = options
const data: ITalkingDataOptions = {
EventId: 'upload',
Label: type,
MapKv: {
by: fromClipboard ? 'clipboard' : 'files',
count,
duration: calcDurationRange(duration || 0),
type
}
}
webContents.send(TALKING_DATA_EVENT, data)
}
class Uploader {
private webContents: WebContents | null = null
@@ -67,8 +52,8 @@ class Uploader {
picgo.on(ICOREBuildInEvent.BEFORE_TRANSFORM, () => {
if (db.get(configPaths.settings.uploadNotification)) {
const notification = new Notification({
title: T('UPLOAD_PROGRESS'),
body: T('UPLOADING')
title: $t('UPLOAD_PROGRESS'),
body: $t('UPLOADING')
})
notification.show()
}
@@ -164,19 +149,9 @@ class Uploader {
async uploadReturnCtx (img?: IUploadOption, skipProcess = false): Promise<IPicGo | false> {
try {
const startTime = Date.now()
const ctx = await picgo.uploadReturnCtx(img, skipProcess)
if (!Array.isArray(ctx.output) || !ctx.output.some((item: ImgInfo) => item.imgUrl)) return false
if (this.webContents) {
handleTalkingData(this.webContents, {
fromClipboard: !img,
type: db.get(configPaths.picBed.uploader) || db.get(configPaths.picBed.current) || 'smms',
count: img ? img.length : 1,
duration: Date.now() - startTime
} as IAnalyticsData)
}
ctx.output.forEach((item: ImgInfo) => {
item.config = JSON.parse(JSON.stringify(db.get(`picBed.${item.type}`)))
})
@@ -186,7 +161,7 @@ class Uploader {
logger.error(e)
setTimeout(() => {
showNotification({
title: T('UPLOAD_FAILED'),
title: $t('UPLOAD_FAILED'),
body: util.format(e.stack),
clickToCopy: true
})
@@ -199,18 +174,8 @@ class Uploader {
async upload (img?: IUploadOption): Promise<ImgInfo[] | false> {
try {
const startTime = Date.now()
const output = await picgo.upload(img)
if (!Array.isArray(output) || !output.some((item: ImgInfo) => item.imgUrl)) return false
if (this.webContents) {
handleTalkingData(this.webContents, {
fromClipboard: !img,
type: db.get(configPaths.picBed.uploader) || db.get(configPaths.picBed.current) || 'smms',
count: img ? img.length : 1,
duration: Date.now() - startTime
} as IAnalyticsData)
}
output.forEach((item: ImgInfo) => {
item.config = JSON.parse(JSON.stringify(db.get(`picBed.${item.type}`)))
})
@@ -219,7 +184,7 @@ class Uploader {
logger.error(e)
setTimeout(() => {
showNotification({
title: T('UPLOAD_FAILED'),
title: $t('UPLOAD_FAILED'),
body: util.format(e.stack),
clickToCopy: true
})
+2 -2
View File
@@ -10,7 +10,7 @@ import { IWindowListItem } from '#/types/electron'
import { IWindowList } from '#/types/enum'
import { IBrowserWindowOptions } from '#/types/types'
import { configPaths } from '#/utils/configPaths'
import { T } from '~/i18n'
import { T as $t } from '~/i18n'
import logo from '../../../../../resources/logo.png?asset'
import {
@@ -171,7 +171,7 @@ const toolboxWindowOptions = {
center: true,
fullscreenable: false,
resizable: false,
title: `PicList ${T('TOOLBOX')}`,
title: `PicList ${$t('TOOLBOX')}`,
vibrancy: 'ultra-dark',
icon: logo,
webPreferences: {
+7 -7
View File
@@ -7,7 +7,7 @@ import fs from 'fs-extra'
import writeFile from 'write-file-atomic'
import { notificationList } from '#/utils/notification'
import { T } from '~/i18n'
import { T as $t } from '~/i18n'
const STORE_PATH = app.getPath('userData')
@@ -19,8 +19,8 @@ let _configFilePath = ''
let hasCheckPath = false
const errorMsg = {
broken: T('TIPS_PICGO_CONFIG_FILE_BROKEN_WITH_DEFAULT'),
brokenButBackup: T('TIPS_PICGO_CONFIG_FILE_BROKEN_WITH_BACKUP')
broken: $t('TIPS_PICGO_CONFIG_FILE_BROKEN_WITH_DEFAULT'),
brokenButBackup: $t('TIPS_PICGO_CONFIG_FILE_BROKEN_WITH_BACKUP')
}
function dbChecker () {
@@ -41,7 +41,7 @@ function dbChecker () {
}
let configFile: string = '{}'
const optionsTpl = {
title: T('TIPS_NOTICE'),
title: $t('TIPS_NOTICE'),
body: ''
}
// config save bak
@@ -58,7 +58,7 @@ function dbChecker () {
JSON.parse(configFile)
writeFile.sync(configFilePath, configFile, { encoding: 'utf-8' })
const stats = fs.statSync(configFileBackupPath)
optionsTpl.body = `${errorMsg.brokenButBackup}\n${T('TIPS_PICGO_BACKUP_FILE_VERSION', {
optionsTpl.body = `${errorMsg.brokenButBackup}\n${$t('TIPS_PICGO_BACKUP_FILE_VERSION', {
v: dayjs(stats.mtime).format('YYYY-MM-DD HH:mm:ss')
})}`
notificationList.push(optionsTpl)
@@ -108,8 +108,8 @@ function dbPathChecker (): string {
const logger = getLogger(piclistLogPath, 'PicList')
if (!hasCheckPath) {
const optionsTpl = {
title: T('TIPS_NOTICE'),
body: T('TIPS_CUSTOM_CONFIG_FILE_PATH_ERROR')
title: $t('TIPS_NOTICE'),
body: $t('TIPS_CUSTOM_CONFIG_FILE_PATH_ERROR')
}
notificationList.push(optionsTpl)
hasCheckPath = true
+2 -2
View File
@@ -4,7 +4,7 @@ import fs from 'fs-extra'
import { IConfig } from 'piclist'
import { configPaths } from '#/utils/configPaths'
import { T } from '~/i18n'
import { T as $t } from '~/i18n'
interface IJSON {
[propsName: string]: string | number | IJSON
}
@@ -37,7 +37,7 @@ class ConfigStore {
enable: true,
key: 'CommandOrControl+Alt+P',
name: 'upload',
label: T('QUICK_UPLOAD')
label: $t('QUICK_UPLOAD')
})
}
this.read()
+6 -6
View File
@@ -12,7 +12,7 @@ import { SHOW_INPUT_BOX } from '#/events/constants'
import { IPasteStyle } from '#/types/enum'
import { IGuiApi, ImgInfo, IShowFileExplorerOption, IShowInputBoxOption, IShowMessageBoxOption, IShowMessageBoxResult, IShowNotificationOption, IUploadOption } from '#/types/types'
import { configPaths } from '#/utils/configPaths'
import { T } from '~/i18n'
import { T as $t } from '~/i18n'
import { handleCopyUrl } from '~/utils/common'
import pasteTemplate from '~/utils/pasteTemplate'
@@ -104,7 +104,7 @@ class GuiApi implements IGuiApi {
: !!db.get(configPaths.settings.uploadResultNotification)
if (isShowResultNotification) {
const notification = new Notification({
title: T('UPLOAD_SUCCEED'),
title: $t('UPLOAD_SUCCEED'),
body: shortUrl || (imgs[i].imgUrl! as string)
// icon: imgs[i].imgUrl
})
@@ -179,8 +179,8 @@ class GuiApi implements IGuiApi {
const guiApi = GuiApi.getInstance()
guiApi
.showMessageBox({
title: T('TIPS_WARNING'),
message: T('TIPS_PLUGIN_REMOVE_GALLERY_ITEM'),
title: $t('TIPS_WARNING'),
message: $t('TIPS_PLUGIN_REMOVE_GALLERY_ITEM'),
type: 'info',
buttons: ['Yes', 'No']
})
@@ -202,8 +202,8 @@ class GuiApi implements IGuiApi {
const guiApi = GuiApi.getInstance()
guiApi
.showMessageBox({
title: T('TIPS_WARNING'),
message: T('TIPS_PLUGIN_REMOVE_GALLERY_ITEM'),
title: $t('TIPS_WARNING'),
message: $t('TIPS_PLUGIN_REMOVE_GALLERY_ITEM'),
type: 'info',
buttons: ['Yes', 'No']
})