@lobehub/chat 1.15.22 → 1.15.24
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.
Potentially problematic release.
This version of @lobehub/chat might be problematic. Click here for more details.
- package/CHANGELOG.md +50 -0
- package/locales/ar/metadata.json +6 -6
- package/locales/ar/migration.json +9 -9
- package/locales/ar/plugin.json +1 -1
- package/locales/ar/setting.json +4 -4
- package/locales/ar/welcome.json +13 -13
- package/locales/bg-BG/metadata.json +7 -7
- package/locales/bg-BG/migration.json +12 -12
- package/locales/bg-BG/plugin.json +1 -1
- package/locales/bg-BG/setting.json +4 -4
- package/locales/bg-BG/welcome.json +13 -13
- package/locales/de-DE/metadata.json +6 -6
- package/locales/de-DE/migration.json +9 -9
- package/locales/de-DE/plugin.json +1 -1
- package/locales/de-DE/setting.json +4 -4
- package/locales/de-DE/welcome.json +15 -15
- package/locales/en-US/metadata.json +8 -8
- package/locales/en-US/migration.json +9 -9
- package/locales/en-US/plugin.json +1 -1
- package/locales/en-US/setting.json +4 -4
- package/locales/en-US/welcome.json +16 -16
- package/locales/es-ES/metadata.json +8 -8
- package/locales/es-ES/migration.json +9 -9
- package/locales/es-ES/plugin.json +1 -1
- package/locales/es-ES/setting.json +4 -4
- package/locales/es-ES/welcome.json +15 -15
- package/locales/fr-FR/metadata.json +7 -7
- package/locales/fr-FR/migration.json +8 -8
- package/locales/fr-FR/plugin.json +1 -1
- package/locales/fr-FR/setting.json +4 -4
- package/locales/fr-FR/welcome.json +12 -12
- package/locales/it-IT/metadata.json +6 -6
- package/locales/it-IT/migration.json +11 -11
- package/locales/it-IT/plugin.json +1 -1
- package/locales/it-IT/setting.json +4 -4
- package/locales/it-IT/welcome.json +16 -16
- package/locales/ja-JP/metadata.json +6 -6
- package/locales/ja-JP/migration.json +9 -9
- package/locales/ja-JP/plugin.json +1 -1
- package/locales/ja-JP/setting.json +4 -4
- package/locales/ja-JP/welcome.json +15 -15
- package/locales/ko-KR/metadata.json +6 -6
- package/locales/ko-KR/migration.json +9 -9
- package/locales/ko-KR/plugin.json +1 -1
- package/locales/ko-KR/setting.json +4 -4
- package/locales/ko-KR/welcome.json +13 -13
- package/locales/nl-NL/metadata.json +7 -7
- package/locales/nl-NL/migration.json +9 -9
- package/locales/nl-NL/plugin.json +1 -1
- package/locales/nl-NL/setting.json +4 -4
- package/locales/nl-NL/welcome.json +15 -15
- package/locales/pl-PL/metadata.json +6 -6
- package/locales/pl-PL/migration.json +11 -11
- package/locales/pl-PL/plugin.json +1 -1
- package/locales/pl-PL/setting.json +4 -4
- package/locales/pl-PL/welcome.json +16 -16
- package/locales/pt-BR/metadata.json +8 -8
- package/locales/pt-BR/migration.json +13 -13
- package/locales/pt-BR/plugin.json +1 -1
- package/locales/pt-BR/setting.json +4 -4
- package/locales/pt-BR/welcome.json +16 -16
- package/locales/ru-RU/metadata.json +6 -6
- package/locales/ru-RU/migration.json +11 -11
- package/locales/ru-RU/plugin.json +1 -1
- package/locales/ru-RU/setting.json +4 -4
- package/locales/ru-RU/welcome.json +16 -16
- package/locales/tr-TR/metadata.json +6 -6
- package/locales/tr-TR/migration.json +12 -12
- package/locales/tr-TR/plugin.json +1 -1
- package/locales/tr-TR/setting.json +4 -4
- package/locales/tr-TR/welcome.json +15 -15
- package/locales/vi-VN/metadata.json +6 -6
- package/locales/vi-VN/migration.json +8 -8
- package/locales/vi-VN/plugin.json +1 -1
- package/locales/vi-VN/setting.json +4 -4
- package/locales/vi-VN/welcome.json +9 -9
- package/locales/zh-CN/common.json +3 -3
- package/locales/zh-CN/market.json +1 -1
- package/locales/zh-CN/metadata.json +6 -6
- package/locales/zh-CN/migration.json +4 -4
- package/locales/zh-CN/plugin.json +2 -2
- package/locales/zh-CN/setting.json +4 -4
- package/locales/zh-CN/welcome.json +8 -8
- package/locales/zh-TW/metadata.json +6 -6
- package/locales/zh-TW/migration.json +6 -6
- package/locales/zh-TW/plugin.json +1 -1
- package/locales/zh-TW/setting.json +4 -4
- package/locales/zh-TW/welcome.json +10 -10
- package/package.json +1 -1
- package/src/app/(auth)/login/[[...login]]/page.tsx +2 -1
- package/src/app/(main)/chat/(workspace)/features/ShareButton/useScreenshot.ts +2 -1
- package/src/app/(main)/chat/(workspace)/features/TelemetryNotification.tsx +5 -2
- package/src/app/(main)/chat/(workspace)/page.tsx +5 -4
- package/src/app/(main)/chat/@session/_layout/Desktop/SessionHeader.tsx +2 -2
- package/src/app/(main)/chat/@session/_layout/Mobile/SessionHeader.tsx +2 -2
- package/src/app/(main)/chat/features/Migration/ExportConfigButton.tsx +3 -1
- package/src/app/(main)/chat/features/Migration/Modal.tsx +3 -2
- package/src/app/(main)/chat/features/Migration/Start.tsx +4 -2
- package/src/app/(main)/files/(content)/NotSupportClient.tsx +2 -1
- package/src/app/(main)/market/_layout/Desktop/Header.tsx +3 -2
- package/src/app/(main)/market/features/ShareAgentButton/Inner.tsx +2 -1
- package/src/app/(main)/settings/about/features/Analytics.tsx +2 -1
- package/src/app/(main)/settings/about/features/Version.tsx +3 -2
- package/src/app/(main)/settings/about/index.tsx +6 -1
- package/src/app/(main)/welcome/features/Hero.tsx +3 -1
- package/src/app/(main)/welcome/page.tsx +5 -4
- package/src/app/metadata.ts +11 -12
- package/src/components/Branding/ProductLogo.tsx +14 -0
- package/src/components/Branding/index.ts +1 -0
- package/src/config/featureFlags/schema.ts +11 -5
- package/src/config/modelProviders/groq.ts +3 -3
- package/src/const/branding.ts +5 -0
- package/src/features/Conversation/components/InboxWelcome/QuestionSuggest.tsx +2 -1
- package/src/features/Conversation/components/InboxWelcome/index.tsx +4 -1
- package/src/features/PluginDevModal/UrlManifestForm.tsx +2 -1
- package/src/features/Setting/Footer.tsx +2 -1
- package/src/locales/default/common.ts +3 -3
- package/src/locales/default/market.ts +1 -1
- package/src/locales/default/metadata.ts +6 -6
- package/src/locales/default/migration.ts +4 -4
- package/src/locales/default/plugin.ts +2 -2
- package/src/locales/default/setting.ts +4 -5
- package/src/locales/default/welcome.ts +8 -8
- package/src/server/ld.ts +2 -1
- package/src/server/metadata.ts +2 -1
- package/src/store/user/slices/auth/selectors.ts +2 -1
- package/src/utils/config.ts +2 -1
@@ -1,4 +1,5 @@
|
|
1
1
|
import StructuredData from '@/components/StructuredData';
|
2
|
+
import { BRANDING_NAME } from '@/const/branding';
|
2
3
|
import { ldModule } from '@/server/ld';
|
3
4
|
import { metadataModule } from '@/server/metadata';
|
4
5
|
import { translation } from '@/server/translation';
|
@@ -10,8 +11,8 @@ import TelemetryNotification from './features/TelemetryNotification';
|
|
10
11
|
export const generateMetadata = async () => {
|
11
12
|
const { t } = await translation('metadata');
|
12
13
|
return metadataModule.generate({
|
13
|
-
description: t('chat.
|
14
|
-
title: t('chat.title'),
|
14
|
+
description: t('chat.title', { appName: BRANDING_NAME }),
|
15
|
+
title: t('chat.title', { appName: BRANDING_NAME }),
|
15
16
|
url: '/chat',
|
16
17
|
});
|
17
18
|
};
|
@@ -20,8 +21,8 @@ const Page = async () => {
|
|
20
21
|
const mobile = isMobileDevice();
|
21
22
|
const { t } = await translation('metadata');
|
22
23
|
const ld = ldModule.generate({
|
23
|
-
description: t('chat.
|
24
|
-
title: t('chat.title'),
|
24
|
+
description: t('chat.title', { appName: BRANDING_NAME }),
|
25
|
+
title: t('chat.title', { appName: BRANDING_NAME }),
|
25
26
|
url: '/chat',
|
26
27
|
});
|
27
28
|
|
@@ -1,13 +1,13 @@
|
|
1
1
|
'use client';
|
2
2
|
|
3
3
|
import { ActionIcon } from '@lobehub/ui';
|
4
|
-
import { LobeChat } from '@lobehub/ui/brand';
|
5
4
|
import { createStyles } from 'antd-style';
|
6
5
|
import { MessageSquarePlus } from 'lucide-react';
|
7
6
|
import { memo } from 'react';
|
8
7
|
import { useTranslation } from 'react-i18next';
|
9
8
|
import { Flexbox } from 'react-layout-kit';
|
10
9
|
|
10
|
+
import { ProductLogo } from '@/components/Branding';
|
11
11
|
import { DESKTOP_HEADER_ICON_SIZE } from '@/const/layoutTokens';
|
12
12
|
import SyncStatusTag from '@/features/SyncStatusInspector';
|
13
13
|
import { useActionSWR } from '@/libs/swr';
|
@@ -38,7 +38,7 @@ const Header = memo(() => {
|
|
38
38
|
<Flexbox className={styles.top} gap={16} padding={16}>
|
39
39
|
<Flexbox distribution={'space-between'} horizontal>
|
40
40
|
<Flexbox align={'center'} gap={4} horizontal>
|
41
|
-
<
|
41
|
+
<ProductLogo className={styles.logo} size={36} />
|
42
42
|
{enableWebrtc && <SyncStatusTag />}
|
43
43
|
</Flexbox>
|
44
44
|
{showCreateSession && (
|
@@ -1,12 +1,12 @@
|
|
1
1
|
'use client';
|
2
2
|
|
3
3
|
import { ActionIcon, MobileNavBar } from '@lobehub/ui';
|
4
|
-
import { LobeChat } from '@lobehub/ui/brand';
|
5
4
|
import { MessageSquarePlus } from 'lucide-react';
|
6
5
|
import { useRouter } from 'next/navigation';
|
7
6
|
import { memo } from 'react';
|
8
7
|
import { Flexbox } from 'react-layout-kit';
|
9
8
|
|
9
|
+
import { ProductLogo } from '@/components/Branding';
|
10
10
|
import { MOBILE_HEADER_ICON_SIZE } from '@/const/layoutTokens';
|
11
11
|
import SyncStatusInspector from '@/features/SyncStatusInspector';
|
12
12
|
import UserAvatar from '@/features/User/UserAvatar';
|
@@ -24,7 +24,7 @@ const Header = memo(() => {
|
|
24
24
|
left={
|
25
25
|
<Flexbox align={'center'} gap={8} horizontal style={{ marginLeft: 8 }}>
|
26
26
|
<UserAvatar onClick={() => router.push('/me')} size={32} />
|
27
|
-
<
|
27
|
+
<ProductLogo />
|
28
28
|
{enableWebrtc && <SyncStatusInspector placement={'bottom'} />}
|
29
29
|
</Flexbox>
|
30
30
|
}
|
@@ -2,6 +2,8 @@ import { Button } from 'antd';
|
|
2
2
|
import { memo } from 'react';
|
3
3
|
import { useTranslation } from 'react-i18next';
|
4
4
|
|
5
|
+
import { BRANDING_NAME } from '@/const/branding';
|
6
|
+
|
5
7
|
const ExportConfigButton = memo<{ primary?: boolean; state: any }>(({ state, primary }) => {
|
6
8
|
const { t } = useTranslation('migration');
|
7
9
|
|
@@ -14,7 +16,7 @@ const ExportConfigButton = memo<{ primary?: boolean; state: any }>(({ state, pri
|
|
14
16
|
|
15
17
|
const a = document.createElement('a');
|
16
18
|
a.href = url;
|
17
|
-
a.download =
|
19
|
+
a.download = `${BRANDING_NAME}-backup-v1.json`;
|
18
20
|
|
19
21
|
document.body.append(a);
|
20
22
|
a.click();
|
@@ -6,6 +6,7 @@ import { useTranslation } from 'react-i18next';
|
|
6
6
|
import { Center } from 'react-layout-kit';
|
7
7
|
|
8
8
|
import DataStyleModal from '@/components/DataStyleModal';
|
9
|
+
import { BRANDING_NAME } from '@/const/branding';
|
9
10
|
|
10
11
|
import Failed from './Failed';
|
11
12
|
import MigrationStart from './Start';
|
@@ -51,7 +52,7 @@ const MigrationModal = memo<MigrationModalProps>(({ setOpen, open, state: dbStat
|
|
51
52
|
icon={<Icon icon={CheckCircle} />}
|
52
53
|
status={'success'}
|
53
54
|
style={{ paddingBlock: 24 }}
|
54
|
-
subTitle={t('dbV1.upgrade.success.subTitle')}
|
55
|
+
subTitle={t('dbV1.upgrade.success.subTitle', { appName: BRANDING_NAME })}
|
55
56
|
title={t('dbV1.upgrade.success.title')}
|
56
57
|
/>
|
57
58
|
);
|
@@ -71,7 +72,7 @@ const MigrationModal = memo<MigrationModalProps>(({ setOpen, open, state: dbStat
|
|
71
72
|
};
|
72
73
|
|
73
74
|
return (
|
74
|
-
<DataStyleModal icon={CpuIcon} open={open} title={t('dbV1.title')}>
|
75
|
+
<DataStyleModal icon={CpuIcon} open={open} title={t('dbV1.title', { appName: BRANDING_NAME })}>
|
75
76
|
<Center gap={48}>{renderContent()}</Center>
|
76
77
|
</DataStyleModal>
|
77
78
|
);
|
@@ -6,6 +6,8 @@ import { useTranslation } from 'react-i18next';
|
|
6
6
|
import { Center, Flexbox } from 'react-layout-kit';
|
7
7
|
import Balancer from 'react-wrap-balancer';
|
8
8
|
|
9
|
+
import { BRANDING_NAME } from '@/const/branding';
|
10
|
+
|
9
11
|
import ExportConfigButton from './ExportConfigButton';
|
10
12
|
import UpgradeButton, { UpgradeButtonProps } from './UpgradeButton';
|
11
13
|
|
@@ -72,7 +74,7 @@ const MigrationStart = memo<UpgradeButtonProps>((props) => {
|
|
72
74
|
<>
|
73
75
|
<Flexbox>
|
74
76
|
<Flexbox className={styles.intro} style={{ textAlign: 'center' }} width={460}>
|
75
|
-
{t('dbV1.description')}
|
77
|
+
{t('dbV1.description', { appName: BRANDING_NAME })}
|
76
78
|
</Flexbox>
|
77
79
|
</Flexbox>
|
78
80
|
<Flexbox gap={32}>
|
@@ -96,7 +98,7 @@ const MigrationStart = memo<UpgradeButtonProps>((props) => {
|
|
96
98
|
<UpgradeButton {...props} />
|
97
99
|
</Flexbox>
|
98
100
|
<Flexbox align={'center'} className={styles.hint}>
|
99
|
-
<Balancer>{t('dbV1.upgradeTip')}</Balancer>
|
101
|
+
<Balancer>{t('dbV1.upgradeTip', { appName: BRANDING_NAME })}</Balancer>
|
100
102
|
</Flexbox>
|
101
103
|
</Flexbox>
|
102
104
|
</>
|
@@ -9,6 +9,7 @@ import { Trans, useTranslation } from 'react-i18next';
|
|
9
9
|
import { Center, Flexbox } from 'react-layout-kit';
|
10
10
|
|
11
11
|
import FeatureList from '@/components/FeatureList';
|
12
|
+
import { LOBE_CHAT_CLOUD } from '@/const/branding';
|
12
13
|
import { DATABASE_SELF_HOSTING_URL, OFFICIAL_URL, UTM_SOURCE } from '@/const/url';
|
13
14
|
|
14
15
|
const BLOCK_SIZE = 100;
|
@@ -136,7 +137,7 @@ const NotSupportClient = () => {
|
|
136
137
|
<Link
|
137
138
|
href={`${OFFICIAL_URL}?utm_source=${UTM_SOURCE}&utm_medium=client_not_support_file`}
|
138
139
|
>
|
139
|
-
|
140
|
+
{LOBE_CHAT_CLOUD}
|
140
141
|
</Link>
|
141
142
|
</Trans>
|
142
143
|
</Typography.Text>
|
@@ -1,10 +1,11 @@
|
|
1
1
|
'use client';
|
2
2
|
|
3
3
|
import { ChatHeader } from '@lobehub/ui';
|
4
|
-
import { LobeChat } from '@lobehub/ui/brand';
|
5
4
|
import { createStyles } from 'antd-style';
|
6
5
|
import { memo } from 'react';
|
7
6
|
|
7
|
+
import { ProductLogo } from '@/components/Branding';
|
8
|
+
|
8
9
|
import ShareAgentButton from '../../features/ShareAgentButton';
|
9
10
|
|
10
11
|
export const useStyles = createStyles(({ css, token }) => ({
|
@@ -19,7 +20,7 @@ const Header = memo(() => {
|
|
19
20
|
|
20
21
|
return (
|
21
22
|
<ChatHeader
|
22
|
-
left={<
|
23
|
+
left={<ProductLogo className={styles.logo} extra={'Discover'} size={36} />}
|
23
24
|
right={<ShareAgentButton />}
|
24
25
|
/>
|
25
26
|
);
|
@@ -5,6 +5,7 @@ import Image from 'next/image';
|
|
5
5
|
import { memo } from 'react';
|
6
6
|
import { useTranslation } from 'react-i18next';
|
7
7
|
|
8
|
+
import { BRANDING_NAME } from '@/const/branding';
|
8
9
|
import { AGENTS_INDEX_GITHUB, imageUrl } from '@/const/url';
|
9
10
|
|
10
11
|
const Inner = memo(() => {
|
@@ -20,7 +21,7 @@ const Inner = memo(() => {
|
|
20
21
|
/>
|
21
22
|
<h3>
|
22
23
|
<Tag color={'cyan'}>{t('guide.func1.tag')}</Tag>
|
23
|
-
<span>{t('guide.func1.title')}</span>
|
24
|
+
<span>{t('guide.func1.title', { appName: BRANDING_NAME })}</span>
|
24
25
|
</h3>
|
25
26
|
<p>
|
26
27
|
<kbd>
|
@@ -5,6 +5,7 @@ import { Switch } from 'antd';
|
|
5
5
|
import { memo } from 'react';
|
6
6
|
import { useTranslation } from 'react-i18next';
|
7
7
|
|
8
|
+
import { BRANDING_NAME } from '@/const/branding';
|
8
9
|
import { FORM_STYLE } from '@/const/layoutTokens';
|
9
10
|
import { useUserStore } from '@/store/user';
|
10
11
|
import { preferenceSelectors } from '@/store/user/selectors';
|
@@ -27,7 +28,7 @@ const Analytics = memo(() => {
|
|
27
28
|
}}
|
28
29
|
/>
|
29
30
|
),
|
30
|
-
desc: t('analytics.telemetry.desc'),
|
31
|
+
desc: t('analytics.telemetry.desc', { appName: BRANDING_NAME }),
|
31
32
|
label: t('analytics.telemetry.title'),
|
32
33
|
minWidth: undefined,
|
33
34
|
valuePropName: 'checked',
|
@@ -6,6 +6,7 @@ import { memo } from 'react';
|
|
6
6
|
import { useTranslation } from 'react-i18next';
|
7
7
|
import { Center, Flexbox } from 'react-layout-kit';
|
8
8
|
|
9
|
+
import { BRANDING_NAME } from '@/const/branding';
|
9
10
|
import { MANUAL_UPGRADE_URL, OFFICIAL_SITE, RELEASES_URL } from '@/const/url';
|
10
11
|
import { CURRENT_VERSION } from '@/const/version';
|
11
12
|
import { useNewVersion } from '@/features/User/UserPanel/useNewVersion';
|
@@ -37,11 +38,11 @@ const Version = memo<{ mobile?: boolean }>(({ mobile }) => {
|
|
37
38
|
<Flexbox align={'center'} flex={'none'} gap={16} horizontal>
|
38
39
|
<Link href={OFFICIAL_SITE} target={'_blank'}>
|
39
40
|
<Center className={styles.logo} height={64} width={64}>
|
40
|
-
<Image alt={
|
41
|
+
<Image alt={BRANDING_NAME} height={52} src={'/icons/icon-192x192.png'} width={52} />
|
41
42
|
</Center>
|
42
43
|
</Link>
|
43
44
|
<Flexbox>
|
44
|
-
<div style={{ fontSize: 18, fontWeight: 'bolder' }}>
|
45
|
+
<div style={{ fontSize: 18, fontWeight: 'bolder' }}>{BRANDING_NAME}</div>
|
45
46
|
<div>
|
46
47
|
<Tag color={theme.colorFillSecondary} style={{ color: theme.colorTextSecondary }}>
|
47
48
|
v{CURRENT_VERSION}
|
@@ -8,6 +8,7 @@ import { memo } from 'react';
|
|
8
8
|
import { useTranslation } from 'react-i18next';
|
9
9
|
import { Flexbox } from 'react-layout-kit';
|
10
10
|
|
11
|
+
import { BRANDING_NAME } from '@/const/branding';
|
11
12
|
import {
|
12
13
|
BLOG,
|
13
14
|
DISCORD,
|
@@ -45,7 +46,11 @@ const Page = memo<{ mobile?: boolean }>(({ mobile }) => {
|
|
45
46
|
|
46
47
|
return (
|
47
48
|
<>
|
48
|
-
<Form.Group
|
49
|
+
<Form.Group
|
50
|
+
style={{ width: '100%' }}
|
51
|
+
title={`${t('about')} ${BRANDING_NAME}`}
|
52
|
+
variant={'pure'}
|
53
|
+
>
|
49
54
|
<Flexbox gap={20} paddingBlock={20} width={'100%'}>
|
50
55
|
<div className={styles.title}>{t('version')}</div>
|
51
56
|
<Version mobile={mobile} />
|
@@ -6,6 +6,8 @@ import { memo } from 'react';
|
|
6
6
|
import { useTranslation } from 'react-i18next';
|
7
7
|
import { Flexbox } from 'react-layout-kit';
|
8
8
|
|
9
|
+
import { BRANDING_NAME } from '@/const/branding';
|
10
|
+
|
9
11
|
const useStyles = createStyles(({ css, token }) => {
|
10
12
|
return {
|
11
13
|
desc: css`
|
@@ -43,7 +45,7 @@ const Hero = memo(() => {
|
|
43
45
|
justify={'center'}
|
44
46
|
wrap={'wrap'}
|
45
47
|
>
|
46
|
-
<strong style={{ fontSize: 'min(56px, 8vw)' }}>
|
48
|
+
<strong style={{ fontSize: 'min(56px, 8vw)' }}>{BRANDING_NAME}</strong>
|
47
49
|
<span>{t('slogan.title')}</span>
|
48
50
|
</Flexbox>
|
49
51
|
<Flexbox
|
@@ -1,4 +1,5 @@
|
|
1
1
|
import StructuredData from '@/components/StructuredData';
|
2
|
+
import { BRANDING_NAME } from '@/const/branding';
|
2
3
|
import { ldModule } from '@/server/ld';
|
3
4
|
import { metadataModule } from '@/server/metadata';
|
4
5
|
import { translation } from '@/server/translation';
|
@@ -11,8 +12,8 @@ import Logo from './features/Logo';
|
|
11
12
|
export const generateMetadata = async () => {
|
12
13
|
const { t } = await translation('metadata');
|
13
14
|
return metadataModule.generate({
|
14
|
-
description: t('welcome.description'),
|
15
|
-
title: t('welcome.title'),
|
15
|
+
description: t('welcome.description', { appName: BRANDING_NAME }),
|
16
|
+
title: t('welcome.title', { appName: BRANDING_NAME }),
|
16
17
|
url: '/welcome',
|
17
18
|
});
|
18
19
|
};
|
@@ -21,8 +22,8 @@ const Page = async () => {
|
|
21
22
|
const mobile = isMobileDevice();
|
22
23
|
const { t } = await translation('metadata');
|
23
24
|
const ld = ldModule.generate({
|
24
|
-
description: t('welcome.description'),
|
25
|
-
title: t('welcome.title'),
|
25
|
+
description: t('welcome.description', { appName: BRANDING_NAME }),
|
26
|
+
title: t('welcome.title', { appName: BRANDING_NAME }),
|
26
27
|
url: '/welcome',
|
27
28
|
});
|
28
29
|
|
package/src/app/metadata.ts
CHANGED
@@ -1,11 +1,10 @@
|
|
1
1
|
import { Metadata } from 'next';
|
2
2
|
|
3
3
|
import { appEnv } from '@/config/app';
|
4
|
+
import { BRANDING_NAME } from '@/const/branding';
|
4
5
|
import { OFFICIAL_URL, OG_URL } from '@/const/url';
|
5
6
|
import { translation } from '@/server/translation';
|
6
7
|
|
7
|
-
const title = 'LobeChat';
|
8
|
-
|
9
8
|
const BASE_PATH = appEnv.NEXT_PUBLIC_BASE_PATH;
|
10
9
|
|
11
10
|
// if there is a base path, then we don't need the manifest
|
@@ -17,9 +16,9 @@ export const generateMetadata = async (): Promise<Metadata> => {
|
|
17
16
|
return {
|
18
17
|
appleWebApp: {
|
19
18
|
statusBarStyle: 'black-translucent',
|
20
|
-
title,
|
19
|
+
title: BRANDING_NAME,
|
21
20
|
},
|
22
|
-
description: t('chat.description'),
|
21
|
+
description: t('chat.description', { appName: BRANDING_NAME }),
|
23
22
|
icons: {
|
24
23
|
apple: '/apple-touch-icon.png?v=1',
|
25
24
|
icon: '/favicon.ico?v=1',
|
@@ -28,31 +27,31 @@ export const generateMetadata = async (): Promise<Metadata> => {
|
|
28
27
|
manifest: noManifest ? undefined : '/manifest.json',
|
29
28
|
metadataBase: new URL(OFFICIAL_URL),
|
30
29
|
openGraph: {
|
31
|
-
description: t('chat.description'),
|
30
|
+
description: t('chat.description', { appName: BRANDING_NAME }),
|
32
31
|
images: [
|
33
32
|
{
|
34
|
-
alt: t('chat.title'),
|
33
|
+
alt: t('chat.title', { appName: BRANDING_NAME }),
|
35
34
|
height: 640,
|
36
35
|
url: OG_URL,
|
37
36
|
width: 1200,
|
38
37
|
},
|
39
38
|
],
|
40
39
|
locale: 'en-US',
|
41
|
-
siteName:
|
42
|
-
title:
|
40
|
+
siteName: BRANDING_NAME,
|
41
|
+
title: BRANDING_NAME,
|
43
42
|
type: 'website',
|
44
43
|
url: OFFICIAL_URL,
|
45
44
|
},
|
46
45
|
title: {
|
47
|
-
default: t('chat.title'),
|
48
|
-
template:
|
46
|
+
default: t('chat.title', { appName: BRANDING_NAME }),
|
47
|
+
template: `%s · ${BRANDING_NAME}`,
|
49
48
|
},
|
50
49
|
twitter: {
|
51
50
|
card: 'summary_large_image',
|
52
|
-
description: t('chat.description'),
|
51
|
+
description: t('chat.description', { appName: BRANDING_NAME }),
|
53
52
|
images: [OG_URL],
|
54
53
|
site: '@lobehub',
|
55
|
-
title: t('chat.title'),
|
54
|
+
title: t('chat.title', { appName: BRANDING_NAME }),
|
56
55
|
},
|
57
56
|
};
|
58
57
|
};
|
@@ -0,0 +1,14 @@
|
|
1
|
+
import { LobeChat } from '@lobehub/ui/brand';
|
2
|
+
import { memo } from 'react';
|
3
|
+
|
4
|
+
interface ProductLogoProps {
|
5
|
+
className?: string;
|
6
|
+
extra?: string;
|
7
|
+
size?: number;
|
8
|
+
}
|
9
|
+
|
10
|
+
export const ProductLogo = memo<ProductLogoProps>(({ size, className, extra }) => {
|
11
|
+
return <LobeChat className={className} extra={extra} size={size} type={'text'} />;
|
12
|
+
});
|
13
|
+
|
14
|
+
export default ProductLogo;
|
@@ -0,0 +1 @@
|
|
1
|
+
export { ProductLogo } from './ProductLogo';
|
@@ -2,8 +2,13 @@
|
|
2
2
|
import { z } from 'zod';
|
3
3
|
|
4
4
|
export const FeatureFlagsSchema = z.object({
|
5
|
+
/**
|
6
|
+
*
|
7
|
+
*/
|
5
8
|
webrtc_sync: z.boolean().optional(),
|
9
|
+
check_updates: z.boolean().optional(),
|
6
10
|
|
11
|
+
// settings
|
7
12
|
language_model_settings: z.boolean().optional(),
|
8
13
|
|
9
14
|
openai_api_key: z.boolean().optional(),
|
@@ -13,19 +18,20 @@ export const FeatureFlagsSchema = z.object({
|
|
13
18
|
edit_agent: z.boolean().optional(),
|
14
19
|
|
15
20
|
dalle: z.boolean().optional(),
|
21
|
+
speech_to_text: z.boolean().optional(),
|
22
|
+
token_counter: z.boolean().optional(),
|
16
23
|
|
17
|
-
check_updates: z.boolean().optional(),
|
18
24
|
welcome_suggest: z.boolean().optional(),
|
19
25
|
|
20
26
|
clerk_sign_up: z.boolean().optional(),
|
21
27
|
|
22
|
-
cloud_promotion: z.boolean().optional(),
|
23
|
-
|
24
28
|
market: z.boolean().optional(),
|
25
|
-
speech_to_text: z.boolean().optional(),
|
26
|
-
|
27
29
|
knowledge_base: z.boolean().optional(),
|
30
|
+
|
28
31
|
rag_eval: z.boolean().optional(),
|
32
|
+
|
33
|
+
// internal flag
|
34
|
+
cloud_promotion: z.boolean().optional(),
|
29
35
|
});
|
30
36
|
|
31
37
|
export type IFeatureFlags = z.infer<typeof FeatureFlagsSchema>;
|
@@ -10,14 +10,14 @@ const Groq: ModelProviderCard = {
|
|
10
10
|
enabled: true,
|
11
11
|
functionCall: true,
|
12
12
|
id: 'llama-3.1-8b-instant',
|
13
|
-
tokens:
|
13
|
+
tokens: 131_072,
|
14
14
|
},
|
15
15
|
{
|
16
16
|
displayName: 'Llama 3.1 70B (Preview)',
|
17
17
|
enabled: true,
|
18
18
|
functionCall: true,
|
19
19
|
id: 'llama-3.1-70b-versatile',
|
20
|
-
tokens:
|
20
|
+
tokens: 131_072,
|
21
21
|
},
|
22
22
|
/*
|
23
23
|
// Offline due to overwhelming demand! Stay tuned for updates.
|
@@ -25,7 +25,7 @@ const Groq: ModelProviderCard = {
|
|
25
25
|
displayName: 'Llama 3.1 405B (Preview)',
|
26
26
|
functionCall: true,
|
27
27
|
id: 'llama-3.1-405b-reasoning',
|
28
|
-
tokens:
|
28
|
+
tokens: 8_192,
|
29
29
|
},
|
30
30
|
*/
|
31
31
|
{
|
@@ -9,6 +9,7 @@ import { memo } from 'react';
|
|
9
9
|
import { useTranslation } from 'react-i18next';
|
10
10
|
import { Flexbox } from 'react-layout-kit';
|
11
11
|
|
12
|
+
import { BRANDING_NAME } from '@/const/branding';
|
12
13
|
import { USAGE_DOCUMENTS } from '@/const/url';
|
13
14
|
import { useSendMessage } from '@/features/ChatInput/useSend';
|
14
15
|
import { useChatStore } from '@/store/chat';
|
@@ -81,7 +82,7 @@ const QuestionSuggest = memo<{ mobile?: boolean }>(({ mobile }) => {
|
|
81
82
|
</Flexbox>
|
82
83
|
<Flexbox gap={8} horizontal wrap={'wrap'}>
|
83
84
|
{qa.slice(0, mobile ? 2 : 5).map((item) => {
|
84
|
-
const text = t(`guide.qa.${item}` as any);
|
85
|
+
const text = t(`guide.qa.${item}` as any, { appName: BRANDING_NAME });
|
85
86
|
return (
|
86
87
|
<Flexbox
|
87
88
|
align={'center'}
|
@@ -6,6 +6,7 @@ import { memo } from 'react';
|
|
6
6
|
import { useTranslation } from 'react-i18next';
|
7
7
|
import { Center, Flexbox } from 'react-layout-kit';
|
8
8
|
|
9
|
+
import { BRANDING_NAME } from '@/const/branding';
|
9
10
|
import { useGreeting } from '@/hooks/useGreeting';
|
10
11
|
import { featureFlagsSelectors, useServerConfigStore } from '@/store/serverConfig';
|
11
12
|
|
@@ -52,7 +53,9 @@ const InboxWelcome = memo(() => {
|
|
52
53
|
<h1 className={styles.title}>{greeting}</h1>
|
53
54
|
</Flexbox>
|
54
55
|
<Markdown className={styles.desc} variant={'chat'}>
|
55
|
-
{t(showCreateSession ? 'guide.defaultMessage' : 'guide.defaultMessageWithoutCreate'
|
56
|
+
{t(showCreateSession ? 'guide.defaultMessage' : 'guide.defaultMessageWithoutCreate', {
|
57
|
+
appName: BRANDING_NAME,
|
58
|
+
})}
|
56
59
|
</Markdown>
|
57
60
|
{showWelcomeSuggest && (
|
58
61
|
<>
|
@@ -7,6 +7,7 @@ import { useTranslation } from 'react-i18next';
|
|
7
7
|
import { Flexbox } from 'react-layout-kit';
|
8
8
|
|
9
9
|
import ManifestPreviewer from '@/components/ManifestPreviewer';
|
10
|
+
import { BRANDING_NAME } from '@/const/branding';
|
10
11
|
import { toolService } from '@/services/tool';
|
11
12
|
import { useToolStore } from '@/store/tool';
|
12
13
|
import { pluginSelectors } from '@/store/tool/selectors';
|
@@ -49,7 +50,7 @@ const UrlManifestForm = memo<{ form: FormInstance; isEditMode: boolean }>(
|
|
49
50
|
<FormItem
|
50
51
|
extra={
|
51
52
|
<Flexbox horizontal justify={'space-between'} style={{ marginTop: 8 }}>
|
52
|
-
{t('dev.meta.manifest.desc')}
|
53
|
+
{t('dev.meta.manifest.desc', { appName: BRANDING_NAME })}
|
53
54
|
{manifest && (
|
54
55
|
<ManifestPreviewer manifest={manifest}>
|
55
56
|
<ActionIcon
|
@@ -10,6 +10,7 @@ import { Center, Flexbox } from 'react-layout-kit';
|
|
10
10
|
|
11
11
|
import GuideModal from '@/components/GuideModal';
|
12
12
|
import GuideVideo from '@/components/GuideVideo';
|
13
|
+
import { BRANDING_NAME } from '@/const/branding';
|
13
14
|
import { GITHUB, GITHUB_ISSUES } from '@/const/url';
|
14
15
|
import { isOnServerSide } from '@/utils/env';
|
15
16
|
|
@@ -79,7 +80,7 @@ const Footer = memo<PropsWithChildren>(() => {
|
|
79
80
|
<GuideModal
|
80
81
|
cancelText={t('footer.later')}
|
81
82
|
cover={<GuideVideo height={269} src={'/videos/feedback.mp4?v=1'} width={358} />}
|
82
|
-
desc={t('footer.feedback.desc')}
|
83
|
+
desc={t('footer.feedback.desc', { appName: BRANDING_NAME })}
|
83
84
|
okText={t('footer.feedback.action')}
|
84
85
|
onCancel={() => setOpenFeedback(false)}
|
85
86
|
onOk={() => {
|
@@ -56,7 +56,7 @@ export default {
|
|
56
56
|
and: '并',
|
57
57
|
feedback: {
|
58
58
|
action: '分享反馈',
|
59
|
-
desc: '您的每一个想法和建议对我们来说都弥足珍贵,我们迫不及待地想知道您的看法!欢迎联系我们提供产品功能和使用体验反馈,帮助我们将
|
59
|
+
desc: '您的每一个想法和建议对我们来说都弥足珍贵,我们迫不及待地想知道您的看法!欢迎联系我们提供产品功能和使用体验反馈,帮助我们将 {{appName}} 建设得更好。',
|
60
60
|
title: '在 GitHub 分享您宝贵的反馈',
|
61
61
|
},
|
62
62
|
later: '稍后',
|
@@ -196,9 +196,9 @@ export default {
|
|
196
196
|
telemetry: {
|
197
197
|
allow: '允许',
|
198
198
|
deny: '拒绝',
|
199
|
-
desc: '我们希望匿名获取你的使用信息,进而帮助我们改进
|
199
|
+
desc: '我们希望匿名获取你的使用信息,进而帮助我们改进 {{appName}},并为你提供更好的产品体验。你可以在「设置」 - 「关于」随时关闭。',
|
200
200
|
learnMore: '了解更多',
|
201
|
-
title: '帮助
|
201
|
+
title: '帮助 {{appName}} 做得更好',
|
202
202
|
},
|
203
203
|
temp: '临时',
|
204
204
|
terms: '服务条款',
|
@@ -1,20 +1,20 @@
|
|
1
1
|
export default {
|
2
2
|
chat: {
|
3
|
-
description: '
|
4
|
-
title: '
|
3
|
+
description: '{{appName}} 带给你最好的 ChatGPT, Claude , Gemini, OLLaMA WebUI 使用体验',
|
4
|
+
title: '{{appName}}:个人 AI 效能工具,给自己一个更聪明的大脑',
|
5
5
|
},
|
6
6
|
market: {
|
7
7
|
description:
|
8
|
-
'内容创作、文案、问答、图像生成、视频生成、语音生成、智能 Agent、自动化工作流,定制你专属的 AI
|
8
|
+
'内容创作、文案、问答、图像生成、视频生成、语音生成、智能 Agent、自动化工作流,定制你专属的 AI 智能助手',
|
9
9
|
title: '助手市场',
|
10
10
|
},
|
11
11
|
plugins: {
|
12
12
|
description:
|
13
|
-
'搜素、图表生成、学术、图像生成、视频生成、语音生成、自动化工作流,定制 ChatGPT /
|
13
|
+
'搜素、图表生成、学术、图像生成、视频生成、语音生成、自动化工作流,定制 ChatGPT / Claude 专属的 ToolCall 插件能力',
|
14
14
|
title: '插件市场',
|
15
15
|
},
|
16
16
|
welcome: {
|
17
|
-
description: '
|
18
|
-
title: '欢迎使用
|
17
|
+
description: '{{appName}} 带给你最好的 ChatGPT, Claude , Gemini, OLLaMA WebUI 使用体验',
|
18
|
+
title: '欢迎使用 {{appName}}:个人 AI 效能工具,给自己一个更聪明的大脑',
|
19
19
|
},
|
20
20
|
};
|
@@ -11,7 +11,7 @@ export default {
|
|
11
11
|
confirm: '即将清空本地数据(全局设置不受影响),请确认你已经下载了数据备份。',
|
12
12
|
},
|
13
13
|
description:
|
14
|
-
'在新版本中,
|
14
|
+
'在新版本中,{{appName}} 的数据存储有了巨大的飞跃。因此我们要对旧版数据进行升级,进而为你带来更好的使用体验。',
|
15
15
|
features: {
|
16
16
|
capability: {
|
17
17
|
desc: '基于 IndexedDB 技术,足以装下你一生的会话消息',
|
@@ -26,7 +26,7 @@ export default {
|
|
26
26
|
title: '更易用',
|
27
27
|
},
|
28
28
|
},
|
29
|
-
title: '
|
29
|
+
title: '{{appName}} 数据进化',
|
30
30
|
upgrade: {
|
31
31
|
error: {
|
32
32
|
subTitle:
|
@@ -34,11 +34,11 @@ export default {
|
|
34
34
|
title: '数据库升级失败',
|
35
35
|
},
|
36
36
|
success: {
|
37
|
-
subTitle: '
|
37
|
+
subTitle: '{{appName}} 的数据库已经升级到最新版本,立即开始体验吧',
|
38
38
|
title: '数据库升级成功',
|
39
39
|
},
|
40
40
|
},
|
41
|
-
upgradeTip: '升级大致需要 10~20 秒,升级过程中请不要关闭
|
41
|
+
upgradeTip: '升级大致需要 10~20 秒,升级过程中请不要关闭 {{appName}}',
|
42
42
|
},
|
43
43
|
migrateError: {
|
44
44
|
missVersion: '导入数据缺少版本号,请检查文件后重试',
|