diff --git a/api/core/rag/retrieval/dataset_retrieval.py b/api/core/rag/retrieval/dataset_retrieval.py index e00c989c9d..244611c750 100644 --- a/api/core/rag/retrieval/dataset_retrieval.py +++ b/api/core/rag/retrieval/dataset_retrieval.py @@ -52,6 +52,7 @@ from core.rag.retrieval.template_prompts import ( METADATA_FILTER_USER_PROMPT_2, METADATA_FILTER_USER_PROMPT_3, ) +from core.tools.entities.common_entities import I18nObject from core.tools.utils.dataset_retriever.dataset_retriever_base_tool import DatasetRetrieverBaseTool from extensions.ext_database import db from libs.json_in_md_parser import parse_and_check_json_markdown @@ -294,7 +295,10 @@ class DatasetRetrieval: for dataset in available_datasets: description = dataset.description if not description: - description = "useful for when you want to answer queries about the " + dataset.name + description = I18nObject( + en_US="useful for when you want to answer queries about the " + dataset.name, + zh_Hans="用于回答关于 " + dataset.name + " 的查询", + ) description = description.replace("\n", "").replace("\r", "") message_tool = PromptMessageTool( diff --git a/api/core/tools/utils/dataset_retriever/dataset_retriever_tool.py b/api/core/tools/utils/dataset_retriever/dataset_retriever_tool.py index 63260cfac3..fc3b61a191 100644 --- a/api/core/tools/utils/dataset_retriever/dataset_retriever_tool.py +++ b/api/core/tools/utils/dataset_retriever/dataset_retriever_tool.py @@ -6,6 +6,7 @@ from core.rag.datasource.retrieval_service import RetrievalService from core.rag.entities.context_entities import DocumentContext from core.rag.models.document import Document as RetrievalDocument from core.rag.retrieval.retrieval_methods import RetrievalMethod +from core.tools.entities.common_entities import I18nObject from core.tools.utils.dataset_retriever.dataset_retriever_base_tool import DatasetRetrieverBaseTool from extensions.ext_database import db from models.dataset import Dataset @@ -38,7 +39,10 @@ class DatasetRetrieverTool(DatasetRetrieverBaseTool): def from_dataset(cls, dataset: Dataset, **kwargs): description = dataset.description if not description: - description = "useful for when you want to answer queries about the " + dataset.name + description = I18nObject( + en_US="useful for when you want to answer queries about the " + dataset.name, + zh_Hans="用于回答关于 " + dataset.name + " 的查询", + ) description = description.replace("\n", "").replace("\r", "") return cls( diff --git a/api/services/dataset_service.py b/api/services/dataset_service.py index 61dc86a028..68c193a6ba 100644 --- a/api/services/dataset_service.py +++ b/api/services/dataset_service.py @@ -21,6 +21,7 @@ from core.plugin.entities.plugin import ModelProviderID from core.rag.index_processor.constant.built_in_field import BuiltInField from core.rag.index_processor.constant.index_type import IndexType from core.rag.retrieval.retrieval_methods import RetrievalMethod +from core.tools.entities.common_entities import I18nObject from events.dataset_event import dataset_was_deleted from events.document_event import document_was_deleted from extensions.ext_database import db @@ -1378,7 +1379,10 @@ class DocumentService: cut_length = 18 cut_name = documents[0].name[:cut_length] dataset.name = cut_name + "..." - dataset.description = "useful for when you want to answer queries about the " + documents[0].name + dataset.description = I18nObject( + en_US="useful for when you want to answer queries about the " + documents[0].name, + zh_Hans="用于回答关于 " + documents[0].name + " 的查询", + ) db.session.commit() return dataset, documents, batch diff --git a/web/app/(commonLayout)/datasets/Container.tsx b/web/app/(commonLayout)/datasets/Container.tsx index c1d9950bf3..95f8baea12 100644 --- a/web/app/(commonLayout)/datasets/Container.tsx +++ b/web/app/(commonLayout)/datasets/Container.tsx @@ -38,6 +38,8 @@ const Container = () => { const { showExternalApiPanel, setShowExternalApiPanel } = useExternalApiPanel() const [includeAll, { toggle: toggleIncludeAll }] = useBoolean(false) + document.title = `${t('dataset.knowledge')} - Dify` + const options = useMemo(() => { return [ { value: 'dataset', text: t('dataset.datasets') }, diff --git a/web/app/(commonLayout)/datasets/page.tsx b/web/app/(commonLayout)/datasets/page.tsx index 096a1b8979..678de47c94 100644 --- a/web/app/(commonLayout)/datasets/page.tsx +++ b/web/app/(commonLayout)/datasets/page.tsx @@ -4,8 +4,4 @@ const AppList = async () => { return } -export const metadata = { - title: 'Datasets - Dify', -} - export default AppList diff --git a/web/app/(commonLayout)/plugins/page.tsx b/web/app/(commonLayout)/plugins/page.tsx index a3066311b2..cc525992fa 100644 --- a/web/app/(commonLayout)/plugins/page.tsx +++ b/web/app/(commonLayout)/plugins/page.tsx @@ -13,8 +13,4 @@ const PluginList = async () => { ) } -export const metadata = { - title: 'Plugins - Dify', -} - export default PluginList diff --git a/web/app/components/base/app-icon-picker/ImageInput.tsx b/web/app/components/base/app-icon-picker/ImageInput.tsx index a973362ec8..9c0a95c021 100644 --- a/web/app/components/base/app-icon-picker/ImageInput.tsx +++ b/web/app/components/base/app-icon-picker/ImageInput.tsx @@ -4,6 +4,7 @@ import type { ChangeEvent, FC } from 'react' import { createRef, useEffect, useState } from 'react' import Cropper, { type Area, type CropperProps } from 'react-easy-crop' import classNames from 'classnames' +import { useTranslation } from 'react-i18next' import { ImagePlus } from '../icons/src/vender/line/images' import { useDraggableUploader } from './hooks' @@ -26,6 +27,7 @@ const ImageInput: FC = ({ cropShape, onImageInput, }) => { + const { t } = useTranslation() const [inputImage, setInputImage] = useState<{ file: File; url: string }>() const [isAnimatedImage, setIsAnimatedImage] = useState(false) useEffect(() => { @@ -103,8 +105,8 @@ const ImageInput: FC = ({ ? <>
- Drop your image here, or  - + {t('common.imageInput.dropImageHere')}  + ((e.target as HTMLInputElement).value = '')} @@ -112,7 +114,7 @@ const ImageInput: FC = ({ onChange={handleLocalFileInput} />
-
Supports PNG, JPG, JPEG, WEBP and GIF
+
{t('common.imageInput.supportedFormats')}
: handleShowImage() } diff --git a/web/app/components/plugins/plugin-page/index.tsx b/web/app/components/plugins/plugin-page/index.tsx index 74991938a2..eb28e17655 100644 --- a/web/app/components/plugins/plugin-page/index.tsx +++ b/web/app/components/plugins/plugin-page/index.tsx @@ -56,6 +56,8 @@ const PluginPage = ({ const searchParams = useSearchParams() const { replace } = useRouter() + document.title = `${t('plugin.metadata.title')} - Dify` + // just support install one package now const packageId = useMemo(() => { const idStrings = searchParams.get(PACKAGE_IDS_KEY) diff --git a/web/i18n/en-US/common.ts b/web/i18n/en-US/common.ts index 62e1d166ba..a0f2eebc8e 100644 --- a/web/i18n/en-US/common.ts +++ b/web/i18n/en-US/common.ts @@ -649,6 +649,11 @@ const translation = { pagination: { perPage: 'Items per page', }, + imageInput: { + dropImageHere: 'Drop your image here, or', + browse: 'browse', + supportedFormats: 'Supports PNG, JPG, JPEG, WEBP and GIF', + }, } export default translation diff --git a/web/i18n/en-US/plugin.ts b/web/i18n/en-US/plugin.ts index bdfcfb3e72..fd1a8c2a05 100644 --- a/web/i18n/en-US/plugin.ts +++ b/web/i18n/en-US/plugin.ts @@ -1,4 +1,7 @@ const translation = { + metadata: { + title: 'Plugins', + }, category: { all: 'All', models: 'Models', diff --git a/web/i18n/zh-Hans/common.ts b/web/i18n/zh-Hans/common.ts index 7ece3acf54..ef865263bc 100644 --- a/web/i18n/zh-Hans/common.ts +++ b/web/i18n/zh-Hans/common.ts @@ -649,6 +649,11 @@ const translation = { pagination: { perPage: '每页显示', }, + imageInput: { + dropImageHere: '将图片拖放到此处,或', + browse: '浏览', + supportedFormats: '支持PNG、JPG、JPEG、WEBP和GIF格式', + }, } export default translation diff --git a/web/i18n/zh-Hans/plugin.ts b/web/i18n/zh-Hans/plugin.ts index dfd13c6bf0..94b81ef1d5 100644 --- a/web/i18n/zh-Hans/plugin.ts +++ b/web/i18n/zh-Hans/plugin.ts @@ -1,4 +1,7 @@ const translation = { + metadata: { + title: '插件', + }, category: { all: '全部', models: '模型',