refactor(i18n): use JSON with flattened key and namespace (#30114)

Co-authored-by: yyh <yuanyouhuilyz@gmail.com>
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
This commit is contained in:
Stephen Zhou
2025-12-29 14:52:32 +08:00
committed by GitHub
parent 09be869f58
commit 6d0e36479b
2552 changed files with 111159 additions and 142972 deletions

View File

@ -80,14 +80,14 @@ const DatasetCard = ({
const documentCountTooltip = useMemo(() => {
const availableDocCount = dataset.total_available_documents ?? 0
if (availableDocCount === dataset.document_count)
return t('dataset.docAllEnabled', { count: availableDocCount })
return t('docAllEnabled', { ns: 'dataset', count: availableDocCount })
if (availableDocCount < dataset.document_count)
return t('dataset.partialEnabled', { count: dataset.document_count, num: availableDocCount })
return t('partialEnabled', { ns: 'dataset', count: dataset.document_count, num: availableDocCount })
}, [t, dataset.document_count, dataset.total_available_documents])
const { formatTimeFromNow } = useFormatTimeFromNow()
const editTimeText = useMemo(() => {
return `${t('datasetDocuments.segment.editedAt')} ${formatTimeFromNow(dataset.updated_at * 1000)}`
return `${t('segment.editedAt', { ns: 'datasetDocuments' })} ${formatTimeFromNow(dataset.updated_at * 1000)}`
}, [t, dataset.updated_at, formatTimeFromNow])
const openRenameModal = useCallback(() => {
@ -119,7 +119,7 @@ const DatasetCard = ({
URL.revokeObjectURL(url)
}
catch {
Toast.notify({ type: 'error', message: t('app.exportFailed') })
Toast.notify({ type: 'error', message: t('exportFailed', { ns: 'app' }) })
}
finally {
setExporting(false)
@ -129,7 +129,7 @@ const DatasetCard = ({
const detectIsUsedByApp = useCallback(async () => {
try {
const { is_using: isUsedByApp } = await checkIsUsedInApp(dataset.id)
setConfirmMessage(isUsedByApp ? t('dataset.datasetUsedByApp')! : t('dataset.deleteDatasetConfirmContent')!)
setConfirmMessage(isUsedByApp ? t('datasetUsedByApp', { ns: 'dataset' })! : t('deleteDatasetConfirmContent', { ns: 'dataset' })!)
setShowConfirmDelete(true)
}
catch (e: any) {
@ -141,7 +141,7 @@ const DatasetCard = ({
const onConfirmDelete = useCallback(async () => {
try {
await deleteDataset(dataset.id)
Toast.notify({ type: 'success', message: t('dataset.datasetDeleted') })
Toast.notify({ type: 'success', message: t('datasetDeleted', { ns: 'dataset' }) })
if (onSuccess)
onSuccess()
}
@ -171,14 +171,14 @@ const DatasetCard = ({
>
{!dataset.embedding_available && (
<CornerLabel
label={t('dataset.cornerLabel.unavailable')}
label={t('cornerLabel.unavailable', { ns: 'dataset' })}
className="absolute right-0 top-0 z-10"
labelClassName="rounded-tr-xl"
/>
)}
{dataset.embedding_available && dataset.runtime_mode === 'rag_pipeline' && (
<CornerLabel
label={t('dataset.cornerLabel.pipeline')}
label={t('cornerLabel.pipeline', { ns: 'dataset' })}
className="absolute right-0 top-0 z-10"
labelClassName="rounded-tr-xl"
/>
@ -211,15 +211,15 @@ const DatasetCard = ({
<div className="truncate" title={editTimeText}>{editTimeText}</div>
</div>
<div className="system-2xs-medium-uppercase flex items-center gap-x-3 text-text-tertiary">
{isExternalProvider && <span>{t('dataset.externalKnowledgeBase')}</span>}
{isExternalProvider && <span>{t('externalKnowledgeBase', { ns: 'dataset' })}</span>}
{!isExternalProvider && isShowDocModeInfo && (
<>
{dataset.doc_form && (
<span
className="min-w-0 max-w-full truncate"
title={t(`dataset.chunkingMode.${DOC_FORM_TEXT[dataset.doc_form]}` as any) as string}
title={t(`chunkingMode.${DOC_FORM_TEXT[dataset.doc_form]}`, { ns: 'dataset' })}
>
{t(`dataset.chunkingMode.${DOC_FORM_TEXT[dataset.doc_form]}` as any) as string}
{t(`chunkingMode.${DOC_FORM_TEXT[dataset.doc_form]}`, { ns: 'dataset' })}
</span>
)}
{dataset.indexing_technique && (
@ -233,9 +233,9 @@ const DatasetCard = ({
{dataset.is_multimodal && (
<span
className="min-w-0 max-w-full truncate"
title={t('dataset.multimodal')}
title={t('multimodal', { ns: 'dataset' })}
>
{t('dataset.multimodal')}
{t('multimodal', { ns: 'dataset' })}
</span>
)}
</>
@ -294,7 +294,7 @@ const DatasetCard = ({
</div>
</Tooltip>
{!isExternalProvider && (
<Tooltip popupContent={`${dataset.app_count} ${t('dataset.appCount')}`}>
<Tooltip popupContent={`${dataset.app_count} ${t('appCount', { ns: 'dataset' })}`}>
<div className="flex items-center gap-x-1">
<RiRobot2Fill className="size-3 text-text-quaternary" />
<span className="system-xs-medium">{dataset.app_count}</span>
@ -302,7 +302,7 @@ const DatasetCard = ({
</Tooltip>
)}
<span className="system-xs-regular text-divider-deep">/</span>
<span className="system-xs-regular">{`${t('dataset.updated')} ${formatTimeFromNow(dataset.updated_at * 1000)}`}</span>
<span className="system-xs-regular">{`${t('updated', { ns: 'dataset' })} ${formatTimeFromNow(dataset.updated_at * 1000)}`}</span>
</div>
<div className="absolute right-2 top-2 z-[15] hidden group-hover:block">
<CustomPopover
@ -342,7 +342,7 @@ const DatasetCard = ({
)}
{showConfirmDelete && (
<Confirm
title={t('dataset.deleteDatasetConfirmTitle')}
title={t('deleteDatasetConfirmTitle', { ns: 'dataset' })}
content={confirmMessage}
isShow={showConfirmDelete}
onConfirm={onConfirmDelete}

View File

@ -26,13 +26,13 @@ const Operations = ({
<div className="flex flex-col p-1">
<OperationItem
Icon={RiEditLine}
name={t('common.operation.edit')}
name={t('operation.edit', { ns: 'common' })}
handleClick={openRenameModal}
/>
{showExportPipeline && (
<OperationItem
Icon={RiFileDownloadLine}
name={t('datasetPipeline.operations.exportPipeline')}
name={t('operations.exportPipeline', { ns: 'datasetPipeline' })}
handleClick={handleExportPipeline}
/>
)}
@ -43,7 +43,7 @@ const Operations = ({
<div className="flex flex-col p-1">
<OperationItem
Icon={RiDeleteBinLine}
name={t('common.operation.delete')}
name={t('operation.delete', { ns: 'common' })}
handleClick={detectIsUsedByApp}
/>
</div>

View File

@ -8,15 +8,15 @@ const DatasetFooter = () => {
return (
<footer className="shrink-0 px-12 py-6">
<h3 className="text-gradient text-xl font-semibold leading-tight">{t('dataset.didYouKnow')}</h3>
<h3 className="text-gradient text-xl font-semibold leading-tight">{t('didYouKnow', { ns: 'dataset' })}</h3>
<p className="mt-1 text-sm font-normal leading-tight text-text-secondary">
{t('dataset.intro1')}
<span className="inline-flex items-center gap-1 text-text-accent">{t('dataset.intro2')}</span>
{t('dataset.intro3')}
{t('intro1', { ns: 'dataset' })}
<span className="inline-flex items-center gap-1 text-text-accent">{t('intro2', { ns: 'dataset' })}</span>
{t('intro3', { ns: 'dataset' })}
<br />
{t('dataset.intro4')}
<span className="inline-flex items-center gap-1 text-text-accent">{t('dataset.intro5')}</span>
{t('dataset.intro6')}
{t('intro4', { ns: 'dataset' })}
<span className="inline-flex items-center gap-1 text-text-accent">{t('intro5', { ns: 'dataset' })}</span>
{t('intro6', { ns: 'dataset' })}
</p>
</footer>
)

View File

@ -37,7 +37,7 @@ const Datasets = ({
const observerRef = useRef<IntersectionObserver>(null)
useEffect(() => {
document.title = `${t('dataset.knowledge')} - Dify`
document.title = `${t('knowledge', { ns: 'dataset' })} - Dify`
}, [t])
useEffect(() => {

View File

@ -32,7 +32,7 @@ const List = () => {
const showTagManagementModal = useTagStore(s => s.showTagManagementModal)
const { showExternalApiPanel, setShowExternalApiPanel } = useExternalApiPanel()
const [includeAll, { toggle: toggleIncludeAll }] = useBoolean(false)
useDocumentTitle(t('dataset.knowledge'))
useDocumentTitle(t('knowledge', { ns: 'dataset' }))
const [keywords, setKeywords] = useState('')
const [searchKeywords, setSearchKeywords] = useState('')
@ -66,10 +66,10 @@ const List = () => {
<CheckboxWithLabel
isChecked={includeAll}
onChange={toggleIncludeAll}
label={t('dataset.allKnowledge')}
label={t('allKnowledge', { ns: 'dataset' })}
labelClassName="system-md-regular text-text-secondary"
className="mr-2"
tooltip={t('dataset.allKnowledgeDescription') as string}
tooltip={t('allKnowledgeDescription', { ns: 'dataset' }) as string}
/>
)}
<TagFilter type="knowledge" value={tagFilterValue} onChange={handleTagsChange} />
@ -87,7 +87,7 @@ const List = () => {
onClick={() => setShowExternalApiPanel(true)}
>
<ApiConnectionMod className="h-4 w-4 text-components-button-secondary-text" />
<div className="system-sm-medium flex items-center justify-center gap-1 px-0.5 text-components-button-secondary-text">{t('dataset.externalAPIPanelTitle')}</div>
<div className="system-sm-medium flex items-center justify-center gap-1 px-0.5 text-components-button-secondary-text">{t('externalAPIPanelTitle', { ns: 'dataset' })}</div>
</Button>
</div>
</div>

View File

@ -17,19 +17,19 @@ const CreateAppCard = () => {
<Option
href="/datasets/create"
Icon={RiAddLine}
text={t('dataset.createDataset')}
text={t('createDataset', { ns: 'dataset' })}
/>
<Option
href="/datasets/create-from-pipeline"
Icon={RiFunctionAddLine}
text={t('dataset.createFromPipeline')}
text={t('createFromPipeline', { ns: 'dataset' })}
/>
</div>
<div className="border-t-[0.5px] border-divider-subtle p-2">
<Option
href="/datasets/connect"
Icon={ApiConnectionMod}
text={t('dataset.connectDataset')}
text={t('connectDataset', { ns: 'dataset' })}
/>
</div>
</div>