mirror of
https://github.com/langgenius/dify.git
synced 2026-09-05 00:31:19 +08:00
fix(web): align create knowledge flow with design
This commit is contained in:
parent
88ce098f55
commit
1db2f68b3d
@ -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(
|
||||
|
||||
@ -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'])}
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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>
|
||||
|
||||
@ -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 && (
|
||||
|
||||
@ -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>
|
||||
|
||||
@ -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": "عرض المعرفة",
|
||||
|
||||
@ -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",
|
||||
|
||||
@ -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",
|
||||
|
||||
@ -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",
|
||||
|
||||
@ -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": "نمای دانش",
|
||||
|
||||
@ -257,7 +257,7 @@
|
||||
"newKnowledge.documentUploadExclusion.quota": "quota de l’espace de travail dépassé",
|
||||
"newKnowledge.documentUploadExclusion.target": "la cible du document n’est 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}} n’ont pas pu être ajoutés : {{details}}",
|
||||
"newKnowledge.documentUploadRejected": "Aucun document n’a é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",
|
||||
|
||||
@ -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": "नॉलेज दृश्य",
|
||||
|
||||
@ -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",
|
||||
|
||||
@ -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",
|
||||
|
||||
@ -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": "ナレッジ表示",
|
||||
|
||||
@ -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": "지식 보기",
|
||||
|
||||
@ -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": "ກຳລັງອັບໂຫລດ...",
|
||||
|
||||
@ -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",
|
||||
|
||||
@ -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",
|
||||
|
||||
@ -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",
|
||||
|
||||
@ -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",
|
||||
|
||||
@ -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": "Вид базы знаний",
|
||||
|
||||
@ -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",
|
||||
|
||||
@ -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": "มุมมองความรู้",
|
||||
|
||||
@ -257,7 +257,7 @@
|
||||
"newKnowledge.documentUploadExclusion.quota": "çalışma alanı kotası aşı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ü",
|
||||
|
||||
@ -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": "Вигляд бази знань",
|
||||
|
||||
@ -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",
|
||||
|
||||
@ -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": "知识库视图",
|
||||
|
||||
@ -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": "知識庫檢視",
|
||||
|
||||
Loading…
Reference in New Issue
Block a user