fix(web): align create knowledge flow with design

This commit is contained in:
Stephen Zhou 2026-08-10 17:00:06 +08:00
parent 88ce098f55
commit 1db2f68b3d
No known key found for this signature in database
30 changed files with 529 additions and 262 deletions

View File

@ -22,7 +22,6 @@ const serviceMock = vi.hoisted(() => ({
updateKfsSource: vi.fn(),
updateSyncPolicy: vi.fn(),
upload: vi.fn(),
uploadBulk: vi.fn(),
listKey: vi.fn(() => ['console', 'knowledgeFs', 'listKnowledgeSpaces']),
sourcesKey: vi.fn(() => ['console', 'knowledgeFs', 'sources']),
documentsKey: vi.fn(() => ['console', 'knowledgeFs', 'documents']),
@ -49,6 +48,10 @@ const systemFeaturesStateMock = vi.hoisted(() => ({
rbacEnabled: true,
}))
const datasourceAuthStateMock = vi.hoisted(() => ({
result: [] as Array<Record<string, unknown>>,
}))
vi.mock('@/next/navigation', () => ({
useRouter: () => routerMock,
useSearchParams: () => ({
@ -156,6 +159,13 @@ vi.mock('@/service/datasets', () => ({
createFirecrawlTask: serviceMock.createCrawl,
}))
vi.mock('@/service/use-datasource', () => ({
useGetDataSourceListAuth: () => ({
data: { result: datasourceAuthStateMock.result },
isPending: false,
}),
}))
const createdKnowledge = {
control_space_id: 'e735c1dc-d2b8-4dc4-86dc-abaf2fb7d084',
model_setup_required: false,
@ -206,17 +216,17 @@ vi.mock('../knowledge-fs-upload', () => ({
uploadKnowledgeFsDocuments: async (
knowledgeSpaceId: string,
uploads: Array<{ file: File; id: string }>,
_progress: Map<string, { phase: 'completed' | 'pending' }>,
onProgress?: (file: File, phase: 'completed' | 'pending') => void,
) => {
const files = uploads.map(({ file }) => file)
if (files.length === 1)
return serviceMock.upload({
body: { file: files[0] },
for (const { file } of uploads) {
onProgress?.(file, 'pending')
await serviceMock.upload({
body: { file },
params: { control_space_id: knowledgeSpaceId },
})
return serviceMock.uploadBulk({
body: { files },
params: { control_space_id: knowledgeSpaceId },
})
onProgress?.(file, 'completed')
}
},
}))
@ -249,6 +259,14 @@ describe('CreateKnowledgePage', () => {
beforeEach(() => {
vi.clearAllMocks()
globalThis.sessionStorage.clear()
datasourceAuthStateMock.result = [
{
credentials_list: [{ id: 'notion-credential-1' }],
name: 'Notion',
plugin_id: 'langgenius/notion_datasource',
provider: 'notion',
},
]
serviceMock.create.mockResolvedValue(createdKnowledge)
serviceMock.createCrawl.mockResolvedValue({ job_id: 'crawl-job-1' })
serviceMock.createKfsSource.mockResolvedValue(kfsSourceResponse())
@ -348,11 +366,6 @@ describe('CreateKnowledgePage', () => {
serviceMock.upload.mockResolvedValue({
id: 'document-1',
})
serviceMock.uploadBulk.mockResolvedValue({
accepted: 2,
excluded: 0,
items: [],
})
permissionStateMock.keys = ['dataset.acl.access_config']
systemFeaturesStateMock.uploadEnabled = true
systemFeaturesStateMock.rbacEnabled = true
@ -368,19 +381,17 @@ describe('CreateKnowledgePage', () => {
vi.restoreAllMocks()
})
it('keeps create reachable and reports an empty knowledge name', async () => {
it('keeps create disabled until the knowledge name is provided', async () => {
const user = userEvent.setup()
renderPage()
const createButton = screen.getByRole('button', {
name: 'dataset.newKnowledge.createTitle',
})
expect(createButton).toBeDisabled()
await user.type(screen.getByRole('textbox', { name: 'dataset.newKnowledge.name' }), 'Handbook')
expect(createButton).toBeEnabled()
await user.click(createButton)
expect(await screen.findByText('dataset.newKnowledge.nameRequired')).toBeInTheDocument()
expect(serviceMock.create).not.toHaveBeenCalled()
})
it('creates a private empty knowledge space, invalidates the list, and navigates', async () => {
@ -784,18 +795,9 @@ describe('CreateKnowledgePage', () => {
expect(onlineDocuments).toBeChecked()
expect(screen.queryByRole('alert')).not.toBeInTheDocument()
expect(screen.getByText('Notion')).toBeInTheDocument()
expect(screen.getByText('dataset.newKnowledge.notionNotConnected')).toBeInTheDocument()
expect(screen.getByRole('button', { name: 'dataset.newKnowledge.connectNotion' })).toBeEnabled()
expect(
screen.queryByRole('textbox', { name: 'dataset.newKnowledge.sourceName' }),
).not.toBeInTheDocument()
expect(
screen.queryByRole('combobox', { name: 'dataset.newKnowledge.syncPolicy' }),
).not.toBeInTheDocument()
await user.click(screen.getByRole('button', { name: 'dataset.newKnowledge.connectNotion' }))
expect(screen.getByRole('alert')).toHaveTextContent(
'dataset.newKnowledge.sourceSetupBackendDependency',
)
expect(screen.queryByText('dataset.newKnowledge.notionNotConnected')).not.toBeInTheDocument()
expect(screen.getByRole('textbox', { name: 'dataset.newKnowledge.sourceName' })).toBeEnabled()
expect(screen.getByRole('combobox', { name: 'dataset.newKnowledge.syncPolicy' })).toBeEnabled()
await user.click(screen.getByRole('radio', { name: 'Google Docs' }))
expect(screen.getByRole('textbox', { name: 'dataset.newKnowledge.sourceName' })).toBeEnabled()
expect(screen.getByRole('combobox', { name: 'dataset.newKnowledge.syncPolicy' })).toBeEnabled()
@ -812,6 +814,27 @@ describe('CreateKnowledgePage', () => {
expect(screen.getByRole('button', { name: 'dataset.newKnowledge.createTitle' })).toBeDisabled()
})
it('offers to connect Notion when the provider has no credential', async () => {
const user = userEvent.setup()
datasourceAuthStateMock.result = []
renderPage()
await user.click(screen.getByRole('radio', { name: 'dataset.newKnowledge.connectSource' }))
await user.click(screen.getByRole('radio', { name: 'dataset.newKnowledge.onlineDocuments' }))
expect(screen.getByText('dataset.newKnowledge.notionNotConnected')).toBeInTheDocument()
expect(
screen.queryByRole('textbox', { name: 'dataset.newKnowledge.sourceName' }),
).not.toBeInTheDocument()
expect(
screen.queryByRole('combobox', { name: 'dataset.newKnowledge.syncPolicy' }),
).not.toBeInTheDocument()
await user.click(screen.getByRole('button', { name: 'dataset.newKnowledge.connectNotion' }))
expect(screen.getByRole('alert')).toHaveTextContent(
'dataset.newKnowledge.sourceSetupBackendDependency',
)
})
it('disables upload before creating a space when direct upload is unavailable', () => {
navigationMock.startMode = 'upload'
systemFeaturesStateMock.uploadEnabled = false
@ -918,9 +941,49 @@ describe('CreateKnowledgePage', () => {
url: 'https://docs.dify.ai',
})
expect(await screen.findByText('Getting started')).toBeInTheDocument()
expect(
screen.queryByRole('button', { name: 'dataset.newKnowledge.crawlAndPreview' }),
).not.toBeInTheDocument()
expect(screen.getByRole('checkbox', { name: 'dataset.newKnowledge.selectAll' })).toBeEnabled()
expect(screen.getByRole('checkbox', { name: 'Getting started' })).toBeEnabled()
expect(screen.getByRole('button', { name: 'dataset.newKnowledge.reCrawl' })).toBeEnabled()
const syncPolicy = screen.getByRole('combobox', {
name: 'dataset.newKnowledge.syncPolicy',
})
expect(syncPolicy).toHaveTextContent('dataset.newKnowledge.syncPolicyDaily')
await user.click(syncPolicy)
await user.click(
await screen.findByRole('option', { name: 'dataset.newKnowledge.syncPolicyManual' }),
)
expect(syncPolicy).toHaveTextContent('dataset.newKnowledge.syncPolicyManual')
expect(screen.getByText('Getting started')).toBeInTheDocument()
})
it('shows and can stop an ongoing website crawl', async () => {
const user = userEvent.setup()
navigationMock.startMode = 'source'
serviceMock.getCrawlStatus.mockImplementation(() => new Promise(() => {}))
renderPage()
await fillRequiredFields(user)
await user.type(
screen.getByPlaceholderText('dataset.newKnowledge.rootUrlPlaceholder'),
'https://docs.dify.ai',
)
await user.type(
screen.getByPlaceholderText('dataset.newKnowledge.sourceNamePlaceholder'),
'Dify docs',
)
await user.click(screen.getByRole('button', { name: 'dataset.newKnowledge.crawlAndPreview' }))
expect(await screen.findByRole('status')).toHaveTextContent(
'dataset.newKnowledge.crawlingPages',
)
const stopButton = screen.getByRole('button', { name: 'dataset.newKnowledge.stopCrawl' })
expect(stopButton).toBeEnabled()
await user.click(stopButton)
expect(screen.getByRole('status')).toHaveTextContent('dataset.newKnowledge.crawlStopped')
})
it('submits selected preview URLs for the server-side crawl import', async () => {
@ -1111,27 +1174,59 @@ describe('CreateKnowledgePage', () => {
expect(serviceMock.create).not.toHaveBeenCalled()
})
it('shows the real uploading state on each valid file row', async () => {
it('marks only the file currently being uploaded as pending', async () => {
const user = userEvent.setup()
navigationMock.startMode = 'upload'
vi.mocked(globalThis.crypto.randomUUID)
.mockReturnValueOnce('11111111-1111-4111-8111-111111111111')
.mockReturnValueOnce('22222222-2222-4222-8222-222222222222')
.mockReturnValue('33333333-3333-4333-8333-333333333333')
serviceMock.upload.mockImplementation(() => new Promise(() => {}))
renderPage()
await fillRequiredFields(user)
await user.upload(
fireEvent.change(
screen.getByLabelText('dataset.newKnowledge.uploadFiles', {
selector: 'input[type="file"]',
}),
new File(['content'], 'handbook.md', { type: 'text/markdown' }),
{
target: {
files: [
new File(['content'], 'handbook.md', { type: 'text/markdown' }),
new File(['content'], 'policy.pdf', { type: 'application/pdf' }),
],
},
},
)
const queue = screen.getByRole('list', { name: 'dataset.newKnowledge.uploadFiles' })
const preview = within(queue).getByRole('button', { name: 'dataset.newKnowledge.preview' })
expect(preview).toBeEnabled()
const handbookRow = within(queue).getByText('handbook.md').closest('li')
const policyRow = within(queue).getByText('policy.pdf').closest('li')
expect(handbookRow).not.toBeNull()
expect(policyRow).not.toBeNull()
expect(
within(queue).getAllByRole('button', { name: 'dataset.newKnowledge.preview' }),
).toHaveLength(2)
expect(screen.queryByText('dataset.newKnowledge.previewUnavailable')).not.toBeInTheDocument()
await user.click(screen.getByRole('button', { name: 'dataset.newKnowledge.createTitle' }))
expect(await within(queue).findByText('dataset.newKnowledge.uploadingFiles')).toBeVisible()
expect(within(queue).queryByRole('button', { name: 'dataset.newKnowledge.preview' })).toBeNull()
expect(
await within(handbookRow as HTMLElement).findByText('dataset.newKnowledge.uploadingFiles'),
).toBeVisible()
expect(
within(handbookRow as HTMLElement).queryByRole('button', {
name: 'dataset.newKnowledge.preview',
}),
).toBeNull()
expect(
within(policyRow as HTMLElement).getByText(
'dataset.newKnowledge.uploadCharactersUnavailable',
),
).toBeVisible()
expect(
within(policyRow as HTMLElement).getByRole('button', {
name: 'dataset.newKnowledge.preview',
}),
).toBeEnabled()
})
it('previews a selected file locally without uploading it', () => {
@ -1242,6 +1337,9 @@ describe('CreateKnowledgePage', () => {
expect(
screen.getByPlaceholderText('dataset.newKnowledge.descriptionPlaceholder'),
).toBeInTheDocument()
expect(
screen.getByRole('textbox', { name: /^dataset\.newKnowledge\.description$/ }),
).toBeInTheDocument()
expect(screen.getByText('dataset.newKnowledge.descriptionHelp')).toBeInTheDocument()
expect(screen.getByText('dataset.newKnowledge.startWithHelp')).toBeInTheDocument()
expect(

View File

@ -11,6 +11,7 @@ export function StartMode({
children,
description,
disabled = false,
endAdornment,
icon,
selected = false,
title,
@ -19,6 +20,7 @@ export function StartMode({
children?: ReactNode
description: string
disabled?: boolean
endAdornment?: ReactNode
icon: string
selected?: boolean
title: string
@ -45,7 +47,8 @@ export function StartMode({
aria-describedby={disabled ? `${descriptionId} ${unavailableId}` : descriptionId}
disabled={disabled}
className={cn(
'relative flex min-h-16 w-full items-center gap-3 px-4 py-3.5 text-left outline-hidden',
'relative flex w-full items-center gap-3 px-4 text-left outline-hidden',
value === 'empty' || !selected ? 'min-h-15.5 py-3' : 'min-h-16 py-3.5',
'hover:bg-state-base-hover focus-visible:ring-2 focus-visible:ring-state-accent-solid focus-visible:ring-inset',
'data-disabled:cursor-not-allowed data-disabled:opacity-50 data-disabled:hover:bg-transparent',
)}
@ -62,12 +65,7 @@ export function StartMode({
{description}
</span>
</span>
{value === 'source' && (
<span
aria-hidden
className="h-4 w-20.5 shrink-0 bg-[url('/images/new-rag/create-knowledge-connectors.svg')] bg-contain bg-center bg-no-repeat"
/>
)}
{endAdornment}
{disabled && (
<span id={unavailableId} className="ml-3 shrink-0 system-xs-medium text-text-disabled">
{t(($) => $['cornerLabel.unavailable'])}

View File

@ -242,7 +242,7 @@ export function CrawlPreviewPageSelection({
return (
<section aria-labelledby="crawl-selection-summary">
<div className="flex flex-wrap items-center gap-2">
<div className="flex flex-wrap items-center gap-3.5">
<h3
id="crawl-selection-summary"
role="status"
@ -286,7 +286,7 @@ export function CrawlPreviewPageSelection({
/>
{t(($) => $['newKnowledge.selectAll'])}
</label>
<ul className="min-h-0 flex-1 divide-y divide-divider-subtle overflow-y-auto">
<ul className="min-h-0 flex-1 overflow-y-auto">
{pages.map((page, index) => {
const skipReason = pageSkipReasons.get(page.pageId)
const selectable = !skipReason

View File

@ -5,7 +5,7 @@ import type { CreateKnowledgeExitReason } from './components/create-knowledge-ex
import type { KnowledgeVisibility } from './create-knowledge-workflow'
import type { WebsiteCrawlPreviewSelection } from './create-source-setup'
import type { QueuedUpload } from './create-upload-queue'
import type { KnowledgeFsUploadProgress } from './knowledge-fs-upload'
import type { KnowledgeFsUploadPhase, KnowledgeFsUploadProgress } from './knowledge-fs-upload'
import type { NewKnowledgeSourceDraft, NewKnowledgeStartMode } from './routes'
import { Button } from '@langgenius/dify-ui/button'
import {
@ -111,6 +111,9 @@ export function CreateKnowledgePage() {
const [modelSetupDialogOpen, setModelSetupDialogOpen] = useState(false)
const [submissionLocked, setSubmissionLocked] = useState(false)
const [uploading, setUploading] = useState(false)
const [uploadPhases, setUploadPhases] = useState<ReadonlyMap<File, KnowledgeFsUploadPhase>>(
() => new Map(),
)
const [uploadError, setUploadError] = useState(false)
const [exitReason, setExitReason] = useState<CreateKnowledgeExitReason | null>(null)
const idempotencyKeyRef = useRef<string | undefined>(undefined)
@ -122,6 +125,7 @@ export function CreateKnowledgePage() {
const createMutation = useMutation({ mutationFn: createKnowledge })
const submissionPending = createMutation.isPending || uploading
const createErrorMessage = t(($) => $['newKnowledge.createFailed'])
const nameSubmissionBlocked = !name.trim()
const uploadSubmissionBlocked =
startMode === 'upload' &&
(!uploadAvailable || !uploads.length || uploads.some((upload) => upload.issue))
@ -336,6 +340,13 @@ export function CreateKnowledgePage() {
created.control_space_id,
uploads.map(({ file, id }) => ({ file, id })),
uploadProgressRef.current,
(file, phase) => {
setUploadPhases((current) => {
const next = new Map(current)
next.set(file, phase)
return next
})
},
)
} catch {
setUploadError(true)
@ -422,7 +433,7 @@ export function CreateKnowledgePage() {
</header>
<div className="flex min-h-0 flex-col gap-4 overflow-y-auto px-6 sm:px-10">
<div className="space-y-4">
<div className="flex flex-col gap-4">
<Field
name="name"
className="gap-1.5"
@ -457,10 +468,7 @@ export function CreateKnowledgePage() {
<FieldError match="customError" />
</Field>
<Field name="description" className="gap-1.5">
<FieldLabel>
{t(($) => $['newKnowledge.description'])}{' '}
{tCommon(($) => $['label.optional'])}
</FieldLabel>
<FieldLabel>{t(($) => $['newKnowledge.description'])}</FieldLabel>
<Textarea
autoComplete="off"
className="min-h-20"
@ -478,7 +486,7 @@ export function CreateKnowledgePage() {
{t(($) => $['newKnowledge.descriptionHelp'])}
</FieldDescription>
</Field>
<div className="space-y-1.5">
<div className="flex flex-col gap-1.5">
<Select
name="permission"
value={visibility}
@ -527,7 +535,7 @@ export function CreateKnowledgePage() {
<FieldsetLegend className="py-0 system-md-semibold">
{t(($) => $['newKnowledge.startWith'])}
</FieldsetLegend>
<p className="pb-0.5 body-xs-regular text-text-tertiary">
<p className="pb-1.5 body-xs-regular text-text-tertiary">
{t(($) => $['newKnowledge.startWithHelp'])}
</p>
<RadioGroup<NewKnowledgeStartMode>
@ -553,6 +561,14 @@ export function CreateKnowledgePage() {
selected={startMode === 'source'}
title={t(($) => $['newKnowledge.connectSource'])}
description={t(($) => $['newKnowledge.connectSourceDescription'])}
endAdornment={
startMode === 'upload' ? (
<span
aria-hidden
className="h-4 w-20.5 shrink-0 bg-[url('/images/new-rag/create-knowledge-connectors.svg')] bg-contain bg-center bg-no-repeat"
/>
) : undefined
}
>
<CreateSourceSetup
disabled={submissionLocked}
@ -586,6 +602,7 @@ export function CreateKnowledgePage() {
<CreateUploadQueue
disabled={submissionPending}
uploads={uploads}
uploadPhases={uploadPhases}
uploading={uploading}
onChange={(value) => {
setUploads(value)
@ -623,7 +640,9 @@ export function CreateKnowledgePage() {
type="submit"
variant="primary"
loading={submissionPending}
disabled={uploadSubmissionBlocked || sourceSubmissionBlocked}
disabled={
nameSubmissionBlocked || uploadSubmissionBlocked || sourceSubmissionBlocked
}
>
{t(($) => $['newKnowledge.createTitle'])}
</Button>

View File

@ -36,6 +36,7 @@ import {
import { useEffect, useMemo, useRef, useState } from 'react'
import { useTranslation } from 'react-i18next'
import { checkFirecrawlTaskStatus, createFirecrawlTask } from '@/service/datasets'
import { useGetDataSourceListAuth } from '@/service/use-datasource'
import { CrawlPreviewPageSelection } from './crawl-selection-form'
import {
isValidWebsiteSourceDraft,
@ -52,6 +53,12 @@ const sourceTypes = [
const DEFAULT_INCLUDE_SUBPAGES = true
const DEFAULT_MAX_PAGES = 100
const CRAWL_POLL_INTERVAL_MS = 1500
const CRAWL_PREVIEW_SKELETONS = [
{ id: 'short', sourceWidth: 'w-22.5', titleWidth: 'w-37.5' },
{ id: 'medium', sourceWidth: 'w-26', titleWidth: 'w-42.5' },
{ id: 'long', sourceWidth: 'w-29.5', titleWidth: 'w-47.5' },
{ id: 'longest', sourceWidth: 'w-33', titleWidth: 'w-52.5' },
] as const
type LocalCrawlState = 'error' | 'idle' | 'running' | 'stopped' | 'success'
@ -110,10 +117,10 @@ const providers = {
{ icon: 'i-ri-box-3-line', label: 'Amazon S3' },
],
websiteCrawl: [
{ icon: 'i-ri-fire-fill text-orange-500', label: 'Firecrawl', available: true },
{ icon: 'i-custom-public-common-firecrawl', label: 'Firecrawl', available: true },
{ icon: 'i-custom-public-llm-jina', label: 'Jina Reader' },
{ icon: 'i-ri-water-flash-line', label: 'WaterCrawl' },
{ icon: 'i-ri-bug-line', label: 'FakeCrawler' },
{ icon: 'i-custom-public-knowledge-watercrawl', label: 'WaterCrawl' },
{ icon: 'i-ri-global-line text-text-accent', label: 'FakeCrawler' },
],
} as const
@ -144,13 +151,35 @@ function ConnectedSourceConfiguration({
maxLength={NEW_KNOWLEDGE_SOURCE_NAME_MAX_LENGTH}
value={draft.sourceName}
placeholder={t(($) => $['newKnowledge.sourceNamePlaceholder'])}
size="large"
size="medium"
onValueChange={(value) => onDraftChange({ ...draft, sourceName: value })}
onKeyDown={(event) => {
if (event.key === 'Enter') event.preventDefault()
}}
/>
</Field>
<SyncPolicySelect disabled={disabled} draft={draft} onDraftChange={onDraftChange} />
</div>
)
}
function SyncPolicySelect({
className,
disabled,
draft,
onDraftChange,
size = 'medium',
}: {
className?: string
disabled: boolean
draft: NewKnowledgeSourceDraft
onDraftChange: (draft: NewKnowledgeSourceDraft) => void
size?: 'large' | 'medium'
}) {
const { t } = useTranslation('dataset')
return (
<div className={cn('flex min-w-0 flex-col gap-1.5', className)}>
<Select<NewKnowledgeSourceDraft['syncPolicy']>
name="syncPolicy"
disabled={disabled}
@ -160,7 +189,7 @@ function ConnectedSourceConfiguration({
}}
>
<SelectLabel>{t(($) => $['newKnowledge.syncPolicy'])}</SelectLabel>
<SelectTrigger size="large">
<SelectTrigger size={size}>
{t(($) =>
draft.syncPolicy === 'provider'
? $['newKnowledge.syncPolicyProvider']
@ -188,6 +217,66 @@ function ConnectedSourceConfiguration({
)
}
function NotionSourceConfiguration({
disabled,
draft,
onConnect,
onDraftChange,
}: {
disabled: boolean
draft: NewKnowledgeSourceDraft
onConnect: () => void
onDraftChange: (draft: NewKnowledgeSourceDraft) => void
}) {
const { t } = useTranslation('dataset')
const datasourceAuthQuery = useGetDataSourceListAuth()
const notionConnected = Boolean(
datasourceAuthQuery.data?.result.some(
(auth) =>
auth.credentials_list.length > 0 &&
[auth.name, auth.plugin_id, auth.provider].some((identity) =>
identity
.toLocaleLowerCase()
.replaceAll(/[^a-z0-9]/g, '')
.includes('notion'),
),
),
)
if (notionConnected) {
return (
<ConnectedSourceConfiguration
disabled={disabled}
draft={draft}
onDraftChange={onDraftChange}
/>
)
}
return (
<section className="flex h-44 flex-col items-start gap-2.5 rounded-xl bg-background-section p-4">
<span className="flex size-9 items-center justify-center rounded-lg border-[0.5px] border-divider-subtle bg-background-default">
<span aria-hidden className="i-custom-public-common-notion size-4.5" />
</span>
<h3 className="system-sm-semibold text-text-primary">
{t(($) => $['newKnowledge.notionNotConnected'])}
</h3>
<p className="max-w-xl system-xs-regular leading-3.75 text-text-tertiary">
{t(($) => $['newKnowledge.notionNotConnectedDescription'])}
</p>
<Button
type="button"
variant="primary"
disabled={disabled}
className="mt-auto"
onClick={onConnect}
>
{t(($) => $['newKnowledge.connectNotion'])}
</Button>
</section>
)
}
export function CreateSourceSetup({
disabled,
draft,
@ -241,6 +330,10 @@ export function CreateSourceSetup({
setBackendBoundaryVisible(false)
resetPreview()
}
const updateDraftWithoutReset = (nextDraft: NewKnowledgeSourceDraft) => {
onDraftChange(nextDraft)
setBackendBoundaryVisible(false)
}
const selectProvider = (provider: string) => {
if (draft.sourceType === 'onlineDocuments')
updateDraft({ ...draft, provider: provider as NewKnowledgeOnlineDocumentsProvider })
@ -333,15 +426,15 @@ export function CreateSourceSetup({
}, [crawlState, draft, onWebsitePreviewSelectionChange, selectedPageIds, selectionPages])
return (
<div className="mx-4 mb-4 space-y-4 border-t border-divider-subtle pt-4">
<div className="mx-4 -mt-1 mb-3.75 flex flex-col gap-4">
<Fieldset disabled={disabled}>
<FieldsetLegend className="mb-1.5 py-0 system-xs-medium">
<FieldsetLegend className="mb-1.25 py-0 system-xs-medium">
{t(($) => $['newKnowledge.sourceTypeLabel'])}
</FieldsetLegend>
<RadioGroup<NewKnowledgeSourceDraft['sourceType']>
value={sourceType}
disabled={disabled}
className="grid grid-cols-1 gap-0.5 rounded-lg bg-background-default p-0.5 sm:grid-cols-3"
className="grid grid-cols-1 gap-0.5 rounded-lg bg-background-section p-0.5 sm:grid-cols-3"
onValueChange={(value) => {
setBackendBoundaryVisible(false)
onSourceTypeChange(value)
@ -352,7 +445,7 @@ export function CreateSourceSetup({
key={option.value}
value={option.value}
className={cn(
'relative flex min-h-8 items-center justify-center gap-1.5 rounded-md px-2 system-xs-medium text-text-tertiary outline-hidden',
'relative flex min-h-7 items-center justify-center gap-1.5 rounded-md px-2 system-xs-medium text-text-tertiary outline-hidden',
'hover:text-text-secondary focus-visible:ring-2 focus-visible:ring-state-accent-solid',
'data-checked:bg-components-option-card-option-selected-bg data-checked:text-text-primary data-checked:shadow-xs',
'data-disabled:cursor-not-allowed data-disabled:opacity-60',
@ -374,13 +467,15 @@ export function CreateSourceSetup({
{t(($) => $['newKnowledge.providerLabel'])}
</span>
<Button
type="button"
variant="ghost-accent"
size="small"
disabled={disabled}
className="h-auto px-0"
className="gap-0.5 px-2.75"
onClick={showBackendBoundary}
>
{t(($) => $['newKnowledge.moreProviders'])}
<span aria-hidden className="i-ri-arrow-right-up-line size-3.5" />
</Button>
</div>
<RadioGroup<string>
@ -398,9 +493,9 @@ export function CreateSourceSetup({
key={provider.label}
value={provider.label}
className={cn(
'flex min-h-10 items-center gap-2 rounded-lg border border-divider-subtle bg-background-default px-3 system-xs-medium text-text-secondary outline-hidden',
'relative flex h-8.5 items-center justify-center gap-1.5 rounded-lg border border-divider-subtle bg-background-default px-2.5 system-xs-medium text-text-secondary outline-hidden',
'hover:bg-state-base-hover focus-visible:ring-2 focus-visible:ring-state-accent-solid',
'data-checked:border-components-option-card-option-selected-border data-checked:text-text-primary',
'data-checked:border-[1.5px] data-checked:border-components-option-card-option-selected-border data-checked:bg-components-option-card-option-selected-bg data-checked:text-text-primary',
'data-disabled:cursor-not-allowed data-disabled:opacity-60',
)}
>
@ -416,7 +511,7 @@ export function CreateSourceSetup({
<div className="space-y-4">
<div className="grid grid-cols-1 gap-3 sm:grid-cols-2">
<Field name="rootUrl" className="gap-1.5">
<FieldLabel>
<FieldLabel className="py-0.5">
{t(($) => $['newKnowledge.rootUrl'])}
<span aria-hidden className="ml-0.5 text-text-destructive">
*
@ -440,7 +535,7 @@ export function CreateSourceSetup({
/>
</Field>
<Field name="sourceName" className="gap-1.5">
<FieldLabel>
<FieldLabel className="py-0.5">
{t(($) => $['newKnowledge.sourceName'])}
<span aria-hidden className="ml-0.5 text-text-destructive">
*
@ -535,20 +630,28 @@ export function CreateSourceSetup({
</Fieldset>
</CollapsiblePanel>
</Collapsible>
<Button
type="button"
variant="primary"
className="w-full"
disabled={disabled || crawlState === 'running' || !previewReady}
onClick={() => void startPreview()}
>
{crawlState === 'running'
? t(($) => $['newKnowledge.crawling'])
: t(($) => $['newKnowledge.crawlAndPreview'])}
</Button>
{crawlState !== 'success' && (
<Button
type="button"
variant="primary"
className="w-full"
disabled={disabled || crawlState === 'running' || !previewReady}
onClick={() => void startPreview()}
>
{crawlState === 'running'
? t(($) => $['newKnowledge.crawling'])
: t(($) => $['newKnowledge.crawlAndPreview'])}
</Button>
)}
<section
aria-label={t(($) => $['newKnowledge.crawlPreview'])}
className="min-h-40 rounded-lg border border-dashed border-divider-regular px-4 py-4"
className={cn(
crawlState === 'running'
? 'flex h-60 flex-col gap-3.5 overflow-hidden rounded-xl border border-divider-deep bg-background-default-subtle p-4'
: crawlState === 'success'
? ''
: 'min-h-40 rounded-lg border border-dashed border-divider-regular px-4 py-4',
)}
>
{crawlState === 'idle' && (
<div className="flex min-h-32 flex-col items-center justify-center text-center">
@ -564,22 +667,52 @@ export function CreateSourceSetup({
</div>
)}
{crawlState === 'running' && (
<div className="flex items-center gap-3">
<div className="flex h-6 shrink-0 items-center gap-2">
<span
aria-hidden
className="i-ri-loader-4-line size-4 animate-spin text-text-accent"
/>
<p role="status" className="min-w-0 flex-1 system-xs-medium text-text-primary">
<p
role="status"
aria-live="polite"
className="min-w-0 flex-1 truncate system-xs-medium text-text-primary"
>
{t(($) => $['newKnowledge.crawlingPages'], {
count: previewPages.length,
host: new URL(draft.rootUrl).host,
})}
</p>
<Button type="button" size="small" onClick={() => stopPreview()}>
<Button
type="button"
variant="ghost-accent"
size="small"
className="ml-auto shrink-0"
onClick={() => stopPreview()}
>
{t(($) => $['newKnowledge.stopCrawl'])}
</Button>
</div>
)}
{crawlState === 'running' &&
CRAWL_PREVIEW_SKELETONS.map(({ id, sourceWidth, titleWidth }) => (
<div key={id} aria-hidden className="flex h-8 shrink-0 items-center gap-2.5 py-1">
<span className="size-4 animate-pulse rounded bg-util-colors-gray-gray-200 motion-reduce:animate-none" />
<span className="flex min-w-0 flex-1 flex-col gap-1.5">
<span
className={cn(
'block h-2.5 animate-pulse rounded bg-util-colors-gray-gray-200 motion-reduce:animate-none',
titleWidth,
)}
/>
<span
className={cn(
'block h-2 animate-pulse rounded bg-background-section-burn motion-reduce:animate-none',
sourceWidth,
)}
/>
</span>
</div>
))}
{crawlState === 'error' && (
<p role="alert" className="system-xs-regular text-text-destructive">
{t(($) => $['newKnowledge.crawlStartFailed'])}
@ -601,48 +734,35 @@ export function CreateSourceSetup({
/>
)}
</section>
{crawlState === 'success' && (
<SyncPolicySelect
className="w-full sm:w-75.25"
disabled={disabled}
draft={draft}
onDraftChange={updateDraftWithoutReset}
size="medium"
/>
)}
</div>
)}
{draft.sourceType !== 'websiteCrawl' && (
<div className="space-y-3">
{draft.sourceType === 'onlineDocuments' && activeProvider === 'Notion' && (
<section className="rounded-lg border border-divider-subtle bg-background-default p-4">
<div className="flex flex-col items-start gap-3">
<span
aria-hidden
className={cn(
'flex size-10 shrink-0 items-center justify-center rounded-lg bg-background-section text-xl',
availableProviders.find((provider) => provider.label === activeProvider)?.icon,
)}
/>
<div className="min-w-0 flex-1">
<p className="system-sm-semibold text-text-primary">
{t(($) => $['newKnowledge.notionNotConnected'])}
</p>
<p className="mt-1 system-xs-regular text-text-tertiary">
{t(($) => $['newKnowledge.notionNotConnectedDescription'])}
</p>
</div>
</div>
<Button
variant="primary"
disabled={disabled}
className="mt-4"
onClick={showBackendBoundary}
>
{t(($) => $['newKnowledge.connectNotion'])}
</Button>
</section>
)}
{!(draft.sourceType === 'onlineDocuments' && activeProvider === 'Notion') && (
<>
{draft.sourceType === 'onlineDocuments' && activeProvider === 'Notion' ? (
<NotionSourceConfiguration
disabled={disabled}
draft={draft}
onConnect={showBackendBoundary}
onDraftChange={updateDraft}
/>
) : (
<ConnectedSourceConfiguration
disabled={disabled}
draft={draft}
onDraftChange={updateDraft}
/>
)}
</div>
</>
)}
{backendBoundaryVisible && (

View File

@ -1,5 +1,6 @@
'use client'
import type { KnowledgeFsUploadPhase } from './knowledge-fs-upload'
import { Button } from '@langgenius/dify-ui/button'
import { cn } from '@langgenius/dify-ui/cn'
import { useId, useState } from 'react'
@ -32,8 +33,11 @@ function formatFileSize(bytes: number) {
return `${(bytes / (1024 * 1024)).toFixed(1)} MB`
}
function fileBadge(file: File) {
return documentUploadFileExtension(file.name).toLocaleUpperCase() || 'FILE'
function fileIconClass(extension: string) {
if (extension === 'PDF') return 'i-ri-file-pdf-2-fill text-text-destructive'
if (extension === 'DOC' || extension === 'DOCX') return 'i-ri-file-word-2-fill text-text-accent'
if (extension === 'XLS' || extension === 'XLSX') return 'i-ri-file-excel-fill text-text-success'
return 'i-ri-file-text-fill text-text-tertiary'
}
function mergeFiles(current: QueuedUpload[], files: File[]) {
@ -53,11 +57,13 @@ function mergeFiles(current: QueuedUpload[], files: File[]) {
export function CreateUploadQueue({
disabled,
uploadPhases = new Map(),
uploading,
uploads,
onChange,
}: {
disabled: boolean
uploadPhases?: ReadonlyMap<File, KnowledgeFsUploadPhase>
uploading: boolean
uploads: QueuedUpload[]
onChange: (uploads: QueuedUpload[]) => void
@ -72,7 +78,7 @@ export function CreateUploadQueue({
}
return (
<div className="mx-4 mb-4 space-y-2 border-t border-divider-subtle pt-4">
<div className="mx-[14.5px] -mt-[3.5px] mb-[14.5px] space-y-3">
<input
id={inputId}
className="peer sr-only"
@ -89,7 +95,7 @@ export function CreateUploadQueue({
<label
htmlFor={inputId}
className={cn(
'flex min-h-20 flex-col items-center justify-center rounded-lg border border-dashed border-divider-regular px-4 py-3 text-center outline-hidden transition-colors motion-reduce:transition-none',
'flex h-16 flex-col items-center justify-center gap-1 rounded-[10px] border border-dashed border-divider-regular bg-background-section px-4 text-center outline-hidden transition-colors motion-reduce:transition-none',
'peer-focus-visible:ring-2 peer-focus-visible:ring-state-accent-solid',
disabled
? 'cursor-not-allowed opacity-60'
@ -111,89 +117,113 @@ export function CreateUploadQueue({
addFiles([...event.dataTransfer.files])
}}
>
<span
aria-hidden
className={cn(
'size-5 text-text-tertiary',
uploading
? 'i-ri-loader-2-line animate-spin motion-reduce:animate-none'
: 'i-ri-upload-cloud-2-line',
)}
/>
<span className="mt-1.5 system-sm-medium text-text-primary">
<span className="flex items-center gap-1.5 system-xs-medium text-text-primary">
<span
aria-hidden
className={cn(
'size-5 text-text-tertiary',
uploading
? 'i-ri-loader-2-line animate-spin motion-reduce:animate-none'
: 'i-ri-upload-cloud-2-line',
)}
/>
{uploading
? t(($) => $['newKnowledge.uploadingFiles'])
: t(($) => $['newKnowledge.uploadFiles'])}
: t(($) => $['newKnowledge.uploadDropZoneTitle'])}
</span>
<span className="mt-1 system-xs-regular text-text-tertiary">
{t(($) => $['newKnowledge.documentsDropHint'])}
<span className="system-2xs-medium text-text-tertiary">
{t(($) => $['newKnowledge.documentUploadFormats'])}
</span>
</label>
{!!uploads.length && (
<ul className="space-y-1.5" aria-label={t(($) => $['newKnowledge.uploadFiles'])}>
{uploads.map((upload) => (
<li
key={upload.id}
className={cn(
'flex min-w-0 items-center gap-2 rounded-lg border border-divider-subtle bg-background-default px-3 py-2',
upload.issue &&
'border-components-input-border-destructive bg-state-destructive-hover',
)}
>
<span
aria-hidden
<ul className="space-y-1" aria-label={t(($) => $['newKnowledge.uploadFiles'])}>
{uploads.map((upload) => {
const extension =
documentUploadFileExtension(upload.file.name).toLocaleUpperCase() || 'FILE'
const fileUploading = uploadPhases.get(upload.file) === 'pending'
return (
<li
key={upload.id}
aria-busy={fileUploading || undefined}
className={cn(
'system-2xs-semibold flex h-7 min-w-9 shrink-0 items-center justify-center rounded bg-background-section px-1',
upload.issue ? 'text-text-destructive' : 'text-text-tertiary',
'group flex h-12 min-w-0 items-center overflow-hidden rounded-lg border-[0.5px] shadow-xs',
upload.issue
? 'border-state-destructive-border bg-state-destructive-hover'
: 'border-components-panel-border bg-components-panel-on-panel-item-bg',
)}
>
{uploading && !upload.issue ? (
<span className="i-ri-loader-2-line size-4 animate-spin motion-reduce:animate-none" />
) : (
fileBadge(upload.file)
)}
</span>
<span className="min-w-0 flex-1">
<span className="block truncate system-xs-medium text-text-primary">
{upload.file.name}
<span className="flex shrink-0 items-start p-3">
<span aria-hidden className={cn('size-6', fileIconClass(extension))} />
</span>
<span
className={cn(
'block system-2xs-regular text-text-tertiary',
upload.issue && 'text-text-destructive',
<span className="min-w-0 flex-1 py-1 pr-2 text-left">
<span className="block truncate system-xs-medium text-text-primary">
{upload.file.name}
</span>
<span className="mt-0.5 flex min-h-3 items-center gap-1 system-2xs-medium text-text-tertiary">
{extension} · {formatFileSize(upload.file.size)}
<span aria-hidden className="text-text-quaternary">
·
</span>
<span
className={cn(
'truncate',
upload.issue ? 'text-text-destructive' : 'text-text-tertiary',
)}
>
{fileUploading
? t(($) => $['newKnowledge.uploadingFiles'])
: upload.issue === 'fileSize'
? t(($) => $['newKnowledge.documentUploadExclusion.fileSize'])
: upload.issue === 'fileType'
? t(($) => $['newKnowledge.documentUploadExclusion.fileType'])
: t(($) => $['newKnowledge.uploadCharactersUnavailable'])}
</span>
</span>
</span>
<span className="flex shrink-0 items-center gap-1 py-2 pr-3">
{fileUploading ? (
<span className="flex size-6 items-center justify-center">
<span
aria-hidden
className="i-ri-loader-2-line size-3 animate-spin text-text-accent motion-reduce:animate-none"
/>
</span>
) : (
!upload.issue &&
canPreviewLocalFile(upload.file) && (
<Button
size="small"
className="shrink-0 opacity-0 transition-opacity group-focus-within:opacity-100 group-hover:opacity-100 motion-reduce:transition-none"
onClick={() => openLocalFilePreview(upload.file)}
>
{t(($) => $['newKnowledge.preview'])}
</Button>
)
)}
>
{uploading && !upload.issue
? t(($) => $['newKnowledge.uploadingFiles'])
: upload.issue === 'fileSize'
? `${formatFileSize(upload.file.size)} · ${t(($) => $['newKnowledge.documentUploadExclusion.fileSize'])}`
: upload.issue === 'fileType'
? t(($) => $['newKnowledge.documentUploadExclusion.fileType'])
: `${formatFileSize(upload.file.size)} · ${t(($) => $['newKnowledge.uploadCharactersUnavailable'])}`}
{upload.issue && (
<span className="flex size-6 items-center justify-center">
<span
aria-hidden
className="i-ri-error-warning-fill size-4 text-text-destructive"
/>
</span>
)}
<button
type="button"
disabled={disabled}
aria-label={`${tCommon(($) => $['operation.remove'])} ${upload.file.name}`}
className="flex size-6 shrink-0 items-center justify-center rounded-md text-text-tertiary outline-hidden hover:bg-state-base-hover hover:text-text-secondary focus-visible:ring-2 focus-visible:ring-state-accent-solid disabled:cursor-not-allowed disabled:text-text-disabled"
onClick={() =>
onChange(uploads.filter((candidate) => candidate.id !== upload.id))
}
>
<span aria-hidden className="i-ri-close-line size-4" />
</button>
</span>
</span>
{!uploading && !upload.issue && canPreviewLocalFile(upload.file) && (
<Button
size="small"
className="shrink-0"
onClick={() => openLocalFilePreview(upload.file)}
>
{t(($) => $['newKnowledge.preview'])}
</Button>
)}
<Button
variant="ghost"
size="small"
disabled={disabled}
aria-label={`${tCommon(($) => $['operation.remove'])} ${upload.file.name}`}
className="size-7 shrink-0 px-0"
onClick={() => onChange(uploads.filter((candidate) => candidate.id !== upload.id))}
>
<span aria-hidden className="i-ri-delete-bin-line size-4" />
</Button>
</li>
))}
</li>
)
})}
</ul>
)}
</div>

View File

@ -257,7 +257,7 @@
"newKnowledge.documentUploadExclusion.quota": "تم تجاوز حصة مساحة العمل",
"newKnowledge.documentUploadExclusion.target": "لم يعد هدف المستند صالحًا",
"newKnowledge.documentUploadFailed": "لم نتمكن من تحميل هذه المستندات. حاول ثانية.",
"newKnowledge.documentUploadFormats": "PDF، DOCX، Markdown، HTML، CSV، JSONL، XLSX، TXT — حتى 15 ميغابايت لكل ملف",
"newKnowledge.documentUploadFormats": "يدعم TXT وMarkdown وPDF وHTML وXLSX وCSV وJSONL · حتى 15 ميغابايت لكل ملف",
"newKnowledge.documentUploadPartial": "بدأت معالجة {{accepted}} مستندًا؛ تعذرت إضافة {{excluded}}: {{details}}",
"newKnowledge.documentUploadRejected": "لم يتم قبول أي مستند: {{details}}",
"newKnowledge.documentUploadStarted": "بدأت معالجة المستندات.",
@ -690,9 +690,9 @@
"newKnowledge.updatedColumn": "تم التحديث",
"newKnowledge.uploadCharactersUnavailable": "الأحرف: —",
"newKnowledge.uploadDocuments": "تحميل المستندات",
"newKnowledge.uploadDropZoneTitle": "اسحب الملفات وأفلتها هنا، أو انقر للتصفح",
"newKnowledge.uploadDropZoneTitle": "اسحب الملفات وأفلتها، أو تصفّح",
"newKnowledge.uploadFiles": "رفع الملفات",
"newKnowledge.uploadFilesDescription": "حمّل الملفات إلى قاعدة المعرفة هذه — ستتم معالجتها وتقسيمها إلى مقاطع وفهرستها تلقائيًا.",
"newKnowledge.uploadFilesDescription": "أضف ملفات من جهاز الكمبيوتر — ستتم فهرستها بمجرد إنشاء قاعدة المعرفة.",
"newKnowledge.uploadingFiles": "جارٍ الرفع…",
"newKnowledge.usingDefaults": "استخدام الإعدادات الافتراضية",
"newKnowledge.viewLabel": "عرض المعرفة",

View File

@ -257,7 +257,7 @@
"newKnowledge.documentUploadExclusion.quota": "Arbeitsbereichskontingent überschritten",
"newKnowledge.documentUploadExclusion.target": "Dokumentziel ist nicht mehr gültig",
"newKnowledge.documentUploadFailed": "Wir konnten diese Dokumente nicht hochladen. Versuchen Sie es erneut.",
"newKnowledge.documentUploadFormats": "PDF, DOCX, Markdown, HTML, CSV, JSONL, XLSX, TXT — bis zu 15 MB pro Datei",
"newKnowledge.documentUploadFormats": "Unterstützt TXT, Markdown, PDF, HTML, XLSX, CSV und JSONL · jeweils bis zu 15 MB",
"newKnowledge.documentUploadPartial": "{{accepted}} Dokumente wurden gestartet; {{excluded}} konnten nicht hinzugefügt werden: {{details}}",
"newKnowledge.documentUploadRejected": "Keine Dokumente wurden akzeptiert: {{details}}",
"newKnowledge.documentUploadStarted": "Die Dokumentenverarbeitung wurde gestartet.",
@ -690,9 +690,9 @@
"newKnowledge.updatedColumn": "Aktualisiert",
"newKnowledge.uploadCharactersUnavailable": "Zeichen: —",
"newKnowledge.uploadDocuments": "Dokumente hochladen",
"newKnowledge.uploadDropZoneTitle": "Dateien hierher ziehen oder zum Durchsuchen klicken",
"newKnowledge.uploadDropZoneTitle": "Dateien ziehen und ablegen oder durchsuchen",
"newKnowledge.uploadFiles": "Dateien hochladen",
"newKnowledge.uploadFilesDescription": "Laden Sie Dateien in diese Wissensdatenbank hoch — sie werden automatisch analysiert, in Abschnitte unterteilt und indiziert.",
"newKnowledge.uploadFilesDescription": "Fügen Sie Dateien von Ihrem Computer hinzu — sie werden direkt nach dem Erstellen der Wissensdatenbank indexiert.",
"newKnowledge.uploadingFiles": "Wird hochgeladen…",
"newKnowledge.usingDefaults": "Standardeinstellungen werden verwendet",
"newKnowledge.viewLabel": "Wissensansicht",

View File

@ -257,7 +257,7 @@
"newKnowledge.documentUploadExclusion.quota": "workspace quota exceeded",
"newKnowledge.documentUploadExclusion.target": "document target is no longer valid",
"newKnowledge.documentUploadFailed": "We couldn't upload these documents. Try again.",
"newKnowledge.documentUploadFormats": "PDF, DOCX, Markdown, HTML, CSV, JSONL, XLSX, TXT — up to 15 MB each",
"newKnowledge.documentUploadFormats": "Supports TXT, Markdown, PDF, HTML, XLSX, CSV, and JSONL · up to 15MB each",
"newKnowledge.documentUploadPartial": "{{accepted}} documents started; {{excluded}} could not be added: {{details}}",
"newKnowledge.documentUploadRejected": "No documents were accepted: {{details}}",
"newKnowledge.documentUploadStarted": "Document processing started.",
@ -668,7 +668,7 @@
"newKnowledge.syncPolicy": "Sync policy",
"newKnowledge.syncPolicyColumn": "Sync policy",
"newKnowledge.syncPolicyCustom": "Custom interval",
"newKnowledge.syncPolicyDaily": "Every 24h",
"newKnowledge.syncPolicyDaily": "Every 24 hours",
"newKnowledge.syncPolicyLoadFailed": "We couldn't load the sync policy.",
"newKnowledge.syncPolicyManual": "Manual only",
"newKnowledge.syncPolicyProvider": "Provider sync",
@ -690,9 +690,9 @@
"newKnowledge.updatedColumn": "Updated",
"newKnowledge.uploadCharactersUnavailable": "Characters: —",
"newKnowledge.uploadDocuments": "Upload documents",
"newKnowledge.uploadDropZoneTitle": "Drag & drop files here, or click to browse",
"newKnowledge.uploadDropZoneTitle": "Drag and drop files, or browse",
"newKnowledge.uploadFiles": "Upload files",
"newKnowledge.uploadFilesDescription": "Upload files to this knowledge base — they will be parsed, chunked, and indexed automatically.",
"newKnowledge.uploadFilesDescription": "Add files from your computer — they're indexed as soon as you create.",
"newKnowledge.uploadingFiles": "Uploading…",
"newKnowledge.usingDefaults": "Using defaults",
"newKnowledge.viewLabel": "Knowledge view",

View File

@ -257,7 +257,7 @@
"newKnowledge.documentUploadExclusion.quota": "se superó la cuota del espacio de trabajo",
"newKnowledge.documentUploadExclusion.target": "el destino del documento ya no es válido",
"newKnowledge.documentUploadFailed": "No pudimos cargar estos documentos. Intentar otra vez.",
"newKnowledge.documentUploadFormats": "PDF, DOCX, Markdown, HTML, CSV, JSONL, XLSX, TXT — hasta 15 MB por archivo",
"newKnowledge.documentUploadFormats": "Admite TXT, Markdown, PDF, HTML, XLSX, CSV y JSONL · hasta 15 MB cada uno",
"newKnowledge.documentUploadPartial": "Se inició el procesamiento de {{accepted}} documentos; no se pudieron añadir {{excluded}}: {{details}}",
"newKnowledge.documentUploadRejected": "No se aceptó ningún documento: {{details}}",
"newKnowledge.documentUploadStarted": "Se inició el procesamiento de documentos.",
@ -690,9 +690,9 @@
"newKnowledge.updatedColumn": "Actualizado",
"newKnowledge.uploadCharactersUnavailable": "Caracteres: —",
"newKnowledge.uploadDocuments": "Subir documentos",
"newKnowledge.uploadDropZoneTitle": "Arrastra y suelta archivos aquí, o haz clic para explorar",
"newKnowledge.uploadDropZoneTitle": "Arrastra y suelta archivos o explora",
"newKnowledge.uploadFiles": "Subir archivos",
"newKnowledge.uploadFilesDescription": "Sube archivos a esta base de conocimiento; se analizarán, dividirán en fragmentos e indexarán automáticamente.",
"newKnowledge.uploadFilesDescription": "Añade archivos desde tu ordenador; se indexarán en cuanto crees la base de conocimiento.",
"newKnowledge.uploadingFiles": "Subiendo…",
"newKnowledge.usingDefaults": "Usando valores predeterminados",
"newKnowledge.viewLabel": "Vista de conocimiento",

View File

@ -257,7 +257,7 @@
"newKnowledge.documentUploadExclusion.quota": "سهمیه فضای کاری رد شده است",
"newKnowledge.documentUploadExclusion.target": "هدف سند دیگر معتبر نیست",
"newKnowledge.documentUploadFailed": "ما نتوانستیم این اسناد را آپلود کنیم. دوباره امتحان کنید.",
"newKnowledge.documentUploadFormats": "PDF، DOCX، Markdown، HTML، CSV، JSONL، XLSX، TXT — حداکثر ۱۵ مگابایت برای هر فایل",
"newKnowledge.documentUploadFormats": "پشتیبانی از TXT، Markdown، PDF، HTML، XLSX، CSV و JSONL · هر فایل تا ۱۵ مگابایت",
"newKnowledge.documentUploadPartial": "پردازش {{accepted}} سند آغاز شد؛ {{excluded}} سند افزوده نشد: {{details}}",
"newKnowledge.documentUploadRejected": "هیچ سندی پذیرفته نشد: {{details}}",
"newKnowledge.documentUploadStarted": "پردازش اسناد آغاز شد.",
@ -690,9 +690,9 @@
"newKnowledge.updatedColumn": "به روز شد",
"newKnowledge.uploadCharactersUnavailable": "نویسه‌ها: —",
"newKnowledge.uploadDocuments": "اسناد را بارگذاری کنید",
"newKnowledge.uploadDropZoneTitle": "فایل‌ها را اینجا بکشید و رها کنید یا برای انتخاب کلیک کنید",
"newKnowledge.uploadDropZoneTitle": "فایل‌ها را بکشید و رها کنید یا انتخاب کنید",
"newKnowledge.uploadFiles": "بارگذاری فایل‌ها",
"newKnowledge.uploadFilesDescription": "فایل‌ها را در این پایگاه دانش بارگذاری کنید — به‌طور خودکار تجزیه، بخش‌بندی و نمایه‌سازی می‌شوند.",
"newKnowledge.uploadFilesDescription": "فایل‌ها را از رایانه‌تان اضافه کنید — به‌محض ایجاد پایگاه دانش نمایه‌سازی می‌شوند.",
"newKnowledge.uploadingFiles": "در حال بارگذاری…",
"newKnowledge.usingDefaults": "استفاده از تنظیمات پیش‌فرض",
"newKnowledge.viewLabel": "نمای دانش",

View File

@ -257,7 +257,7 @@
"newKnowledge.documentUploadExclusion.quota": "quota de lespace de travail dépassé",
"newKnowledge.documentUploadExclusion.target": "la cible du document nest plus valide",
"newKnowledge.documentUploadFailed": "Nous n'avons pas pu télécharger ces documents. Essayer à nouveau.",
"newKnowledge.documentUploadFormats": "PDF, DOCX, Markdown, HTML, CSV, JSONL, XLSX, TXT — jusquà 15 Mo par fichier",
"newKnowledge.documentUploadFormats": "Formats pris en charge : TXT, Markdown, PDF, HTML, XLSX, CSV et JSONL · 15 Mo max par fichier",
"newKnowledge.documentUploadPartial": "Le traitement de {{accepted}} documents a démarré ; {{excluded}} nont pas pu être ajoutés : {{details}}",
"newKnowledge.documentUploadRejected": "Aucun document na été accepté : {{details}}",
"newKnowledge.documentUploadStarted": "Le traitement du document a commencé.",
@ -690,9 +690,9 @@
"newKnowledge.updatedColumn": "Mis à jour",
"newKnowledge.uploadCharactersUnavailable": "Caractères : —",
"newKnowledge.uploadDocuments": "Télécharger des documents",
"newKnowledge.uploadDropZoneTitle": "Glissez-déposez les fichiers ici ou cliquez pour parcourir",
"newKnowledge.uploadDropZoneTitle": "Glissez-déposez des fichiers ou parcourez",
"newKnowledge.uploadFiles": "Importer des fichiers",
"newKnowledge.uploadFilesDescription": "Importez des fichiers dans cette base de connaissances : ils seront automatiquement analysés, découpés et indexés.",
"newKnowledge.uploadFilesDescription": "Ajoutez des fichiers depuis votre ordinateur : ils seront indexés dès la création de la base de connaissances.",
"newKnowledge.uploadingFiles": "Téléversement…",
"newKnowledge.usingDefaults": "Valeurs par défaut utilisées",
"newKnowledge.viewLabel": "Vue des connaissances",

View File

@ -257,7 +257,7 @@
"newKnowledge.documentUploadExclusion.quota": "कार्यस्थान कोटा पार हो गया",
"newKnowledge.documentUploadExclusion.target": "दस्तावेज़ लक्ष्य अब मान्य नहीं है",
"newKnowledge.documentUploadFailed": "हम ये दस्तावेज़ अपलोड नहीं कर सके. पुनः प्रयास करें।",
"newKnowledge.documentUploadFormats": "PDF, DOCX, Markdown, HTML, CSV, JSONL, XLSX, TXT — प्रत्येक फ़ाइल अधिकतम 15 MB",
"newKnowledge.documentUploadFormats": "TXT, Markdown, PDF, HTML, XLSX, CSV और JSONL समर्थित · प्रत्येक फ़ाइल अधिकतम 15 MB",
"newKnowledge.documentUploadPartial": "{{accepted}} दस्तावेज़ों की प्रोसेसिंग शुरू हुई; {{excluded}} जोड़े नहीं जा सके: {{details}}",
"newKnowledge.documentUploadRejected": "कोई दस्तावेज़ स्वीकार नहीं किया गया: {{details}}",
"newKnowledge.documentUploadStarted": "दस्तावेज़ प्रसंस्करण शुरू हुआ.",
@ -690,9 +690,9 @@
"newKnowledge.updatedColumn": "अद्यतन किया गया",
"newKnowledge.uploadCharactersUnavailable": "वर्ण: —",
"newKnowledge.uploadDocuments": "दस्तावेज़ अपलोड करें",
"newKnowledge.uploadDropZoneTitle": "फ़ाइलें यहाँ खींचकर छोड़ें, या ब्राउज़ करने के लिए क्लिक करें",
"newKnowledge.uploadDropZoneTitle": "फ़ाइलें खींचकर छोड़ें या ब्राउज़ करें",
"newKnowledge.uploadFiles": "फ़ाइलें अपलोड करें",
"newKnowledge.uploadFilesDescription": "इस नॉलेज बेस में फ़ाइलें अपलोड करें — उन्हें अपने-आप पार्स, खंडित और इंडेक्स किया जाएगा।",
"newKnowledge.uploadFilesDescription": "अपने कंप्यूटर से फ़ाइलें जोड़ें — नॉलेज बेस बनाते ही वे इंडेक्स हो जाएँगी।",
"newKnowledge.uploadingFiles": "अपलोड हो रहा है…",
"newKnowledge.usingDefaults": "डिफ़ॉल्ट सेटिंग का उपयोग हो रहा है",
"newKnowledge.viewLabel": "नॉलेज दृश्य",

View File

@ -257,7 +257,7 @@
"newKnowledge.documentUploadExclusion.quota": "kuota ruang kerja terlampaui",
"newKnowledge.documentUploadExclusion.target": "target dokumen tidak lagi valid",
"newKnowledge.documentUploadFailed": "Kami tidak dapat mengunggah dokumen-dokumen ini. Coba lagi.",
"newKnowledge.documentUploadFormats": "PDF, DOCX, Markdown, HTML, CSV, JSONL, XLSX, TXT — maksimal 15 MB per file",
"newKnowledge.documentUploadFormats": "Mendukung TXT, Markdown, PDF, HTML, XLSX, CSV, dan JSONL · masing-masing hingga 15 MB",
"newKnowledge.documentUploadPartial": "Pemrosesan {{accepted}} dokumen dimulai; {{excluded}} tidak dapat ditambahkan: {{details}}",
"newKnowledge.documentUploadRejected": "Tidak ada dokumen yang diterima: {{details}}",
"newKnowledge.documentUploadStarted": "Pemrosesan dokumen dimulai.",
@ -690,9 +690,9 @@
"newKnowledge.updatedColumn": "Diperbarui",
"newKnowledge.uploadCharactersUnavailable": "Karakter: —",
"newKnowledge.uploadDocuments": "Unggah dokumen",
"newKnowledge.uploadDropZoneTitle": "Seret & letakkan file di sini, atau klik untuk memilih",
"newKnowledge.uploadDropZoneTitle": "Seret dan lepas file, atau pilih",
"newKnowledge.uploadFiles": "Unggah file",
"newKnowledge.uploadFilesDescription": "Unggah file ke basis pengetahuan ini — file akan diurai, dibagi menjadi potongan, dan diindeks secara otomatis.",
"newKnowledge.uploadFilesDescription": "Tambahkan file dari komputer Anda — file akan langsung diindeks setelah basis pengetahuan dibuat.",
"newKnowledge.uploadingFiles": "Mengunggah…",
"newKnowledge.usingDefaults": "Menggunakan pengaturan default",
"newKnowledge.viewLabel": "Tampilan pengetahuan",

View File

@ -257,7 +257,7 @@
"newKnowledge.documentUploadExclusion.quota": "quota dell'area di lavoro superata",
"newKnowledge.documentUploadExclusion.target": "la destinazione del documento non è più valida",
"newKnowledge.documentUploadFailed": "Non è stato possibile caricare questi documenti. Riprova.",
"newKnowledge.documentUploadFormats": "PDF, DOCX, Markdown, HTML, CSV, JSONL, XLSX, TXT — fino a 15 MB per file",
"newKnowledge.documentUploadFormats": "Supporta TXT, Markdown, PDF, HTML, XLSX, CSV e JSONL · fino a 15 MB ciascuno",
"newKnowledge.documentUploadPartial": "Elaborazione avviata per {{accepted}} documenti; impossibile aggiungerne {{excluded}}: {{details}}",
"newKnowledge.documentUploadRejected": "Nessun documento è stato accettato: {{details}}",
"newKnowledge.documentUploadStarted": "È iniziata l'elaborazione del documento.",
@ -690,9 +690,9 @@
"newKnowledge.updatedColumn": "Aggiornato",
"newKnowledge.uploadCharactersUnavailable": "Caratteri: —",
"newKnowledge.uploadDocuments": "Carica documenti",
"newKnowledge.uploadDropZoneTitle": "Trascina qui i file oppure fai clic per sfogliare",
"newKnowledge.uploadDropZoneTitle": "Trascina e rilascia i file oppure sfoglia",
"newKnowledge.uploadFiles": "Carica file",
"newKnowledge.uploadFilesDescription": "Carica i file in questa knowledge base: verranno analizzati, suddivisi in segmenti e indicizzati automaticamente.",
"newKnowledge.uploadFilesDescription": "Aggiungi file dal computer: verranno indicizzati non appena crei la knowledge base.",
"newKnowledge.uploadingFiles": "Caricamento…",
"newKnowledge.usingDefaults": "Impostazioni predefinite in uso",
"newKnowledge.viewLabel": "Vista conoscenza",

View File

@ -257,7 +257,7 @@
"newKnowledge.documentUploadExclusion.quota": "ワークスペースのクォータを超えています",
"newKnowledge.documentUploadExclusion.target": "ドキュメントの対象が無効になっています",
"newKnowledge.documentUploadFailed": "これらの書類をアップロードできませんでした。もう一度やり直してください。",
"newKnowledge.documentUploadFormats": "PDF、DOCX、Markdown、HTML、CSV、JSONL、XLSX、TXT — 1ファイル最大15 MB",
"newKnowledge.documentUploadFormats": "TXT、Markdown、PDF、HTML、XLSX、CSV、JSONL に対応 · 1ファイル最大15 MB",
"newKnowledge.documentUploadPartial": "{{accepted}} 件のドキュメントの処理を開始しました。{{excluded}} 件は追加できませんでした:{{details}}",
"newKnowledge.documentUploadRejected": "ドキュメントを受け付けられませんでした:{{details}}",
"newKnowledge.documentUploadStarted": "文書処理が開始されました。",
@ -690,9 +690,9 @@
"newKnowledge.updatedColumn": "更新されました",
"newKnowledge.uploadCharactersUnavailable": "文字数:—",
"newKnowledge.uploadDocuments": "書類のアップロード",
"newKnowledge.uploadDropZoneTitle": "ここにファイルをドラッグ&ドロップするか、クリックして選択",
"newKnowledge.uploadDropZoneTitle": "ファイルをドラッグ&ドロップするか、参照",
"newKnowledge.uploadFiles": "ファイルをアップロード",
"newKnowledge.uploadFilesDescription": "このナレッジベースにファイルをアップロードすると、自動的に解析、チャンク分割、インデックス作成が行われます。",
"newKnowledge.uploadFilesDescription": "コンピューターからファイルを追加すると、ナレッジベースの作成後すぐにインデックス化されます。",
"newKnowledge.uploadingFiles": "アップロード中…",
"newKnowledge.usingDefaults": "デフォルト設定を使用中",
"newKnowledge.viewLabel": "ナレッジ表示",

View File

@ -257,7 +257,7 @@
"newKnowledge.documentUploadExclusion.quota": "워크스페이스 할당량을 초과했습니다",
"newKnowledge.documentUploadExclusion.target": "문서 대상이 더 이상 유효하지 않습니다",
"newKnowledge.documentUploadFailed": "이 문서를 업로드할 수 없습니다. 다시 시도해 보세요.",
"newKnowledge.documentUploadFormats": "PDF, DOCX, Markdown, HTML, CSV, JSONL, XLSX, TXT — 파일당 최대 15 MB",
"newKnowledge.documentUploadFormats": "TXT, Markdown, PDF, HTML, XLSX, CSV, JSONL 지원 · 파일당 최대 15 MB",
"newKnowledge.documentUploadPartial": "문서 {{accepted}}개의 처리를 시작했습니다. {{excluded}}개는 추가하지 못했습니다: {{details}}",
"newKnowledge.documentUploadRejected": "수락된 문서가 없습니다: {{details}}",
"newKnowledge.documentUploadStarted": "문서 처리가 시작되었습니다.",
@ -690,9 +690,9 @@
"newKnowledge.updatedColumn": "업데이트됨",
"newKnowledge.uploadCharactersUnavailable": "문자 수: —",
"newKnowledge.uploadDocuments": "문서 업로드",
"newKnowledge.uploadDropZoneTitle": "파일을 여기로 끌어다 놓거나 클릭하여 찾아보기",
"newKnowledge.uploadDropZoneTitle": "파일을 끌어다 놓거나 찾아보기",
"newKnowledge.uploadFiles": "파일 업로드",
"newKnowledge.uploadFilesDescription": "이 지식 베이스에 파일을 업로드하면 자동으로 파싱, 청킹 및 인덱싱됩니다.",
"newKnowledge.uploadFilesDescription": "컴퓨터에서 파일을 추가하면 지식 베이스 생성 즉시 인덱싱됩니다.",
"newKnowledge.uploadingFiles": "업로드 중…",
"newKnowledge.usingDefaults": "기본값 사용 중",
"newKnowledge.viewLabel": "지식 보기",

View File

@ -250,6 +250,7 @@
"newKnowledge.documentUploadExclusion.quota": "ເກີນໂຄຕ້າພື້ນທີ່ເຮັດວຽກ",
"newKnowledge.documentUploadExclusion.target": "ເປົ້າໝາຍເອກະສານບໍ່ຖືກຕ້ອງອີກຕໍ່ໄປ",
"newKnowledge.documentUploadFailed": "ພວກເຮົາບໍ່ສາມາດອັບໂຫລດເອກະສານເຫຼົ່ານີ້ໄດ້. ລອງອີກຄັ້ງ.",
"newKnowledge.documentUploadFormats": "ຮອງຮັບ TXT, Markdown, PDF, HTML, XLSX, CSV ແລະ JSONL · ສູງສຸດ 15 MB ຕໍ່ໄຟລ໌",
"newKnowledge.documentUploadPartial": "ເອກະສານ {{accepted}} ລາຍການເລີ່ມແລ້ວ; ບໍ່ສາມາດເພີ່ມ {{excluded}} ລາຍການໄດ້: {{details}}",
"newKnowledge.documentUploadRejected": "ບໍ່ມີເອກະສານໄດ້ຮັບການຍອມຮັບ: {{details}}",
"newKnowledge.documentUploadStarted": "ການປະມວນຜົນເອກະສານໄດ້ເລີ່ມຕົ້ນ.",
@ -434,6 +435,7 @@
"newKnowledge.updatedColumn": "ອັບເດດ",
"newKnowledge.uploadCharactersUnavailable": "ລັກ​ສະ​ນະ​: —",
"newKnowledge.uploadDocuments": "ອັບໂຫລດເອກະສານ",
"newKnowledge.uploadDropZoneTitle": "ລາກແລະວາງໄຟລ໌ ຫຼື ເລືອກໄຟລ໌",
"newKnowledge.uploadFiles": "ອັບໂຫຼດໄຟລ໌",
"newKnowledge.uploadFilesDescription": "ເພີ່ມໄຟລ໌ຈາກຄອມພິວເຕີຂອງທ່ານ — ພວກມັນຈະຖືກສ້າງດັດຊະນີທັນທີທີ່ທ່ານສ້າງ.",
"newKnowledge.uploadingFiles": "ກຳລັງອັບໂຫລດ...",

View File

@ -257,7 +257,7 @@
"newKnowledge.documentUploadExclusion.quota": "werkruimtequotum overschreden",
"newKnowledge.documentUploadExclusion.target": "documentdoel is niet meer geldig",
"newKnowledge.documentUploadFailed": "We konden deze documenten niet uploaden. Probeer het opnieuw.",
"newKnowledge.documentUploadFormats": "PDF, DOCX, Markdown, HTML, CSV, JSONL, XLSX, TXT — maximaal 15 MB per bestand",
"newKnowledge.documentUploadFormats": "Ondersteunt TXT, Markdown, PDF, HTML, XLSX, CSV en JSONL · maximaal 15 MB per bestand",
"newKnowledge.documentUploadPartial": "Verwerking van {{accepted}} documenten gestart; {{excluded}} konden niet worden toegevoegd: {{details}}",
"newKnowledge.documentUploadRejected": "Er zijn geen documenten geaccepteerd: {{details}}",
"newKnowledge.documentUploadStarted": "Documentverwerking gestart.",
@ -690,9 +690,9 @@
"newKnowledge.updatedColumn": "Bijgewerkt",
"newKnowledge.uploadCharactersUnavailable": "Tekens: —",
"newKnowledge.uploadDocuments": "Documenten uploaden",
"newKnowledge.uploadDropZoneTitle": "Sleep bestanden hierheen of klik om te bladeren",
"newKnowledge.uploadDropZoneTitle": "Sleep bestanden hierheen of blader",
"newKnowledge.uploadFiles": "Bestanden uploaden",
"newKnowledge.uploadFilesDescription": "Upload bestanden naar deze kennisbank — ze worden automatisch geparseerd, opgedeeld en geïndexeerd.",
"newKnowledge.uploadFilesDescription": "Voeg bestanden toe vanaf uw computer — ze worden geïndexeerd zodra u de kennisbank maakt.",
"newKnowledge.uploadingFiles": "Uploaden…",
"newKnowledge.usingDefaults": "Standaardinstellingen gebruikt",
"newKnowledge.viewLabel": "Kennisweergave",

View File

@ -257,7 +257,7 @@
"newKnowledge.documentUploadExclusion.quota": "przekroczono limit obszaru roboczego",
"newKnowledge.documentUploadExclusion.target": "miejsce docelowe dokumentu jest już nieprawidłowe",
"newKnowledge.documentUploadFailed": "Nie mogliśmy przesłać tych dokumentów. Spróbuj ponownie.",
"newKnowledge.documentUploadFormats": "PDF, DOCX, Markdown, HTML, CSV, JSONL, XLSX, TXT — do 15 MB na plik",
"newKnowledge.documentUploadFormats": "Obsługuje TXT, Markdown, PDF, HTML, XLSX, CSV i JSONL · do 15 MB na plik",
"newKnowledge.documentUploadPartial": "Rozpoczęto przetwarzanie {{accepted}} dokumentów; nie udało się dodać {{excluded}}: {{details}}",
"newKnowledge.documentUploadRejected": "Nie zaakceptowano żadnych dokumentów: {{details}}",
"newKnowledge.documentUploadStarted": "Rozpoczęto przetwarzanie dokumentu.",
@ -690,9 +690,9 @@
"newKnowledge.updatedColumn": "Zaktualizowano",
"newKnowledge.uploadCharactersUnavailable": "Znaki: —",
"newKnowledge.uploadDocuments": "Prześlij dokumenty",
"newKnowledge.uploadDropZoneTitle": "Przeciągnij i upuść pliki tutaj lub kliknij, aby przeglądać",
"newKnowledge.uploadDropZoneTitle": "Przeciągnij i upuść pliki lub przeglądaj",
"newKnowledge.uploadFiles": "Prześlij pliki",
"newKnowledge.uploadFilesDescription": "Prześlij pliki do tej bazy wiedzy — zostaną automatycznie przeanalizowane, podzielone na fragmenty i zindeksowane.",
"newKnowledge.uploadFilesDescription": "Dodaj pliki z komputera — zostaną zindeksowane od razu po utworzeniu bazy wiedzy.",
"newKnowledge.uploadingFiles": "Przesyłanie…",
"newKnowledge.usingDefaults": "Używane są ustawienia domyślne",
"newKnowledge.viewLabel": "Widok wiedzy",

View File

@ -257,7 +257,7 @@
"newKnowledge.documentUploadExclusion.quota": "cota do espaço de trabalho excedida",
"newKnowledge.documentUploadExclusion.target": "o destino do documento não é mais válido",
"newKnowledge.documentUploadFailed": "Não foi possível fazer upload desses documentos. Tente novamente.",
"newKnowledge.documentUploadFormats": "PDF, DOCX, Markdown, HTML, CSV, JSONL, XLSX, TXT — até 15 MB por arquivo",
"newKnowledge.documentUploadFormats": "Compatível com TXT, Markdown, PDF, HTML, XLSX, CSV e JSONL · até 15 MB cada",
"newKnowledge.documentUploadPartial": "O processamento de {{accepted}} documentos foi iniciado; não foi possível adicionar {{excluded}}: {{details}}",
"newKnowledge.documentUploadRejected": "Nenhum documento foi aceito: {{details}}",
"newKnowledge.documentUploadStarted": "O processamento do documento foi iniciado.",
@ -690,9 +690,9 @@
"newKnowledge.updatedColumn": "Atualizado",
"newKnowledge.uploadCharactersUnavailable": "Caracteres: —",
"newKnowledge.uploadDocuments": "Carregar documentos",
"newKnowledge.uploadDropZoneTitle": "Arraste e solte arquivos aqui ou clique para procurar",
"newKnowledge.uploadDropZoneTitle": "Arraste e solte arquivos ou procure",
"newKnowledge.uploadFiles": "Enviar arquivos",
"newKnowledge.uploadFilesDescription": "Envie arquivos para esta base de conhecimento — eles serão analisados, divididos em partes e indexados automaticamente.",
"newKnowledge.uploadFilesDescription": "Adicione arquivos do computador — eles serão indexados assim que você criar a base de conhecimento.",
"newKnowledge.uploadingFiles": "Enviando…",
"newKnowledge.usingDefaults": "Usando valores padrão",
"newKnowledge.viewLabel": "Visualização de conhecimento",

View File

@ -257,7 +257,7 @@
"newKnowledge.documentUploadExclusion.quota": "cota spațiului de lucru a fost depășită",
"newKnowledge.documentUploadExclusion.target": "destinația documentului nu mai este validă",
"newKnowledge.documentUploadFailed": "Nu am putut încărca aceste documente. Încearcă din nou.",
"newKnowledge.documentUploadFormats": "PDF, DOCX, Markdown, HTML, CSV, JSONL, XLSX, TXT — maximum 15 MB per fișier",
"newKnowledge.documentUploadFormats": "Acceptă TXT, Markdown, PDF, HTML, XLSX, CSV și JSONL · maximum 15 MB fiecare",
"newKnowledge.documentUploadPartial": "Procesarea a {{accepted}} documente a început; {{excluded}} nu au putut fi adăugate: {{details}}",
"newKnowledge.documentUploadRejected": "Nu a fost acceptat niciun document: {{details}}",
"newKnowledge.documentUploadStarted": "Procesarea documentelor a început.",
@ -690,9 +690,9 @@
"newKnowledge.updatedColumn": "Actualizat",
"newKnowledge.uploadCharactersUnavailable": "Caractere: —",
"newKnowledge.uploadDocuments": "Încărcați documente",
"newKnowledge.uploadDropZoneTitle": "Trage și plasează fișierele aici sau fă clic pentru a naviga",
"newKnowledge.uploadDropZoneTitle": "Trage și plasează fișiere sau răsfoiește",
"newKnowledge.uploadFiles": "Încarcă fișiere",
"newKnowledge.uploadFilesDescription": "Încarcă fișiere în această bază de cunoștințe — acestea vor fi analizate, segmentate și indexate automat.",
"newKnowledge.uploadFilesDescription": "Adaugă fișiere de pe computer — acestea vor fi indexate imediat ce creezi baza de cunoștințe.",
"newKnowledge.uploadingFiles": "Se încarcă…",
"newKnowledge.usingDefaults": "Se folosesc valorile implicite",
"newKnowledge.viewLabel": "Vizualizare cunoștințe",

View File

@ -257,7 +257,7 @@
"newKnowledge.documentUploadExclusion.quota": "превышена квота рабочей области",
"newKnowledge.documentUploadExclusion.target": "назначение документа больше недействительно",
"newKnowledge.documentUploadFailed": "Нам не удалось загрузить эти документы. Попробуйте еще раз.",
"newKnowledge.documentUploadFormats": "PDF, DOCX, Markdown, HTML, CSV, JSONL, XLSX, TXT — до 15 МБ на файл",
"newKnowledge.documentUploadFormats": "Поддерживаются TXT, Markdown, PDF, HTML, XLSX, CSV и JSONL · до 15 МБ на файл",
"newKnowledge.documentUploadPartial": "Начата обработка {{accepted}} документов; не удалось добавить {{excluded}}: {{details}}",
"newKnowledge.documentUploadRejected": "Ни один документ не принят: {{details}}",
"newKnowledge.documentUploadStarted": "Началась обработка документов.",
@ -690,9 +690,9 @@
"newKnowledge.updatedColumn": "Обновлено",
"newKnowledge.uploadCharactersUnavailable": "Символы: —",
"newKnowledge.uploadDocuments": "Загрузить документы",
"newKnowledge.uploadDropZoneTitle": "Перетащите файлы сюда или нажмите для выбора",
"newKnowledge.uploadDropZoneTitle": "Перетащите файлы или выберите их",
"newKnowledge.uploadFiles": "Загрузить файлы",
"newKnowledge.uploadFilesDescription": "Загрузите файлы в эту базу знаний — они будут автоматически обработаны, разбиты на фрагменты и проиндексированы.",
"newKnowledge.uploadFilesDescription": "Добавьте файлы с компьютера — они будут проиндексированы сразу после создания базы знаний.",
"newKnowledge.uploadingFiles": "Загрузка…",
"newKnowledge.usingDefaults": "Используются настройки по умолчанию",
"newKnowledge.viewLabel": "Вид базы знаний",

View File

@ -257,7 +257,7 @@
"newKnowledge.documentUploadExclusion.quota": "kvota delovnega prostora je presežena",
"newKnowledge.documentUploadExclusion.target": "cilj dokumenta ni več veljaven",
"newKnowledge.documentUploadFailed": "Teh dokumentov nismo mogli naložiti. poskusi ponovno",
"newKnowledge.documentUploadFormats": "PDF, DOCX, Markdown, HTML, CSV, JSONL, XLSX, TXT — do 15 MB na datoteko",
"newKnowledge.documentUploadFormats": "Podpira TXT, Markdown, PDF, HTML, XLSX, CSV in JSONL · do 15 MB na datoteko",
"newKnowledge.documentUploadPartial": "Obdelava {{accepted}} dokumentov se je začela; {{excluded}} jih ni bilo mogoče dodati: {{details}}",
"newKnowledge.documentUploadRejected": "Noben dokument ni bil sprejet: {{details}}",
"newKnowledge.documentUploadStarted": "Začela se je obdelava dokumentov.",
@ -690,9 +690,9 @@
"newKnowledge.updatedColumn": "Posodobljeno",
"newKnowledge.uploadCharactersUnavailable": "Znaki: —",
"newKnowledge.uploadDocuments": "Nalaganje dokumentov",
"newKnowledge.uploadDropZoneTitle": "Povlecite in spustite datoteke sem ali kliknite za brskanje",
"newKnowledge.uploadDropZoneTitle": "Povlecite in spustite datoteke ali prebrskajte",
"newKnowledge.uploadFiles": "Naloži datoteke",
"newKnowledge.uploadFilesDescription": "Naložite datoteke v to zbirko znanja — samodejno bodo razčlenjene, razdeljene na odseke in indeksirane.",
"newKnowledge.uploadFilesDescription": "Dodajte datoteke iz računalnika — indeksirane bodo takoj, ko ustvarite zbirko znanja.",
"newKnowledge.uploadingFiles": "Nalaganje…",
"newKnowledge.usingDefaults": "Uporabljene so privzete nastavitve",
"newKnowledge.viewLabel": "Prikaz znanja",

View File

@ -257,7 +257,7 @@
"newKnowledge.documentUploadExclusion.quota": "เกินโควตาพื้นที่ทำงาน",
"newKnowledge.documentUploadExclusion.target": "เป้าหมายเอกสารไม่ถูกต้องอีกต่อไป",
"newKnowledge.documentUploadFailed": "เราไม่สามารถอัปโหลดเอกสารเหล่านี้ได้ ลองอีกครั้ง",
"newKnowledge.documentUploadFormats": "PDF, DOCX, Markdown, HTML, CSV, JSONL, XLSX, TXT — สูงสุดไฟล์ละ 15 MB",
"newKnowledge.documentUploadFormats": "รองรับ TXT, Markdown, PDF, HTML, XLSX, CSV และ JSONL · สูงสุดไฟล์ละ 15 MB",
"newKnowledge.documentUploadPartial": "เริ่มประมวลผลเอกสาร {{accepted}} รายการแล้ว; เพิ่มไม่ได้ {{excluded}} รายการ: {{details}}",
"newKnowledge.documentUploadRejected": "ไม่มีเอกสารที่ได้รับการยอมรับ: {{details}}",
"newKnowledge.documentUploadStarted": "การประมวลผลเอกสารเริ่มต้นขึ้น",
@ -690,9 +690,9 @@
"newKnowledge.updatedColumn": "อัปเดตแล้ว",
"newKnowledge.uploadCharactersUnavailable": "อักขระ: —",
"newKnowledge.uploadDocuments": "อัพโหลดเอกสาร",
"newKnowledge.uploadDropZoneTitle": "ลากและวางไฟล์ที่นี่ หรือคลิกเพื่อเรียกดู",
"newKnowledge.uploadDropZoneTitle": "ลากและวางไฟล์ หรือเรียกดู",
"newKnowledge.uploadFiles": "อัปโหลดไฟล์",
"newKnowledge.uploadFilesDescription": "อัปโหลดไฟล์ไปยังฐานความรู้นี้ ระบบจะแยกวิเคราะห์ แบ่งเป็นส่วน และจัดทำดัชนีโดยอัตโนมัติ",
"newKnowledge.uploadFilesDescription": "เพิ่มไฟล์จากคอมพิวเตอร์ ระบบจะจัดทำดัชนีทันทีที่คุณสร้างฐานความรู้",
"newKnowledge.uploadingFiles": "กำลังอัปโหลด…",
"newKnowledge.usingDefaults": "ใช้ค่าเริ่มต้น",
"newKnowledge.viewLabel": "มุมมองความรู้",

View File

@ -257,7 +257,7 @@
"newKnowledge.documentUploadExclusion.quota": "çalışma alanı kotasııldı",
"newKnowledge.documentUploadExclusion.target": "belge hedefi artık geçerli değil",
"newKnowledge.documentUploadFailed": "Bu belgeleri yükleyemedik. Tekrar deneyin.",
"newKnowledge.documentUploadFormats": "PDF, DOCX, Markdown, HTML, CSV, JSONL, XLSX, TXT — dosya başına en fazla 15 MB",
"newKnowledge.documentUploadFormats": "TXT, Markdown, PDF, HTML, XLSX, CSV ve JSONL destekler · dosya başına en fazla 15 MB",
"newKnowledge.documentUploadPartial": "{{accepted}} belgenin işlenmesi başladı; {{excluded}} belge eklenemedi: {{details}}",
"newKnowledge.documentUploadRejected": "Hiçbir belge kabul edilmedi: {{details}}",
"newKnowledge.documentUploadStarted": "Evrak işlemleri başlatıldı.",
@ -690,9 +690,9 @@
"newKnowledge.updatedColumn": "Güncellendi",
"newKnowledge.uploadCharactersUnavailable": "Karakterler: —",
"newKnowledge.uploadDocuments": "Belgeleri yükleyin",
"newKnowledge.uploadDropZoneTitle": "Dosyaları buraya sürükleyip bırakın veya göz atmak için tıklayın",
"newKnowledge.uploadDropZoneTitle": "Dosyaları sürükleyip bırakın veya göz atın",
"newKnowledge.uploadFiles": "Dosya yükle",
"newKnowledge.uploadFilesDescription": "Dosyaları bu bilgi tabanına yükleyin; dosyalar otomatik olarak ayrıştırılır, parçalara bölünür ve indekslenir.",
"newKnowledge.uploadFilesDescription": "Bilgisayarınızdan dosya ekleyin; bilgi tabanını oluşturduğunuz anda dizine eklenir.",
"newKnowledge.uploadingFiles": "Yükleniyor…",
"newKnowledge.usingDefaults": "Varsayılanlar kullanılıyor",
"newKnowledge.viewLabel": "Bilgi görünümü",

View File

@ -257,7 +257,7 @@
"newKnowledge.documentUploadExclusion.quota": "перевищено квоту робочої області",
"newKnowledge.documentUploadExclusion.target": "ціль документа більше недійсна",
"newKnowledge.documentUploadFailed": "Нам не вдалося завантажити ці документи. Спробуйте знову.",
"newKnowledge.documentUploadFormats": "PDF, DOCX, Markdown, HTML, CSV, JSONL, XLSX, TXT — до 15 МБ на файл",
"newKnowledge.documentUploadFormats": "Підтримуються TXT, Markdown, PDF, HTML, XLSX, CSV і JSONL · до 15 МБ на файл",
"newKnowledge.documentUploadPartial": "Розпочато обробку {{accepted}} документів; не вдалося додати {{excluded}}: {{details}}",
"newKnowledge.documentUploadRejected": "Жодного документа не прийнято: {{details}}",
"newKnowledge.documentUploadStarted": "Розпочато обробку документів.",
@ -690,9 +690,9 @@
"newKnowledge.updatedColumn": "Оновлено",
"newKnowledge.uploadCharactersUnavailable": "Символи: —",
"newKnowledge.uploadDocuments": "Завантажити документи",
"newKnowledge.uploadDropZoneTitle": "Перетягніть файли сюди або натисніть, щоб вибрати",
"newKnowledge.uploadDropZoneTitle": "Перетягніть файли або виберіть їх",
"newKnowledge.uploadFiles": "Завантажити файли",
"newKnowledge.uploadFilesDescription": "Завантажте файли до цієї бази знань — їх буде автоматично оброблено, розділено на фрагменти та проіндексовано.",
"newKnowledge.uploadFilesDescription": "Додайте файли з комп’ютера — їх буде проіндексовано одразу після створення бази знань.",
"newKnowledge.uploadingFiles": "Завантаження…",
"newKnowledge.usingDefaults": "Використовуються стандартні налаштування",
"newKnowledge.viewLabel": "Вигляд бази знань",

View File

@ -257,7 +257,7 @@
"newKnowledge.documentUploadExclusion.quota": "đã vượt quá hạn mức không gian làm việc",
"newKnowledge.documentUploadExclusion.target": "đích tài liệu không còn hợp lệ",
"newKnowledge.documentUploadFailed": "Chúng tôi không thể tải lên những tài liệu này. Hãy thử lại.",
"newKnowledge.documentUploadFormats": "PDF, DOCX, Markdown, HTML, CSV, JSONL, XLSX, TXT — tối đa 15 MB mỗi tệp",
"newKnowledge.documentUploadFormats": "Hỗ trợ TXT, Markdown, PDF, HTML, XLSX, CSV và JSONL · tối đa 15 MB mỗi tệp",
"newKnowledge.documentUploadPartial": "Đã bắt đầu xử lý {{accepted}} tài liệu; không thể thêm {{excluded}} tài liệu: {{details}}",
"newKnowledge.documentUploadRejected": "Không có tài liệu nào được chấp nhận: {{details}}",
"newKnowledge.documentUploadStarted": "Quá trình xử lý tài liệu bắt đầu.",
@ -690,9 +690,9 @@
"newKnowledge.updatedColumn": "Đã cập nhật",
"newKnowledge.uploadCharactersUnavailable": "Ký tự: —",
"newKnowledge.uploadDocuments": "Tải tài liệu lên",
"newKnowledge.uploadDropZoneTitle": "Kéo và thả tệp vào đây hoặc nhấp để duyệt",
"newKnowledge.uploadDropZoneTitle": "Kéo và thả tệp hoặc duyệt",
"newKnowledge.uploadFiles": "Tải tệp lên",
"newKnowledge.uploadFilesDescription": "Tải tệp lên cơ sở tri thức này — tệp sẽ được tự động phân tích, chia đoạn và lập chỉ mục.",
"newKnowledge.uploadFilesDescription": "Thêm tệp từ máy tính — chúng sẽ được lập chỉ mục ngay khi bạn tạo cơ sở tri thức.",
"newKnowledge.uploadingFiles": "Đang tải lên…",
"newKnowledge.usingDefaults": "Đang dùng giá trị mặc định",
"newKnowledge.viewLabel": "Chế độ xem kiến thức",

View File

@ -257,7 +257,7 @@
"newKnowledge.documentUploadExclusion.quota": "超出工作区配额",
"newKnowledge.documentUploadExclusion.target": "文档目标已失效",
"newKnowledge.documentUploadFailed": "无法上传这些文档,请重试。",
"newKnowledge.documentUploadFormats": "PDF、DOCX、Markdown、HTML、CSV、JSONL、XLSX、TXT — 每个文件不超过 15 MB",
"newKnowledge.documentUploadFormats": "支持 TXT、Markdown、PDF、HTML、XLSX、CSV 和 JSONL · 每个文件不超过 15 MB",
"newKnowledge.documentUploadPartial": "已开始处理 {{accepted}} 个文档;{{excluded}} 个无法添加:{{details}}",
"newKnowledge.documentUploadRejected": "所有文档均未能添加:{{details}}",
"newKnowledge.documentUploadStarted": "文档处理已开始。",
@ -690,9 +690,9 @@
"newKnowledge.updatedColumn": "更新时间",
"newKnowledge.uploadCharactersUnavailable": "字符数:—",
"newKnowledge.uploadDocuments": "上传文档",
"newKnowledge.uploadDropZoneTitle": "将文件拖放到此处,或点击选择文件",
"newKnowledge.uploadDropZoneTitle": "拖放文件,或浏览",
"newKnowledge.uploadFiles": "上传文件",
"newKnowledge.uploadFilesDescription": "将文件上传到此知识库,系统会自动解析、分段并建立索引。",
"newKnowledge.uploadFilesDescription": "从电脑添加文件,创建知识库后会立即建立索引。",
"newKnowledge.uploadingFiles": "正在上传…",
"newKnowledge.usingDefaults": "使用默认设置",
"newKnowledge.viewLabel": "知识库视图",

View File

@ -257,7 +257,7 @@
"newKnowledge.documentUploadExclusion.quota": "超出工作區配額",
"newKnowledge.documentUploadExclusion.target": "文件目標已失效",
"newKnowledge.documentUploadFailed": "無法上傳這些文件,請再試一次。",
"newKnowledge.documentUploadFormats": "PDF、DOCX、Markdown、HTML、CSV、JSONL、XLSX、TXT — 每個檔案不超過 15 MB",
"newKnowledge.documentUploadFormats": "支援 TXT、Markdown、PDF、HTML、XLSX、CSV 和 JSONL · 每個檔案不超過 15 MB",
"newKnowledge.documentUploadPartial": "已開始處理 {{accepted}} 個文件;{{excluded}} 個無法新增:{{details}}",
"newKnowledge.documentUploadRejected": "未接受任何文件:{{details}}",
"newKnowledge.documentUploadStarted": "文件處理已開始。",
@ -690,9 +690,9 @@
"newKnowledge.updatedColumn": "更新時間",
"newKnowledge.uploadCharactersUnavailable": "字元數:—",
"newKnowledge.uploadDocuments": "上傳文件",
"newKnowledge.uploadDropZoneTitle": "將檔案拖放到此處,或點擊瀏覽",
"newKnowledge.uploadDropZoneTitle": "拖放檔案,或瀏覽",
"newKnowledge.uploadFiles": "上傳檔案",
"newKnowledge.uploadFilesDescription": "將檔案上傳至此知識庫,系統會自動解析、分段並建立索引。",
"newKnowledge.uploadFilesDescription": "從電腦新增檔案,建立知識庫後會立即建立索引。",
"newKnowledge.uploadingFiles": "正在上傳…",
"newKnowledge.usingDefaults": "使用預設設定",
"newKnowledge.viewLabel": "知識庫檢視",