@lobehub/chat 1.103.2 → 1.104.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/apps/desktop/src/main/controllers/BrowserWindowsCtr.ts +1 -1
  3. package/apps/desktop/src/main/controllers/ShortcutCtr.ts +9 -1
  4. package/apps/desktop/src/main/controllers/TrayMenuCtr.ts +1 -5
  5. package/apps/desktop/src/main/controllers/__tests__/ShortcutCtr.test.ts +14 -11
  6. package/apps/desktop/src/main/core/ui/ShortcutManager.ts +71 -5
  7. package/apps/desktop/src/main/shortcuts/config.ts +4 -2
  8. package/changelog/v1.json +9 -0
  9. package/locales/ar/hotkey.json +10 -4
  10. package/locales/ar/setting.json +12 -1
  11. package/locales/bg-BG/hotkey.json +10 -4
  12. package/locales/bg-BG/setting.json +12 -1
  13. package/locales/de-DE/hotkey.json +10 -4
  14. package/locales/de-DE/setting.json +12 -1
  15. package/locales/en-US/hotkey.json +10 -4
  16. package/locales/en-US/setting.json +12 -1
  17. package/locales/es-ES/hotkey.json +10 -4
  18. package/locales/es-ES/setting.json +12 -1
  19. package/locales/fa-IR/hotkey.json +10 -4
  20. package/locales/fa-IR/setting.json +12 -1
  21. package/locales/fr-FR/hotkey.json +10 -4
  22. package/locales/fr-FR/setting.json +12 -1
  23. package/locales/it-IT/hotkey.json +10 -4
  24. package/locales/it-IT/setting.json +12 -1
  25. package/locales/ja-JP/hotkey.json +10 -4
  26. package/locales/ja-JP/setting.json +12 -1
  27. package/locales/ko-KR/hotkey.json +10 -4
  28. package/locales/ko-KR/setting.json +12 -1
  29. package/locales/nl-NL/hotkey.json +10 -4
  30. package/locales/nl-NL/setting.json +12 -1
  31. package/locales/pl-PL/hotkey.json +10 -4
  32. package/locales/pl-PL/setting.json +12 -1
  33. package/locales/pt-BR/hotkey.json +10 -4
  34. package/locales/pt-BR/setting.json +12 -1
  35. package/locales/ru-RU/hotkey.json +10 -4
  36. package/locales/ru-RU/setting.json +12 -1
  37. package/locales/tr-TR/hotkey.json +10 -4
  38. package/locales/tr-TR/setting.json +12 -1
  39. package/locales/vi-VN/hotkey.json +10 -4
  40. package/locales/vi-VN/setting.json +12 -1
  41. package/locales/zh-CN/hotkey.json +10 -4
  42. package/locales/zh-CN/setting.json +12 -1
  43. package/locales/zh-TW/hotkey.json +10 -4
  44. package/locales/zh-TW/setting.json +12 -1
  45. package/package.json +1 -1
  46. package/packages/electron-client-ipc/src/events/shortcut.ts +3 -1
  47. package/packages/electron-client-ipc/src/types/shortcut.ts +11 -0
  48. package/src/app/[variants]/(main)/settings/hotkey/features/Conversation.tsx +3 -11
  49. package/src/app/[variants]/(main)/settings/hotkey/features/Desktop.tsx +92 -0
  50. package/src/app/[variants]/(main)/settings/hotkey/features/Essential.tsx +3 -11
  51. package/src/app/[variants]/(main)/settings/hotkey/page.tsx +3 -0
  52. package/src/const/desktop.ts +9 -0
  53. package/src/const/hotkeys.ts +20 -16
  54. package/src/features/User/UserPanel/useMenu.tsx +2 -2
  55. package/src/locales/default/hotkey.ts +13 -5
  56. package/src/locales/default/setting.ts +11 -0
  57. package/src/services/electron/settings.ts +19 -1
  58. package/src/store/electron/actions/settings.ts +42 -1
  59. package/src/store/electron/initialState.ts +9 -1
  60. package/src/store/electron/selectors/__tests__/desktopState.test.ts +6 -17
  61. package/src/store/electron/selectors/hotkey.ts +11 -0
  62. package/src/store/electron/selectors/index.ts +1 -0
  63. package/src/types/hotkey.ts +18 -4
package/CHANGELOG.md CHANGED
@@ -2,6 +2,31 @@
2
2
 
3
3
  # Changelog
4
4
 
