diff --git a/assets/technical-docs/api-doc.md b/assets/technical-docs/api-doc.md index 0c2840c..3540ff1 100644 --- a/assets/technical-docs/api-doc.md +++ b/assets/technical-docs/api-doc.md @@ -2,10 +2,225 @@ 本文档主要记录主进程和渲染进程的通信约定。 -## 背景知识 +## 命名方式 -本项目渲染进程包含两个:字幕窗口和控制窗口。主进程需要分别和两者进行通信,通信命令一般有三个关键词组成,由点号隔开。 +本项目渲染进程包含两个:字幕窗口和控制窗口,主进程需要分别和两者进行通信。通信命令的命名规则如下: -第一个词表示发送/接收处理对象,`config` 表示配置对象,`engine` 表示字幕引擎对象,`both` 表示两者同时。 +1. 命令一般由三个关键字组成,由点号隔开。 +2. 第一个关键字表示通信发送目标: + - `config` 表示控制窗口类实例(后端)或控制窗口(前端) + - `engine` 表示字幕窗口类实例(后端)或字幕窗口(前端) + - `both` 表示上述对象都有可能成为目标 +3. 第二个关键字表示需要修改的对象 / 发生改变的对象,采用小驼峰命名 +4. 第三个关键字一般是动词,表示通信发生时对应动作 / 需要进行的操作 -比如 `` +根据上面的描述可以看出通信命令一般有两种语义,一种表示要求执行的操作,另一种表示当前发生的事件。 + +## 前端 <=> 后端 + +### `control.captionLog.clear` + +**介绍:**清空字幕记录 + +**发起方:**前端控制窗口 + +**接收方:**后端控制窗口实例 + +**数据类型:** + +- 发送:无数据 +- 接收:`CaptionItem[]` + +## 前端 ==> 后端 + +### `control.styles.change` + +**介绍:**前端修改字幕样式,将修改同步给后端 + +**发起方:**前端控制窗口 + +**接收方:**后端控制窗口实例 + +**数据类型:**`Styles` + +### `control.styles.reset` + +**介绍:**将字幕样式恢复为默认 + +**发起方:**前端控制窗口 + +**接收方:**后端控制窗口实例 + +**数据类型:**无数据 + +### `control.controls.change` + +**介绍:**前端修改了字幕引擎配置,将最新配置发送给后端 + +**发起方:**前端控制窗口 + +**接收方:**后端控制窗口实例 + +**数据类型:**`Controls` + +### `control.captionWindow.activate` + +**介绍:**激活字幕窗口 + +**发起方:**前端控制窗口 + +**接收方:**后端控制窗口实例 + +**数据类型:**无数据 + +### `control.engine.start` + +**介绍:**启动字幕引擎 + +**发起方:**前端控制窗口 + +**接收方:**后端控制窗口实例 + +**数据类型:**无数据 + +### `control.engine.stop` + +**介绍:**关闭字幕引擎 + +**发起方:**前端控制窗口 + +**接收方:**后端控制窗口实例 + +**数据类型:**无数据 + +### `caption.windowHeight.change` + +**介绍:**字幕窗口宽度发生改变 + +**发起方:**前端字幕窗口 + +**接收方:**后端字幕窗口实例 + +**数据类型:**`number` + +### `caption.pin.set` + +**介绍:**是否将窗口置顶 + +**发起方:**前端字幕窗口 + +**接收方:**后端字幕窗口实例 + +**数据类型:**`boolean` + +### `caption.controlWindow.activate` + +**介绍:**激活控制窗口 + +**发起方:**前端字幕窗口 + +**接收方:**后端字幕窗口实例 + +**数据类型:**无数据 + +### `caption.window.close` + +**介绍:**关闭字幕窗口 + +**发起方:**前端字幕窗口 + +**接收方:**后端字幕窗口实例 + +**数据类型:**无数据 + +## 后端 ==> 前端 + +### `control.engine.already` + +**介绍:**引擎已经启动 + +**发起方:**后端 + +**接收方:**前端控制窗口 + +**数据类型:**无数据 + +### `control.engine.started` + +**介绍:**引擎启动 + +**发起方:**后端 + +**接收方:**前端控制窗口 + +**数据类型:**无数据 + +### `control.engine.stopped` + +**介绍:**引擎关闭 + +**发起方:**后端 + +**接收方:**前端控制窗口 + +**数据类型:**无数据 + +### `control.error.occurred` + +**介绍:**发送错误 + +**发起方:**后端 + +**接收方:**前端控制窗口 + +**数据类型:**`string` + +### `control.controls.set` + +**介绍:**后端将最新字幕引擎配置发送给前端,前端进行设置 + +**发起方:**后端 + +**接收方:**前端控制窗口 + +**数据类型:**`Controls` + +### `caption.styles.set` + +**介绍:**后端将最新字幕样式发送给前端,前端进行设置 + +**发起方:**后端 + +**接收方:**前端 + +**数据类型:**`Styles` + +### `both.captionLog.add` + +**介绍:**添加一条新的字幕数据 + +**发起方:**后端 + +**接收方:**前端 + +**数据类型:**`CaptionItem` + +### `both.captionLog.upd` + +**介绍:**更新最后一条字幕数据 + +**发起方:**后端 + +**接收方:**前端 + +**数据类型:**`CaptionItem` + +### `both.captionLog.set` + +**介绍:**设置全部的字幕数据 + +**发起方:**后端 + +**接收方:**前端 + +**数据类型:**`CaptionItem[]` diff --git a/src/main/ControlWindow.ts b/src/main/ControlWindow.ts index 7a622f9..7172a4b 100644 --- a/src/main/ControlWindow.ts +++ b/src/main/ControlWindow.ts @@ -14,8 +14,8 @@ class ControlWindow { icon: icon, width: 1200, height: 800, - minWidth: 600, - minHeight: 400, + minWidth: 750, + minHeight: 500, show: false, center: true, autoHideMenuBar: true, @@ -58,8 +58,13 @@ class ControlWindow { } public handleMessage() { + // 控制窗口初始化完毕 + ipcMain.handle('control.window.mounted', async () => { + return allConfig.getControlWindowConfig() + }) + // 样式变更 - ipcMain.on('control.style.change', (_, args) => { + ipcMain.on('control.styles.change', (_, args) => { allConfig.setStyles(args) if(captionWindow.window){ allConfig.sendStyles(captionWindow.window) @@ -67,7 +72,7 @@ class ControlWindow { }) // 样式重置 - ipcMain.on('control.style.reset', () => { + ipcMain.on('control.styles.reset', () => { allConfig.resetStyles() if(this.window){ allConfig.sendStyles(this.window) @@ -88,7 +93,7 @@ class ControlWindow { }) // 字幕引擎配置更新 - ipcMain.on('control.control.change', (_, args) => { + ipcMain.on('control.controls.change', (_, args) => { allConfig.setControls(args) }) @@ -109,13 +114,14 @@ class ControlWindow { }) // 清空字幕记录 - ipcMain.on('control.caption.clear', () => { + ipcMain.handle('control.captionLog.clear', () => { allConfig.captionLog.splice(0) + return allConfig.captionLog }) } public sendErrorMessage(message: string) { - this.window?.webContents.send('control.error.send', message) + this.window?.webContents.send('control.error.occurred', message) } } diff --git a/src/main/types/index.ts b/src/main/types/index.ts index 05f2b4f..84d1516 100644 --- a/src/main/types/index.ts +++ b/src/main/types/index.ts @@ -1,5 +1,17 @@ export type UILanguage = "zh" | "en" | "ja" +export interface Controls { + engineEnabled: boolean, + sourceLang: string, + targetLang: string, + engine: 'gummy', + audio: 0 | 1, + translation: boolean, + customized: boolean, + customizedApp: string, + customizedCommand: string +} + export interface Styles { fontFamily: string, fontSize: number, @@ -20,14 +32,9 @@ export interface CaptionItem { translation: string } -export interface Controls { - engineEnabled: boolean, - sourceLang: string, - targetLang: string, - engine: 'gummy', - audio: 0 | 1, - translation: boolean, - customized: boolean, - customizedApp: string, - customizedCommand: string +export interface ControlWindowConfig { + uiLanguage: UILanguage, + leftBarWidth: number, + styles: Styles, + controls: Controls } diff --git a/src/main/utils/AllConfig.ts b/src/main/utils/AllConfig.ts index 202c7ec..31753c4 100644 --- a/src/main/utils/AllConfig.ts +++ b/src/main/utils/AllConfig.ts @@ -1,4 +1,7 @@ -import { UILanguage, Styles, CaptionItem, Controls } from '../types' +import { + UILanguage, Styles, CaptionItem, Controls, + ControlWindowConfig +} from '../types' import { app, BrowserWindow } from 'electron' import * as path from 'path' import * as fs from 'fs' @@ -29,7 +32,8 @@ const defaultControls: Controls = { class AllConfig { - uiLanguage: UILanguage = 'ja' + uiLanguage: UILanguage = 'zh'; + leftBarWidth: number = 8; styles: Styles = {...defaultStyles}; controls: Controls = {...defaultControls}; captionLog: CaptionItem[] = []; @@ -41,6 +45,7 @@ class AllConfig { if(fs.existsSync(configPath)){ const config = JSON.parse(fs.readFileSync(configPath, 'utf-8')) if(config.uiLanguage) this.uiLanguage = config.uiLanguage + if(config.leftBarWidth) this.leftBarWidth = config.leftBarWidth if(config.styles) this.setStyles(config.styles) if(config.controls) this.setControls(config.controls) console.log('[INFO] Read Config from:', configPath) @@ -58,8 +63,21 @@ class AllConfig { console.log('[INFO] Write Config to:', configPath) } - public setStyles(args: any) { - this.styles = {...args} + public getControlWindowConfig(): ControlWindowConfig { + return { + uiLanguage: this.uiLanguage, + leftBarWidth: this.leftBarWidth, + styles: this.styles, + controls: this.controls + } + } + + public setStyles(args: Styles) { + for(let key in this.styles) { + if(key in args) { + this.styles[key] = args[key] + } + } console.log('[INFO] Set Styles:', this.styles) } @@ -68,40 +86,49 @@ class AllConfig { } public sendStyles(window: BrowserWindow) { - window.webContents.send('caption.style.set', this.styles) + window.webContents.send('caption.styles.set', this.styles) console.log(`[INFO] Send Styles to #${window.id}:`, this.styles) } - public setControls(args: any) { + public setControls(args: Controls) { const engineEnabled = args.engineEnabled - this.controls = {...args} + for(let key in this.controls){ + if(key in args) { + this.controls[key] = args[key] + } + } this.controls.engineEnabled = engineEnabled console.log('[INFO] Set Controls:', this.controls) } public sendControls(window: BrowserWindow) { - window.webContents.send('control.control.set', this.controls) + window.webContents.send('control.controls.set', this.controls) console.log(`[INFO] Send Controls to #${window.id}:`, this.controls) } public updateCaptionLog(log: CaptionItem) { + let command: 'add' | 'upd' = 'add' if(this.captionLog.length && this.captionLog[this.captionLog.length - 1].index === log.index) { this.captionLog.splice(this.captionLog.length - 1, 1, log) + command = 'upd' } else { this.captionLog.push(log) } for(const window of BrowserWindow.getAllWindows()){ - this.sendCaptionLog(window, 'add') + this.sendCaptionLog(window, command) } } - public sendCaptionLog(window: BrowserWindow, command: 'add' | 'set') { + public sendCaptionLog(window: BrowserWindow, command: 'add' | 'upd' | 'set') { if(command === 'add'){ - window.webContents.send(`both.log.add`, this.captionLog[this.captionLog.length - 1]) + window.webContents.send(`both.captionLog.add`, this.captionLog[this.captionLog.length - 1]) + } + else if(command === 'upd'){ + window.webContents.send(`both.captionLog.upd`, this.captionLog[this.captionLog.length - 1]) } else if(command === 'set'){ - window.webContents.send(`both.log.${command}`, this.captionLog) + window.webContents.send(`both.captionLog.set`, this.captionLog) } } } diff --git a/src/renderer/src/App.vue b/src/renderer/src/App.vue index 270a927..314e3d5 100644 --- a/src/renderer/src/App.vue +++ b/src/renderer/src/App.vue @@ -3,4 +3,11 @@ diff --git a/src/renderer/src/components/CaptionStyle.vue b/src/renderer/src/components/CaptionStyle.vue index 3894b77..636a184 100644 --- a/src/renderer/src/components/CaptionStyle.vue +++ b/src/renderer/src/components/CaptionStyle.vue @@ -168,7 +168,7 @@ function applyStyle(){ captionStyle.transFontSize = currentTransFontSize.value; captionStyle.transFontColor = currentTransFontColor.value; - captionStyle.sendStyleChange(); + captionStyle.sendStylesChange(); } function backStyle(){ @@ -185,7 +185,7 @@ function backStyle(){ } function resetStyle() { - captionStyle.sendStyleReset(); + captionStyle.sendStylesReset(); } watch(changeSignal, (val) => { diff --git a/src/renderer/src/components/EngineControl.vue b/src/renderer/src/components/EngineControl.vue index 6149177..0f63e78 100644 --- a/src/renderer/src/components/EngineControl.vue +++ b/src/renderer/src/components/EngineControl.vue @@ -115,7 +115,7 @@ function applyChange(){ engineControl.customizedApp = currentCustomizedApp.value engineControl.customizedCommand = currentCustomizedCommand.value - engineControl.sendControlChange() + engineControl.sendControlsChange() notification.open({ message: '字幕控制已更改', diff --git a/src/renderer/src/i18n/config/audio.ts b/src/renderer/src/i18n/config/audio.ts new file mode 100644 index 0000000..1e163e1 --- /dev/null +++ b/src/renderer/src/i18n/config/audio.ts @@ -0,0 +1,32 @@ +export const audioTypes = { + zh: [ + { + value: 0, + label: '系统音频输出(扬声器)' + }, + { + value: 1, + label: '系统音频输入(麦克风)' + } + ], + en: [ + { + value: 0, + label: 'System Audio Output (Speaker)' + }, + { + value: 1, + label: 'System Audio Input (Microphone)' + } + ], + ja: [ + { + value: 0, + label: 'システム音声出力(スピーカー)' + }, + { + value: 1, + label: 'システム音声入力(マイク)' + } + ] +} diff --git a/src/renderer/src/i18n/config/engine.ts b/src/renderer/src/i18n/config/engine.ts new file mode 100644 index 0000000..d9cf655 --- /dev/null +++ b/src/renderer/src/i18n/config/engine.ts @@ -0,0 +1,57 @@ +export const engines = { + zh: [ + { + value: 'gummy', + label: '云端 - 阿里云 - Gummy', + languages: [ + { value: 'auto', label: '自动检测' }, + { value: 'en', label: '英语' }, + { value: 'zh', label: '中文' }, + { value: 'ja', label: '日语' }, + { value: 'ko', label: '韩语' }, + { value: 'de', label: '德语' }, + { value: 'fr', label: '法语' }, + { value: 'ru', label: '俄语' }, + { value: 'es', label: '西班牙语' }, + { value: 'it', label: '意大利语' }, + ] + }, + ], + en: [ + { + value: 'gummy', + label: 'Cloud - Alibaba Cloud - Gummy', + languages: [ + { value: 'auto', label: 'Auto Detect' }, + { value: 'en', label: 'English' }, + { value: 'zh', label: 'Chinese' }, + { value: 'ja', label: 'Japanese' }, + { value: 'ko', label: 'Korean' }, + { value: 'de', label: 'German' }, + { value: 'fr', label: 'French' }, + { value: 'ru', label: 'Russian' }, + { value: 'es', label: 'Spanish' }, + { value: 'it', label: 'Italian' }, + ] + }, + ], + ja: [ + { + value: 'gummy', + label: 'クラウド - アリババクラウド - Gummy', + languages: [ + { value: 'auto', label: '自動検出' }, + { value: 'en', label: '英語' }, + { value: 'zh', label: '中国語' }, + { value: 'ja', label: '日本語' }, + { value: 'ko', label: '韓国語' }, + { value: 'de', label: 'ドイツ語' }, + { value: 'fr', label: 'フランス語' }, + { value: 'ru', label: 'ロシア語' }, + { value: 'es', label: 'スペイン語' }, + { value: 'it', label: 'イタリア語' }, + ] + }, + ] +} + diff --git a/src/renderer/src/i18n/index.ts b/src/renderer/src/i18n/index.ts index fbe63ac..7a930d0 100644 --- a/src/renderer/src/i18n/index.ts +++ b/src/renderer/src/i18n/index.ts @@ -4,7 +4,7 @@ import zh from './lang/zh'; import en from './lang/en'; import ja from './lang/ja'; -const i18n = createI18n({ +export const i18n = createI18n({ legacy: false, locale: 'zh', messages: { @@ -14,4 +14,5 @@ const i18n = createI18n({ } }); -export default i18n; +export * from './config/engine' +export * from './config/audio' diff --git a/src/renderer/src/main.ts b/src/renderer/src/main.ts index 5c9bd86..141622b 100644 --- a/src/renderer/src/main.ts +++ b/src/renderer/src/main.ts @@ -4,7 +4,7 @@ import { createPinia } from 'pinia' import App from './App.vue' import router from './router' -import i18n from './i18n' +import { i18n } from './i18n' import Antd from 'ant-design-vue'; import 'ant-design-vue/dist/reset.css'; diff --git a/src/renderer/src/stores/captionLog.ts b/src/renderer/src/stores/captionLog.ts index 1070ce3..9e52dd0 100644 --- a/src/renderer/src/stores/captionLog.ts +++ b/src/renderer/src/stores/captionLog.ts @@ -5,21 +5,21 @@ import { CaptionItem } from '../types' export const useCaptionLogStore = defineStore('captionLog', () => { const captionData = ref([]) - window.electron.ipcRenderer.on('both.log.add', (_, log) => { - if(captionData.value.length && log.index === captionData.value[captionData.value.length - 1].index) { - captionData.value.splice(captionData.value.length - 1, 1, log) - } - else { - captionData.value.push(log) - } - }) - function clear() { - captionData.value = [] - window.electron.ipcRenderer.send('control.caption.clear') + window.electron.ipcRenderer.invoke('control.captionLog.clear').then((data: CaptionItem[]) => { + captionData.value = data + }) } - window.electron.ipcRenderer.on('both.log.set', (_, logs) => { + window.electron.ipcRenderer.on('both.captionLog.add', (_, log) => { + captionData.value.push(log) + }) + + window.electron.ipcRenderer.on('both.captionLog.upd', (_, log) => { + captionData.value.splice(captionData.value.length - 1, 1, log) + }) + + window.electron.ipcRenderer.on('both.captionLog.set', (_, logs) => { captionData.value = logs }) diff --git a/src/renderer/src/stores/captionStyle.ts b/src/renderer/src/stores/captionStyle.ts index d327805..0ae9efc 100644 --- a/src/renderer/src/stores/captionStyle.ts +++ b/src/renderer/src/stores/captionStyle.ts @@ -26,7 +26,7 @@ export const useCaptionStyleStore = defineStore('captionStyle', () => { return addOpicityToColor(background.value, opacity.value) }) - function sendStyleChange() { + function sendStylesChange() { const styles: Styles = { fontFamily: fontFamily.value, fontSize: fontSize.value, @@ -38,14 +38,14 @@ export const useCaptionStyleStore = defineStore('captionStyle', () => { transFontSize: transFontSize.value, transFontColor: transFontColor.value } - window.electron.ipcRenderer.send('control.style.change', styles) + window.electron.ipcRenderer.send('control.styles.change', styles) } - function sendStyleReset() { - window.electron.ipcRenderer.send('control.style.reset') + function sendStylesReset() { + window.electron.ipcRenderer.send('control.styles.reset') } - window.electron.ipcRenderer.on('caption.style.set', (_, args) => { + window.electron.ipcRenderer.on('caption.styles.set', (_, args: Styles) => { fontFamily.value = args.fontFamily fontSize.value = args.fontSize fontColor.value = args.fontColor @@ -69,8 +69,8 @@ export const useCaptionStyleStore = defineStore('captionStyle', () => { transFontSize, // 翻译字体大小 transFontColor, // 翻译字体颜色 backgroundRGBA, // 带透明度的背景颜色 - sendStyleChange, // 发送样式改变 - sendStyleReset, // 恢复默认样式 + sendStylesChange, // 发送样式改变 + sendStylesReset, // 恢复默认样式 changeSignal // 样式改变信号 } }) diff --git a/src/renderer/src/stores/engineControl.ts b/src/renderer/src/stores/engineControl.ts index 312ea31..ed9272c 100644 --- a/src/renderer/src/stores/engineControl.ts +++ b/src/renderer/src/stores/engineControl.ts @@ -6,39 +6,14 @@ import { ExclamationCircleOutlined } from '@ant-design/icons-vue' import { h } from 'vue' import { Controls } from '@renderer/types' +import { engines, audioTypes } from '@renderer/i18n' +import { useGeneralSettingStore } from './generalSetting' export const useEngineControlStore = defineStore('engineControl', () => { - const captionEngine = ref([ - { - value: 'gummy', - label: '云端-阿里云-Gummy', - languages: [ - { value: 'auto', label: '自动检测' }, - { value: 'en', label: '英语' }, - { value: 'zh', label: '中文' }, - { value: 'ja', label: '日语' }, - { value: 'ko', label: '韩语' }, - { value: 'de', label: '德语' }, - { value: 'fr', label: '法语' }, - { value: 'ru', label: '俄语' }, - { value: 'es', label: '西班牙语' }, - { value: 'it', label: '意大利语' }, - ] - }, - ]) - const audioType = ref([ - { - value: 0, - label: '系统音频输出(扬声器)' - }, - { - value: 1, - label: '系统音频输入(麦克风)' - } - ]) + const captionEngine = ref(engines[useGeneralSettingStore().uiLanguage]) + const audioType = ref(audioTypes[useGeneralSettingStore().uiLanguage]) const engineEnabled = ref(false) - const sourceLang = ref('en') const targetLang = ref('zh') const engine = ref<'gummy'>('gummy') @@ -50,7 +25,7 @@ export const useEngineControlStore = defineStore('engineControl', () => { const changeSignal = ref(false) - function sendControlChange() { + function sendControlsChange() { const controls: Controls = { engineEnabled: engineEnabled.value, sourceLang: sourceLang.value, @@ -62,10 +37,10 @@ export const useEngineControlStore = defineStore('engineControl', () => { customizedApp: customizedApp.value, customizedCommand: customizedCommand.value } - window.electron.ipcRenderer.send('control.control.change', controls) + window.electron.ipcRenderer.send('control.controls.change', controls) } - window.electron.ipcRenderer.on('control.control.set', (_, controls) => { + window.electron.ipcRenderer.on('control.controls.set', (_, controls: Controls) => { sourceLang.value = controls.sourceLang targetLang.value = controls.targetLang engine.value = controls.engine @@ -79,6 +54,7 @@ export const useEngineControlStore = defineStore('engineControl', () => { }) window.electron.ipcRenderer.on('control.engine.already', () => { + // TODO 修改为重启 notification.open({ message: '字幕引擎已经启动', description: '字幕引擎已经启动,请勿重复启动' @@ -104,7 +80,7 @@ export const useEngineControlStore = defineStore('engineControl', () => { }); }) - window.electron.ipcRenderer.on('control.error.send', (_, message) => { + window.electron.ipcRenderer.on('control.error.occurred', (_, message) => { notification.open({ message: '发生错误', description: message, @@ -126,7 +102,7 @@ export const useEngineControlStore = defineStore('engineControl', () => { customized, // 是否使用自定义字幕引擎 customizedApp, // 自定义字幕引擎的应用程序 customizedCommand, // 自定义字幕引擎的命令 - sendControlChange, // 发送最新控制消息到后端 + sendControlsChange, // 发送最新控制消息到后端 changeSignal, // 配置改变信号 } }) diff --git a/src/renderer/src/stores/generalSetting.ts b/src/renderer/src/stores/generalSetting.ts index 9a640ff..da9f64e 100644 --- a/src/renderer/src/stores/generalSetting.ts +++ b/src/renderer/src/stores/generalSetting.ts @@ -1,8 +1,11 @@ import { ref, watch } from 'vue' import { defineStore } from 'pinia' -import i18n from '../i18n' +import { i18n } from '../i18n' import type { UILanguage } from '../types' +import { engines, audioTypes } from '../i18n' +import { useEngineControlStore } from './engineControl' + export const useGeneralSettingStore = defineStore('generalSetting', () => { const uiLanguage = ref('zh') const leftBarWidth = ref(8) @@ -10,6 +13,8 @@ export const useGeneralSettingStore = defineStore('generalSetting', () => { watch(uiLanguage, (newValue) => { i18n.global.locale.value = newValue console.log(newValue) + useEngineControlStore().captionEngine = engines[newValue] + useEngineControlStore().audioType = audioTypes[newValue] }) return { diff --git a/src/renderer/src/types/index.ts b/src/renderer/src/types/index.ts index 05f2b4f..84d1516 100644 --- a/src/renderer/src/types/index.ts +++ b/src/renderer/src/types/index.ts @@ -1,5 +1,17 @@ export type UILanguage = "zh" | "en" | "ja" +export interface Controls { + engineEnabled: boolean, + sourceLang: string, + targetLang: string, + engine: 'gummy', + audio: 0 | 1, + translation: boolean, + customized: boolean, + customizedApp: string, + customizedCommand: string +} + export interface Styles { fontFamily: string, fontSize: number, @@ -20,14 +32,9 @@ export interface CaptionItem { translation: string } -export interface Controls { - engineEnabled: boolean, - sourceLang: string, - targetLang: string, - engine: 'gummy', - audio: 0 | 1, - translation: boolean, - customized: boolean, - customizedApp: string, - customizedCommand: string +export interface ControlWindowConfig { + uiLanguage: UILanguage, + leftBarWidth: number, + styles: Styles, + controls: Controls }