@lobehub/chat 1.103.2 → 1.104.1

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 (83) hide show
  1. package/.cursor/rules/code-review.mdc +2 -0
  2. package/.cursor/rules/typescript.mdc +3 -1
  3. package/CHANGELOG.md +50 -0
  4. package/apps/desktop/src/main/controllers/BrowserWindowsCtr.ts +1 -1
  5. package/apps/desktop/src/main/controllers/ShortcutCtr.ts +9 -1
  6. package/apps/desktop/src/main/controllers/TrayMenuCtr.ts +1 -5
  7. package/apps/desktop/src/main/controllers/__tests__/ShortcutCtr.test.ts +14 -11
  8. package/apps/desktop/src/main/core/ui/ShortcutManager.ts +71 -5
  9. package/apps/desktop/src/main/shortcuts/config.ts +4 -2
  10. package/changelog/v1.json +18 -0
  11. package/locales/ar/hotkey.json +10 -4
  12. package/locales/ar/setting.json +12 -1
  13. package/locales/bg-BG/hotkey.json +10 -4
  14. package/locales/bg-BG/setting.json +12 -1
  15. package/locales/de-DE/hotkey.json +10 -4
  16. package/locales/de-DE/setting.json +12 -1
  17. package/locales/en-US/hotkey.json +10 -4
  18. package/locales/en-US/setting.json +12 -1
  19. package/locales/es-ES/hotkey.json +10 -4
  20. package/locales/es-ES/setting.json +12 -1
  21. package/locales/fa-IR/hotkey.json +10 -4
  22. package/locales/fa-IR/setting.json +12 -1
  23. package/locales/fr-FR/hotkey.json +10 -4
  24. package/locales/fr-FR/setting.json +12 -1
  25. package/locales/it-IT/hotkey.json +10 -4
  26. package/locales/it-IT/setting.json +12 -1
  27. package/locales/ja-JP/hotkey.json +10 -4
  28. package/locales/ja-JP/setting.json +12 -1
  29. package/locales/ko-KR/hotkey.json +10 -4
  30. package/locales/ko-KR/setting.json +12 -1
  31. package/locales/nl-NL/hotkey.json +10 -4
  32. package/locales/nl-NL/setting.json +12 -1
  33. package/locales/pl-PL/hotkey.json +10 -4
  34. package/locales/pl-PL/setting.json +12 -1
  35. package/locales/pt-BR/hotkey.json +10 -4
  36. package/locales/pt-BR/setting.json +12 -1
  37. package/locales/ru-RU/hotkey.json +10 -4
  38. package/locales/ru-RU/setting.json +12 -1
  39. package/locales/tr-TR/hotkey.json +10 -4
  40. package/locales/tr-TR/setting.json +12 -1
  41. package/locales/vi-VN/hotkey.json +10 -4
  42. package/locales/vi-VN/setting.json +12 -1
  43. package/locales/zh-CN/hotkey.json +10 -4
  44. package/locales/zh-CN/setting.json +12 -1
  45. package/locales/zh-TW/hotkey.json +10 -4
  46. package/locales/zh-TW/setting.json +12 -1
  47. package/package.json +1 -1
  48. package/packages/electron-client-ipc/src/events/shortcut.ts +3 -1
  49. package/packages/electron-client-ipc/src/types/shortcut.ts +11 -0
  50. package/src/app/[variants]/(main)/image/features/GenerationFeed/BatchItem.tsx +6 -1
  51. package/src/app/[variants]/(main)/image/features/GenerationFeed/GenerationItem/ErrorState.tsx +3 -2
  52. package/src/app/[variants]/(main)/image/features/GenerationFeed/GenerationItem/LoadingState.tsx +27 -24
  53. package/src/app/[variants]/(main)/image/features/GenerationFeed/GenerationItem/SuccessState.tsx +14 -3
  54. package/src/app/[variants]/(main)/image/features/GenerationFeed/GenerationItem/index.tsx +4 -7
  55. package/src/app/[variants]/(main)/image/features/GenerationFeed/GenerationItem/types.ts +3 -0
  56. package/src/app/[variants]/(main)/image/features/GenerationFeed/GenerationItem/utils.test.ts +600 -0
  57. package/src/app/[variants]/(main)/image/features/GenerationFeed/GenerationItem/utils.ts +126 -7
  58. package/src/app/[variants]/(main)/settings/hotkey/features/Conversation.tsx +3 -11
  59. package/src/app/[variants]/(main)/settings/hotkey/features/Desktop.tsx +92 -0
  60. package/src/app/[variants]/(main)/settings/hotkey/features/Essential.tsx +3 -11
  61. package/src/app/[variants]/(main)/settings/hotkey/page.tsx +3 -0
  62. package/src/const/desktop.ts +9 -0
  63. package/src/const/hotkeys.ts +20 -16
  64. package/src/const/imageGeneration.ts +18 -0
  65. package/src/features/User/UserPanel/useMenu.tsx +2 -2
  66. package/src/libs/model-runtime/utils/openaiCompatibleFactory/index.test.ts +3 -0
  67. package/src/libs/model-runtime/utils/openaiCompatibleFactory/index.ts +7 -5
  68. package/src/libs/model-runtime/utils/streams/openai/openai.ts +8 -4
  69. package/src/libs/model-runtime/utils/usageConverter.test.ts +45 -1
  70. package/src/libs/model-runtime/utils/usageConverter.ts +6 -2
  71. package/src/locales/default/hotkey.ts +13 -5
  72. package/src/locales/default/setting.ts +11 -0
  73. package/src/server/services/generation/index.test.ts +848 -0
  74. package/src/server/services/generation/index.ts +90 -69
  75. package/src/services/electron/settings.ts +19 -1
  76. package/src/store/electron/actions/settings.ts +42 -1
  77. package/src/store/electron/initialState.ts +9 -1
  78. package/src/store/electron/selectors/__tests__/desktopState.test.ts +6 -17
  79. package/src/store/electron/selectors/hotkey.ts +11 -0
  80. package/src/store/electron/selectors/index.ts +1 -0
  81. package/src/types/hotkey.ts +18 -4
  82. package/src/utils/number.test.ts +101 -1
  83. package/src/utils/number.ts +42 -0
