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

@ -56,7 +56,7 @@ const Actions = ({
checked={checked}
/>
<span className="system-sm-medium text-text-accent">
{t('common.operation.selectAll')}
{t('operation.selectAll', { ns: 'common' })}
</span>
</div>
{tip && (
@ -75,7 +75,7 @@ const Actions = ({
variant="ghost"
className="px-3 py-2"
>
{t('common.operation.cancel')}
{t('operation.cancel', { ns: 'common' })}
</Button>
</Link>
<Button
@ -84,7 +84,7 @@ const Actions = ({
onClick={handleNextStep}
className="gap-x-0.5"
>
<span className="px-0.5">{t('datasetCreation.stepOne.button')}</span>
<span className="px-0.5">{t('stepOne.button', { ns: 'datasetCreation' })}</span>
<RiArrowRightLine className="size-4" />
</Button>
</div>

View File

@ -31,7 +31,7 @@ const Header = ({
/>
<Divider type="vertical" className="mx-1 h-3.5 shrink-0" />
<Tooltip
popupContent={t('datasetPipeline.configurationTip', { pluginName })}
popupContent={t('configurationTip', { ns: 'datasetPipeline', pluginName })}
position="top"
>
<Button

View File

@ -113,11 +113,11 @@ const LocalFile = ({
const ext = `.${getFileType(file)}`
const isValidType = ACCEPTS.includes(ext.toLowerCase())
if (!isValidType)
notify({ type: 'error', message: t('datasetCreation.stepOne.uploader.validation.typeError') })
notify({ type: 'error', message: t('stepOne.uploader.validation.typeError', { ns: 'datasetCreation' }) })
const isValidSize = size <= fileUploadConfig.file_size_limit * 1024 * 1024
if (!isValidSize)
notify({ type: 'error', message: t('datasetCreation.stepOne.uploader.validation.size', { size: fileUploadConfig.file_size_limit }) })
notify({ type: 'error', message: t('stepOne.uploader.validation.size', { ns: 'datasetCreation', size: fileUploadConfig.file_size_limit }) })
return isValidType && isValidSize
}, [notify, t, ACCEPTS, fileUploadConfig.file_size_limit])
@ -155,7 +155,7 @@ const LocalFile = ({
return Promise.resolve({ ...completeFile })
})
.catch((e) => {
const errorMessage = getFileUploadErrorMessage(e, t('datasetCreation.stepOne.uploader.failed'), t as any)
const errorMessage = getFileUploadErrorMessage(e, t('stepOne.uploader.failed', { ns: 'datasetCreation' }), t)
notify({ type: 'error', message: errorMessage })
updateFile(fileItem, -2, fileListRef.current)
return Promise.resolve({ ...fileItem })
@ -191,7 +191,7 @@ const LocalFile = ({
return false
if (files.length + localFileList.length > filesCountLimit && !IS_CE_EDITION) {
notify({ type: 'error', message: t('datasetCreation.stepOne.uploader.validation.filesNumber', { filesNumber: filesCountLimit }) })
notify({ type: 'error', message: t('stepOne.uploader.validation.filesNumber', { ns: 'datasetCreation', filesNumber: filesCountLimit }) })
return false
}
@ -298,14 +298,15 @@ const LocalFile = ({
<RiUploadCloud2Line className="mr-2 size-5" />
<span>
{supportBatchUpload ? t('datasetCreation.stepOne.uploader.button') : t('datasetCreation.stepOne.uploader.buttonSingleFile')}
{supportBatchUpload ? t('stepOne.uploader.button', { ns: 'datasetCreation' }) : t('stepOne.uploader.buttonSingleFile', { ns: 'datasetCreation' })}
{allowedExtensions.length > 0 && (
<label className="ml-1 cursor-pointer text-text-accent" onClick={selectHandle}>{t('datasetCreation.stepOne.uploader.browse')}</label>
<label className="ml-1 cursor-pointer text-text-accent" onClick={selectHandle}>{t('stepOne.uploader.browse', { ns: 'datasetCreation' })}</label>
)}
</span>
</div>
<div>
{t('datasetCreation.stepOne.uploader.tip', {
{t('stepOne.uploader.tip', {
ns: 'datasetCreation',
size: fileUploadConfig.file_size_limit,
supportTypes: supportTypesShowNames,
batchCount: fileUploadConfig.batch_count_limit,

View File

@ -154,7 +154,7 @@ const PageSelector = ({
if (!currentDataList.length) {
return (
<div className="flex h-[296px] items-center justify-center text-[13px] text-text-tertiary">
{t('common.dataSource.notion.selector.noSearchResult')}
{t('dataSource.notion.selector.noSearchResult', { ns: 'common' })}
</div>
)
}

View File

@ -131,7 +131,7 @@ const Item = ({ index, style, data }: ListChildComponentProps<{
hover:border-components-button-secondary-border-hover hover:bg-components-button-secondary-bg-hover group-hover:flex"
onClick={() => handlePreview(index)}
>
{t('common.dataSource.notion.selector.preview')}
{t('dataSource.notion.selector.preview', { ns: 'common' })}
</div>
)
}

View File

@ -12,7 +12,7 @@ const Title = ({
return (
<div className="system-sm-medium px-[5px] py-1 text-text-secondary">
{t('datasetPipeline.onlineDocument.pageSelectorTitle', { name })}
{t('onlineDocument.pageSelectorTitle', { ns: 'datasetPipeline', name })}
</div>
)
}

View File

@ -31,16 +31,16 @@ const Connect = ({
<div className="flex flex-col gap-y-1 pb-3 pt-1">
<div className="system-md-semibold text-text-secondary">
<span className="relative">
{t('datasetPipeline.onlineDrive.notConnected', { name: nodeData.title })}
{t('onlineDrive.notConnected', { ns: 'datasetPipeline', name: nodeData.title })}
<Icon3Dots className="absolute -right-2.5 -top-1.5 size-4 text-text-secondary" />
</span>
</div>
<div className="system-sm-regular text-text-tertiary">
{t('datasetPipeline.onlineDrive.notConnectedTip', { name: nodeData.title })}
{t('onlineDrive.notConnectedTip', { ns: 'datasetPipeline', name: nodeData.title })}
</div>
</div>
<Button className="w-fit" variant="primary" onClick={onSetting}>
{t('datasetCreation.stepOne.connect')}
{t('stepOne.connect', { ns: 'datasetCreation' })}
</Button>
</div>
</div>

View File

@ -31,7 +31,7 @@ const Bucket = ({
return (
<>
<Tooltip
popupContent={t('datasetPipeline.onlineDrive.breadcrumbs.allBuckets')}
popupContent={t('onlineDrive.breadcrumbs.allBuckets', { ns: 'datasetPipeline' })}
>
<button
type="button"

View File

@ -25,7 +25,7 @@ const Drive = ({
onClick={handleBackToRoot}
disabled={breadcrumbs.length === 0}
>
{t('datasetPipeline.onlineDrive.breadcrumbs.allFiles')}
{t('onlineDrive.breadcrumbs.allFiles', { ns: 'datasetPipeline' })}
</button>
{breadcrumbs.length > 0 && <span className="system-xs-regular text-divider-deep">/</span>}
</>

View File

@ -84,7 +84,8 @@ const Breadcrumbs = ({
<div className="flex grow items-center overflow-hidden">
{showSearchResult && (
<div className="system-sm-medium text-test-secondary px-[5px]">
{t('datasetPipeline.onlineDrive.breadcrumbs.searchResult', {
{t('onlineDrive.breadcrumbs.searchResult', {
ns: 'datasetPipeline',
searchResultsLength,
folderName: breadcrumbs.length > 0 ? breadcrumbs[breadcrumbs.length - 1] : bucket,
})}
@ -92,7 +93,7 @@ const Breadcrumbs = ({
)}
{!showSearchResult && showBucketListTitle && (
<div className="system-sm-medium text-test-secondary px-[5px]">
{t('datasetPipeline.onlineDrive.breadcrumbs.allBuckets')}
{t('onlineDrive.breadcrumbs.allBuckets', { ns: 'datasetPipeline' })}
</div>
)}
{!showSearchResult && !showBucketListTitle && (

View File

@ -39,7 +39,7 @@ const Header = ({
value={inputValue}
onChange={handleInputChange}
onClear={handleResetKeywords}
placeholder={t('datasetPipeline.onlineDrive.breadcrumbs.searchPlaceholder')}
placeholder={t('onlineDrive.breadcrumbs.searchPlaceholder', { ns: 'datasetPipeline' })}
showLeftIcon
showClearIcon
wrapperClassName="w-[200px] h-8 shrink-0"

View File

@ -6,7 +6,7 @@ const EmptyFolder = () => {
return (
<div className="flex size-full items-center justify-center rounded-[10px] bg-background-section px-1 py-1.5">
<span className="system-xs-regular text-text-tertiary">{t('datasetPipeline.onlineDrive.emptyFolder')}</span>
<span className="system-xs-regular text-text-tertiary">{t('onlineDrive.emptyFolder', { ns: 'datasetPipeline' })}</span>
</div>
)
}

View File

@ -18,7 +18,7 @@ const EmptySearchResult = ({
<div className="flex size-full flex-col items-center justify-center gap-y-2 rounded-[10px] bg-background-section p-6">
<SearchMenu className="size-8 text-text-tertiary" />
<div className="system-sm-regular text-text-secondary">
{t('datasetPipeline.onlineDrive.emptySearchResult')}
{t('onlineDrive.emptySearchResult', { ns: 'datasetPipeline' })}
</div>
<Button
variant="secondary-accent"
@ -26,7 +26,7 @@ const EmptySearchResult = ({
onClick={onResetKeywords}
className="px-1.5"
>
<span className="px-[3px]">{t('datasetPipeline.onlineDrive.resetKeywords')}</span>
<span className="px-[3px]">{t('onlineDrive.resetKeywords', { ns: 'datasetPipeline' })}</span>
</Button>
</div>
)

View File

@ -94,7 +94,7 @@ const List = ({
className="flex items-center justify-center py-2"
role="status"
aria-live="polite"
aria-label={t('appApi.loading')}
aria-label={t('loading', { ns: 'appApi' })}
>
<RiLoader2Line className="animation-spin size-4 text-text-tertiary" />
</div>

View File

@ -36,7 +36,7 @@ const Item = ({
const Wrapper = disabled ? Tooltip : React.Fragment
const wrapperProps = disabled
? {
popupContent: t('datasetPipeline.onlineDrive.notSupportedFileType'),
popupContent: t('onlineDrive.notSupportedFileType', { ns: 'datasetPipeline' }),
position: 'top-end' as Placement,
offset: { mainAxis: 4, crossAxis: -104 },
}

View File

@ -76,7 +76,7 @@ const CrawledResultItem = ({
onClick={onPreview}
className="system-xs-medium-uppercase right-2 top-2 hidden px-1.5 group-hover:absolute group-hover:block"
>
{t('datasetCreation.stepOne.website.preview')}
{t('stepOne.website.preview', { ns: 'datasetCreation' })}
</Button>
)}
</div>

View File

@ -7,7 +7,7 @@ import { cn } from '@/utils/classnames'
import CheckboxWithLabel from './checkbox-with-label'
import CrawledResultItem from './crawled-result-item'
const I18N_PREFIX = 'datasetCreation.stepOne.website'
const I18N_PREFIX = 'stepOne.website'
type CrawledResultProps = {
className?: string
@ -66,6 +66,7 @@ const CrawledResult = ({
<div className={cn('flex flex-col gap-y-2', className)}>
<div className="system-sm-medium pt-2 text-text-primary">
{t(`${I18N_PREFIX}.scrapTimeInfo`, {
ns: 'datasetCreation',
total: list.length,
time: usedTime.toFixed(1),
})}
@ -76,7 +77,7 @@ const CrawledResult = ({
<CheckboxWithLabel
isChecked={isCheckAll}
onChange={handleCheckedAll}
label={isCheckAll ? t(`${I18N_PREFIX}.resetAll`) : t(`${I18N_PREFIX}.selectAll`)}
label={isCheckAll ? t(`${I18N_PREFIX}.resetAll`, { ns: 'datasetCreation' }) : t(`${I18N_PREFIX}.selectAll`, { ns: 'datasetCreation' })}
/>
</div>
)}

View File

@ -66,7 +66,7 @@ const Crawling = ({
return (
<div className={cn('mt-2 flex flex-col gap-y-2 pt-2', className)}>
<div className="system-sm-medium text-text-primary">
{t('datasetCreation.stepOne.website.totalPageScraped')}
{t('stepOne.website.totalPageScraped', { ns: 'datasetCreation' })}
{' '}
{crawledNum}
/

View File

@ -13,7 +13,7 @@ import { useConfigurations, useInitialData } from '@/app/components/rag-pipeline
import { CrawlStep } from '@/models/datasets'
import { cn } from '@/utils/classnames'
const I18N_PREFIX = 'datasetCreation.stepOne.website'
const I18N_PREFIX = 'stepOne.website'
type OptionsProps = {
variables: RAGPipelineVariables
@ -89,7 +89,7 @@ const Options = ({
onClick={foldToggle}
>
<span className="system-sm-semibold-uppercase text-text-secondary">
{t(`${I18N_PREFIX}.options`)}
{t(`${I18N_PREFIX}.options`, { ns: 'datasetCreation' })}
</span>
<ArrowDownRoundFill className={cn('h-4 w-4 shrink-0 text-text-quaternary', fold && '-rotate-90')} />
</div>
@ -102,7 +102,7 @@ const Options = ({
spinnerClassName="!ml-0"
>
<RiPlayLargeLine className="size-4" />
<span className="px-0.5">{!isRunning ? t(`${I18N_PREFIX}.run`) : t(`${I18N_PREFIX}.running`)}</span>
<span className="px-0.5">{!isRunning ? t(`${I18N_PREFIX}.run`, { ns: 'datasetCreation' }) : t(`${I18N_PREFIX}.running`, { ns: 'datasetCreation' })}</span>
</Button>
</div>
{!fold && (

View File

@ -29,7 +29,7 @@ import Crawling from './base/crawling'
import ErrorMessage from './base/error-message'
import Options from './base/options'
const I18N_PREFIX = 'datasetCreation.stepOne.website'
const I18N_PREFIX = 'stepOne.website'
export type WebsiteCrawlProps = {
nodeId: string
@ -130,7 +130,7 @@ const WebsiteCrawl = ({
setStep(CrawlStep.finished)
},
onDataSourceNodeError: (error: DataSourceNodeErrorResponse) => {
setCrawlErrorMessage(error.error || t(`${I18N_PREFIX}.unknownError`))
setCrawlErrorMessage(error.error || t(`${I18N_PREFIX}.unknownError`, { ns: 'datasetCreation' }))
setStep(CrawlStep.finished)
},
},
@ -184,7 +184,7 @@ const WebsiteCrawl = ({
{showError && (
<ErrorMessage
className="mt-2"
title={t(`${I18N_PREFIX}.exceptionErrorTitle`)}
title={t(`${I18N_PREFIX}.exceptionErrorTitle`, { ns: 'datasetCreation' })}
errorMsg={crawlErrorMessage}
/>
)}

View File

@ -24,15 +24,15 @@ export const useAddDocumentsSteps = () => {
const steps = [
{
label: t('datasetPipeline.addDocuments.steps.chooseDatasource'),
label: t('addDocuments.steps.chooseDatasource', { ns: 'datasetPipeline' }),
value: AddDocumentsStep.dataSource,
},
{
label: t('datasetPipeline.addDocuments.steps.processDocuments'),
label: t('addDocuments.steps.processDocuments', { ns: 'datasetPipeline' }),
value: AddDocumentsStep.processDocuments,
},
{
label: t('datasetPipeline.addDocuments.steps.processingDocuments'),
label: t('addDocuments.steps.processingDocuments', { ns: 'datasetPipeline' }),
value: AddDocumentsStep.processingDocuments,
},
]

View File

@ -188,9 +188,10 @@ const CreateFormPipeline = () => {
const tip = useMemo(() => {
if (datasourceType === DatasourceType.onlineDocument)
return t('datasetPipeline.addDocuments.selectOnlineDocumentTip', { count: 50 })
return t('addDocuments.selectOnlineDocumentTip', { ns: 'datasetPipeline', count: 50 })
if (datasourceType === DatasourceType.onlineDrive) {
return t('datasetPipeline.addDocuments.selectOnlineDriveTip', {
return t('addDocuments.selectOnlineDriveTip', {
ns: 'datasetPipeline',
count: fileUploadConfig.batch_count_limit,
fileSize: fileUploadConfig.file_size_limit,
})
@ -467,7 +468,7 @@ const CreateFormPipeline = () => {
<div className="flex h-full flex-col px-14">
<LeftHeader
steps={steps}
title={t('datasetPipeline.addDocuments.title')}
title={t('addDocuments.title', { ns: 'datasetPipeline' })}
currentStep={currentStep}
/>
<div className="grow overflow-y-auto">
@ -608,8 +609,8 @@ const CreateFormPipeline = () => {
<PlanUpgradeModal
show
onClose={hidePlanUpgradeModal}
title={t('billing.upgrade.uploadMultiplePages.title')!}
description={t('billing.upgrade.uploadMultiplePages.description')!}
title={t('upgrade.uploadMultiplePages.title', { ns: 'billing' })!}
description={t('upgrade.uploadMultiplePages.description', { ns: 'billing' })!}
/>
)}
</div>

View File

@ -62,7 +62,7 @@ const ChunkPreview = ({
<PreviewContainer
header={(
<PreviewHeader
title={t('datasetCreation.stepTwo.preview')}
title={t('stepTwo.preview', { ns: 'datasetCreation' })}
>
<div className="flex items-center gap-1">
{dataSourceType === DatasourceType.localFile
@ -149,7 +149,8 @@ const ChunkPreview = ({
{
currentDocForm !== ChunkingMode.qa
&& (
<Badge text={t('datasetCreation.stepTwo.previewChunkCount', {
<Badge text={t('stepTwo.previewChunkCount', {
ns: 'datasetCreation',
count: estimateData?.total_segments || 0,
}) as string}
/>
@ -216,10 +217,10 @@ const ChunkPreview = ({
<div className="flex flex-col items-center justify-center gap-3 pb-4">
<RiSearchEyeLine className="size-10 text-text-empty-state-icon" />
<p className="text-sm text-text-tertiary">
{t('datasetCreation.stepTwo.previewChunkTip')}
{t('stepTwo.previewChunkTip', { ns: 'datasetCreation' })}
</p>
<Button onClick={onPreview}>
{t('datasetPipeline.addDocuments.stepTwo.previewChunks')}
{t('addDocuments.stepTwo.previewChunks', { ns: 'datasetPipeline' })}
</Button>
</div>
</div>

View File

@ -32,7 +32,7 @@ const FilePreview = ({
<div className="flex h-full w-full flex-col rounded-t-xl border-l border-t border-components-panel-border bg-background-default-lighter shadow-md shadow-shadow-shadow-5">
<div className="flex gap-x-2 border-b border-divider-subtle pb-3 pl-6 pr-4 pt-4">
<div className="flex grow flex-col gap-y-1">
<div className="system-2xs-semibold-uppercase text-text-accent">{t('datasetPipeline.addDocuments.stepOne.preview')}</div>
<div className="system-2xs-semibold-uppercase text-text-accent">{t('addDocuments.stepOne.preview', { ns: 'datasetPipeline' })}</div>
<div className="title-md-semi-bold text-tex-primary">{`${fileName}.${file.extension || ''}`}</div>
<div className="system-xs-medium flex items-center gap-x-1 text-text-tertiary">
<DocumentFileIcon
@ -46,7 +46,7 @@ const FilePreview = ({
{fileData && (
<>
<span>·</span>
<span>{`${formatNumberAbbreviated(fileData.content.length)} ${t('datasetPipeline.addDocuments.characters')}`}</span>
<span>{`${formatNumberAbbreviated(fileData.content.length)} ${t('addDocuments.characters', { ns: 'datasetPipeline' })}`}</span>
</>
)}
</div>

View File

@ -56,13 +56,13 @@ const OnlineDocumentPreview = ({
<div className="flex h-full w-full flex-col rounded-t-xl border-l border-t border-components-panel-border bg-background-default-lighter shadow-md shadow-shadow-shadow-5">
<div className="flex gap-x-2 border-b border-divider-subtle pb-3 pl-6 pr-4 pt-4">
<div className="flex grow flex-col gap-y-1">
<div className="system-2xs-semibold-uppercase text-text-accent">{t('datasetPipeline.addDocuments.stepOne.preview')}</div>
<div className="system-2xs-semibold-uppercase text-text-accent">{t('addDocuments.stepOne.preview', { ns: 'datasetPipeline' })}</div>
<div className="title-md-semi-bold text-tex-primary">{currentPage?.page_name}</div>
<div className="system-xs-medium flex items-center gap-x-1 text-text-tertiary">
<Notion className="size-3.5" />
<span>{currentPage.type}</span>
<span>·</span>
<span>{`${formatNumberAbbreviated(content.length)} ${t('datasetPipeline.addDocuments.characters')}`}</span>
<span>{`${formatNumberAbbreviated(content.length)} ${t('addDocuments.characters', { ns: 'datasetPipeline' })}`}</span>
</div>
</div>
<button

View File

@ -20,14 +20,14 @@ const WebsitePreview = ({
<div className="flex h-full w-full flex-col rounded-t-xl border-l border-t border-components-panel-border bg-background-default-lighter shadow-md shadow-shadow-shadow-5">
<div className="flex gap-x-2 border-b border-divider-subtle pb-3 pl-6 pr-4 pt-4">
<div className="flex grow flex-col gap-y-1">
<div className="system-2xs-semibold-uppercase">{t('datasetPipeline.addDocuments.stepOne.preview')}</div>
<div className="system-2xs-semibold-uppercase">{t('addDocuments.stepOne.preview', { ns: 'datasetPipeline' })}</div>
<div className="title-md-semi-bold text-tex-primary">{currentWebsite.title}</div>
<div className="system-xs-medium flex gap-x-1 text-text-tertiary">
<RiGlobalLine className="size-3.5" />
<span className="uppercase" title={currentWebsite.source_url}>{currentWebsite.source_url}</span>
<span>·</span>
<span>·</span>
<span>{`${formatNumberAbbreviated(currentWebsite.markdown.length)} ${t('datasetPipeline.addDocuments.characters')}`}</span>
<span>{`${formatNumberAbbreviated(currentWebsite.markdown.length)} ${t('addDocuments.characters', { ns: 'datasetPipeline' })}`}</span>
</div>
</div>
<button

View File

@ -24,14 +24,14 @@ const Actions = ({
className="gap-x-0.5"
>
<RiArrowLeftLine className="size-4" />
<span className="px-0.5">{t('datasetPipeline.operations.dataSource')}</span>
<span className="px-0.5">{t('operations.dataSource', { ns: 'datasetPipeline' })}</span>
</Button>
<Button
variant="primary"
disabled={runDisabled}
onClick={onProcess}
>
{t('datasetPipeline.operations.saveAndProcess')}
{t('operations.saveAndProcess', { ns: 'datasetPipeline' })}
</Button>
</div>
)

View File

@ -21,10 +21,10 @@ const Header = ({
return (
<div className="flex items-center gap-x-1 px-4 py-2">
<div className="system-sm-semibold-uppercase grow text-text-secondary">
{t('datasetPipeline.addDocuments.stepTwo.chunkSettings')}
{t('addDocuments.stepTwo.chunkSettings', { ns: 'datasetPipeline' })}
</div>
<Button variant="ghost" disabled={resetDisabled} onClick={onReset}>
{t('common.operation.reset')}
{t('operation.reset', { ns: 'common' })}
</Button>
<Button
variant="secondary-accent"
@ -33,7 +33,7 @@ const Header = ({
disabled={previewDisabled}
>
<RiSearchEyeLine className="size-4" />
<span className="px-0.5">{t('datasetPipeline.addDocuments.stepTwo.previewChunks')}</span>
<span className="px-0.5">{t('addDocuments.stepTwo.previewChunks', { ns: 'datasetPipeline' })}</span>
</Button>
</div>
)

View File

@ -139,11 +139,11 @@ const EmbeddingProcess = ({
<>
<RiLoader2Fill className="size-4 animate-spin" />
<span>
{isEmbeddingWaiting ? t('datasetDocuments.embedding.waiting') : t('datasetDocuments.embedding.processing')}
{isEmbeddingWaiting ? t('embedding.waiting', { ns: 'datasetDocuments' }) : t('embedding.processing', { ns: 'datasetDocuments' })}
</span>
</>
)}
{isEmbeddingCompleted && t('datasetDocuments.embedding.completed')}
{isEmbeddingCompleted && t('embedding.completed', { ns: 'datasetDocuments' })}
</div>
{
enableBilling && plan.type !== Plan.team && (
@ -152,7 +152,7 @@ const EmbeddingProcess = ({
<RiAedFill className="size-4 text-text-primary-on-surface" />
</div>
<div className="system-md-medium grow text-text-primary">
{t('billing.plansCommon.documentProcessingPriorityUpgrade')}
{t('plansCommon.documentProcessingPriorityUpgrade', { ns: 'billing' })}
</div>
<UpgradeBtn loc="knowledge-speed-up" />
</div>
@ -245,7 +245,7 @@ const EmbeddingProcess = ({
variant="primary"
onClick={navToDocumentList}
>
<span className="px-0.5">{t('datasetCreation.stepThree.navTo')}</span>
<span className="px-0.5">{t('stepThree.navTo', { ns: 'datasetCreation' })}</span>
<RiArrowRightLine className="size-4 stroke-current stroke-1" />
</Button>
</div>

View File

@ -30,11 +30,11 @@ const RuleDetail = ({
? value
// eslint-disable-next-line sonarjs/no-nested-conditional
: sourceData.mode === ProcessMode.general
? (t('datasetDocuments.embedding.custom') as string)
? (t('embedding.custom', { ns: 'datasetDocuments' }) as string)
// eslint-disable-next-line sonarjs/no-nested-conditional
: `${t('datasetDocuments.embedding.hierarchical')} · ${sourceData?.rules?.parent_mode === 'paragraph'
? t('dataset.parentMode.paragraph')
: t('dataset.parentMode.fullDoc')}`
: `${t('embedding.hierarchical', { ns: 'datasetDocuments' })} · ${sourceData?.rules?.parent_mode === 'paragraph'
? t('parentMode.paragraph', { ns: 'dataset' })
: t('parentMode.fullDoc', { ns: 'dataset' })}`
break
}
return value
@ -43,12 +43,12 @@ const RuleDetail = ({
return (
<div className="flex flex-col gap-1" data-testid="rule-detail">
<FieldInfo
label={t('datasetDocuments.embedding.mode')}
label={t('embedding.mode', { ns: 'datasetDocuments' })}
displayedValue={getValue('mode')}
/>
<FieldInfo
label={t('datasetCreation.stepTwo.indexMode')}
displayedValue={t(`datasetCreation.stepTwo.${indexingType === IndexingType.ECONOMICAL ? 'economical' : 'qualified'}`) as string}
label={t('stepTwo.indexMode', { ns: 'datasetCreation' })}
displayedValue={t(`stepTwo.${indexingType === IndexingType.ECONOMICAL ? 'economical' : 'qualified'}`, { ns: 'datasetCreation' }) as string}
valueIcon={(
<Image
className="size-4"
@ -62,8 +62,8 @@ const RuleDetail = ({
)}
/>
<FieldInfo
label={t('datasetSettings.form.retrievalSetting.title')}
displayedValue={t(`dataset.retrieval.${indexingType === IndexingType.ECONOMICAL ? 'keyword_search' : retrievalMethod}.title` as any) as string}
label={t('form.retrievalSetting.title', { ns: 'datasetSettings' })}
displayedValue={t(`retrieval.${indexingType === IndexingType.ECONOMICAL ? 'keyword_search' : retrievalMethod ?? 'semantic_search'}.title`, { ns: 'dataset' })}
valueIcon={(
<Image
className="size-4"

View File

@ -12,7 +12,10 @@ import Processing from './index'
// Mock react-i18next (handled by global mock in web/vitest.setup.ts but we override for custom messages)
vi.mock('react-i18next', () => ({
useTranslation: () => ({
t: (key: string) => key,
t: (key: string, options?: { ns?: string }) => {
const prefix = options?.ns ? `${options.ns}.` : ''
return `${prefix}${key}`
},
}),
}))

View File

@ -41,15 +41,15 @@ const Processing = ({
<RiBookOpenLine className="size-5 text-text-accent" />
</div>
<div className="flex flex-col gap-y-2">
<div className="system-xl-semibold text-text-secondary">{t('datasetCreation.stepThree.sideTipTitle')}</div>
<div className="system-sm-regular text-text-tertiary">{t('datasetCreation.stepThree.sideTipContent')}</div>
<div className="system-xl-semibold text-text-secondary">{t('stepThree.sideTipTitle', { ns: 'datasetCreation' })}</div>
<div className="system-sm-regular text-text-tertiary">{t('stepThree.sideTipContent', { ns: 'datasetCreation' })}</div>
<a
href={docLink('/guides/knowledge-base/integrate-knowledge-within-application')}
target="_blank"
rel="noreferrer noopener"
className="system-sm-regular text-text-accent"
>
{t('datasetPipeline.addDocuments.stepThree.learnMore')}
{t('addDocuments.stepThree.learnMore', { ns: 'datasetPipeline' })}
</a>
</div>
</div>