5
+ ## [Version 1.104.0](https://github.com/lobehub/lobe-chat/compare/v1.103.2...v1.104.0)
6
+
7
+ <sup>Released on **2025-07-24**</sup>
8
+
9
+ #### ✨ Features
10
+
11
+ - **misc**: Support custom hotkey on desktop.
12
+
13
+ <br/>
14
+
15
+ <details>
16
+ <summary><kbd>Improvements and Fixes</kbd></summary>
17
+
18
+ #### What's improved
19
+
20
+ - **misc**: Support custom hotkey on desktop, closes [#8559](https://github.com/lobehub/lobe-chat/issues/8559) ([b50f121](https://github.com/lobehub/lobe-chat/commit/b50f121))
21
+
22
+ </details>
23
+
24
+ <div align="right">
25
+
26
+ [![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
27
+
28
+ </div>
29
+
5
30
  ### [Version 1.103.2](https://github.com/lobehub/lobe-chat/compare/v1.103.1...v1.103.2)
6
31
 
7
32
  <sup>Released on **2025-07-24**</sup>
@@ -7,7 +7,7 @@ import { IpcClientEventSender } from '@/types/ipcClientEvent';
7
7
  import { ControllerModule, ipcClientEvent, shortcut } from './index';
8
8
 
9
9
  export default class BrowserWindowsCtr extends ControllerModule {
10
- @shortcut('showMainWindow')
10
+ @shortcut('showApp')
11
11
  async toggleMainWindow() {
12
12
  const mainWindow = this.app.browserManager.getMainWindow();
13
13
  mainWindow.toggleVisible();
@@ -1,3 +1,5 @@
1
+ import { ShortcutUpdateResult } from '@/core/ui/ShortcutManager';
2
+
1
3
  import { ControllerModule, ipcClientEvent } from '.';
2
4
 
3
5
  export default class ShortcutController extends ControllerModule {
@@ -13,7 +15,13 @@ export default class ShortcutController extends ControllerModule {
13
15
  * 更新单个快捷键配置
14
16
  */
15
17
  @ipcClientEvent('updateShortcutConfig')
16
- updateShortcutConfig(id: string, accelerator: string): boolean {
18
+ updateShortcutConfig({
19
+ id,
20
+ accelerator,
21
+ }: {
22
+ accelerator: string;
23
+ id: string;
24
+ }): ShortcutUpdateResult {
17
25
  return this.app.shortcutManager.updateShortcutConfig(id, accelerator);
18
26
  }
19
27
  }
@@ -6,16 +6,12 @@ import {
6
6
 
7
7
  import { createLogger } from '@/utils/logger';
8
8
 
9
- import { ControllerModule, ipcClientEvent, shortcut } from './index';
9
+ import { ControllerModule, ipcClientEvent } from './index';
10
10
 
11
11
  // 创建日志记录器
12
12
  const logger = createLogger('controllers:TrayMenuCtr');
13
13
 
14
14
  export default class TrayMenuCtr extends ControllerModule {
15
- /**
16
- * 使用快捷键切换窗口可见性
17
- */
18
- @shortcut('showMainWindow')
19
15
  async toggleMainWindow() {
20
16
  logger.debug('通过快捷键切换主窗口可见性');
21
17
  const mainWindow = this.app.browserManager.getMainWindow();
@@ -5,9 +5,9 @@ import type { App } from '@/core/App';
5
5
  import ShortcutController from '../ShortcutCtr';
6
6
 
7
7
  // 模拟 App 及其依赖项
8
- const mockGetShortcutsConfig = vi.fn().mockReturnValue({
8
+ const mockGetShortcutsConfig = vi.fn().mockReturnValue({
9
9
  toggleMainWindow: 'CommandOrControl+Shift+L',
10
- openSettings: 'CommandOrControl+,'
10
+ openSettings: 'CommandOrControl+,',
11
11
  });
12
12
  const mockUpdateShortcutConfig = vi.fn().mockImplementation((id, accelerator) => {
13
13
  // 简单模拟更新成功
@@ -32,11 +32,11 @@ describe('ShortcutController', () => {
32
32
  describe('getShortcutsConfig', () => {
33
33
  it('should return shortcuts config from shortcutManager', () => {
34
34
  const result = shortcutController.getShortcutsConfig();
35
-
35
+
36
36
  expect(mockGetShortcutsConfig).toHaveBeenCalled();
37
37
  expect(result).toEqual({
38
38
  toggleMainWindow: 'CommandOrControl+Shift+L',
39
- openSettings: 'CommandOrControl+,'
39
+ openSettings: 'CommandOrControl+,',
40
40
  });
41
41
  });
42
42
  });
@@ -45,9 +45,9 @@ describe('ShortcutController', () => {
45
45
  it('should call shortcutManager.updateShortcutConfig with correct parameters', () => {
46
46
  const id = 'toggleMainWindow';
47
47
  const accelerator = 'CommandOrControl+Alt+L';
48
-
49
- const result = shortcutController.updateShortcutConfig(id, accelerator);
50
-
48
+
49
+ const result = shortcutController.updateShortcutConfig({ id, accelerator });
50
+
51
51
  expect(mockUpdateShortcutConfig).toHaveBeenCalledWith(id, accelerator);
52
52
  expect(result).toBe(true);
53
53
  });
@@ -55,10 +55,13 @@ describe('ShortcutController', () => {
55
55
  it('should return the result from shortcutManager.updateShortcutConfig', () => {
56
56
  // 模拟更新失败的情况
57
57
  mockUpdateShortcutConfig.mockReturnValueOnce(false);
58
-
59
- const result = shortcutController.updateShortcutConfig('invalidKey', 'invalid+combo');
60
-
58
+
59
+ const result = shortcutController.updateShortcutConfig({
60
+ id: 'invalidKey',
61
+ accelerator: 'invalid+combo',
62
+ });
63
+
61
64
  expect(result).toBe(false);
62
65
  });
63
66
  });
64
- });
67
+ });
@@ -8,6 +8,17 @@ import type { App } from '../App';
8
8
  // Create logger
9
9
  const logger = createLogger('core:ShortcutManager');
10
10
 
11
+ export interface ShortcutUpdateResult {
12
+ errorType?:
13
+ | 'INVALID_ID'
14
+ | 'INVALID_FORMAT'
15
+ | 'NO_MODIFIER'
16
+ | 'CONFLICT'
17
+ | 'SYSTEM_OCCUPIED'
18
+ | 'UNKNOWN';
19
+ success: boolean;
20
+ }
21
+
11
22
  export class ShortcutManager {
12
23
  private app: App;
13
24
  private shortcuts: Map<string, () => void> = new Map();
@@ -40,18 +51,73 @@ export class ShortcutManager {
40
51
  /**
41
52
  * Update a single shortcut configuration
42
53
  */
43
- updateShortcutConfig(id: string, accelerator: string): boolean {
54
+ updateShortcutConfig(id: string, accelerator: string): ShortcutUpdateResult {
44
55
  try {
45
56
  logger.debug(`Updating shortcut ${id} to ${accelerator}`);
46
- // Update configuration
47
- this.shortcutsConfig[id] = accelerator;
57
+
58
+ // 1. 检查 ID 是否有效
59
+ if (!DEFAULT_SHORTCUTS_CONFIG[id]) {
60
+ logger.error(`Invalid shortcut ID: ${id}`);
61
+ return { errorType: 'INVALID_ID', success: false };
62
+ }
63
+
64
+ // 2. 基本格式校验
65
+ if (!accelerator || typeof accelerator !== 'string' || accelerator.trim() === '') {
66
+ logger.error(`Invalid accelerator format: ${accelerator}`);
67
+ return { errorType: 'INVALID_FORMAT', success: false };
68
+ }
69
+
70
+ const cleanAccelerator = accelerator.trim().toLowerCase();
71
+
72
+ // 3. 检查是否包含 + 号(修饰键格式)
73
+ if (!cleanAccelerator.includes('+')) {
74
+ logger.error(
75
+ `Invalid accelerator format: ${cleanAccelerator}. Must contain modifier keys like 'CommandOrControl+E'`,
76
+ );
77
+ return { errorType: 'INVALID_FORMAT', success: false };
78
+ }
79
+
80
+ // 4. 检查是否有基本的修饰键
81
+ const hasModifier = ['CommandOrControl', 'Command', 'Ctrl', 'Alt', 'Shift'].some((modifier) =>
82
+ cleanAccelerator.includes(modifier.toLowerCase()),
83
+ );
84
+
85
+ if (!hasModifier) {
86
+ logger.error(`Invalid accelerator format: ${cleanAccelerator}. Must contain modifier keys`);
87
+ return { errorType: 'NO_MODIFIER', success: false };
88
+ }
89
+
90
+ // 5. 检查冲突
91
+ for (const [existingId, existingAccelerator] of Object.entries(this.shortcutsConfig)) {
92
+ if (
93
+ existingId !== id &&
94
+ typeof existingAccelerator === 'string' &&
95
+ existingAccelerator.toLowerCase() === cleanAccelerator
96
+ ) {
97
+ logger.error(`Shortcut conflict: ${cleanAccelerator} already used by ${existingId}`);
98
+ return { errorType: 'CONFLICT', success: false };
99
+ }
100
+ }
101
+
102
+ // 6. 尝试注册测试(检查是否被系统占用)
103
+ const testSuccess = globalShortcut.register(cleanAccelerator, () => {});
104
+ if (!testSuccess) {
105
+ logger.error(`Shortcut ${cleanAccelerator} is already registered by system or other app`);
106
+ return { errorType: 'SYSTEM_OCCUPIED', success: false };
107
+ } else {
108
+ // 测试成功,立即取消注册
109
+ globalShortcut.unregister(cleanAccelerator);
110
+ }
111
+
112
+ // 7. 更新配置
113
+ this.shortcutsConfig[id] = cleanAccelerator;
48
114
 
49
115
  this.saveShortcutsConfig();
50
116
  this.registerConfiguredShortcuts();
51
- return true;
117
+ return { success: true };
52
118
  } catch (error) {
53
119
  logger.error(`Error updating shortcut ${id}:`, error);
54
- return false;
120
+ return { errorType: 'UNKNOWN', success: false };
55
121
  }
56
122
  }
57
123
 
@@ -2,10 +2,11 @@
2
2
  * 快捷键操作类型枚举
3
3
  */
4
4
  export const ShortcutActionEnum = {
5
+ openSettings: 'openSettings',
5
6
  /**
6
7
  * 显示/隐藏主窗口
7
8
  */
8
- showMainWindow: 'showMainWindow',
9
+ showApp: 'showApp',
9
10
  } as const;
10
11
 
11
12
  export type ShortcutActionType = (typeof ShortcutActionEnum)[keyof typeof ShortcutActionEnum];
@@ -14,5 +15,6 @@ export type ShortcutActionType = (typeof ShortcutActionEnum)[keyof typeof Shortc
14
15
  * 默认快捷键配置
15
16
  */
16
17
  export const DEFAULT_SHORTCUTS_CONFIG: Record<ShortcutActionType, string> = {
17
- [ShortcutActionEnum.showMainWindow]: 'Control+E',
18
+ [ShortcutActionEnum.showApp]: 'Control+E',
19
+ [ShortcutActionEnum.openSettings]: 'CommandOrControl+,',
18
20
  };
package/changelog/v1.json CHANGED
@@ -1,4 +1,13 @@
1
1
  [
2
+ {
3
+ "children": {
4
+ "features": [
5
+ "Support custom hotkey on desktop."
6
+ ]
7
+ },
8
+ "date": "2025-07-24",
9
+ "version": "1.104.0"
10
+ },
2
11
  {
3
12
  "children": {
4
13
  "fixes": [
@@ -7,6 +7,16 @@
7
7
  "desc": "مسح الرسائل والملفات المرفوعة في المحادثة الحالية",
8
8
  "title": "مسح رسائل المحادثة"
9
9
  },
10
+ "desktop": {
11
+ "openSettings": {
12
+ "desc": "افتح صفحة إعدادات التطبيق",
13
+ "title": "إعدادات التطبيق"
14
+ },
15
+ "showApp": {
16
+ "desc": "مفتاح اختصار عام لإظهار أو إخفاء النافذة الرئيسية",
17
+ "title": "إظهار/إخفاء النافذة الرئيسية"
18
+ }
19
+ },
10
20
  "editMessage": {
11
21
  "desc": "الدخول إلى وضع التحرير عن طريق الضغط على مفتاح Alt والنقر المزدوج على الرسالة",
12
22
  "title": "تحرير الرسالة"
@@ -19,10 +29,6 @@
19
29
  "desc": "عرض جميع تعليمات استخدام الاختصارات",
20
30
  "title": "فتح مساعدة الاختصارات"
21
31
  },
22
- "openSettings": {
23
- "desc": "فتح صفحة إعدادات التطبيق",
24
- "title": "إعدادات التطبيق"
25
- },
26
32
  "regenerateMessage": {
27
33
  "desc": "إعادة توليد آخر رسالة",
28
34
  "title": "إعادة توليد الرسالة"
@@ -45,14 +45,25 @@
45
45
  },
46
46
  "hotkey": {
47
47
  "conflicts": "يتعارض مع اختصارات لوحة المفاتيح الحالية",
48
+ "errors": {
49
+ "CONFLICT": "تعارض في اختصار لوحة المفاتيح: هذا الاختصار مستخدم بالفعل من قبل وظيفة أخرى",
50
+ "INVALID_FORMAT": "تنسيق اختصار لوحة المفاتيح غير صالح: يرجى استخدام التنسيق الصحيح (مثل CommandOrControl+E)",
51
+ "INVALID_ID": "معرف اختصار لوحة المفاتيح غير صالح",
52
+ "NO_MODIFIER": "يجب أن يحتوي اختصار لوحة المفاتيح على مفتاح تعديل (Ctrl، Alt، Shift، إلخ)",
53
+ "SYSTEM_OCCUPIED": "اختصار لوحة المفاتيح مستخدم من قبل النظام أو تطبيقات أخرى",
54
+ "UNKNOWN": "فشل التحديث: خطأ غير معروف"
55
+ },
48
56
  "group": {
49
57
  "conversation": "المحادثة",
58
+ "desktop": "سطح المكتب",
50
59
  "essential": "أساسي"
51
60
  },
52
61
  "invalidCombination": "يجب أن تحتوي اختصارات لوحة المفاتيح على مفتاح تعديل واحد على الأقل (Ctrl، Alt، Shift) ومفتاح عادي واحد",
53
62
  "record": "اضغط على المفتاح لتسجيل اختصار لوحة المفاتيح",
54
63
  "reset": "إعادة تعيين إلى اختصارات لوحة المفاتيح الافتراضية",
55
- "title": "اختصارات لوحة المفاتيح"
64
+ "title": "اختصارات لوحة المفاتيح",
65
+ "updateError": "فشل تحديث اختصار لوحة المفاتيح: خطأ في الشبكة أو النظام",
66
+ "updateSuccess": "تم تحديث اختصار لوحة المفاتيح بنجاح"
56
67
  },
57
68
  "llm": {
58
69
  "aesGcm": "سيتم استخدام خوارزمية التشفير <1>AES-GCM</1> لتشفير مفتاحك وعنوان الوكيل",
@@ -7,6 +7,16 @@
7
7
  "desc": "Изтриване на текущите съобщения и качените файлове в сесията",
8
8
  "title": "Изтриване на съобщенията в сесията"
9
9
  },
10
+ "desktop": {
11
+ "openSettings": {
12
+ "desc": "Отворете страницата с настройки на приложението",
13
+ "title": "Настройки на приложението"
14
+ },
15
+ "showApp": {
16
+ "desc": "Глобална клавишна комбинация за показване или скриване на главния прозорец",
17
+ "title": "Показване/скриване на главния прозорец"
18
+ }
19
+ },
10
20
  "editMessage": {
11
21
  "desc": "Влезте в режим на редактиране, като задържите Alt и два пъти кликнете върху съобщението",
12
22
  "title": "Редактиране на съобщение"
@@ -19,10 +29,6 @@
19
29
  "desc": "Прегледайте инструкциите за използване на всички клавишни комбинации",
20
30
  "title": "Отворете помощта за клавишни комбинации"
21
31
  },
22
- "openSettings": {
23
- "desc": "Отворете страницата с настройки на приложението",
24
- "title": "Настройки на приложението"
25
- },
26
32
  "regenerateMessage": {
27
33
  "desc": "Прегенерирайте последното съобщение",
28
34
  "title": "Прегенериране на съобщение"
@@ -45,14 +45,25 @@
45
45
  },
46
46
  "hotkey": {
47
47
  "conflicts": "Конфликт с текущите клавишни комбинации",
48
+ "errors": {
49
+ "CONFLICT": "Конфликт на клавишната комбинация: тази комбинация вече е заета от друга функция",
50
+ "INVALID_FORMAT": "Невалиден формат на клавишната комбинация: моля, използвайте правилния формат (например CommandOrControl+E)",
51
+ "INVALID_ID": "Невалиден идентификатор на клавишната комбинация",
52
+ "NO_MODIFIER": "Клавишната комбинация трябва да съдържа модификатор (Ctrl, Alt, Shift и др.)",
53
+ "SYSTEM_OCCUPIED": "Клавишната комбинация е заета от системата или друго приложение",
54
+ "UNKNOWN": "Актуализацията не бе успешна: неизвестна грешка"
55
+ },
48
56
  "group": {
49
57
  "conversation": "Разговор",
58
+ "desktop": "Настолен",
50
59
  "essential": "Основен"
51
60
  },
52
61
  "invalidCombination": "Клавишната комбинация трябва да съдържа поне един модификатор (Ctrl, Alt, Shift) и един обикновен клавиш",
53
62
  "record": "Натиснете клавиш, за да запишете клавишна комбинация",
54
63
  "reset": "Нулиране до подразбиращите се клавишни комбинации",
55
- "title": "Бързи клавиши"
64
+ "title": "Бързи клавиши",
65
+ "updateError": "Актуализацията на клавишната комбинация не бе успешна: мрежова или системна грешка",
66
+ "updateSuccess": "Актуализацията на клавишната комбинация бе успешна"
56
67
  },
57
68
  "llm": {
58
69
  "aesGcm": "Вашият ключ и адрес на агента ще бъдат криптирани с алгоритъма за криптиране <1>AES-GCM</1>",
@@ -7,6 +7,16 @@
7
7
  "desc": "Aktuelle Nachrichten und hochgeladene Dateien im Gespräch löschen",
8
8
  "title": "Gesprächsnachrichten löschen"
9
9
  },
10
+ "desktop": {
11
+ "openSettings": {
12
+ "desc": "Öffnet die Anwendungseinstellungsseite",
13
+ "title": "Anwendungseinstellungen"
14
+ },
15
+ "showApp": {
16
+ "desc": "Globale Tastenkombination zum Anzeigen oder Verbergen des Hauptfensters",
17
+ "title": "Hauptfenster anzeigen/verbergen"
18
+ }
19
+ },
10
20
  "editMessage": {
11
21
  "desc": "Treten Sie in den Bearbeitungsmodus, indem Sie die Alt-Taste gedrückt halten und auf die Nachricht doppelklicken",
12
22
  "title": "Nachricht bearbeiten"
@@ -19,10 +29,6 @@
19
29
  "desc": "Anleitung zur Verwendung aller Tastenkombinationen anzeigen",
20
30
  "title": "Tastenkombinationshilfe öffnen"
21
31
  },
22
- "openSettings": {
23
- "desc": "Öffnen Sie die Anwendungseinstellungen",
24
- "title": "Anwendungseinstellungen"
25
- },
26
32
  "regenerateMessage": {
27
33
  "desc": "Die letzte Nachricht neu generieren",
28
34
  "title": "Nachricht neu generieren"
@@ -45,14 +45,25 @@
45
45
  },
46
46
  "hotkey": {
47
47
  "conflicts": "Konflikte mit bestehenden Tastenkombinationen",
48
+ "errors": {
49
+ "CONFLICT": "Tastenkonflikt: Diese Tastenkombination wird bereits von einer anderen Funktion verwendet",
50
+ "INVALID_FORMAT": "Ungültiges Tastenkürzel-Format: Bitte verwenden Sie das korrekte Format (z. B. CommandOrControl+E)",
51
+ "INVALID_ID": "Ungültige Tastenkürzel-ID",
52
+ "NO_MODIFIER": "Das Tastenkürzel muss einen Modifikatortaste enthalten (Strg, Alt, Shift usw.)",
53
+ "SYSTEM_OCCUPIED": "Das Tastenkürzel wird vom System oder einer anderen Anwendung verwendet",
54
+ "UNKNOWN": "Aktualisierung fehlgeschlagen: Unbekannter Fehler"
55
+ },
48
56
  "group": {
49
57
  "conversation": "Gespräch",
58
+ "desktop": "Desktop",
50
59
  "essential": "Grundlegend"
51
60
  },
52
61
  "invalidCombination": "Die Tastenkombination muss mindestens einen Modifikatortaste (Strg, Alt, Umschalt) und eine normale Taste enthalten",
53
62
  "record": "Drücken Sie eine Taste, um die Tastenkombination aufzuzeichnen",
54
63
  "reset": "Auf die Standard-Tastenkombination zurücksetzen",
55
- "title": "Tastenkombinationen"
64
+ "title": "Tastenkombinationen",
65
+ "updateError": "Tastenkürzel-Aktualisierung fehlgeschlagen: Netzwerk- oder Systemfehler",
66
+ "updateSuccess": "Tastenkürzel erfolgreich aktualisiert"
56
67
  },
57
68
  "llm": {
58
69
  "aesGcm": "Ihr Schlüssel und Ihre Proxy-Adresse werden mit dem <1>AES-GCM</1> Verschlüsselungsalgorithmus verschlüsselt.",
@@ -7,6 +7,16 @@
7
7
  "desc": "Clear the messages and uploaded files from the current conversation",
8
8
  "title": "Clear Conversation Messages"
9
9
  },
10
+ "desktop": {
11
+ "openSettings": {
12
+ "desc": "Open the application settings page",
13
+ "title": "Application Settings"
14
+ },
15
+ "showApp": {
16
+ "desc": "Toggle the main window visibility with a global shortcut",
17
+ "title": "Show/Hide Main Window"
18
+ }
19
+ },
10
20
  "editMessage": {
11
21
  "desc": "Enter edit mode by holding Alt and double-clicking the message",
12
22
  "title": "Edit Message"
@@ -19,10 +29,6 @@
19
29
  "desc": "View instructions for all keyboard shortcuts",
20
30
  "title": "Open Hotkey Help"
21
31
  },
22
- "openSettings": {
23
- "desc": "Open the application settings page",
24
- "title": "Application Settings"
25
- },
26
32
  "regenerateMessage": {
27
33
  "desc": "Regenerate the last message",
28
34
  "title": "Regenerate Message"
@@ -45,14 +45,25 @@
45
45
  },
46
46
  "hotkey": {
47
47
  "conflicts": "Conflicts with existing hotkeys",
48
+ "errors": {
49
+ "CONFLICT": "Hotkey conflict: This hotkey is already assigned to another function",
50
+ "INVALID_FORMAT": "Invalid hotkey format: Please use the correct format (e.g., CommandOrControl+E)",
51
+ "INVALID_ID": "Invalid hotkey ID",
52
+ "NO_MODIFIER": "Hotkey must include a modifier key (Ctrl, Alt, Shift, etc.)",
53
+ "SYSTEM_OCCUPIED": "Hotkey is occupied by the system or another application",
54
+ "UNKNOWN": "Update failed: Unknown error"
55
+ },
48
56
  "group": {
49
57
  "conversation": "Conversation",
58
+ "desktop": "Desktop",
50
59
  "essential": "Essential"
51
60
  },
52
61
  "invalidCombination": "The hotkey must include at least one modifier key (Ctrl, Alt, Shift) and one regular key",
53
62
  "record": "Press a key to record the hotkey",
54
63
  "reset": "Reset to default hotkeys",
55
- "title": "Hotkeys"
64
+ "title": "Hotkeys",
65
+ "updateError": "Failed to update hotkey: Network or system error",
66
+ "updateSuccess": "Hotkey updated successfully"
56
67
  },
57
68
  "llm": {
58
69
  "aesGcm": "Your keys and proxy address will be encrypted using the <1>AES-GCM</1> encryption algorithm",
@@ -7,6 +7,16 @@
7
7
  "desc": "Eliminar los mensajes y archivos subidos de la conversación actual",
8
8
  "title": "Eliminar mensajes de la conversación"
9
9
  },
10
+ "desktop": {
11
+ "openSettings": {
12
+ "desc": "Abrir la página de configuración de la aplicación",
13
+ "title": "Configuración de la aplicación"
14
+ },
15
+ "showApp": {
16
+ "desc": "Mostrar u ocultar la ventana principal mediante un atajo global",
17
+ "title": "Mostrar/Ocultar ventana principal"
18
+ }
19
+ },
10
20
  "editMessage": {
11
21
  "desc": "Entrar en modo de edición manteniendo presionada la tecla Alt y haciendo doble clic en el mensaje",
12
22
  "title": "Editar mensaje"
@@ -19,10 +29,6 @@
19
29
  "desc": "Ver las instrucciones de uso de todos los atajos de teclado",
20
30
  "title": "Abrir ayuda de atajos de teclado"
21
31
  },
22
- "openSettings": {
23
- "desc": "Abrir la página de configuración de la aplicación",
24
- "title": "Configuración de la aplicación"
25
- },
26
32
  "regenerateMessage": {
27
33
  "desc": "Regenerar el último mensaje",
28
34
  "title": "Regenerar mensaje"
@@ -45,14 +45,25 @@
45
45
  },
46
46
  "hotkey": {
47
47
  "conflicts": "Conflicto con las teclas de acceso rápido existentes",
48
+ "errors": {
49
+ "CONFLICT": "Conflicto de atajo: este atajo ya está asignado a otra función",
50
+ "INVALID_FORMAT": "Formato de atajo inválido: por favor use el formato correcto (por ejemplo, CommandOrControl+E)",
51
+ "INVALID_ID": "ID de atajo inválido",
52
+ "NO_MODIFIER": "El atajo debe incluir una tecla modificadora (Ctrl, Alt, Shift, etc.)",
53
+ "SYSTEM_OCCUPIED": "El atajo está ocupado por el sistema u otra aplicación",
54
+ "UNKNOWN": "Error al actualizar: error desconocido"
55
+ },
48
56
  "group": {
49
57
  "conversation": "Conversación",
58
+ "desktop": "Escritorio",
50
59
  "essential": "Esencial"
51
60
  },
52
61
  "invalidCombination": "La combinación de teclas de acceso rápido debe incluir al menos una tecla modificadora (Ctrl, Alt, Shift) y una tecla normal",
53
62
  "record": "Presiona una tecla para grabar la tecla de acceso rápido",
54
63
  "reset": "Restablecer a las teclas de acceso rápido predeterminadas",
55
- "title": "Atajos de teclado"
64
+ "title": "Atajos de teclado",
65
+ "updateError": "Error al actualizar el atajo: problema de red o del sistema",
66
+ "updateSuccess": "Atajo actualizado con éxito"
56
67
  },
57
68
  "llm": {
58
69
  "aesGcm": "Su clave y dirección del agente se cifrarán utilizando el algoritmo de cifrado <1>AES-GCM</1>",
@@ -7,6 +7,16 @@
7
7
  "desc": "حذف پیام‌ها و فایل‌های بارگذاری شده در جلسه جاری",
8
8
  "title": "حذف پیام‌های جلسه"
9
9
  },
10
+ "desktop": {
11
+ "openSettings": {
12
+ "desc": "باز کردن صفحه تنظیمات برنامه",
13
+ "title": "تنظیمات برنامه"
14
+ },
15
+ "showApp": {
16
+ "desc": "نمایش یا پنهان کردن پنجره اصلی با کلید میانبر جهانی",
17
+ "title": "نمایش/پنهان کردن پنجره اصلی"
18
+ }
19
+ },
10
20
  "editMessage": {
11
21
  "desc": "با نگه داشتن کلید Alt و دوبار کلیک بر روی پیام وارد حالت ویرایش شوید",
12
22
  "title": "ویرایش پیام"
@@ -19,10 +29,6 @@
19
29
  "desc": "مشاهده تمام توضیحات استفاده از کلیدهای میانبر",
20
30
  "title": "باز کردن راهنمای کلیدهای میانبر"
21
31
  },
22
- "openSettings": {
23
- "desc": "صفحه تنظیمات برنامه را باز کنید",
24
- "title": "تنظیمات برنامه"
25
- },
26
32
  "regenerateMessage": {
27
33
  "desc": "آخرین پیام را دوباره تولید کنید",
28
34
  "title": "تولید مجدد پیام"
@@ -45,14 +45,25 @@
45
45
  },
46
46
  "hotkey": {
47
47
  "conflicts": "تداخل با کلیدهای میانبر موجود",
48
+ "errors": {
49
+ "CONFLICT": "تداخل کلید میانبر: این کلید میانبر قبلاً توسط عملکرد دیگری استفاده شده است",
50
+ "INVALID_FORMAT": "فرمت کلید میانبر نامعتبر است: لطفاً از فرمت صحیح استفاده کنید (مانند CommandOrControl+E)",
51
+ "INVALID_ID": "شناسه کلید میانبر نامعتبر است",
52
+ "NO_MODIFIER": "کلید میانبر باید شامل کلیدهای تغییر دهنده (Ctrl، Alt، Shift و غیره) باشد",
53
+ "SYSTEM_OCCUPIED": "کلید میانبر توسط سیستم یا برنامه‌های دیگر اشغال شده است",
54
+ "UNKNOWN": "به‌روزرسانی ناموفق بود: خطای ناشناخته"
55
+ },
48
56
  "group": {
49
57
  "conversation": "گفتگو",
58
+ "desktop": "نسخه دسکتاپ",
50
59
  "essential": "اساسی"
51
60
  },
52
61
  "invalidCombination": "کلیدهای میانبر باید حداقل شامل یک کلید اصلاحی (Ctrl, Alt, Shift) و یک کلید معمولی باشند",
53
62
  "record": "برای ضبط کلید میانبر، کلید را فشار دهید",
54
63
  "reset": "بازنشانی به کلیدهای میانبر پیش‌فرض",
55
- "title": "کلیدهای میانبر"
64
+ "title": "کلیدهای میانبر",
65
+ "updateError": "به‌روزرسانی کلید میانبر ناموفق بود: خطای شبکه یا سیستم",
66
+ "updateSuccess": "کلید میانبر با موفقیت به‌روزرسانی شد"
56
67
  },
57
68
  "llm": {
58
69
  "aesGcm": "کلید و آدرس پروکسی شما با استفاده از الگوریتم رمزنگاری <1>AES-GCM</1> رمزگذاری خواهد شد",
@@ -7,6 +7,16 @@
7
7
  "desc": "Effacer les messages de la session actuelle et les fichiers téléchargés",
8
8
  "title": "Effacer les messages de la session"
9
9
  },
10
+ "desktop": {
11
+ "openSettings": {
12
+ "desc": "Ouvrir la page des paramètres de l'application",
13
+ "title": "Paramètres de l'application"
14
+ },
15
+ "showApp": {
16
+ "desc": "Afficher ou masquer la fenêtre principale via un raccourci global",
17
+ "title": "Afficher/Masquer la fenêtre principale"
18
+ }
19
+ },
10
20
  "editMessage": {
11
21
  "desc": "Entrez en mode édition en maintenant la touche Alt enfoncée et en double-cliquant sur le message",
12
22
  "title": "Éditer le message"
@@ -19,10 +29,6 @@
19
29
  "desc": "Voir les instructions d'utilisation de tous les raccourcis",
20
30
  "title": "Ouvrir l'aide des raccourcis"
21
31
  },
22
- "openSettings": {
23
- "desc": "Ouvrir la page des paramètres de l'application",
24
- "title": "Paramètres de l'application"
25
- },
26
32
  "regenerateMessage": {
27
33
  "desc": "Régénérer le dernier message",
28
34
  "title": "Régénérer le message"