From de166d0ff24dc56f1d06b255052f5d3db2918130 Mon Sep 17 00:00:00 2001 From: balibabu Date: Tue, 29 Apr 2025 18:20:46 +0800 Subject: [PATCH] Feat: Add a language switch drop-down box to the top navigation bar #3221 (#7416) ### What problem does this PR solve? Feat: Add a language switch drop-down box to the top navigation bar #3221 ### Type of change - [x] New Feature (non-breaking change which adds functionality) --- web/src/layouts/next-header.tsx | 117 +++++++++++++----- .../components/knowledge-file/index.tsx | 3 +- 2 files changed, 87 insertions(+), 33 deletions(-) diff --git a/web/src/layouts/next-header.tsx b/web/src/layouts/next-header.tsx index 94c076619..f071f0e9f 100644 --- a/web/src/layouts/next-header.tsx +++ b/web/src/layouts/next-header.tsx @@ -1,39 +1,87 @@ +import { useTheme } from '@/components/theme-provider'; import { Avatar, AvatarFallback, AvatarImage } from '@/components/ui/avatar'; +import { Badge } from '@/components/ui/badge'; import { Button } from '@/components/ui/button'; -import { Container } from '@/components/ui/container'; +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuTrigger, +} from '@/components/ui/dropdown-menu'; import { Segmented, SegmentedValue } from '@/components/ui/segmented'; -import { useTranslate } from '@/hooks/common-hooks'; +import { LanguageList, LanguageMap } from '@/constants/common'; +import { useChangeLanguage } from '@/hooks/logic-hooks'; import { useNavigatePage } from '@/hooks/logic-hooks/navigate-hooks'; import { useNavigateWithFromState } from '@/hooks/route-hook'; +import { useFetchUserInfo, useListTenant } from '@/hooks/user-setting-hooks'; +import { TenantRole } from '@/pages/user-setting/constants'; import { Routes } from '@/routes'; +import { camelCase } from 'lodash'; import { ChevronDown, + CircleHelp, Cpu, File, Github, House, Library, MessageSquareText, + Moon, Search, - Zap, + Sun, } from 'lucide-react'; -import { useCallback, useMemo } from 'react'; +import React, { useCallback, useMemo } from 'react'; +import { useTranslation } from 'react-i18next'; import { useLocation } from 'umi'; +const handleDocHelpCLick = () => { + window.open('https://ragflow.io/docs/dev/category/guides', 'target'); +}; + export function Header() { - const { t } = useTranslate('header'); + const { t } = useTranslation(); const { pathname } = useLocation(); const navigate = useNavigateWithFromState(); const { navigateToProfile } = useNavigatePage(); + const changeLanguage = useChangeLanguage(); + const { setTheme, theme } = useTheme(); + + const { + data: { language = 'English' }, + } = useFetchUserInfo(); + + const handleItemClick = (key: string) => () => { + changeLanguage(key); + }; + + const { data } = useListTenant(); + + const showBell = useMemo(() => { + return data.some((x) => x.role === TenantRole.Invite); + }, [data]); + + const items = LanguageList.map((x) => ({ + key: x, + label: {LanguageMap[x as keyof typeof LanguageMap]}, + })); + + const onThemeClick = React.useCallback(() => { + setTheme(theme === 'dark' ? 'light' : 'dark'); + }, [setTheme, theme]); + + const handleBellClick = useCallback(() => { + navigate('/user-setting/team'); + }, [navigate]); + const tagsData = useMemo( () => [ - { path: Routes.Home, name: t('home'), icon: House }, - { path: Routes.Datasets, name: t('knowledgeBase'), icon: Library }, - { path: Routes.Chats, name: t('chat'), icon: MessageSquareText }, - { path: Routes.Searches, name: t('search'), icon: Search }, - { path: Routes.Agents, name: t('flow'), icon: Cpu }, - { path: Routes.Files, name: t('fileManager'), icon: File }, + { path: Routes.Home, name: t('header.home'), icon: House }, + { path: Routes.Datasets, name: t('header.knowledgeBase'), icon: Library }, + { path: Routes.Chats, name: t('header.chat'), icon: MessageSquareText }, + { path: Routes.Searches, name: t('header.search'), icon: Search }, + { path: Routes.Agents, name: t('header.flow'), icon: Cpu }, + { path: Routes.Files, name: t('header.fileManager'), icon: File }, ], [t], ); @@ -87,30 +135,37 @@ export function Header() { value={currentPath} onChange={handleChange} > -
- - V 0.13.0 - - - - +
+ + +
+ {t(`common.${camelCase(language)}`)} + +
+
+ + {items.map((x) => ( + + {x.label} + + ))} + +
+ + +
+ CN - yifanwu92@gmail.com - - + +
); diff --git a/web/src/pages/add-knowledge/components/knowledge-file/index.tsx b/web/src/pages/add-knowledge/components/knowledge-file/index.tsx index 25acdbd2b..c9d2ab2ea 100644 --- a/web/src/pages/add-knowledge/components/knowledge-file/index.tsx +++ b/web/src/pages/add-knowledge/components/knowledge-file/index.tsx @@ -164,8 +164,7 @@ const KnowledgeFile = () => { text: t(`runningStatus${value}`), value: value, })), - onFilter: (value: string | number | boolean, record: IDocumentInfo) => - record.run === value, + onFilter: (value, record: IDocumentInfo) => record.run === value, render: (text, record) => { return ; },