@@ -26,6 +26,8 @@ Gather the modified code and context. Please strictly follow the process below:
26
26
 
27
27
  ### Code Style
28
28
 
29
+ read [typescript.mdc](mdc:.cursor/rules/typescript.mdc) to learn the project's code style.
30
+
29
31
  - Ensure JSDoc comments accurately reflect the implementation; update them when needed.
30
32
  - Look for opportunities to simplify or modernize code with the latest JavaScript/TypeScript features.
31
33
  - Prefer `async`/`await` over callbacks or chained `.then` promises.
@@ -16,4 +16,6 @@ TypeScript Code Style Guide:
16
16
  - Always refactor repeated logic into a reusable function
17
17
  - Don't remove meaningful code comments, be sure to keep original comments when providing applied code
18
18
  - Update the code comments when needed after you modify the related code
19
- - Please respect my prettier preferences when you provide code
19
+ - Please respect my prettier preferences when you provide code
20
+ - Prefer object destructuring when accessing and using properties
21
+ - Prefer async version api than sync version, eg: use readFile from 'fs/promises' instead of 'fs'
package/CHANGELOG.md CHANGED
@@ -2,6 +2,56 @@
2
2
 
3
3
  # Changelog
4
4
 
5
+ ### [Version 1.104.1](https://github.com/lobehub/lobe-chat/compare/v1.104.0...v1.104.1)
6
+
7
+ <sup>Released on **2025-07-25**</sup>
8
+
9
+ #### 🐛 Bug Fixes
10
+
11
+ - **misc**: Update convertUsage to handle XAI provider and adjust OpenAIStream to pass provider.
12
+
13
+ <br/>
14
+
15
+ <details>
16
+ <summary><kbd>Improvements and Fixes</kbd></summary>
17
+
18
+ #### What's fixed
19
+
20
+ - **misc**: Update convertUsage to handle XAI provider and adjust OpenAIStream to pass provider, closes [#8557](https://github.com/lobehub/lobe-chat/issues/8557) ([d1e4a54](https://github.com/lobehub/lobe-chat/commit/d1e4a54))
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
+
30
+ ## [Version 1.104.0](https://github.com/lobehub/lobe-chat/compare/v1.103.2...v1.104.0)
31
+
32
+ <sup>Released on **2025-07-24**</sup>
33
+
34
+ #### ✨ Features
35
+
36
+ - **misc**: Support custom hotkey on desktop.
37
+
38
+ <br/>
39
+
40
+ <details>
41
+ <summary><kbd>Improvements and Fixes</kbd></summary>
42
+
43
+ #### What's improved
44
+
45
+ - **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))
46
+
47
+ </details>
48
+
49
+ <div align="right">
50
+
51
+ [![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
52
+
53
+ </div>
54
+
5
55
  ### [Version 1.103.2](https://github.com/lobehub/lobe-chat/compare/v1.103.1...v1.103.2)
6
56
 
7
57
  <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,22 @@
1
1
  [
2
+ {
3
+ "children": {
4
+ "fixes": [
5
+ "Update convertUsage to handle XAI provider and adjust OpenAIStream to pass provider."
6
+ ]
7
+ },
8
+ "date": "2025-07-25",
9
+ "version": "1.104.1"
10
+ },
11
+ {
12
+ "children": {
13
+ "features": [
14
+ "Support custom hotkey on desktop."
15
+ ]
16
+ },
17
+ "date": "2025-07-24",
18
+ "version": "1.104.0"
19
+ },
2
20
  {
3
21
  "children": {
4
22
  "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": "تولید مجدد پیام"