diff --git a/web/src/app.tsx b/web/src/app.tsx index e33201a9408dd94b22bd6d68cb433ef5bfa7d583..f4aa1502f7400680bc42cc08e5a440d86927866c 100644 --- a/web/src/app.tsx +++ b/web/src/app.tsx @@ -1,4 +1,4 @@ -import i18next from '@/locales/config'; +import { default as i18n, default as i18next } from '@/locales/config'; import { App, ConfigProvider, ConfigProviderProps } from 'antd'; import enUS from 'antd/locale/en_US'; import zhCN from 'antd/locale/zh_CN'; @@ -18,8 +18,12 @@ const RootProvider = ({ children }: React.PropsWithChildren) => { }); useEffect(() => { - i18next.changeLanguage(storage.getLanguage()); - }, [locale]); + // Because the language is saved in the backend, a token is required to obtain the api. However, the login page cannot obtain the language through the getUserInfo api, so the language needs to be saved in localstorage. + const lng = storage.getLanguage(); + if (lng) { + i18n.changeLanguage(lng); + } + }, []); return ( <ConfigProvider diff --git a/web/src/layouts/components/header/index.tsx b/web/src/layouts/components/header/index.tsx index d0d2827ae5e66adbb21362ba167b56029f362da9..3affb2282c061e69d4523d7fefd5c98305439ba4 100644 --- a/web/src/layouts/components/header/index.tsx +++ b/web/src/layouts/components/header/index.tsx @@ -1,16 +1,15 @@ import { ReactComponent as StarIon } from '@/assets/svg/chat-star.svg'; import { ReactComponent as KnowledgeBaseIcon } from '@/assets/svg/knowledge-base.svg'; import { ReactComponent as Logo } from '@/assets/svg/logo.svg'; +import { useTranslate } from '@/hooks/commonHooks'; +import { useNavigateWithFromState } from '@/hooks/routeHook'; import { Layout, Radio, Space, theme } from 'antd'; +import { useCallback, useMemo } from 'react'; +import { useLocation } from 'umi'; import Toolbar from '../right-toolbar'; import styles from './index.less'; -import { useNavigateWithFromState } from '@/hooks/routeHook'; -import { useCallback, useMemo } from 'react'; -import { useTranslation } from 'react-i18next'; -import { useLocation } from 'umi'; - const { Header } = Layout; const RagHeader = () => { @@ -19,7 +18,7 @@ const RagHeader = () => { } = theme.useToken(); const navigate = useNavigateWithFromState(); const { pathname } = useLocation(); - const { t } = useTranslation('translation', { keyPrefix: 'header' }); + const { t } = useTranslate('header'); const tagsData = useMemo( () => [ diff --git a/web/src/locales/en.ts b/web/src/locales/en.ts index 487b5c313b06ff1744c8d9e6424421c7c66c0632..661af3ca571073b2b0f9a448d9415017be30ed08 100644 --- a/web/src/locales/en.ts +++ b/web/src/locales/en.ts @@ -129,6 +129,7 @@ export default { uploadTitle: 'Click or drag file to this area to upload', uploadDescription: 'Support for a single or bulk upload. Strictly prohibited from uploading company data or other banned files.', + chunk: 'Chunk', }, knowledgeConfiguration: { titleDescription: @@ -256,6 +257,7 @@ export default { chunkMessage: 'Please input value!', }, chat: { + createAssistant: 'Create an Assistant', assistantSetting: 'Assistant Setting', promptEngine: 'Prompt Engine', modelSetting: 'Model Setting', @@ -383,7 +385,7 @@ export default { img2txtModel: 'Img2txt model', img2txtModelTip: 'The default multi-module model all the newly created knowledgebase will use. It can describe a picture or video.', - sequence2txtModel: 'Img2txt model', + sequence2txtModel: 'Sequence2txt model', sequence2txtModelTip: 'The default ASR model all the newly created knowledgebase will use. Use this model to translate voices to corresponding text.', workspace: 'Workspace', diff --git a/web/src/locales/zh.ts b/web/src/locales/zh.ts index aa79895f697bd10e623c3ae9f255c09f78fb2bf3..e2165ea72893cc55b66fea645b16ca4cd654559d 100644 --- a/web/src/locales/zh.ts +++ b/web/src/locales/zh.ts @@ -71,7 +71,7 @@ export default { searchFiles: 'ćśç´˘ć–‡ä»¶', localFiles: '本地文件', emptyFiles: '新建空文件', - chunkNumber: '模块数', + chunkNumber: 'ĺ†ĺť—ć•°', uploadDate: 'ä¸ŠäĽ ć—Ąćśź', chunkMethod: '解ćžć–ąćł•', enabled: 'ĺŻç”¨', @@ -94,7 +94,7 @@ export default { testTextPlaceholder: '请输入您的问é˘ďĽ', testingLabel: '测试', similarity: 'ć··ĺ相似度', - termSimilarity: '术čŻç›¸äĽĽĺş¦', + termSimilarity: '关键词相似度', vectorSimilarity: 'ĺ‘量相似度', hits: 'ĺ‘˝ä¸ć•°', view: 'çś‹ćł•', @@ -126,6 +126,7 @@ export default { uploadTitle: '点击ć–拖拽文件至ć¤ĺŚşĺźźĺŤłĺŹŻä¸ŠäĽ ', uploadDescription: '支ćŚĺŤ•ć¬ˇć–ć‰ąé‡Źä¸ŠäĽ ă€‚ 严ç¦ä¸ŠäĽ 公司数据ć–其他违ç¦ć–‡ä»¶ă€‚', + chunk: '解ćžĺť—', }, knowledgeConfiguration: { titleDescription: '在这里更新您的知识库详细信ćŻďĽŚĺ°¤ĺ…¶ćŻč§Łćžć–ąćł•ă€‚', @@ -248,6 +249,7 @@ export default { chunkMessage: '请输入值ďĽ', }, chat: { + createAssistant: '新建助ç†', assistantSetting: '助ç†č®ľç˝®', promptEngine: 'ćŹç¤şĺĽ•ć“Ž', modelSetting: '模型设置', @@ -368,7 +370,7 @@ export default { img2txtModel: 'Img2txt模型', img2txtModelTip: '所有新ĺ›ĺ»şçš„知识库é˝ĺ°†ä˝żç”¨é»č®¤çš„多模块模型。 ĺ®ĺŹŻä»ĄćŹŹčż°ĺ›ľç‰‡ć–视频。', - sequence2txtModel: 'Img2txt模型', + sequence2txtModel: 'Sequence2txt模型', sequence2txtModelTip: '所有新ĺ›ĺ»şçš„知识库é˝ĺ°†ä˝żç”¨é»č®¤çš„ ASR 模型。 使用ć¤ć¨ˇĺž‹ĺ°†čŻéźłçż»čŻ‘为相应的文本。', workspace: '工作空间', diff --git a/web/src/pages/add-knowledge/components/knowledge-chunk/components/chunk-creating-modal/index.tsx b/web/src/pages/add-knowledge/components/knowledge-chunk/components/chunk-creating-modal/index.tsx index 93f2382ac7d925bf3dfc0e4495e025ff2ecd23c6..23020b22ae5d65170a6f6a7d090a2d4765da2b95 100644 --- a/web/src/pages/add-knowledge/components/knowledge-chunk/components/chunk-creating-modal/index.tsx +++ b/web/src/pages/add-knowledge/components/knowledge-chunk/components/chunk-creating-modal/index.tsx @@ -1,7 +1,7 @@ import { useDeleteChunkByIds } from '@/hooks/knowledgeHook'; import { useOneNamespaceEffectsLoading } from '@/hooks/storeHooks'; import { DeleteOutlined } from '@ant-design/icons'; -import { Checkbox, Form, Input, Modal, Space } from 'antd'; +import { Checkbox, Divider, Form, Input, Modal, Space } from 'antd'; import React, { useCallback, useEffect, useState } from 'react'; import { useTranslation } from 'react-i18next'; import { useDispatch, useSelector } from 'umi'; @@ -115,7 +115,7 @@ const ChunkCreatingModal: React.FC<kFProps> = ({ doc_id, chunkId }) => { </section> {chunkId && ( <section> - <p>{t('chunk.function')} *</p> + <Divider></Divider> <Space size={'large'}> <Checkbox onChange={handleCheck} checked={checked}> {t('chunk.enabled')} diff --git a/web/src/pages/add-knowledge/index.tsx b/web/src/pages/add-knowledge/index.tsx index 68df6039955883bb6187698a69d9b8c137764bc8..f27d9e33fce0f904b30db064b2b35d2b3c627d1b 100644 --- a/web/src/pages/add-knowledge/index.tsx +++ b/web/src/pages/add-knowledge/index.tsx @@ -10,11 +10,7 @@ import { useEffect, useMemo } from 'react'; import { useTranslation } from 'react-i18next'; import { Link, Outlet, useDispatch, useLocation } from 'umi'; import Siderbar from './components/knowledge-sidebar'; -import { - KnowledgeDatasetRouteKey, - KnowledgeRouteKey, - datasetRouteMap, -} from './constant'; +import { KnowledgeDatasetRouteKey, KnowledgeRouteKey } from './constant'; import styles from './index.less'; const KnowledgeAdding = () => { @@ -55,7 +51,7 @@ const KnowledgeAdding = () => { if (datasetActiveKey) { items.push({ - title: datasetRouteMap[datasetActiveKey], + title: t(`knowledgeDetails.${datasetActiveKey}`), }); } diff --git a/web/src/pages/chat/index.tsx b/web/src/pages/chat/index.tsx index ba18215e78d9d68d63af65eba74ab51c84d726e8..4086471c01da704708b762987035101f5f3d0cfd 100644 --- a/web/src/pages/chat/index.tsx +++ b/web/src/pages/chat/index.tsx @@ -204,7 +204,7 @@ const Chat = () => { <Flex className={styles.chatAppWrapper}> <Flex flex={1} vertical> <Button type="primary" onClick={handleShowChatConfigurationModal()}> - Create an Assistant + {t('createAssistant')} </Button> <Divider></Divider> <Flex className={styles.chatAppContent} vertical gap={10}> diff --git a/web/src/pages/user-setting/model.ts b/web/src/pages/user-setting/model.ts index 5fffd8f4cf7057e7da6517fe3ef58f66ed7fbb3c..fa4add77b32754c872c5f1911cba657c00736d01 100644 --- a/web/src/pages/user-setting/model.ts +++ b/web/src/pages/user-setting/model.ts @@ -66,6 +66,7 @@ const model: DvaModel<SettingModelState> = { // }; // authorizationUtil.setUserInfo(userInfo); if (retcode === 0) { + i18n.changeLanguage(res.language === 'Chinese' ? 'zh' : 'en'); yield put({ type: 'setUserInfo', payload: res }); // localStorage.setItem('userInfo',res.) }