mirror of
https://github.com/CherryHQ/cherry-studio.git
synced 2025-12-26 20:12:38 +08:00
refactor(i18n, settings): update localization and UI elements for improved consistency
- Removed redundant settings entries in multiple language files. - Updated various settings titles for clarity, including "Code Settings" to "Code Block Settings". - Added new localization keys for assistant and topic settings. - Enhanced the layout of the ChatNavbar and MainSidebar components for better user experience. - Adjusted the MessageMenubar to reflect updated settings terminology.
This commit is contained in:
parent
5794c36d0d
commit
e786feb165
@ -95,7 +95,7 @@ const PageContainer = styled(motion.div)`
|
||||
|
||||
const pageTransition = {
|
||||
type: 'tween',
|
||||
duration: 0.2,
|
||||
duration: 0.25,
|
||||
ease: [0.4, 0.0, 0.2, 1]
|
||||
}
|
||||
|
||||
|
||||
@ -201,7 +201,6 @@
|
||||
"message.quote": "Quote",
|
||||
"message.regenerate.model": "Switch Model",
|
||||
"message.useful": "Helpful",
|
||||
"message.settings": "Settings",
|
||||
"multiple.select": "Multiple Select",
|
||||
"multiple.select.empty": "No Messages Selected",
|
||||
"navigation": {
|
||||
@ -216,7 +215,7 @@
|
||||
},
|
||||
"resend": "Resend",
|
||||
"save": "Save",
|
||||
"settings.code.title": "Code Settings",
|
||||
"settings.code.title": "Code Block Settings",
|
||||
"settings.code_editor": {
|
||||
"title": "Code Editor",
|
||||
"highlight_active_line": "Highlight active line",
|
||||
@ -424,7 +423,8 @@
|
||||
"pinyin.desc": "Sort by Pinyin (Z-A)"
|
||||
},
|
||||
"no_results": "No results",
|
||||
"apps": "Apps"
|
||||
"apps": "Apps",
|
||||
"settings": "Settings"
|
||||
},
|
||||
"docs": {
|
||||
"title": "Docs"
|
||||
@ -1062,6 +1062,7 @@
|
||||
"about.updateNotAvailable": "You are using the latest version",
|
||||
"about.website.button": "Website",
|
||||
"about.website.title": "Official Website",
|
||||
"advanced.auto_switch_to_topics": "Auto switch to topic",
|
||||
"advanced.title": "Advanced Settings",
|
||||
"assistant": "Default Assistant",
|
||||
"assistant.model_params": "Model Parameters",
|
||||
@ -1275,6 +1276,7 @@
|
||||
"message_title.use_topic_naming.title": "Use topic naming model to create titles for exported messages",
|
||||
"message_title.use_topic_naming.help": "When enabled, use topic naming model to create titles for exported messages. This will also affect all Markdown export methods."
|
||||
},
|
||||
"display.assistant.title": "Assistant Settings",
|
||||
"display.custom.css": "Custom CSS",
|
||||
"display.custom.css.cherrycss": "Get from cherrycss.com",
|
||||
"display.custom.css.placeholder": "/* Put custom CSS here */",
|
||||
@ -1517,7 +1519,9 @@
|
||||
"advancedSettings": "Advanced Settings"
|
||||
},
|
||||
"messages.prompt": "Show prompt",
|
||||
"messages.tokens": "Show token usage",
|
||||
"messages.divider": "Show divider between messages",
|
||||
"messages.divider.tooltip": "Not applicable to bubble-style message",
|
||||
"messages.grid_columns": "Message grid display columns",
|
||||
"messages.grid_popover_trigger": "Grid detail trigger",
|
||||
"messages.grid_popover_trigger.click": "Click to display",
|
||||
@ -1730,6 +1734,9 @@
|
||||
"theme.window.style.title": "Window Style",
|
||||
"theme.window.style.transparent": "Transparent Window",
|
||||
"title": "Settings",
|
||||
"topic.position": "Topic position",
|
||||
"topic.position.left": "Left",
|
||||
"topic.position.right": "Right",
|
||||
"topic.show.time": "Show topic time",
|
||||
"topic.pin_to_top": "Pin Topics to Top",
|
||||
"tray.onclose": "Minimize to Tray on Close",
|
||||
|
||||
@ -201,7 +201,6 @@
|
||||
"message.quote": "引用",
|
||||
"message.regenerate.model": "モデルを切り替え",
|
||||
"message.useful": "役立つ",
|
||||
"message.settings": "設定",
|
||||
"multiple.select": "選択",
|
||||
"multiple.select.empty": "メッセージが選択されていません",
|
||||
"navigation": {
|
||||
@ -424,7 +423,8 @@
|
||||
"pinyin.desc": "ピンインで降順ソート"
|
||||
},
|
||||
"no_results": "検索結果なし",
|
||||
"apps": "アプリ"
|
||||
"apps": "アプリ",
|
||||
"settings": "設定"
|
||||
},
|
||||
"docs": {
|
||||
"title": "ドキュメント"
|
||||
@ -1060,6 +1060,7 @@
|
||||
"about.updateNotAvailable": "最新バージョンを使用しています",
|
||||
"about.website.button": "ウェブサイト",
|
||||
"about.website.title": "公式ウェブサイト",
|
||||
"advanced.auto_switch_to_topics": "トピックに自動的に切り替える",
|
||||
"advanced.title": "詳細設定",
|
||||
"assistant": "デフォルトアシスタント",
|
||||
"assistant.model_params": "モデルパラメータ",
|
||||
@ -1273,6 +1274,7 @@
|
||||
"notion.export_reasoning.title": "エクスポート時に思考チェーンを含める",
|
||||
"notion.export_reasoning.help": "有効にすると、Notionにエクスポートする際に思考チェーンの内容が含まれます。"
|
||||
},
|
||||
"display.assistant.title": "アシスタント設定",
|
||||
"display.custom.css": "カスタムCSS",
|
||||
"display.custom.css.cherrycss": "cherrycss.comから取得",
|
||||
"display.custom.css.placeholder": "/* ここにカスタムCSSを入力 */",
|
||||
@ -1511,7 +1513,9 @@
|
||||
"advancedSettings": "詳細設定"
|
||||
},
|
||||
"messages.prompt": "プロンプト表示",
|
||||
"messages.tokens": "トークン使用量を表示",
|
||||
"messages.divider": "メッセージ間に区切り線を表示",
|
||||
"messages.divider.tooltip": "バブルスタイルのメッセージには適用されません",
|
||||
"messages.grid_columns": "メッセージグリッドの表示列数",
|
||||
"messages.grid_popover_trigger": "グリッド詳細トリガー",
|
||||
"messages.grid_popover_trigger.click": "クリックで表示",
|
||||
@ -1718,6 +1722,9 @@
|
||||
"theme.window.style.title": "ウィンドウスタイル",
|
||||
"theme.window.style.transparent": "透明ウィンドウ",
|
||||
"title": "設定",
|
||||
"topic.position": "トピックの位置",
|
||||
"topic.position.left": "左",
|
||||
"topic.position.right": "右",
|
||||
"topic.show.time": "トピックの時間を表示",
|
||||
"topic.pin_to_top": "固定トピックを上部に表示",
|
||||
"tray.onclose": "閉じるときにトレイに最小化",
|
||||
|
||||
@ -201,7 +201,6 @@
|
||||
"message.quote": "Цитата",
|
||||
"message.regenerate.model": "Переключить модель",
|
||||
"message.useful": "Полезно",
|
||||
"message.settings": "Настройки",
|
||||
"multiple.select": "Множественный выбор",
|
||||
"multiple.select.empty": "Ничего не выбрано",
|
||||
"navigation": {
|
||||
@ -424,7 +423,8 @@
|
||||
"pinyin.desc": "Сортировать по пиньинь (Я-А)"
|
||||
},
|
||||
"no_results": "Результатов не найдено",
|
||||
"apps": "Приложения"
|
||||
"apps": "Приложения",
|
||||
"settings": "Настройки"
|
||||
},
|
||||
"docs": {
|
||||
"title": "Документация"
|
||||
@ -1060,6 +1060,7 @@
|
||||
"about.updateNotAvailable": "Вы используете последнюю версию",
|
||||
"about.website.button": "Сайт",
|
||||
"about.website.title": "Официальный сайт",
|
||||
"advanced.auto_switch_to_topics": "Автоматически переключаться на топик",
|
||||
"advanced.title": "Расширенные настройки",
|
||||
"assistant": "Ассистент по умолчанию",
|
||||
"assistant.model_params": "Параметры модели",
|
||||
@ -1273,6 +1274,7 @@
|
||||
"message_title.use_topic_naming.title": "Использовать модель именования тем для создания заголовков сообщений",
|
||||
"message_title.use_topic_naming.help": "Этот параметр влияет на все методы экспорта в Markdown, такие как Notion, Yuque и т.д."
|
||||
},
|
||||
"display.assistant.title": "Настройки ассистентов",
|
||||
"display.custom.css": "Пользовательский CSS",
|
||||
"display.custom.css.cherrycss": "Получить из cherrycss.com",
|
||||
"display.custom.css.placeholder": "/* Здесь введите пользовательский CSS */",
|
||||
@ -1511,7 +1513,9 @@
|
||||
"advancedSettings": "Расширенные настройки"
|
||||
},
|
||||
"messages.prompt": "Показывать подсказки",
|
||||
"messages.tokens": "Показать использование токенов",
|
||||
"messages.divider": "Показывать разделитель между сообщениями",
|
||||
"messages.divider.tooltip": "Не применимо к сообщениям в стиле пузырей",
|
||||
"messages.grid_columns": "Количество столбцов сетки сообщений",
|
||||
"messages.grid_popover_trigger": "Триггер для отображения подробной информации в сетке",
|
||||
"messages.grid_popover_trigger.click": "Нажатие для отображения",
|
||||
@ -1718,6 +1722,9 @@
|
||||
"theme.window.style.title": "Стиль окна",
|
||||
"theme.window.style.transparent": "Прозрачное окно",
|
||||
"title": "Настройки",
|
||||
"topic.position": "Позиция топиков",
|
||||
"topic.position.left": "Слева",
|
||||
"topic.position.right": "Справа",
|
||||
"topic.show.time": "Показывать время топика",
|
||||
"topic.pin_to_top": "Закрепленные топики сверху",
|
||||
"tray.onclose": "Свернуть в трей при закрытии",
|
||||
|
||||
@ -218,7 +218,6 @@
|
||||
"message.new.context": "清除上下文",
|
||||
"message.quote": "引用",
|
||||
"message.regenerate.model": "切换模型",
|
||||
"message.settings": "设置",
|
||||
"message.useful": "有用",
|
||||
"multiple.select": "多选",
|
||||
"multiple.select.empty": "未选中任何消息",
|
||||
@ -234,7 +233,7 @@
|
||||
},
|
||||
"resend": "重新发送",
|
||||
"save": "保存",
|
||||
"settings.code.title": "代码设置",
|
||||
"settings.code.title": "代码块设置",
|
||||
"settings.code_editor": {
|
||||
"title": "代码编辑器",
|
||||
"highlight_active_line": "高亮当前行",
|
||||
@ -424,7 +423,8 @@
|
||||
"pinyin.desc": "按拼音降序"
|
||||
},
|
||||
"no_results": "无结果",
|
||||
"apps": "应用"
|
||||
"apps": "应用",
|
||||
"settings": "设置"
|
||||
},
|
||||
"docs": {
|
||||
"title": "帮助文档"
|
||||
@ -1062,6 +1062,7 @@
|
||||
"about.updateNotAvailable": "你的软件已是最新版本",
|
||||
"about.website.button": "查看",
|
||||
"about.website.title": "官方网站",
|
||||
"advanced.auto_switch_to_topics": "自动切换到话题",
|
||||
"advanced.title": "高级设置",
|
||||
"assistant": "默认助手",
|
||||
"assistant.model_params": "模型参数",
|
||||
@ -1275,6 +1276,7 @@
|
||||
"new_folder.button": "新建文件夹"
|
||||
}
|
||||
},
|
||||
"display.assistant.title": "助手设置",
|
||||
"display.custom.css": "自定义 CSS",
|
||||
"display.custom.css.cherrycss": "从 cherrycss.com 获取",
|
||||
"display.custom.css.placeholder": "/* 这里写自定义CSS */",
|
||||
@ -1517,7 +1519,9 @@
|
||||
"advancedSettings": "高级设置"
|
||||
},
|
||||
"messages.prompt": "显示提示词",
|
||||
"messages.tokens": "显示Token用量",
|
||||
"messages.divider": "消息分割线",
|
||||
"messages.divider.tooltip": "不适用于气泡样式消息",
|
||||
"messages.grid_columns": "消息网格展示列数",
|
||||
"messages.grid_popover_trigger": "网格详情触发",
|
||||
"messages.grid_popover_trigger.click": "点击显示",
|
||||
@ -1730,6 +1734,9 @@
|
||||
"theme.window.style.title": "窗口样式",
|
||||
"theme.window.style.transparent": "透明窗口",
|
||||
"title": "设置",
|
||||
"topic.position": "话题位置",
|
||||
"topic.position.left": "左侧",
|
||||
"topic.position.right": "右侧",
|
||||
"topic.show.time": "显示话题时间",
|
||||
"topic.pin_to_top": "固定话题置顶",
|
||||
"tray.onclose": "关闭时最小化到托盘",
|
||||
|
||||
@ -201,7 +201,6 @@
|
||||
"message.quote": "引用",
|
||||
"message.regenerate.model": "切換模型",
|
||||
"message.useful": "有用",
|
||||
"message.settings": "設定",
|
||||
"multiple.select": "多選",
|
||||
"multiple.select.empty": "未選中任何訊息",
|
||||
"navigation": {
|
||||
@ -216,7 +215,7 @@
|
||||
},
|
||||
"resend": "重新傳送",
|
||||
"save": "儲存",
|
||||
"settings.code.title": "程式碼設定",
|
||||
"settings.code.title": "程式碼區塊",
|
||||
"settings.code_editor": {
|
||||
"title": "程式碼編輯器",
|
||||
"highlight_active_line": "高亮當前行",
|
||||
@ -424,7 +423,8 @@
|
||||
"pinyin.desc": "按拼音降序"
|
||||
},
|
||||
"no_results": "沒有結果",
|
||||
"apps": "應用"
|
||||
"apps": "應用",
|
||||
"settings": "設定"
|
||||
},
|
||||
"docs": {
|
||||
"title": "說明文件"
|
||||
@ -1062,6 +1062,7 @@
|
||||
"about.updateNotAvailable": "您正在使用最新版本",
|
||||
"about.website.button": "網站",
|
||||
"about.website.title": "官方網站",
|
||||
"advanced.auto_switch_to_topics": "自動切換到話題",
|
||||
"advanced.title": "進階設定",
|
||||
"assistant": "預設助手",
|
||||
"assistant.model_params": "模型參數",
|
||||
@ -1275,6 +1276,7 @@
|
||||
"message_title.use_topic_naming.title": "使用話題命名模型為導出的消息創建標題",
|
||||
"message_title.use_topic_naming.help": "此設定會影響所有通過Markdown導出的方式,如Notion、語雀等"
|
||||
},
|
||||
"display.assistant.title": "助手設定",
|
||||
"display.custom.css": "自訂 CSS",
|
||||
"display.custom.css.cherrycss": "從 cherrycss.com 取得",
|
||||
"display.custom.css.placeholder": "/* 這裡寫自訂 CSS */",
|
||||
@ -1514,7 +1516,9 @@
|
||||
"advancedSettings": "高級設定"
|
||||
},
|
||||
"messages.prompt": "提示詞顯示",
|
||||
"messages.tokens": "Token用量顯示",
|
||||
"messages.divider": "訊息間顯示分隔線",
|
||||
"messages.divider.tooltip": "不適用於氣泡樣式消息",
|
||||
"messages.grid_columns": "訊息網格展示列數",
|
||||
"messages.grid_popover_trigger": "網格詳細資訊觸發",
|
||||
"messages.grid_popover_trigger.click": "點選顯示",
|
||||
@ -1721,6 +1725,9 @@
|
||||
"theme.window.style.title": "視窗樣式",
|
||||
"theme.window.style.transparent": "透明視窗",
|
||||
"title": "設定",
|
||||
"topic.position": "話題位置",
|
||||
"topic.position.left": "左側",
|
||||
"topic.position.right": "右側",
|
||||
"topic.show.time": "顯示話題時間",
|
||||
"topic.pin_to_top": "固定話題置頂",
|
||||
"tray.onclose": "關閉時最小化到系统匣",
|
||||
|
||||
@ -918,6 +918,7 @@
|
||||
"about.updateNotAvailable": "Το λογισμικό σας είναι ήδη στην πιο πρόσφατη έκδοση",
|
||||
"about.website.button": "Προβολή",
|
||||
"about.website.title": "Ιστοσελίδα",
|
||||
"advanced.auto_switch_to_topics": "Αυτόματη μετάβαση σε θέματα",
|
||||
"advanced.title": "Ρυθμίσεις Ανώτερου Νiveau",
|
||||
"assistant": "Πρόεδρος Υπηρεσίας",
|
||||
"assistant.model_params": "Παράμετροι Μοντέλου",
|
||||
@ -1124,6 +1125,7 @@
|
||||
"message_title.use_topic_naming.title": "Δημιουργία τίτλων μηνυμάτων χρησιμοποιώντας μοντέλο ονομασίας θεμάτων",
|
||||
"message_title.use_topic_naming.help": "Όταν είναι ενεργό, δημιουργεί τίτλους για τα μηνύματα που εξάγονται χρησιμοποιώντας μοντέλο ονομασίας θεμάτων. Αυτό επηρεάζει επίσης όλες τις μεθόδους εξαγωγής μέσω Markdown."
|
||||
},
|
||||
"display.assistant.title": "Ρυθμίσεις Υπηρεσίας",
|
||||
"display.custom.css": "Προσαρμοστική CSS",
|
||||
"display.custom.css.cherrycss": "Λήψη από cherrycss.com",
|
||||
"display.custom.css.placeholder": "/* Γράψτε εδώ την προσαρμοστική CSS */",
|
||||
@ -1303,6 +1305,7 @@
|
||||
"advancedSettings": "Προχωρημένες Ρυθμίσεις"
|
||||
},
|
||||
"messages.divider": "Διαχωριστική γραμμή μηνυμάτων",
|
||||
"messages.divider.tooltip": "Δεν ισχύει για μηνύματα με στυλ φυσαλίδας",
|
||||
"messages.grid_columns": "Αριθμός στήλων γριλ μηνυμάτων",
|
||||
"messages.grid_popover_trigger": "Καταγραφή στοιχείων στο grid",
|
||||
"messages.grid_popover_trigger.click": "Εμφάνιση κλικ",
|
||||
@ -1484,6 +1487,9 @@
|
||||
"theme.window.style.title": "Στυλ παραθύρων",
|
||||
"theme.window.style.transparent": "Διαφανή παράθυρα",
|
||||
"title": "Ρυθμίσεις",
|
||||
"topic.position": "Θέση θεμάτων",
|
||||
"topic.position.left": "Αριστερά",
|
||||
"topic.position.right": "Δεξιά",
|
||||
"topic.show.time": "Εμφάνιση ώρας θέματος",
|
||||
"tray.onclose": "Μειωμένο στη συνδρομή κατά την κλεισιά",
|
||||
"tray.show": "Εμφάνιση εικονιδίου συνδρομής",
|
||||
@ -1606,6 +1612,7 @@
|
||||
"assistant.icon.type.none": "Κανένα",
|
||||
"general.auto_check_update.title": "Αυτόματη ενημέρωση",
|
||||
"input.show_translate_confirm": "Εμφάνιση παραθύρου επιβεβαίωσης μετάφρασης",
|
||||
"messages.prompt": "Λήμμα προτροπής",
|
||||
"messages.input.enable_quick_triggers": "Ενεργοποίηση των '/' και '@' για γρήγορη πρόσβαση σε μενού",
|
||||
"messages.input.enable_delete_model": "Ενεργοποίηση διαγραφής μοντέλων/επισυναπτόμενων αρχείων με το πλήκτρο διαγραφής",
|
||||
"messages.math_engine.none": "Κανένα",
|
||||
|
||||
@ -919,6 +919,7 @@
|
||||
"about.updateNotAvailable": "Tu software ya está actualizado",
|
||||
"about.website.button": "Ver",
|
||||
"about.website.title": "Sitio web oficial",
|
||||
"advanced.auto_switch_to_topics": "Cambiar automáticamente a temas",
|
||||
"advanced.title": "Configuración avanzada",
|
||||
"assistant": "Asistente predeterminado",
|
||||
"assistant.model_params": "Parámetros del modelo",
|
||||
@ -1123,6 +1124,7 @@
|
||||
"message_title.use_topic_naming.title": "Usar el modelo de nombramiento temático para crear títulos de mensajes exportados",
|
||||
"message_title.use_topic_naming.help": "Al activarlo, se utilizará el modelo de nombramiento temático para generar títulos de mensajes exportados. Esta opción también afectará a todos los métodos de exportación mediante Markdown."
|
||||
},
|
||||
"display.assistant.title": "Configuración del asistente",
|
||||
"display.custom.css": "CSS personalizado",
|
||||
"display.custom.css.cherrycss": "Obtener desde cherrycss.com",
|
||||
"display.custom.css.placeholder": "/* Escribe tu CSS personalizado aquí */",
|
||||
@ -1302,6 +1304,7 @@
|
||||
"advancedSettings": "Configuración avanzada"
|
||||
},
|
||||
"messages.divider": "Separador de mensajes",
|
||||
"messages.divider.tooltip": "No aplicable para mensajes de estilo burbuja",
|
||||
"messages.grid_columns": "Número de columnas en la cuadrícula de mensajes",
|
||||
"messages.grid_popover_trigger": "Desencadenante de detalles de cuadrícula",
|
||||
"messages.grid_popover_trigger.click": "Mostrar al hacer clic",
|
||||
@ -1483,6 +1486,9 @@
|
||||
"theme.window.style.title": "Estilo de ventana",
|
||||
"theme.window.style.transparent": "Ventana transparente",
|
||||
"title": "Configuración",
|
||||
"topic.position": "Posición del tema",
|
||||
"topic.position.left": "Izquierda",
|
||||
"topic.position.right": "Derecha",
|
||||
"topic.show.time": "Mostrar tiempo del tema",
|
||||
"tray.onclose": "Minimizar a la bandeja al cerrar",
|
||||
"tray.show": "Mostrar bandera del sistema",
|
||||
@ -1605,6 +1611,7 @@
|
||||
"assistant.icon.type.none": "No mostrar",
|
||||
"general.auto_check_update.title": "Actualización automática",
|
||||
"input.show_translate_confirm": "Mostrar diálogo de confirmación de traducción",
|
||||
"messages.prompt": "Palabra de indicación",
|
||||
"messages.input.enable_quick_triggers": "Habilitar menú rápido con '/' y '@'",
|
||||
"messages.input.enable_delete_model": "Habilitar la eliminación con la tecla de borrado para modelos/archivos adjuntos introducidos",
|
||||
"messages.math_engine.none": "Ninguno",
|
||||
|
||||
@ -918,6 +918,7 @@
|
||||
"about.updateNotAvailable": "Votre logiciel est déjà à jour",
|
||||
"about.website.button": "Visiter le site web",
|
||||
"about.website.title": "Site web officiel",
|
||||
"advanced.auto_switch_to_topics": "Basculer automatiquement vers les sujets",
|
||||
"advanced.title": "Paramètres avancés",
|
||||
"assistant": "Assistant par défaut",
|
||||
"assistant.model_params": "Paramètres du modèle",
|
||||
@ -1124,6 +1125,7 @@
|
||||
"message_title.use_topic_naming.title": "Utiliser le modèle de dénomination thématique pour créer les titres des messages exportés",
|
||||
"message_title.use_topic_naming.help": "Lorsque cette option est activée, le modèle de dénomination thématique sera utilisé pour créer les titres des messages exportés. Cette option affectera également toutes les méthodes d'exportation au format Markdown."
|
||||
},
|
||||
"display.assistant.title": "Paramètres de l'assistant",
|
||||
"display.custom.css": "CSS personnalisé",
|
||||
"display.custom.css.cherrycss": "Obtenir depuis cherrycss.com",
|
||||
"display.custom.css.placeholder": "/* Écrire votre CSS personnalisé ici */",
|
||||
@ -1303,6 +1305,7 @@
|
||||
"advancedSettings": "Расширенные настройки"
|
||||
},
|
||||
"messages.divider": "Séparateur de messages",
|
||||
"messages.divider.tooltip": "Non applicable aux messages de style bulle",
|
||||
"messages.grid_columns": "Nombre de colonnes de la grille de messages",
|
||||
"messages.grid_popover_trigger": "Déclencheur de popover de la grille",
|
||||
"messages.grid_popover_trigger.click": "Afficher au clic",
|
||||
@ -1484,6 +1487,9 @@
|
||||
"theme.window.style.title": "Style de fenêtre",
|
||||
"theme.window.style.transparent": "Fenêtre transparente",
|
||||
"title": "Paramètres",
|
||||
"topic.position": "Position du sujet",
|
||||
"topic.position.left": "Gauche",
|
||||
"topic.position.right": "Droite",
|
||||
"topic.show.time": "Afficher l'heure du sujet",
|
||||
"tray.onclose": "Minimiser dans la barre d'état système lors de la fermeture",
|
||||
"tray.show": "Afficher l'icône dans la barre d'état système",
|
||||
@ -1606,6 +1612,7 @@
|
||||
"assistant.icon.type.none": "Ne pas afficher",
|
||||
"general.auto_check_update.title": "Mise à jour automatique",
|
||||
"input.show_translate_confirm": "Afficher la boîte de dialogue de confirmation de traduction",
|
||||
"messages.prompt": "Mot-clé d'affichage",
|
||||
"messages.input.enable_quick_triggers": "Activer les menus rapides avec '/' et '@'",
|
||||
"messages.input.enable_delete_model": "Activer la touche Supprimer pour effacer le modèle/pièce jointe saisie",
|
||||
"messages.math_engine.none": "Aucun",
|
||||
|
||||
@ -919,6 +919,7 @@
|
||||
"about.updateNotAvailable": "Seu software já está atualizado",
|
||||
"about.website.button": "Ver",
|
||||
"about.website.title": "Site oficial",
|
||||
"advanced.auto_switch_to_topics": "Alternar automaticamente para tópicos",
|
||||
"advanced.title": "Configurações avançadas",
|
||||
"assistant": "Assistente padrão",
|
||||
"assistant.model_params": "Parâmetros do modelo",
|
||||
@ -1125,6 +1126,7 @@
|
||||
"message_title.use_topic_naming.title": "Usar modelo de nomeação por tópico para criar títulos das mensagens exportadas",
|
||||
"message_title.use_topic_naming.help": "Ativando esta opção, será usado um modelo de nomeação por tópico para criar os títulos das mensagens exportadas. Esta configuração também afetará todas as formas de exportação feitas por meio de Markdown."
|
||||
},
|
||||
"display.assistant.title": "Configurações do assistente",
|
||||
"display.custom.css": "CSS personalizado",
|
||||
"display.custom.css.cherrycss": "Obter do cherrycss.com",
|
||||
"display.custom.css.placeholder": "/* Escreva seu CSS personalizado aqui */",
|
||||
@ -1304,6 +1306,7 @@
|
||||
"advancedSettings": "Configurações Avançadas"
|
||||
},
|
||||
"messages.divider": "Divisor de mensagens",
|
||||
"messages.divider.tooltip": "Não aplicável a mensagens de estilo bolha",
|
||||
"messages.grid_columns": "Número de colunas da grade de mensagens",
|
||||
"messages.grid_popover_trigger": "Disparador de detalhes da grade",
|
||||
"messages.grid_popover_trigger.click": "Clique para mostrar",
|
||||
@ -1485,6 +1488,9 @@
|
||||
"theme.window.style.title": "Estilo de janela",
|
||||
"theme.window.style.transparent": "Janela transparente",
|
||||
"title": "Configurações",
|
||||
"topic.position": "Posição do tópico",
|
||||
"topic.position.left": "Esquerda",
|
||||
"topic.position.right": "Direita",
|
||||
"topic.show.time": "Mostrar tempo do tópico",
|
||||
"tray.onclose": "Minimizar para bandeja ao fechar",
|
||||
"tray.show": "Mostrar ícone de bandeja",
|
||||
@ -1607,6 +1613,7 @@
|
||||
"assistant.icon.type.none": "Não mostrar",
|
||||
"general.auto_check_update.title": "Atualização automática",
|
||||
"input.show_translate_confirm": "Mostrar diálogo de confirmação de tradução",
|
||||
"messages.prompt": "Exibir palavra-chave",
|
||||
"messages.input.enable_quick_triggers": "Ativar menu rápido com '/' e '@'",
|
||||
"messages.input.enable_delete_model": "Ativar tecla de exclusão para remover modelos/anexos inseridos",
|
||||
"messages.math_engine.none": "Nenhum",
|
||||
|
||||
@ -10,12 +10,11 @@ import { modelGenerating } from '@renderer/hooks/useRuntime'
|
||||
import { useSettings } from '@renderer/hooks/useSettings'
|
||||
import { useShortcut } from '@renderer/hooks/useShortcuts'
|
||||
import { useShowAssistants } from '@renderer/hooks/useStore'
|
||||
import { EVENT_NAMES, EventEmitter } from '@renderer/services/EventService'
|
||||
import { useAppDispatch } from '@renderer/store'
|
||||
import { setNarrowMode } from '@renderer/store/settings'
|
||||
import { Tooltip } from 'antd'
|
||||
import { t } from 'i18next'
|
||||
import { LayoutGrid, MessageSquareDiff, PanelLeft, PanelRight, Search } from 'lucide-react'
|
||||
import { LayoutGrid, PanelLeft, PanelRight, Search } from 'lucide-react'
|
||||
import { FC } from 'react'
|
||||
import { useNavigate } from 'react-router'
|
||||
import styled from 'styled-components'
|
||||
@ -43,11 +42,6 @@ const ChatNavbar: FC = () => {
|
||||
<Navbar className="home-navbar">
|
||||
<NavbarContainer $isFullscreen={isFullscreen} $showSidebar={showAssistants} className="home-navbar-right">
|
||||
<HStack alignItems="center" gap={8}>
|
||||
<Tooltip title={t('settings.shortcuts.new_topic')} mouseEnterDelay={0.8}>
|
||||
<NavbarIcon onClick={() => EventEmitter.emit(EVENT_NAMES.ADD_NEW_TOPIC)}>
|
||||
<MessageSquareDiff size={18} />
|
||||
</NavbarIcon>
|
||||
</Tooltip>
|
||||
<NavbarIcon onClick={() => toggleShowAssistants()}>
|
||||
{showAssistants ? <PanelLeft size={18} /> : <PanelRight size={18} />}
|
||||
</NavbarIcon>
|
||||
@ -89,12 +83,11 @@ const NavbarContainer = styled.div<{ $isFullscreen: boolean; $showSidebar: boole
|
||||
max-height: var(--navbar-height);
|
||||
min-height: var(--navbar-height);
|
||||
justify-content: space-between;
|
||||
margin-left: ${({ $showSidebar }) => ($showSidebar ? '-37px' : isMac ? '75px' : '10px')};
|
||||
margin-left: ${({ $showSidebar }) => ($showSidebar ? '15px' : isMac ? '75px' : '15px')};
|
||||
font-weight: bold;
|
||||
color: var(--color-text-1);
|
||||
padding-right: ${({ $isFullscreen }) => ($isFullscreen ? '12px' : isWindows ? '140px' : isLinux ? '120px' : '12px')};
|
||||
padding-right: ${({ $isFullscreen }) => ($isFullscreen ? '15px' : isWindows ? '140px' : isLinux ? '120px' : '15px')};
|
||||
-webkit-app-region: drag;
|
||||
transition: margin-left 0.3s;
|
||||
`
|
||||
|
||||
export const NavbarIcon = styled.div`
|
||||
|
||||
@ -40,6 +40,9 @@ const Container = styled.div`
|
||||
|
||||
const ContentContainer = styled.div`
|
||||
overflow: hidden;
|
||||
display: flex;
|
||||
flex: 1;
|
||||
flex-direction: row;
|
||||
`
|
||||
|
||||
export default HomePage
|
||||
|
||||
@ -1,8 +1,9 @@
|
||||
import SearchPopup from '@renderer/components/Popups/SearchPopup'
|
||||
import { isMac } from '@renderer/config/constant'
|
||||
import { EVENT_NAMES, EventEmitter } from '@renderer/services/EventService'
|
||||
import { Tooltip } from 'antd'
|
||||
import { t } from 'i18next'
|
||||
import { Search } from 'lucide-react'
|
||||
import { MessageSquareDiff, Search } from 'lucide-react'
|
||||
import { FC } from 'react'
|
||||
import styled from 'styled-components'
|
||||
|
||||
@ -20,6 +21,11 @@ const HeaderNavbar: FC<Props> = () => {
|
||||
</Tooltip>
|
||||
)}
|
||||
</div>
|
||||
<Tooltip title={t('settings.shortcuts.new_topic')} mouseEnterDelay={0.8}>
|
||||
<NavbarIcon onClick={() => EventEmitter.emit(EVENT_NAMES.ADD_NEW_TOPIC)}>
|
||||
<MessageSquareDiff size={18} />
|
||||
</NavbarIcon>
|
||||
</Tooltip>
|
||||
</Container>
|
||||
)
|
||||
}
|
||||
@ -35,8 +41,8 @@ const Container = styled.div`
|
||||
min-height: var(--navbar-height);
|
||||
background-color: transparent;
|
||||
-webkit-app-region: drag;
|
||||
padding: 0 8px;
|
||||
padding-left: ${isMac ? '75px' : '10px'};
|
||||
padding: 0 15px;
|
||||
padding-left: ${isMac ? '75px' : '15px'};
|
||||
`
|
||||
|
||||
export const NavbarIcon = styled.div`
|
||||
@ -52,7 +58,7 @@ export const NavbarIcon = styled.div`
|
||||
-webkit-app-region: no-drag;
|
||||
cursor: pointer;
|
||||
&:hover {
|
||||
background-color: var(--color-background-mute);
|
||||
background-color: var(--color-list-item);
|
||||
color: var(--color-icon-white);
|
||||
}
|
||||
`
|
||||
|
||||
@ -9,13 +9,12 @@ import { useSettings } from '@renderer/hooks/useSettings'
|
||||
import { useShortcut } from '@renderer/hooks/useShortcuts'
|
||||
import { useShowAssistants } from '@renderer/hooks/useStore'
|
||||
import i18n from '@renderer/i18n'
|
||||
import AssistantItem from '@renderer/pages/home/Tabs/components/AssistantItem'
|
||||
import { getAssistantById } from '@renderer/services/AssistantService'
|
||||
import { EVENT_NAMES, EventEmitter } from '@renderer/services/EventService'
|
||||
import { ThemeMode } from '@renderer/types'
|
||||
import { isEmoji } from '@renderer/utils'
|
||||
import { Avatar, Dropdown } from 'antd'
|
||||
import { AnimatePresence, motion } from 'framer-motion'
|
||||
import { AnimatePresence } from 'framer-motion'
|
||||
import {
|
||||
Blocks,
|
||||
ChevronDown,
|
||||
@ -39,7 +38,9 @@ import { useTranslation } from 'react-i18next'
|
||||
import { useLocation, useNavigate } from 'react-router-dom'
|
||||
import styled from 'styled-components'
|
||||
|
||||
import Tabs from '../../../pages/home/Tabs'
|
||||
import AssistantsTab from '../Tabs/AssistantsTab'
|
||||
import AssistantItem from '../Tabs/components/AssistantItem'
|
||||
import TopicsTab from '../Tabs/TopicsTab'
|
||||
import MainNavbar from './MainNavbar'
|
||||
import {
|
||||
Container,
|
||||
@ -69,7 +70,7 @@ const MainSidebar: FC = () => {
|
||||
const location = useLocation()
|
||||
const { pathname } = location
|
||||
|
||||
const { activeAssistant, activeTopic, setActiveAssistant, setActiveTopic } = useChat()
|
||||
const { activeAssistant, activeTopic, setActiveAssistant } = useChat()
|
||||
const { showTopics } = useSettings()
|
||||
|
||||
const { openMinapp } = useMinappPopup()
|
||||
@ -145,6 +146,10 @@ const MainSidebar: FC = () => {
|
||||
})
|
||||
}
|
||||
|
||||
if (!showAssistants) {
|
||||
return null
|
||||
}
|
||||
|
||||
return (
|
||||
<Container
|
||||
id="main-sidebar"
|
||||
@ -172,23 +177,17 @@ const MainSidebar: FC = () => {
|
||||
</MainMenuItem>
|
||||
<AnimatePresence initial={false}>
|
||||
{isAppMenuExpanded && (
|
||||
<motion.div
|
||||
initial={{ height: 0, opacity: 0 }}
|
||||
animate={{ height: 'auto', opacity: 1 }}
|
||||
exit={{ height: 0, opacity: 0 }}
|
||||
transition={{ duration: 0.2 }}>
|
||||
<SubMenu>
|
||||
{appMenuItems.map((item) => (
|
||||
<MainMenuItem key={item.path} active={isRoutes(item.path)} onClick={() => navigate(item.path)}>
|
||||
<MainMenuItemLeft>
|
||||
<MainMenuItemIcon>{item.icon}</MainMenuItemIcon>
|
||||
<MainMenuItemText>{item.text}</MainMenuItemText>
|
||||
</MainMenuItemLeft>
|
||||
</MainMenuItem>
|
||||
))}
|
||||
<PinnedApps />
|
||||
</SubMenu>
|
||||
</motion.div>
|
||||
<SubMenu>
|
||||
{appMenuItems.map((item) => (
|
||||
<MainMenuItem key={item.path} active={isRoutes(item.path)} onClick={() => navigate(item.path)}>
|
||||
<MainMenuItemLeft>
|
||||
<MainMenuItemIcon>{item.icon}</MainMenuItemIcon>
|
||||
<MainMenuItemText>{item.text}</MainMenuItemText>
|
||||
</MainMenuItemLeft>
|
||||
</MainMenuItem>
|
||||
))}
|
||||
<PinnedApps />
|
||||
</SubMenu>
|
||||
)}
|
||||
</AnimatePresence>
|
||||
<OpenedMinappTabs />
|
||||
@ -211,13 +210,22 @@ const MainSidebar: FC = () => {
|
||||
</AssistantContainer>
|
||||
)}
|
||||
|
||||
<Tabs
|
||||
tab={tab}
|
||||
activeAssistant={activeAssistant}
|
||||
activeTopic={activeTopic}
|
||||
setActiveAssistant={setActiveAssistant}
|
||||
setActiveTopic={setActiveTopic}
|
||||
/>
|
||||
<MainContainer>
|
||||
{/* <TabContainer>
|
||||
<TabItem
|
||||
active={tab === 'assistants'}
|
||||
style={{ borderRight: '0.5px solid var(--color-border)' }}
|
||||
onClick={() => setTab('assistants')}>
|
||||
<TabItemText>{t('assistants.title')}</TabItemText>
|
||||
</TabItem>
|
||||
<TabItem active={tab === 'topic'} onClick={() => setTab('topic')}>
|
||||
<TabItemText>{t('common.topics')}</TabItemText>
|
||||
</TabItem>
|
||||
</TabContainer> */}
|
||||
{tab === 'assistants' && <AssistantsTab />}
|
||||
{tab === 'topic' && <TopicsTab style={{ paddingTop: 4 }} />}
|
||||
</MainContainer>
|
||||
|
||||
<UserMenu>
|
||||
<UserMenuLeft onClick={() => UserPopup.show()}>
|
||||
{isEmoji(avatar) ? (
|
||||
@ -283,11 +291,53 @@ const ThemeIcon = () => {
|
||||
)
|
||||
}
|
||||
|
||||
const MainContainer = styled.div`
|
||||
display: flex;
|
||||
flex: 1;
|
||||
flex-direction: column;
|
||||
overflow: hidden;
|
||||
height: 0;
|
||||
min-height: 0;
|
||||
`
|
||||
|
||||
const AssistantContainer = styled.div`
|
||||
margin: 0 10px;
|
||||
margin-top: 4px;
|
||||
margin-bottom: 4px;
|
||||
display: flex;
|
||||
`
|
||||
|
||||
// const TabContainer = styled.div`
|
||||
// display: flex;
|
||||
// flex: 1;
|
||||
// flex-direction: row;
|
||||
// height: 32px;
|
||||
// max-height: 32px;
|
||||
// min-height: 32px;
|
||||
// border-radius: 8px;
|
||||
// border: 0.5px solid var(--color-border);
|
||||
// margin: 5px 10px 8px 10px;
|
||||
// overflow: hidden;
|
||||
// `
|
||||
|
||||
// const TabItem = styled.div<{ active: boolean }>`
|
||||
// display: flex;
|
||||
// flex: 1;
|
||||
// flex-direction: column;
|
||||
// justify-content: center;
|
||||
// align-items: center;
|
||||
// cursor: pointer;
|
||||
// background-color: ${({ active }) => (active ? 'var(--color-list-item)' : 'transparent')};
|
||||
// &:hover {
|
||||
// background-color: var(--color-list-item);
|
||||
// }
|
||||
// `
|
||||
|
||||
// const TabItemText = styled.div`
|
||||
// font-size: 14px;
|
||||
// font-weight: 500;
|
||||
// `
|
||||
|
||||
const UserMenu = styled.div`
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
|
||||
@ -48,11 +48,11 @@ export const MainMenuItemText = styled.div`
|
||||
export const Container = styled.div`
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
flex: 1;
|
||||
width: var(--assistants-width);
|
||||
max-width: var(--assistants-width);
|
||||
border-right: 0.5px solid var(--color-border);
|
||||
height: 100vh;
|
||||
transition: all 0.3s;
|
||||
`
|
||||
|
||||
export const MainMenu = styled.div`
|
||||
|
||||
@ -195,10 +195,10 @@ const MessageMenubar: FC<Props> = (props) => {
|
||||
}
|
||||
},
|
||||
{
|
||||
label: t('chat.message.settings'),
|
||||
label: t('common.settings'),
|
||||
key: 'message-settings',
|
||||
icon: <Settings2 size={16} />,
|
||||
onClick: () => MessageSettingsPopup.show({ title: t('chat.message.settings') })
|
||||
onClick: () => MessageSettingsPopup.show({ title: t('common.settings') })
|
||||
},
|
||||
{
|
||||
label: t('chat.topics.export.title'),
|
||||
|
||||
@ -1,11 +1,14 @@
|
||||
import { DownOutlined, PlusOutlined, RightOutlined } from '@ant-design/icons'
|
||||
import { Draggable, Droppable, DropResult } from '@hello-pangea/dnd'
|
||||
import DragableList from '@renderer/components/DragableList'
|
||||
import AddAssistantPopup from '@renderer/components/Popups/AddAssistantPopup'
|
||||
import Scrollbar from '@renderer/components/Scrollbar'
|
||||
import { useAssistants } from '@renderer/hooks/useAssistant'
|
||||
import { useAssistants, useDefaultAssistant } from '@renderer/hooks/useAssistant'
|
||||
import { useChat } from '@renderer/hooks/useChat'
|
||||
import { useAssistantsTabSortType } from '@renderer/hooks/useStore'
|
||||
import { useTags } from '@renderer/hooks/useTags'
|
||||
import { Assistant, AssistantsSortType } from '@renderer/types'
|
||||
import { uuid } from '@renderer/utils'
|
||||
import { Tooltip } from 'antd'
|
||||
import { FC, useCallback, useRef, useState } from 'react'
|
||||
import { useTranslation } from 'react-i18next'
|
||||
@ -13,18 +16,8 @@ import styled from 'styled-components'
|
||||
|
||||
import AssistantItem from './components/AssistantItem'
|
||||
|
||||
interface AssistantsTabProps {
|
||||
activeAssistant: Assistant
|
||||
setActiveAssistant: (assistant: Assistant) => void
|
||||
onCreateAssistant: () => void
|
||||
onCreateDefaultAssistant: () => void
|
||||
}
|
||||
const Assistants: FC<AssistantsTabProps> = ({
|
||||
activeAssistant,
|
||||
setActiveAssistant,
|
||||
onCreateAssistant,
|
||||
onCreateDefaultAssistant
|
||||
}) => {
|
||||
const Assistants: FC = () => {
|
||||
const { activeAssistant, setActiveAssistant } = useChat()
|
||||
const { assistants, removeAssistant, addAssistant, updateAssistants } = useAssistants()
|
||||
const [dragging, setDragging] = useState(false)
|
||||
const [collapsedTags, setCollapsedTags] = useState<Record<string, boolean>>({})
|
||||
@ -32,6 +25,18 @@ const Assistants: FC<AssistantsTabProps> = ({
|
||||
const { getGroupedAssistants, allTags, updateTagsOrder } = useTags()
|
||||
const { assistantsTabSortType = 'list', setAssistantsTabSortType } = useAssistantsTabSortType()
|
||||
const containerRef = useRef<HTMLDivElement>(null)
|
||||
const { defaultAssistant } = useDefaultAssistant()
|
||||
|
||||
const onCreateAssistant = async () => {
|
||||
const assistant = await AddAssistantPopup.show()
|
||||
assistant && setActiveAssistant(assistant)
|
||||
}
|
||||
|
||||
const onCreateDefaultAssistant = useCallback(() => {
|
||||
const assistant = { ...defaultAssistant, id: uuid() }
|
||||
addAssistant(assistant)
|
||||
setActiveAssistant(assistant)
|
||||
}, [addAssistant, defaultAssistant, setActiveAssistant])
|
||||
|
||||
const onDelete = useCallback(
|
||||
(assistant: Assistant) => {
|
||||
|
||||
@ -15,6 +15,7 @@ import PromptPopup from '@renderer/components/Popups/PromptPopup'
|
||||
import Scrollbar from '@renderer/components/Scrollbar'
|
||||
import { isMac } from '@renderer/config/constant'
|
||||
import { useAssistant, useAssistants, useTopicsForAssistant } from '@renderer/hooks/useAssistant'
|
||||
import { useChat } from '@renderer/hooks/useChat'
|
||||
import { modelGenerating } from '@renderer/hooks/useRuntime'
|
||||
import { useSettings } from '@renderer/hooks/useSettings'
|
||||
import { finishTopicRenaming, startTopicRenaming, TopicManager } from '@renderer/hooks/useTopic'
|
||||
@ -24,7 +25,7 @@ import store from '@renderer/store'
|
||||
import { RootState } from '@renderer/store'
|
||||
import { setGenerating } from '@renderer/store/runtime'
|
||||
import { Assistant, Topic } from '@renderer/types'
|
||||
import { removeSpecialCharactersForFileName } from '@renderer/utils'
|
||||
import { classNames, removeSpecialCharactersForFileName } from '@renderer/utils'
|
||||
import { copyTopicAsMarkdown, copyTopicAsPlainText } from '@renderer/utils/copy'
|
||||
import {
|
||||
exportMarkdownToJoplin,
|
||||
@ -44,19 +45,18 @@ import { useTranslation } from 'react-i18next'
|
||||
import { useSelector } from 'react-redux'
|
||||
import styled from 'styled-components'
|
||||
|
||||
interface Props {
|
||||
assistant: Assistant
|
||||
activeTopic: Topic
|
||||
setActiveTopic: (topic: Topic) => void
|
||||
interface TopicsTabProps {
|
||||
style?: React.CSSProperties
|
||||
}
|
||||
|
||||
const Topics: FC<Props> = ({ assistant: _assistant, activeTopic, setActiveTopic }) => {
|
||||
const Topics: FC<TopicsTabProps> = ({ style }) => {
|
||||
const { activeAssistant, activeTopic, setActiveTopic } = useChat()
|
||||
const { assistants } = useAssistants()
|
||||
const { assistant, removeTopic, moveTopic, updateTopic, updateTopics } = useAssistant(_assistant.id)
|
||||
const { assistant, removeTopic, moveTopic, updateTopic, updateTopics } = useAssistant(activeAssistant.id)
|
||||
const { t } = useTranslation()
|
||||
const { showTopicTime, pinTopicsToTop } = useSettings()
|
||||
const { showTopicTime, pinTopicsToTop, topicPosition } = useSettings()
|
||||
|
||||
const topics = useTopicsForAssistant(_assistant.id)
|
||||
const topics = useTopicsForAssistant(activeAssistant.id)
|
||||
|
||||
const renamingTopics = useSelector((state: RootState) => state.runtime.chat.renamingTopics)
|
||||
const newlyRenamedTopics = useSelector((state: RootState) => state.runtime.chat.newlyRenamedTopics)
|
||||
@ -69,6 +69,7 @@ const Topics: FC<Props> = ({ assistant: _assistant, activeTopic, setActiveTopic
|
||||
const pendingTopics = useMemo(() => {
|
||||
return new Set<string>()
|
||||
}, [])
|
||||
|
||||
const isPending = useCallback(
|
||||
(topicId: string) => {
|
||||
const hasPending = hasTopicPendingRequests(topicId)
|
||||
@ -432,7 +433,7 @@ const Topics: FC<Props> = ({ assistant: _assistant, activeTopic, setActiveTopic
|
||||
|
||||
return (
|
||||
<Dropdown menu={{ items: getTopicMenuItems }} trigger={['contextMenu']}>
|
||||
<Container className="topics-tab">
|
||||
<Container className={`topics-tab ${topicPosition === 'right' ? 'right' : ''}`} style={style}>
|
||||
<DragableList list={sortedTopics} onUpdate={updateTopics}>
|
||||
{(topic) => {
|
||||
const isActive = topic.id === activeTopic?.id
|
||||
@ -449,7 +450,7 @@ const Topics: FC<Props> = ({ assistant: _assistant, activeTopic, setActiveTopic
|
||||
return (
|
||||
<TopicListItem
|
||||
onContextMenu={() => setTargetTopic(topic)}
|
||||
className={isActive ? 'active' : ''}
|
||||
className={classNames('topic-item', { active: isActive })}
|
||||
onClick={() => onSwitchTopic(topic)}
|
||||
style={{ borderRadius }}>
|
||||
{isPending(topic.id) && !isActive && <PendingIndicator />}
|
||||
@ -513,6 +514,17 @@ const Container = styled(Scrollbar)`
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
padding: 10px;
|
||||
max-height: calc(100vh - var(--navbar-height));
|
||||
min-width: var(--assistant-width);
|
||||
&.right {
|
||||
border-right: 0.5px solid var(--color-border);
|
||||
.topic-item:hover {
|
||||
background-color: var(--color-background-soft);
|
||||
}
|
||||
.topic-item.active {
|
||||
background-color: var(--color-background-mute);
|
||||
}
|
||||
}
|
||||
`
|
||||
|
||||
const TopicListItem = styled.div`
|
||||
|
||||
@ -60,7 +60,7 @@ const AssistantItem: FC<AssistantItemProps> = ({
|
||||
const { t } = useTranslation()
|
||||
const { allTags } = useTags()
|
||||
const { removeAllTopics } = useAssistant(assistant.id)
|
||||
const { assistantIconType, setAssistantIconType } = useSettings()
|
||||
const { assistantIconType, setAssistantIconType, topicPosition } = useSettings()
|
||||
const defaultModel = getDefaultModel()
|
||||
const { assistants, updateAssistants } = useAssistants()
|
||||
|
||||
@ -128,9 +128,16 @@ const AssistantItem: FC<AssistantItemProps> = ({
|
||||
return
|
||||
}
|
||||
|
||||
EventEmitter.emit(EVENT_NAMES.SWITCH_TOPIC_SIDEBAR)
|
||||
if (topicPosition === 'left') {
|
||||
EventEmitter.emit(EVENT_NAMES.SHOW_TOPIC_SIDEBAR)
|
||||
}
|
||||
|
||||
if (singleLine) {
|
||||
EventEmitter.emit(EVENT_NAMES.SWITCH_TOPIC_SIDEBAR)
|
||||
}
|
||||
|
||||
onSwitch(assistant)
|
||||
}, [isMenuOpen, onSwitch, assistant])
|
||||
}, [isMenuOpen, topicPosition, singleLine, onSwitch, assistant])
|
||||
|
||||
const assistantName = useMemo(() => assistant.name || t('chat.default.name'), [assistant.name, t])
|
||||
const fullAssistantName = useMemo(
|
||||
|
||||
@ -1,78 +0,0 @@
|
||||
import AddAssistantPopup from '@renderer/components/Popups/AddAssistantPopup'
|
||||
import { useAssistants, useDefaultAssistant } from '@renderer/hooks/useAssistant'
|
||||
import { Assistant, Topic } from '@renderer/types'
|
||||
import { uuid } from '@renderer/utils'
|
||||
import { FC } from 'react'
|
||||
import styled from 'styled-components'
|
||||
|
||||
import Assistants from './AssistantsTab'
|
||||
import Topics from './TopicsTab'
|
||||
|
||||
interface Props {
|
||||
tab: Tab
|
||||
activeAssistant: Assistant
|
||||
activeTopic: Topic
|
||||
setActiveAssistant: (assistant: Assistant) => void
|
||||
setActiveTopic: (topic: Topic) => void
|
||||
style?: React.CSSProperties
|
||||
}
|
||||
|
||||
type Tab = 'assistants' | 'topic'
|
||||
|
||||
const HomeTabs: FC<Props> = ({ tab, activeAssistant, activeTopic, setActiveAssistant, setActiveTopic, style }) => {
|
||||
const { addAssistant } = useAssistants()
|
||||
const { defaultAssistant } = useDefaultAssistant()
|
||||
|
||||
const onCreateAssistant = async () => {
|
||||
const assistant = await AddAssistantPopup.show()
|
||||
assistant && setActiveAssistant(assistant)
|
||||
}
|
||||
|
||||
const onCreateDefaultAssistant = () => {
|
||||
const assistant = { ...defaultAssistant, id: uuid() }
|
||||
addAssistant(assistant)
|
||||
setActiveAssistant(assistant)
|
||||
}
|
||||
|
||||
return (
|
||||
<Container style={{ ...style }} className="home-tabs">
|
||||
<TabContent className="home-tabs-content">
|
||||
{tab === 'assistants' && (
|
||||
<Assistants
|
||||
activeAssistant={activeAssistant}
|
||||
setActiveAssistant={setActiveAssistant}
|
||||
onCreateAssistant={onCreateAssistant}
|
||||
onCreateDefaultAssistant={onCreateDefaultAssistant}
|
||||
/>
|
||||
)}
|
||||
{tab === 'topic' && (
|
||||
<Topics assistant={activeAssistant} activeTopic={activeTopic} setActiveTopic={setActiveTopic} />
|
||||
)}
|
||||
</TabContent>
|
||||
</Container>
|
||||
)
|
||||
}
|
||||
|
||||
const Container = styled.div`
|
||||
display: flex;
|
||||
flex: 1;
|
||||
flex-direction: column;
|
||||
max-width: var(--assistants-width);
|
||||
min-width: var(--assistants-width);
|
||||
background-color: transparent;
|
||||
overflow: hidden;
|
||||
.collapsed {
|
||||
width: 0;
|
||||
border-left: none;
|
||||
}
|
||||
`
|
||||
|
||||
const TabContent = styled.div`
|
||||
display: flex;
|
||||
flex: 1;
|
||||
flex-direction: column;
|
||||
overflow-y: auto;
|
||||
overflow-x: hidden;
|
||||
`
|
||||
|
||||
export default HomeTabs
|
||||
@ -1,13 +1,16 @@
|
||||
import { SyncOutlined } from '@ant-design/icons'
|
||||
import CodeEditor from '@renderer/components/CodeEditor'
|
||||
import { HStack } from '@renderer/components/Layout'
|
||||
import { THEME_COLOR_PRESETS } from '@renderer/config/constant'
|
||||
import { isMac, THEME_COLOR_PRESETS } from '@renderer/config/constant'
|
||||
import { useTheme } from '@renderer/context/ThemeProvider'
|
||||
import { useSettings } from '@renderer/hooks/useSettings'
|
||||
import useUserTheme from '@renderer/hooks/useUserTheme'
|
||||
import { useAppDispatch } from '@renderer/store'
|
||||
import {
|
||||
AssistantIconType,
|
||||
DEFAULT_SIDEBAR_ICONS,
|
||||
setAssistantIconType,
|
||||
setClickAssistantToShowTopic,
|
||||
setCustomCss,
|
||||
setPinTopicsToTop,
|
||||
setShowTopicTime,
|
||||
@ -51,7 +54,20 @@ const ColorCircle = styled.div<{ color: string; isActive?: boolean }>`
|
||||
`
|
||||
|
||||
const DisplaySettings: FC = () => {
|
||||
const { showTopicTime, pinTopicsToTop, customCss, sidebarIcons, setTheme, userTheme } = useSettings()
|
||||
const {
|
||||
windowStyle,
|
||||
setWindowStyle,
|
||||
topicPosition,
|
||||
setTopicPosition,
|
||||
clickAssistantToShowTopic,
|
||||
showTopicTime,
|
||||
pinTopicsToTop,
|
||||
customCss,
|
||||
sidebarIcons,
|
||||
setTheme,
|
||||
assistantIconType,
|
||||
userTheme
|
||||
} = useSettings()
|
||||
const { theme, settedTheme } = useTheme()
|
||||
const { t } = useTranslation()
|
||||
const dispatch = useAppDispatch()
|
||||
@ -61,6 +77,13 @@ const DisplaySettings: FC = () => {
|
||||
const [visibleIcons, setVisibleIcons] = useState(sidebarIcons?.visible || DEFAULT_SIDEBAR_ICONS)
|
||||
const [disabledIcons, setDisabledIcons] = useState(sidebarIcons?.disabled || [])
|
||||
|
||||
const handleWindowStyleChange = useCallback(
|
||||
(checked: boolean) => {
|
||||
setWindowStyle(checked ? 'transparent' : 'opaque')
|
||||
},
|
||||
[setWindowStyle]
|
||||
)
|
||||
|
||||
const handleColorPrimaryChange = useCallback(
|
||||
(colorHex: string) => {
|
||||
setUserTheme({
|
||||
@ -135,6 +158,15 @@ const DisplaySettings: FC = () => {
|
||||
setCurrentZoom(zoomFactor)
|
||||
}
|
||||
|
||||
const assistantIconTypeOptions = useMemo(
|
||||
() => [
|
||||
{ value: 'model', label: t('settings.assistant.icon.type.model') },
|
||||
{ value: 'emoji', label: t('settings.assistant.icon.type.emoji') },
|
||||
{ value: 'none', label: t('settings.assistant.icon.type.none') }
|
||||
],
|
||||
[t]
|
||||
)
|
||||
|
||||
return (
|
||||
<SettingContainer theme={theme}>
|
||||
<SettingGroup theme={theme}>
|
||||
@ -164,7 +196,7 @@ const DisplaySettings: FC = () => {
|
||||
value={userTheme.colorPrimary}
|
||||
onChange={(color) => handleColorPrimaryChange(color.toHexString())}
|
||||
showText
|
||||
size="small"
|
||||
style={{ width: '110px' }}
|
||||
presets={[
|
||||
{
|
||||
label: 'Presets',
|
||||
@ -174,6 +206,15 @@ const DisplaySettings: FC = () => {
|
||||
/>
|
||||
</HStack>
|
||||
</SettingRow>
|
||||
{isMac && (
|
||||
<>
|
||||
<SettingDivider />
|
||||
<SettingRow>
|
||||
<SettingRowTitle>{t('settings.theme.window.style.transparent')}</SettingRowTitle>
|
||||
<Switch checked={windowStyle === 'transparent'} onChange={handleWindowStyleChange} />
|
||||
</SettingRow>
|
||||
</>
|
||||
)}
|
||||
</SettingGroup>
|
||||
<SettingGroup theme={theme}>
|
||||
<SettingTitle>{t('settings.display.zoom.title')}</SettingTitle>
|
||||
@ -181,15 +222,13 @@ const DisplaySettings: FC = () => {
|
||||
<SettingRow>
|
||||
<SettingRowTitle>{t('settings.zoom.title')}</SettingRowTitle>
|
||||
<ZoomButtonGroup>
|
||||
<Button onClick={() => handleZoomFactor(-0.1)} icon={<Minus size="14" />} color="default" variant="text" />
|
||||
<Button onClick={() => handleZoomFactor(-0.1)} icon={<Minus size="14" />} />
|
||||
<ZoomValue>{Math.round(currentZoom * 100)}%</ZoomValue>
|
||||
<Button onClick={() => handleZoomFactor(0.1)} icon={<Plus size="14" />} color="default" variant="text" />
|
||||
<Button onClick={() => handleZoomFactor(0.1)} icon={<Plus size="14" />} />
|
||||
<Button
|
||||
onClick={() => handleZoomFactor(0, true)}
|
||||
style={{ marginLeft: 8 }}
|
||||
icon={<RotateCcw size="14" />}
|
||||
color="default"
|
||||
variant="text"
|
||||
/>
|
||||
</ZoomButtonGroup>
|
||||
</SettingRow>
|
||||
@ -197,6 +236,31 @@ const DisplaySettings: FC = () => {
|
||||
<SettingGroup theme={theme}>
|
||||
<SettingTitle>{t('settings.display.topic.title')}</SettingTitle>
|
||||
<SettingDivider />
|
||||
<SettingRow>
|
||||
<SettingRowTitle>{t('settings.topic.position')}</SettingRowTitle>
|
||||
<Segmented
|
||||
value={topicPosition || 'right'}
|
||||
shape="round"
|
||||
onChange={setTopicPosition}
|
||||
options={[
|
||||
{ value: 'left', label: t('settings.topic.position.left') },
|
||||
{ value: 'right', label: t('settings.topic.position.right') }
|
||||
]}
|
||||
/>
|
||||
</SettingRow>
|
||||
<SettingDivider />
|
||||
{topicPosition === 'left' && (
|
||||
<>
|
||||
<SettingRow>
|
||||
<SettingRowTitle>{t('settings.advanced.auto_switch_to_topics')}</SettingRowTitle>
|
||||
<Switch
|
||||
checked={clickAssistantToShowTopic}
|
||||
onChange={(checked) => dispatch(setClickAssistantToShowTopic(checked))}
|
||||
/>
|
||||
</SettingRow>
|
||||
<SettingDivider />
|
||||
</>
|
||||
)}
|
||||
<SettingRow>
|
||||
<SettingRowTitle>{t('settings.topic.show.time')}</SettingRowTitle>
|
||||
<Switch checked={showTopicTime} onChange={(checked) => dispatch(setShowTopicTime(checked))} />
|
||||
@ -207,6 +271,19 @@ const DisplaySettings: FC = () => {
|
||||
<Switch checked={pinTopicsToTop} onChange={(checked) => dispatch(setPinTopicsToTop(checked))} />
|
||||
</SettingRow>
|
||||
</SettingGroup>
|
||||
<SettingGroup theme={theme}>
|
||||
<SettingTitle>{t('settings.display.assistant.title')}</SettingTitle>
|
||||
<SettingDivider />
|
||||
<SettingRow>
|
||||
<SettingRowTitle>{t('settings.assistant.icon.type')}</SettingRowTitle>
|
||||
<Segmented
|
||||
value={assistantIconType}
|
||||
shape="round"
|
||||
onChange={(value) => dispatch(setAssistantIconType(value as AssistantIconType))}
|
||||
options={assistantIconTypeOptions}
|
||||
/>
|
||||
</SettingRow>
|
||||
</SettingGroup>
|
||||
<SettingGroup theme={theme}>
|
||||
<SettingTitle
|
||||
style={{ display: 'flex', flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center' }}>
|
||||
|
||||
Loading…
Reference in New Issue
Block a user