diff --git a/src/renderer/src/components/app/Sidebar.tsx b/src/renderer/src/components/app/Sidebar.tsx index e77944525e..e7007d8188 100644 --- a/src/renderer/src/components/app/Sidebar.tsx +++ b/src/renderer/src/components/app/Sidebar.tsx @@ -51,42 +51,42 @@ const Sidebar: FC = () => { - + to('/')}> - + to('/agents')}> - + to('/paintings')}> - + to('/translate')}> - + to('/apps')}> - + to('/files')}> @@ -96,7 +96,7 @@ const Sidebar: FC = () => { - + toggleTheme()}> {theme === 'dark' ? ( @@ -105,7 +105,7 @@ const Sidebar: FC = () => { )} - + to(isLocalAi ? '/settings/assistant' : '/settings/provider')}> @@ -183,7 +183,8 @@ const Icon = styled.div` background-color: var(--color-active); .iconfont, .anticon { - color: var(--color-icon-white); + color: var(--color-primary); + font-weight: bold; } } ` diff --git a/src/renderer/src/i18n/locales/en-us.json b/src/renderer/src/i18n/locales/en-us.json index 9c335bc912..5ffea3c99d 100644 --- a/src/renderer/src/i18n/locales/en-us.json +++ b/src/renderer/src/i18n/locales/en-us.json @@ -302,8 +302,11 @@ "provider.api.url.preview": "Preview: {{url}}", "provider.api.url.tip": "Ending with / ignores v1, ending with # forces use of input address", "models.default_assistant_model": "Default Assistant Model", + "models.default_assistant_model_description": "Model used when creating a new assistant, if the assistant is not set, this model will be used", "models.topic_naming_model": "Topic Naming Model", + "models.topic_naming_model_description": "Model used when automatically naming a new topic", "models.translate_model": "Translate Model", + "models.translate_model_description": "Model used for translation service", "models.add.add_model": "Add Model", "models.add.model_id.placeholder": "Required e.g. gpt-3.5-turbo", "models.add.model_id": "Model ID", diff --git a/src/renderer/src/i18n/locales/ru-ru.json b/src/renderer/src/i18n/locales/ru-ru.json index e453a314f5..c7854735ce 100644 --- a/src/renderer/src/i18n/locales/ru-ru.json +++ b/src/renderer/src/i18n/locales/ru-ru.json @@ -302,8 +302,11 @@ "provider.api.url.preview": "Предпросмотр: {{url}}", "provider.api.url.tip": "Заканчивая на / игнорирует v1, заканчивая на # принудительно использует введенный адрес", "models.default_assistant_model": "Модель ассистента по умолчанию", + "models.default_assistant_model_description": "Модель, используемая при создании нового ассистента, если ассистент не имеет настроенной модели, будет использоваться эта модель", "models.topic_naming_model": "Модель именования топика", + "models.topic_naming_model_description": "Модель, используемая при автоматическом именовании нового топика", "models.translate_model": "Модель перевода", + "models.translate_model_description": "Модель, используемая для сервиса перевода", "models.add.add_model": "Добавить модель", "models.add.model_id.placeholder": "Обязательно, например, gpt-3.5-turbo", "models.add.model_id": "ID модели", diff --git a/src/renderer/src/i18n/locales/zh-cn.json b/src/renderer/src/i18n/locales/zh-cn.json index 6fcf318d0a..11d8ec9a84 100644 --- a/src/renderer/src/i18n/locales/zh-cn.json +++ b/src/renderer/src/i18n/locales/zh-cn.json @@ -290,8 +290,11 @@ "advanced.title": "高级设置", "advanced.auto_switch_to_topics": "自动切换到话题", "models.default_assistant_model": "默认助手模型", + "models.default_assistant_model_description": "创建新助手时使用的模型,如果助手未设置模型,则使用此模型", "models.topic_naming_model": "话题命名模型", + "models.topic_naming_model_description": "自动命名新话题时使用的模型", "models.translate_model": "翻译模型", + "models.translate_model_description": "翻译服务使用的模型", "models.add.add_model": "添加模型", "models.add.model_id.placeholder": "必填 例如 gpt-3.5-turbo", "models.add.model_id": "模型 ID", diff --git a/src/renderer/src/i18n/locales/zh-tw.json b/src/renderer/src/i18n/locales/zh-tw.json index b740a90f8a..441aa3874c 100644 --- a/src/renderer/src/i18n/locales/zh-tw.json +++ b/src/renderer/src/i18n/locales/zh-tw.json @@ -290,8 +290,11 @@ "advanced.title": "進階設定", "advanced.auto_switch_to_topics": "自動切換到話題", "models.default_assistant_model": "預設助手模型", + "models.default_assistant_model_description": "創建新助手時使用的模型,如果助手未設置模型,則使用此模型", "models.topic_naming_model": "話題命名模型", + "models.topic_naming_model_description": "自動命名新話題時使用的模型", "models.translate_model": "翻譯模型", + "models.translate_model_description": "翻譯服務使用的模型", "models.add.add_model": "添加模型", "models.add.model_id.placeholder": "必填,例如 gpt-3.5-turbo", "models.add.model_id": "模型 ID", diff --git a/src/renderer/src/pages/settings/AboutSettings.tsx b/src/renderer/src/pages/settings/AboutSettings.tsx index fb66142e07..dccbfdab96 100644 --- a/src/renderer/src/pages/settings/AboutSettings.tsx +++ b/src/renderer/src/pages/settings/AboutSettings.tsx @@ -3,6 +3,7 @@ import { FileProtectOutlined, GlobalOutlined, MailOutlined, SoundOutlined } from import { HStack } from '@renderer/components/Layout' import MinApp from '@renderer/components/MinApp' import { APP_NAME, AppLogo } from '@renderer/config/env' +import { useTheme } from '@renderer/context/ThemeProvider' import { useSettings } from '@renderer/hooks/useSettings' import { useAppDispatch } from '@renderer/store' import { setManualUpdateCheck } from '@renderer/store/settings' @@ -15,7 +16,7 @@ import { useTranslation } from 'react-i18next' import { Link } from 'react-router-dom' import styled from 'styled-components' -import { SettingContainer, SettingDivider, SettingRow, SettingTitle } from '.' +import { SettingContainer, SettingDivider, SettingGroup, SettingRow, SettingTitle } from '.' const AboutSettings: FC = () => { const [version, setVersion] = useState('') @@ -24,6 +25,7 @@ const AboutSettings: FC = () => { const [checkUpdateLoading, setCheckUpdateLoading] = useState(false) const [downloading, setDownloading] = useState(false) const { manualUpdateCheck } = useSettings() + const { theme } = useTheme() const dispatch = useAppDispatch() const onCheckUpdate = debounce( @@ -104,102 +106,104 @@ const AboutSettings: FC = () => { }, [t]) return ( - - - {t('settings.about.title')} - - - - - - - - - - onOpenWebsite('https://github.com/kangfenmao/cherry-studio')}> - {percent > 0 && ( - - )} - - - - {APP_NAME} - {t('settings.about.description')} - onOpenWebsite('https://github.com/kangfenmao/cherry-studio/releases')} - color="cyan" - style={{ marginTop: 8, cursor: 'pointer' }}> - v{version} - - - - - {downloading ? t('settings.about.downloading') : t('settings.about.checkUpdate')} - - - - - {t('settings.general.manually_check_update.title')} - dispatch(setManualUpdateCheck(v))} /> - - - - - - {t('settings.about.releases.title')} - - - - - - - - {t('settings.about.website.title')} - - - - - - - - {t('settings.about.feedback.title')} - - - - - - - - {t('settings.about.license.title')} - - - - - - - {t('settings.about.contact.title')} - - - - + + + + {t('settings.about.title')} + + + + + + + + + + onOpenWebsite('https://github.com/kangfenmao/cherry-studio')}> + {percent > 0 && ( + + )} + + + + {APP_NAME} + {t('settings.about.description')} + onOpenWebsite('https://github.com/kangfenmao/cherry-studio/releases')} + color="cyan" + style={{ marginTop: 8, cursor: 'pointer' }}> + v{version} + + + + + {downloading ? t('settings.about.downloading') : t('settings.about.checkUpdate')} + + + + + {t('settings.general.manually_check_update.title')} + dispatch(setManualUpdateCheck(v))} /> + + + + + + + {t('settings.about.releases.title')} + + + + + + + + {t('settings.about.website.title')} + + + + + + + + {t('settings.about.feedback.title')} + + + + + + + + {t('settings.about.license.title')} + + + + + + + {t('settings.about.contact.title')} + + + + ) } diff --git a/src/renderer/src/pages/settings/AssistantSettings.tsx b/src/renderer/src/pages/settings/AssistantSettings.tsx index 6e4325bd2a..a36c0230cf 100644 --- a/src/renderer/src/pages/settings/AssistantSettings.tsx +++ b/src/renderer/src/pages/settings/AssistantSettings.tsx @@ -2,6 +2,7 @@ import { QuestionCircleOutlined } from '@ant-design/icons' import { HStack } from '@renderer/components/Layout' import { TopView } from '@renderer/components/TopView' import { DEFAULT_CONTEXTCOUNT, DEFAULT_MAX_TOKENS, DEFAULT_TEMPERATURE } from '@renderer/config/constant' +import { useTheme } from '@renderer/context/ThemeProvider' import { useDefaultAssistant } from '@renderer/hooks/useAssistant' import { AssistantSettings as AssistantSettingsType } from '@renderer/types' import { Button, Col, Input, InputNumber, Modal, Row, Slider, Switch, Tooltip } from 'antd' @@ -18,6 +19,7 @@ const AssistantSettings: FC = () => { const [contextCount, setContextCount] = useState(defaultAssistant.settings?.contextCount ?? DEFAULT_CONTEXTCOUNT) const [enableMaxTokens, setEnableMaxTokens] = useState(defaultAssistant?.settings?.enableMaxTokens ?? false) const [maxTokens, setMaxTokens] = useState(defaultAssistant?.settings?.maxTokens ?? 0) + const { theme } = useTheme() const { t } = useTranslation() @@ -67,7 +69,7 @@ const AssistantSettings: FC = () => { } return ( - + {t('common.name')} { const { t } = useTranslation() const [appInfo, setAppInfo] = useState() + const { theme } = useTheme() useEffect(() => { window.api.getAppInfo().then(setAppInfo) }, []) - const handleOpenPath = (path: string) => { + const handleOpenPath = (path?: string) => { + if (!path) return if (path?.endsWith('log')) { const dirPath = path.split(/[/\\]/).slice(0, -1).join('/') window.api.openPath(dirPath) @@ -29,8 +32,8 @@ const DataSettings: FC = () => { } return ( - - + + {t('settings.data')} @@ -63,10 +66,10 @@ const DataSettings: FC = () => { - + - + {t('settings.data.title')} diff --git a/src/renderer/src/pages/settings/GeneralSettings.tsx b/src/renderer/src/pages/settings/GeneralSettings.tsx index 9e73ec2073..d0ff8e93a0 100644 --- a/src/renderer/src/pages/settings/GeneralSettings.tsx +++ b/src/renderer/src/pages/settings/GeneralSettings.tsx @@ -1,4 +1,5 @@ import { isMac } from '@renderer/config/constant' +import { useTheme } from '@renderer/context/ThemeProvider' import { useSettings } from '@renderer/hooks/useSettings' import i18n from '@renderer/i18n' import { useAppDispatch } from '@renderer/store' @@ -10,7 +11,7 @@ import { Input, Select, Space, Switch } from 'antd' import { FC, useState } from 'react' import { useTranslation } from 'react-i18next' -import { SettingContainer, SettingDivider, SettingRow, SettingRowTitle, SettingTitle } from '.' +import { SettingContainer, SettingDivider, SettingGroup, SettingRow, SettingRowTitle, SettingTitle } from '.' const GeneralSettings: FC = () => { const { @@ -25,6 +26,7 @@ const GeneralSettings: FC = () => { proxyMode: storeProxyMode } = useSettings() const [proxyUrl, setProxyUrl] = useState(storeProxyUrl) + const { theme: themeMode } = useTheme() const updateTray = (value: boolean) => { setTray(value) @@ -76,82 +78,88 @@ const GeneralSettings: FC = () => { ] return ( - - {t('settings.general.title')} - - - {t('common.language')} - - - - - {t('settings.theme.title')} - - - - )} - - - {t('settings.proxy.mode.title')} - setProxyUrl(e.target.value)} - style={{ width: 180 }} - onBlur={() => onSetProxyUrl()} - type="url" - /> - - - )} - - - {t('settings.tray.title')} - updateTray(checked)} /> - - + + + {t('settings.general.title')} + + + {t('common.language')} + + + + + {t('settings.theme.title')} + + + + )} + + + {t('settings.proxy.mode.title')} + setProxyUrl(e.target.value)} + style={{ width: 180 }} + onBlur={() => onSetProxyUrl()} + type="url" + /> + + + )} + + + {t('settings.tray.title')} + updateTray(checked)} /> + + ) } diff --git a/src/renderer/src/pages/settings/ModelSettings.tsx b/src/renderer/src/pages/settings/ModelSettings.tsx index 413c34082d..4d32d1ae4d 100644 --- a/src/renderer/src/pages/settings/ModelSettings.tsx +++ b/src/renderer/src/pages/settings/ModelSettings.tsx @@ -1,5 +1,6 @@ import { EditOutlined, MessageOutlined, SettingOutlined, TranslationOutlined } from '@ant-design/icons' import { HStack } from '@renderer/components/Layout' +import { useTheme } from '@renderer/context/ThemeProvider' import { useDefaultModel } from '@renderer/hooks/useAssistant' import { useProviders } from '@renderer/hooks/useProvider' import { getModelUniqId, hasModel } from '@renderer/services/ModelService' @@ -9,7 +10,7 @@ import { find, sortBy } from 'lodash' import { FC, useMemo } from 'react' import { useTranslation } from 'react-i18next' -import { SettingContainer, SettingDivider, SettingTitle } from '.' +import { SettingContainer, SettingDescription, SettingDivider, SettingGroup, SettingTitle } from '.' import AssistantSettingsPopup from './AssistantSettings' const ModelSettings: FC = () => { @@ -17,6 +18,7 @@ const ModelSettings: FC = () => { useDefaultModel() const { providers } = useProviders() const allModels = providers.map((p) => p.models).flat() + const { theme } = useTheme() const { t } = useTranslation() const selectOptions = providers @@ -46,57 +48,64 @@ const ModelSettings: FC = () => { ) return ( - - -
- - {t('settings.models.default_assistant_model')} -
-
- - + + + +
+ + {t('settings.models.default_assistant_model')} +
+
+ + + setDefaultModel(find(allModels, JSON.parse(value)) as Model)} + onChange={(value) => setTopicNamingModel(find(allModels, JSON.parse(value)) as Model)} options={selectOptions} placeholder={t('settings.models.empty')} /> -