mirror of
https://github.com/langbot-app/LangBot.git
synced 2026-10-20 15:37:27 +08:00
feat(web): unify guided tours and complete translations
This commit is contained in:
@@ -190,3 +190,8 @@
|
||||
transform: scale(0.95) rotate(-4deg);
|
||||
}
|
||||
}
|
||||
|
||||
/* Show one tour at a time while the sidebar introduction is open. */
|
||||
body:has([data-tour-modal='true']) [data-tour-modal='false'] {
|
||||
display: none;
|
||||
}
|
||||
|
||||
@@ -262,6 +262,7 @@ export default function AgentDetailContent({
|
||||
onSupportedEventPatternsChange={setSupportedEventPatterns}
|
||||
onPlatformToolsChange={setPlatformTools}
|
||||
guideEnabled={canManage}
|
||||
debugGuideEnabled={canOperate}
|
||||
/>
|
||||
</fieldset>
|
||||
}
|
||||
|
||||
@@ -1,5 +1,8 @@
|
||||
import GuidedTour, {
|
||||
type GuidedTourStep,
|
||||
} from '@/app/home/components/guided-tour/GuidedTour';
|
||||
import EntityLoadState from '@/components/EntityLoadState';
|
||||
import { useCallback, useEffect, useRef, useState } from 'react';
|
||||
import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
|
||||
import { useTranslation } from 'react-i18next';
|
||||
import { Link, useSearchParams } from 'react-router-dom';
|
||||
import { eventPatternLabel } from '@/app/home/components/event-patterns/event-pattern-groups';
|
||||
@@ -89,6 +92,65 @@ export default function PluginProcessorDetailContent({
|
||||
const requestVersion = useRef(0);
|
||||
const component = components.find((item) => item.id === componentRef);
|
||||
const available = Boolean(component);
|
||||
const hasParameters = Boolean(component?.config_schema.length);
|
||||
const guideSteps = useMemo<GuidedTourStep[]>(
|
||||
() => [
|
||||
{
|
||||
id: 'select',
|
||||
target: '#event-processor-component',
|
||||
title: t('guidedTour.pluginProcessor.select.title'),
|
||||
description: t('guidedTour.pluginProcessor.select.description'),
|
||||
onEnter: () => setActiveTab('config'),
|
||||
action: {
|
||||
href: 'https://space.langbot.app/market?type=plugin&component=Runner&runner_usage=event',
|
||||
label: t('guidedTour.runner.select.action'),
|
||||
},
|
||||
},
|
||||
...(hasParameters
|
||||
? [
|
||||
{
|
||||
id: 'parameters',
|
||||
target: '[data-guide="event-processor-form-config"]',
|
||||
title: t('guidedTour.pluginProcessor.parameters.title'),
|
||||
description: t(
|
||||
'guidedTour.pluginProcessor.parameters.description',
|
||||
),
|
||||
onEnter: () => setActiveTab('config'),
|
||||
},
|
||||
]
|
||||
: []),
|
||||
...(canOperate && available
|
||||
? [
|
||||
{
|
||||
id: 'debug',
|
||||
target: '[data-guide="event-processor-form-debug"]',
|
||||
title: t('guidedTour.pluginProcessor.debug.title'),
|
||||
description: t('guidedTour.eventDebugDescription'),
|
||||
onEnter: () => setActiveTab('config'),
|
||||
},
|
||||
]
|
||||
: []),
|
||||
{
|
||||
id: 'logs',
|
||||
target: '[data-guide="event-processor-form-tab-logs"]',
|
||||
title: t('guidedTour.pluginProcessor.logs.title'),
|
||||
description: t('guidedTour.pluginProcessor.logs.description'),
|
||||
onEnter: () => setActiveTab('logs'),
|
||||
},
|
||||
...(available
|
||||
? [
|
||||
{
|
||||
id: 'save',
|
||||
target: '[data-guide="event-processor-form-save"]',
|
||||
title: t('guidedTour.pluginProcessor.save.title'),
|
||||
description: t('guidedTour.pluginProcessor.save.description'),
|
||||
onEnter: () => setActiveTab('config'),
|
||||
},
|
||||
]
|
||||
: []),
|
||||
],
|
||||
[t, available, hasParameters, canOperate],
|
||||
);
|
||||
|
||||
const load = useCallback(async () => {
|
||||
setLoading(true);
|
||||
@@ -393,122 +455,130 @@ export default function PluginProcessorDetailContent({
|
||||
return <EntityLoadState error={failed} onRetry={() => void load()} />;
|
||||
|
||||
return (
|
||||
<ProcessorDetailWorkbench
|
||||
title={`${agent.emoji || '🧩'} ${agent.name}`}
|
||||
titleAction={
|
||||
canManage ? <EntityTitleEditButton onClick={onEdit} /> : undefined
|
||||
}
|
||||
titleControls={
|
||||
<PluginProcessorSettings
|
||||
components={components}
|
||||
value={componentRef}
|
||||
disabled={!canManage || saving || loading}
|
||||
onChange={(value) => {
|
||||
setComponentRef(value);
|
||||
setActiveTab('config');
|
||||
const descriptor = components.find((item) => item.id === value);
|
||||
setParameters(
|
||||
Object.fromEntries(
|
||||
(descriptor?.config_schema ?? [])
|
||||
.filter((field) => field.default !== undefined)
|
||||
.map((field) => [field.name, field.default]),
|
||||
<>
|
||||
<GuidedTour
|
||||
enabled={canManage}
|
||||
storageKey="langbot_plugin_processor_setup_guide_v1"
|
||||
steps={guideSteps}
|
||||
testId="plugin-processor-setup-guide"
|
||||
/>
|
||||
<ProcessorDetailWorkbench
|
||||
title={`${agent.emoji || '🧩'} ${agent.name}`}
|
||||
titleAction={
|
||||
canManage ? <EntityTitleEditButton onClick={onEdit} /> : undefined
|
||||
}
|
||||
titleControls={
|
||||
<PluginProcessorSettings
|
||||
components={components}
|
||||
value={componentRef}
|
||||
disabled={!canManage || saving || loading}
|
||||
onChange={(value) => {
|
||||
setComponentRef(value);
|
||||
setActiveTab('config');
|
||||
const descriptor = components.find((item) => item.id === value);
|
||||
setParameters(
|
||||
Object.fromEntries(
|
||||
(descriptor?.config_schema ?? [])
|
||||
.filter((field) => field.default !== undefined)
|
||||
.map((field) => [field.name, field.default]),
|
||||
),
|
||||
);
|
||||
validate.current = null;
|
||||
}}
|
||||
/>
|
||||
}
|
||||
status={
|
||||
!loading && componentRef && !available
|
||||
? { label: t('agents.eventProcessor.unavailable'), tone: 'error' }
|
||||
: undefined
|
||||
}
|
||||
saveLabel={t('common.save')}
|
||||
saveFormId="event-processor-form"
|
||||
canSave={canManage && available}
|
||||
isDirty={dirty}
|
||||
isSaving={saving}
|
||||
headerActions={
|
||||
canManage ? (
|
||||
<Button variant="destructive" disabled={saving} onClick={onDelete}>
|
||||
<Trash2 className="size-4" />
|
||||
{t('common.delete')}
|
||||
</Button>
|
||||
) : undefined
|
||||
}
|
||||
configTitle={t('agents.eventProcessor.type')}
|
||||
configTabs={{
|
||||
value: activeTab,
|
||||
onValueChange: setActiveTab,
|
||||
items: [
|
||||
{
|
||||
value: 'config',
|
||||
label: t('agents.eventProcessor.configTab'),
|
||||
icon: <Settings2 className="size-4" />,
|
||||
content: (
|
||||
<div className="h-full overflow-y-auto">
|
||||
{!component ? (
|
||||
<p className="text-sm text-muted-foreground">
|
||||
{t('agents.eventProcessor.selectComponent')}
|
||||
</p>
|
||||
) : component.config_schema.length === 0 ? (
|
||||
<p className="text-sm text-muted-foreground">
|
||||
{t('agents.eventProcessor.noSettings')}
|
||||
</p>
|
||||
) : (
|
||||
<fieldset disabled={!canManage || saving}>
|
||||
<DynamicFormComponent
|
||||
key={componentRef}
|
||||
itemConfigList={component.config_schema}
|
||||
initialValues={parameters}
|
||||
onSubmit={(values) =>
|
||||
setParameters(values as Record<string, unknown>)
|
||||
}
|
||||
onValidate={(fn) => {
|
||||
validate.current = fn;
|
||||
}}
|
||||
/>
|
||||
</fieldset>
|
||||
)}
|
||||
</div>
|
||||
),
|
||||
);
|
||||
validate.current = null;
|
||||
}}
|
||||
/>
|
||||
}
|
||||
status={
|
||||
!loading && componentRef && !available
|
||||
? { label: t('agents.eventProcessor.unavailable'), tone: 'error' }
|
||||
: undefined
|
||||
}
|
||||
saveLabel={t('common.save')}
|
||||
saveFormId="event-processor-form"
|
||||
canSave={canManage && available}
|
||||
isDirty={dirty}
|
||||
isSaving={saving}
|
||||
headerActions={
|
||||
canManage ? (
|
||||
<Button variant="destructive" disabled={saving} onClick={onDelete}>
|
||||
<Trash2 className="size-4" />
|
||||
{t('common.delete')}
|
||||
</Button>
|
||||
) : undefined
|
||||
}
|
||||
configTitle={t('agents.eventProcessor.type')}
|
||||
configTabs={{
|
||||
value: activeTab,
|
||||
onValueChange: setActiveTab,
|
||||
items: [
|
||||
{
|
||||
value: 'config',
|
||||
label: t('agents.eventProcessor.configTab'),
|
||||
icon: <Settings2 className="size-4" />,
|
||||
content: (
|
||||
<div className="h-full overflow-y-auto">
|
||||
{!component ? (
|
||||
<p className="text-sm text-muted-foreground">
|
||||
{t('agents.eventProcessor.selectComponent')}
|
||||
</p>
|
||||
) : component.config_schema.length === 0 ? (
|
||||
<p className="text-sm text-muted-foreground">
|
||||
{t('agents.eventProcessor.noSettings')}
|
||||
</p>
|
||||
) : (
|
||||
<fieldset disabled={!canManage || saving}>
|
||||
<DynamicFormComponent
|
||||
key={componentRef}
|
||||
itemConfigList={component.config_schema}
|
||||
initialValues={parameters}
|
||||
onSubmit={(values) =>
|
||||
setParameters(values as Record<string, unknown>)
|
||||
}
|
||||
onValidate={(fn) => {
|
||||
validate.current = fn;
|
||||
}}
|
||||
/>
|
||||
</fieldset>
|
||||
)}
|
||||
</div>
|
||||
),
|
||||
},
|
||||
{
|
||||
value: 'logs',
|
||||
label: t('agents.eventProcessor.logsTab'),
|
||||
icon: <ScrollText className="size-4" />,
|
||||
content: logsContent,
|
||||
},
|
||||
],
|
||||
}}
|
||||
debugTitle={canOperate ? t('agents.debugTab') : undefined}
|
||||
debugDescription={t('agents.eventProcessor.debugNotice')}
|
||||
debugContent={
|
||||
canOperate ? (
|
||||
!component ? (
|
||||
<Alert className="m-3 w-auto">
|
||||
<AlertDescription>
|
||||
{t('agents.eventProcessor.selectToDebug')}
|
||||
</AlertDescription>
|
||||
</Alert>
|
||||
) : (
|
||||
<AgentDebugPanel
|
||||
agentId={id}
|
||||
processor
|
||||
platformTools={platformTools}
|
||||
hasUnsavedChanges={dirty}
|
||||
beforeRun={save}
|
||||
onRunFinished={() => {
|
||||
setActiveTab('logs');
|
||||
void refreshLatestRun();
|
||||
}}
|
||||
supportedEventPatterns={component.supported_event_patterns}
|
||||
availableEventTypes={availableEventTypes}
|
||||
/>
|
||||
)
|
||||
) : undefined
|
||||
}
|
||||
unsavedLabel={t('pipelines.unsavedChanges')}
|
||||
/>
|
||||
},
|
||||
{
|
||||
value: 'logs',
|
||||
label: t('agents.eventProcessor.logsTab'),
|
||||
icon: <ScrollText className="size-4" />,
|
||||
content: logsContent,
|
||||
},
|
||||
],
|
||||
}}
|
||||
debugTitle={canOperate ? t('agents.debugTab') : undefined}
|
||||
debugDescription={t('agents.eventProcessor.debugNotice')}
|
||||
debugContent={
|
||||
canOperate ? (
|
||||
!component ? (
|
||||
<Alert className="m-3 w-auto">
|
||||
<AlertDescription>
|
||||
{t('agents.eventProcessor.selectToDebug')}
|
||||
</AlertDescription>
|
||||
</Alert>
|
||||
) : (
|
||||
<AgentDebugPanel
|
||||
agentId={id}
|
||||
processor
|
||||
platformTools={platformTools}
|
||||
hasUnsavedChanges={dirty}
|
||||
beforeRun={save}
|
||||
onRunFinished={() => {
|
||||
setActiveTab('logs');
|
||||
void refreshLatestRun();
|
||||
}}
|
||||
supportedEventPatterns={component.supported_event_patterns}
|
||||
availableEventTypes={availableEventTypes}
|
||||
/>
|
||||
)
|
||||
) : undefined
|
||||
}
|
||||
unsavedLabel={t('pipelines.unsavedChanges')}
|
||||
/>
|
||||
</>
|
||||
);
|
||||
}
|
||||
|
||||
@@ -383,7 +383,10 @@ export default function AgentDebugPanel({
|
||||
}
|
||||
|
||||
return (
|
||||
<div className="flex h-full min-h-0 min-w-0 flex-col">
|
||||
<div
|
||||
data-guide={processor ? undefined : 'agent-event-debug'}
|
||||
className="flex h-full min-h-0 min-w-0 flex-col"
|
||||
>
|
||||
<div ref={transcriptRef} className="min-h-0 flex-1 overflow-y-auto p-3">
|
||||
<div className="mb-3">
|
||||
<p className="text-sm font-medium">{t('agents.debugTranscript')}</p>
|
||||
|
||||
@@ -74,6 +74,7 @@ interface AgentFormComponentProps {
|
||||
onSupportedEventPatternsChange?: (patterns: string[]) => void;
|
||||
onPlatformToolsChange?: (tools: AgentPlatformTool[]) => void;
|
||||
guideEnabled?: boolean;
|
||||
debugGuideEnabled?: boolean;
|
||||
}
|
||||
|
||||
export type AgentConfigSection = 'runner' | 'events_and_tools';
|
||||
@@ -129,6 +130,7 @@ function AgentFormComponent(
|
||||
onSupportedEventPatternsChange,
|
||||
onPlatformToolsChange,
|
||||
guideEnabled = true,
|
||||
debugGuideEnabled = false,
|
||||
}: AgentFormComponentProps,
|
||||
ref: ForwardedRef<AgentFormHandle>,
|
||||
) {
|
||||
@@ -503,8 +505,16 @@ function AgentFormComponent(
|
||||
title: t('guidedTour.runner.events.title'),
|
||||
description: t('guidedTour.runner.events.description'),
|
||||
});
|
||||
if (debugGuideEnabled) {
|
||||
steps.push({
|
||||
id: 'debug',
|
||||
target: '[data-guide="agent-event-debug"]',
|
||||
title: t('guidedTour.runner.debug.title'),
|
||||
description: t('guidedTour.eventDebugDescription'),
|
||||
});
|
||||
}
|
||||
return steps;
|
||||
}, [activeRunnerStage, t]);
|
||||
}, [activeRunnerStage, debugGuideEnabled, t]);
|
||||
|
||||
useEffect(() => {
|
||||
onRunnerStatusChange?.(runnerStatus);
|
||||
|
||||
@@ -1,29 +1,16 @@
|
||||
import { createPortal } from 'react-dom';
|
||||
import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
|
||||
import { Check, ChevronRight, ExternalLink, X } from 'lucide-react';
|
||||
import { useTranslation } from 'react-i18next';
|
||||
import { Button } from '@/components/ui/button';
|
||||
|
||||
const VIEWPORT_GAP = 12;
|
||||
const MIN_POPOVER_WIDTH = 220;
|
||||
const MAX_POPOVER_WIDTH = 340;
|
||||
|
||||
type TargetRect = Pick<
|
||||
DOMRect,
|
||||
'top' | 'right' | 'bottom' | 'left' | 'width' | 'height'
|
||||
>;
|
||||
|
||||
type PopoverPosition = {
|
||||
left: number;
|
||||
top: number;
|
||||
width: number;
|
||||
};
|
||||
import TourOverlay, {
|
||||
getTourPosition,
|
||||
type TargetRect,
|
||||
type PopoverPosition,
|
||||
} from './TourOverlay';
|
||||
|
||||
export interface GuidedTourStep {
|
||||
id: string;
|
||||
target: string;
|
||||
title: string;
|
||||
description: string;
|
||||
onEnter?: () => void;
|
||||
action?: {
|
||||
href: string;
|
||||
label: string;
|
||||
@@ -54,17 +41,12 @@ function storeProgress(storageKey: string, value: string) {
|
||||
}
|
||||
}
|
||||
|
||||
function clamp(value: number, min: number, max: number) {
|
||||
return Math.min(Math.max(value, min), Math.max(min, max));
|
||||
}
|
||||
|
||||
export default function GuidedTour({
|
||||
enabled = true,
|
||||
storageKey,
|
||||
steps,
|
||||
testId = 'guided-tour',
|
||||
}: GuidedTourProps) {
|
||||
const { t } = useTranslation();
|
||||
const initialProgress = useMemo(() => readProgress(storageKey), [storageKey]);
|
||||
const [finished, setFinished] = useState(initialProgress === 'completed');
|
||||
const [activeStepId, setActiveStepId] = useState<string | null>(() =>
|
||||
@@ -91,10 +73,7 @@ export default function GuidedTour({
|
||||
}, [storageKey]);
|
||||
|
||||
useEffect(() => {
|
||||
if (!enabled || steps.length === 0 || finished) {
|
||||
setActiveStepId(null);
|
||||
return;
|
||||
}
|
||||
if (!enabled || steps.length === 0 || finished) return;
|
||||
|
||||
const currentIndex = steps.findIndex((step) => step.id === activeStepId);
|
||||
const nextIndex = currentIndex < 0 ? 0 : currentIndex;
|
||||
@@ -106,6 +85,10 @@ export default function GuidedTour({
|
||||
}
|
||||
}, [activeStepId, enabled, finished, steps, storageKey]);
|
||||
|
||||
useEffect(() => {
|
||||
if (enabled && !finished) activeStep?.onEnter?.();
|
||||
}, [activeStep, enabled, finished]);
|
||||
|
||||
const measure = useCallback(() => {
|
||||
if (!activeStep) return;
|
||||
const target = document.querySelector<HTMLElement>(activeStep.target);
|
||||
@@ -127,44 +110,9 @@ export default function GuidedTour({
|
||||
};
|
||||
setTargetRect(nextRect);
|
||||
|
||||
const viewportWidth = window.innerWidth;
|
||||
const viewportHeight = window.innerHeight;
|
||||
const popoverHeight = popoverRef.current?.offsetHeight ?? 250;
|
||||
const rightSpace = viewportWidth - rect.right - VIEWPORT_GAP * 2;
|
||||
const leftSpace = rect.left - VIEWPORT_GAP * 2;
|
||||
let width = Math.min(MAX_POPOVER_WIDTH, viewportWidth - VIEWPORT_GAP * 2);
|
||||
let left = VIEWPORT_GAP;
|
||||
let top = rect.bottom + VIEWPORT_GAP;
|
||||
|
||||
if (rightSpace >= MIN_POPOVER_WIDTH) {
|
||||
width = Math.min(MAX_POPOVER_WIDTH, rightSpace);
|
||||
left = rect.right + VIEWPORT_GAP;
|
||||
top = clamp(
|
||||
rect.top,
|
||||
VIEWPORT_GAP,
|
||||
viewportHeight - popoverHeight - VIEWPORT_GAP,
|
||||
);
|
||||
} else if (leftSpace >= MIN_POPOVER_WIDTH) {
|
||||
width = Math.min(MAX_POPOVER_WIDTH, leftSpace);
|
||||
left = rect.left - VIEWPORT_GAP - width;
|
||||
top = clamp(
|
||||
rect.top,
|
||||
VIEWPORT_GAP,
|
||||
viewportHeight - popoverHeight - VIEWPORT_GAP,
|
||||
);
|
||||
} else {
|
||||
top =
|
||||
rect.bottom + VIEWPORT_GAP + popoverHeight <= viewportHeight
|
||||
? rect.bottom + VIEWPORT_GAP
|
||||
: rect.top - popoverHeight - VIEWPORT_GAP;
|
||||
top = clamp(
|
||||
top,
|
||||
VIEWPORT_GAP,
|
||||
viewportHeight - popoverHeight - VIEWPORT_GAP,
|
||||
);
|
||||
}
|
||||
|
||||
setPopoverPosition({ left, top, width });
|
||||
setPopoverPosition(
|
||||
getTourPosition(nextRect, popoverRef.current?.offsetHeight),
|
||||
);
|
||||
}, [activeStep]);
|
||||
|
||||
useEffect(() => {
|
||||
@@ -200,11 +148,16 @@ export default function GuidedTour({
|
||||
setActiveStepId(null);
|
||||
}, [storageKey]);
|
||||
|
||||
const handlePrevious = useCallback(() => {
|
||||
const previousStep = steps[activeIndex - 1];
|
||||
if (!previousStep) return;
|
||||
storeProgress(storageKey, previousStep.id);
|
||||
setActiveStepId(previousStep.id);
|
||||
}, [activeIndex, steps, storageKey]);
|
||||
|
||||
const handleNext = useCallback(() => {
|
||||
if (!activeStep) return;
|
||||
const nextStep = steps[activeIndex + 1];
|
||||
setTargetRect(null);
|
||||
setPopoverPosition(null);
|
||||
if (!nextStep) {
|
||||
finishTour();
|
||||
return;
|
||||
@@ -213,33 +166,6 @@ export default function GuidedTour({
|
||||
setActiveStepId(nextStep.id);
|
||||
}, [activeIndex, activeStep, finishTour, steps, storageKey]);
|
||||
|
||||
useEffect(() => {
|
||||
const handleNativeClick = (event: MouseEvent) => {
|
||||
const target = event.target;
|
||||
if (!(target instanceof Element)) return;
|
||||
const button = target.closest<HTMLButtonElement>(
|
||||
'[data-guided-tour-action]',
|
||||
);
|
||||
if (
|
||||
!button ||
|
||||
button.dataset.guidedTourId !== testId ||
|
||||
button.disabled
|
||||
) {
|
||||
return;
|
||||
}
|
||||
if (button.dataset.guidedTourAction === 'skip') {
|
||||
finishTour();
|
||||
} else if (button.dataset.guidedTourAction === 'next') {
|
||||
handleNext();
|
||||
}
|
||||
};
|
||||
|
||||
// Translation extensions can rewrite nodes inside the popover and detach
|
||||
// React's delegated handler. Capture the command by its stable data marker.
|
||||
document.addEventListener('click', handleNativeClick, true);
|
||||
return () => document.removeEventListener('click', handleNativeClick, true);
|
||||
}, [finishTour, handleNext, testId]);
|
||||
|
||||
if (
|
||||
!enabled ||
|
||||
!activeStep ||
|
||||
@@ -250,88 +176,21 @@ export default function GuidedTour({
|
||||
return null;
|
||||
}
|
||||
|
||||
const isLastStep = activeIndex === steps.length - 1;
|
||||
const titleId = `${testId}-${activeStep.id}-title`;
|
||||
|
||||
return createPortal(
|
||||
<div
|
||||
data-testid={testId}
|
||||
data-active-step={activeStep.id}
|
||||
translate="no"
|
||||
className="notranslate pointer-events-none"
|
||||
>
|
||||
<div
|
||||
aria-hidden="true"
|
||||
className="fixed z-[61] rounded-md ring-2 ring-blue-500 ring-offset-2 ring-offset-background transition-[top,left,width,height] duration-200"
|
||||
style={{
|
||||
top: targetRect.top,
|
||||
left: targetRect.left,
|
||||
width: targetRect.width,
|
||||
height: targetRect.height,
|
||||
boxShadow: '0 0 0 9999px rgb(15 23 42 / 0.32)',
|
||||
}}
|
||||
/>
|
||||
<div
|
||||
ref={popoverRef}
|
||||
role="dialog"
|
||||
aria-labelledby={titleId}
|
||||
className="pointer-events-auto fixed z-[80] rounded-lg border bg-popover p-4 text-popover-foreground shadow-xl"
|
||||
style={popoverPosition}
|
||||
>
|
||||
<div className="mb-3 flex items-center gap-2">
|
||||
<span className="text-xs font-medium text-blue-600 dark:text-blue-400">
|
||||
{t('guidedTour.label')}
|
||||
</span>
|
||||
<span className="ml-auto text-xs tabular-nums text-muted-foreground">
|
||||
{t('guidedTour.progress', {
|
||||
current: activeIndex + 1,
|
||||
total: steps.length,
|
||||
})}
|
||||
</span>
|
||||
<Button
|
||||
type="button"
|
||||
variant="ghost"
|
||||
size="sm"
|
||||
data-guided-tour-action="skip"
|
||||
data-guided-tour-id={testId}
|
||||
className="-my-2 -mr-2 h-7 gap-1 px-2 text-xs text-muted-foreground"
|
||||
>
|
||||
<X className="size-3.5" />
|
||||
{t('guidedTour.skip')}
|
||||
</Button>
|
||||
</div>
|
||||
<h2 id={titleId} className="text-base font-semibold">
|
||||
{activeStep.title}
|
||||
</h2>
|
||||
<p className="mt-1.5 text-sm leading-6 text-muted-foreground">
|
||||
{activeStep.description}
|
||||
</p>
|
||||
{activeStep.action && (
|
||||
<a
|
||||
href={activeStep.action.href}
|
||||
target="_blank"
|
||||
rel="noreferrer"
|
||||
className="mt-3 inline-flex items-center gap-1.5 text-sm font-medium text-primary hover:underline"
|
||||
>
|
||||
{activeStep.action.label}
|
||||
<ExternalLink className="size-3.5" />
|
||||
</a>
|
||||
)}
|
||||
<Button
|
||||
type="button"
|
||||
data-guided-tour-action="next"
|
||||
data-guided-tour-id={testId}
|
||||
className="mt-4 w-full"
|
||||
>
|
||||
{isLastStep ? (
|
||||
<Check className="size-4" />
|
||||
) : (
|
||||
<ChevronRight className="size-4" />
|
||||
)}
|
||||
{isLastStep ? t('guidedTour.finish') : t('guidedTour.next')}
|
||||
</Button>
|
||||
</div>
|
||||
</div>,
|
||||
document.body,
|
||||
return (
|
||||
<TourOverlay
|
||||
testId={testId}
|
||||
stepId={activeStep.id}
|
||||
current={activeIndex + 1}
|
||||
total={steps.length}
|
||||
title={activeStep.title}
|
||||
description={activeStep.description}
|
||||
action={activeStep.action}
|
||||
targetRect={targetRect}
|
||||
position={popoverPosition}
|
||||
popoverRef={popoverRef}
|
||||
onPrevious={activeIndex > 0 ? handlePrevious : undefined}
|
||||
onNext={handleNext}
|
||||
onSkip={finishTour}
|
||||
/>
|
||||
);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,293 @@
|
||||
import * as DialogPrimitive from '@radix-ui/react-dialog';
|
||||
import { createPortal } from 'react-dom';
|
||||
import { useEffect, useRef, type RefObject } from 'react';
|
||||
import {
|
||||
Check,
|
||||
ChevronLeft,
|
||||
ChevronRight,
|
||||
ExternalLink,
|
||||
X,
|
||||
} from 'lucide-react';
|
||||
import { useTranslation } from 'react-i18next';
|
||||
import { Button } from '@/components/ui/button';
|
||||
import { cn } from '@/lib/utils';
|
||||
|
||||
export type TargetRect = Pick<
|
||||
DOMRect,
|
||||
'top' | 'right' | 'bottom' | 'left' | 'width' | 'height'
|
||||
>;
|
||||
export type PopoverPosition = { left: number; top: number; width: number };
|
||||
|
||||
const VIEWPORT_GAP = 12;
|
||||
const MIN_POPOVER_WIDTH = 220;
|
||||
const MAX_POPOVER_WIDTH = 340;
|
||||
|
||||
export function getTourPosition(
|
||||
rect: TargetRect,
|
||||
height = 250,
|
||||
): PopoverPosition {
|
||||
const viewportWidth = window.innerWidth;
|
||||
const viewportHeight = window.innerHeight;
|
||||
const rightSpace = viewportWidth - rect.right - VIEWPORT_GAP * 2;
|
||||
const leftSpace = rect.left - VIEWPORT_GAP * 2;
|
||||
let width = Math.min(MAX_POPOVER_WIDTH, viewportWidth - VIEWPORT_GAP * 2);
|
||||
let left = VIEWPORT_GAP;
|
||||
let top = rect.top;
|
||||
if (rightSpace >= MIN_POPOVER_WIDTH) {
|
||||
width = Math.min(MAX_POPOVER_WIDTH, rightSpace);
|
||||
left = rect.right + VIEWPORT_GAP;
|
||||
} else if (leftSpace >= MIN_POPOVER_WIDTH) {
|
||||
width = Math.min(MAX_POPOVER_WIDTH, leftSpace);
|
||||
left = rect.left - VIEWPORT_GAP - width;
|
||||
} else {
|
||||
top =
|
||||
rect.bottom + VIEWPORT_GAP + height <= viewportHeight
|
||||
? rect.bottom + VIEWPORT_GAP
|
||||
: rect.top - height - VIEWPORT_GAP;
|
||||
}
|
||||
top = Math.max(
|
||||
VIEWPORT_GAP,
|
||||
Math.min(top, viewportHeight - height - VIEWPORT_GAP),
|
||||
);
|
||||
return { left, top, width };
|
||||
}
|
||||
|
||||
interface TourOverlayProps {
|
||||
testId: string;
|
||||
stepId: string;
|
||||
current: number;
|
||||
total: number;
|
||||
title: string;
|
||||
description: string;
|
||||
action?: { href: string; label: string };
|
||||
targetRect: TargetRect;
|
||||
position: PopoverPosition;
|
||||
popoverRef: RefObject<HTMLDivElement | null>;
|
||||
modal?: boolean;
|
||||
onPrevious?: () => void;
|
||||
onNext: () => void;
|
||||
onSkip: () => void;
|
||||
}
|
||||
|
||||
/** Shared presentation and controls for sidebar and contextual tours. */
|
||||
export default function TourOverlay({
|
||||
testId,
|
||||
stepId,
|
||||
current,
|
||||
total,
|
||||
title,
|
||||
description,
|
||||
action,
|
||||
targetRect,
|
||||
position,
|
||||
popoverRef,
|
||||
modal = false,
|
||||
onPrevious,
|
||||
onNext,
|
||||
onSkip,
|
||||
}: TourOverlayProps) {
|
||||
const { t } = useTranslation();
|
||||
const nextButtonRef = useRef<HTMLButtonElement | null>(null);
|
||||
const titleId = `${testId}-${stepId}-title`;
|
||||
const descriptionId = `${testId}-${stepId}-description`;
|
||||
|
||||
useEffect(() => {
|
||||
const previousFocus = document.activeElement;
|
||||
return () => {
|
||||
if (previousFocus instanceof HTMLElement && previousFocus.isConnected) {
|
||||
previousFocus.focus({ preventScroll: true });
|
||||
}
|
||||
};
|
||||
}, []);
|
||||
|
||||
useEffect(() => {
|
||||
nextButtonRef.current?.focus({ preventScroll: true });
|
||||
}, [stepId]);
|
||||
|
||||
useEffect(() => {
|
||||
const handleClick = (event: MouseEvent) => {
|
||||
if (!(event.target instanceof Element)) return;
|
||||
const button = event.target.closest<HTMLButtonElement>(
|
||||
'[data-guided-tour-action]',
|
||||
);
|
||||
if (!button || button.dataset.guidedTourId !== testId || button.disabled)
|
||||
return;
|
||||
const action = button.dataset.guidedTourAction;
|
||||
if (action === 'skip') onSkip();
|
||||
else if (action === 'previous') onPrevious?.();
|
||||
else if (action === 'next') onNext();
|
||||
};
|
||||
const handleKeyDown = (event: KeyboardEvent) => {
|
||||
if (
|
||||
!event.defaultPrevented &&
|
||||
event.key === 'Escape' &&
|
||||
(modal || popoverRef.current?.contains(event.target as Node))
|
||||
) {
|
||||
event.preventDefault();
|
||||
event.stopPropagation();
|
||||
onSkip();
|
||||
}
|
||||
};
|
||||
// Capture stable commands even when browser translation rewrites button children.
|
||||
document.addEventListener('click', handleClick, true);
|
||||
document.addEventListener('keydown', handleKeyDown);
|
||||
return () => {
|
||||
document.removeEventListener('click', handleClick, true);
|
||||
document.removeEventListener('keydown', handleKeyDown);
|
||||
};
|
||||
}, [modal, onNext, onPrevious, onSkip, popoverRef, testId]);
|
||||
|
||||
const card = (
|
||||
<div
|
||||
key={stepId}
|
||||
ref={popoverRef}
|
||||
role="dialog"
|
||||
aria-modal={modal || undefined}
|
||||
{...(!modal && {
|
||||
'aria-labelledby': titleId,
|
||||
'aria-describedby': descriptionId,
|
||||
})}
|
||||
className={cn(
|
||||
'pointer-events-auto fixed flex max-h-[calc(100dvh-24px)] flex-col rounded-lg border bg-popover p-4 text-popover-foreground shadow-xl dark:border-white/20 dark:bg-zinc-900 dark:shadow-[0_12px_40px_rgb(0_0_0_/_0.6)] animate-in fade-in-0 slide-in-from-bottom-1 duration-150 ease-out motion-reduce:animate-none',
|
||||
modal ? 'z-[92]' : 'z-[80]',
|
||||
)}
|
||||
style={position}
|
||||
>
|
||||
<div className="mb-3 flex shrink-0 flex-wrap items-center gap-x-2 gap-y-1">
|
||||
<span className="text-xs font-medium text-blue-600 dark:text-blue-400">
|
||||
{t('guidedTour.label')}
|
||||
</span>
|
||||
<span className="ml-auto text-xs tabular-nums text-muted-foreground">
|
||||
{t('guidedTour.progress', { current, total })}
|
||||
</span>
|
||||
<Button
|
||||
type="button"
|
||||
variant="ghost"
|
||||
size="sm"
|
||||
data-guided-tour-action="skip"
|
||||
data-guided-tour-id={testId}
|
||||
className="-my-2 -mr-2 h-7 gap-1 px-2 text-xs text-muted-foreground focus-visible:ring-blue-500/60"
|
||||
>
|
||||
<X className="size-3.5" />
|
||||
{t('guidedTour.skip')}
|
||||
</Button>
|
||||
</div>
|
||||
<div className="min-h-0 overflow-y-auto break-words">
|
||||
{modal ? (
|
||||
<DialogPrimitive.Title className="text-base font-semibold">
|
||||
{title}
|
||||
</DialogPrimitive.Title>
|
||||
) : (
|
||||
<h2 id={titleId} className="text-base font-semibold">
|
||||
{title}
|
||||
</h2>
|
||||
)}
|
||||
{modal ? (
|
||||
<DialogPrimitive.Description className="mt-1.5 text-sm leading-6 text-muted-foreground">
|
||||
{description}
|
||||
</DialogPrimitive.Description>
|
||||
) : (
|
||||
<p
|
||||
id={descriptionId}
|
||||
className="mt-1.5 text-sm leading-6 text-muted-foreground"
|
||||
>
|
||||
{description}
|
||||
</p>
|
||||
)}
|
||||
{action && (
|
||||
<a
|
||||
href={action.href}
|
||||
target="_blank"
|
||||
rel="noreferrer"
|
||||
className="mt-3 inline-flex items-center gap-1.5 rounded-sm text-sm font-medium text-blue-600 hover:underline focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-blue-500/60 dark:text-blue-400"
|
||||
>
|
||||
{action.label}
|
||||
<ExternalLink className="size-3.5 shrink-0" />
|
||||
</a>
|
||||
)}
|
||||
</div>
|
||||
<div className="mt-4 flex shrink-0 gap-2">
|
||||
{onPrevious && (
|
||||
<Button
|
||||
type="button"
|
||||
variant="outline"
|
||||
data-guided-tour-action="previous"
|
||||
data-guided-tour-id={testId}
|
||||
className="h-auto min-h-9 min-w-0 flex-1 whitespace-normal focus-visible:ring-blue-500/60"
|
||||
>
|
||||
<ChevronLeft className="size-4" />
|
||||
{t('guidedTour.previous')}
|
||||
</Button>
|
||||
)}
|
||||
<Button
|
||||
ref={nextButtonRef}
|
||||
type="button"
|
||||
data-guided-tour-action="next"
|
||||
data-guided-tour-id={testId}
|
||||
className="h-auto min-h-9 min-w-0 flex-1 whitespace-normal focus-visible:ring-blue-500/60"
|
||||
>
|
||||
{current === total ? (
|
||||
<Check className="size-4" />
|
||||
) : (
|
||||
<ChevronRight className="size-4" />
|
||||
)}
|
||||
{current === total ? t('guidedTour.finish') : t('guidedTour.next')}
|
||||
</Button>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
|
||||
return createPortal(
|
||||
<div
|
||||
data-testid={testId}
|
||||
data-active-step={stepId}
|
||||
data-tour-modal={modal}
|
||||
translate="no"
|
||||
className="notranslate pointer-events-none"
|
||||
>
|
||||
{modal && (
|
||||
<div
|
||||
className="pointer-events-auto fixed inset-0 z-[90] cursor-default"
|
||||
aria-hidden="true"
|
||||
onClick={(event) => event.preventDefault()}
|
||||
/>
|
||||
)}
|
||||
<div
|
||||
data-testid={`${testId}-highlight`}
|
||||
aria-hidden="true"
|
||||
className={cn(
|
||||
'pointer-events-none fixed rounded-md ring-2 ring-blue-500 dark:ring-blue-400 ring-offset-2 ring-offset-background shadow-[0_0_0_9999px_rgb(15_23_42_/_0.4)] dark:shadow-[0_0_0_9999px_rgb(0_0_0_/_0.72)] transition-[top,left,width,height] duration-200 ease-out motion-reduce:transition-none',
|
||||
modal ? 'z-[91]' : 'z-[61]',
|
||||
)}
|
||||
style={{
|
||||
top: targetRect.top,
|
||||
left: targetRect.left,
|
||||
width: targetRect.width,
|
||||
height: targetRect.height,
|
||||
}}
|
||||
/>
|
||||
{modal ? (
|
||||
<DialogPrimitive.Root
|
||||
open
|
||||
onOpenChange={(open) => {
|
||||
if (!open) onSkip();
|
||||
}}
|
||||
>
|
||||
<DialogPrimitive.Content
|
||||
asChild
|
||||
onPointerDownOutside={(event) => event.preventDefault()}
|
||||
onOpenAutoFocus={(event) => {
|
||||
event.preventDefault();
|
||||
nextButtonRef.current?.focus({ preventScroll: true });
|
||||
}}
|
||||
>
|
||||
{card}
|
||||
</DialogPrimitive.Content>
|
||||
</DialogPrimitive.Root>
|
||||
) : (
|
||||
card
|
||||
)}
|
||||
</div>,
|
||||
document.body,
|
||||
);
|
||||
}
|
||||
@@ -1,14 +1,13 @@
|
||||
import { createPortal } from 'react-dom';
|
||||
import TourOverlay, {
|
||||
getTourPosition,
|
||||
type TargetRect,
|
||||
type PopoverPosition,
|
||||
} from '../guided-tour/TourOverlay';
|
||||
import { useCallback, useEffect, useRef, useState } from 'react';
|
||||
import { Check, ChevronRight } from 'lucide-react';
|
||||
import { useTranslation } from 'react-i18next';
|
||||
import { Button } from '@/components/ui/button';
|
||||
import { useSidebar } from '@/components/ui/sidebar';
|
||||
|
||||
const SIDEBAR_GUIDE_STORAGE_KEY = 'langbot_sidebar_guide_v1';
|
||||
const MIN_POPOVER_WIDTH = 196;
|
||||
const MAX_POPOVER_WIDTH = 320;
|
||||
const VIEWPORT_GAP = 12;
|
||||
|
||||
const GUIDE_STEP_IDS = [
|
||||
'monitoring',
|
||||
@@ -23,21 +22,6 @@ const GUIDE_STEP_IDS = [
|
||||
|
||||
type GuideStepId = (typeof GUIDE_STEP_IDS)[number];
|
||||
|
||||
type TargetRect = {
|
||||
top: number;
|
||||
right: number;
|
||||
bottom: number;
|
||||
left: number;
|
||||
width: number;
|
||||
height: number;
|
||||
};
|
||||
|
||||
type PopoverPosition = {
|
||||
left: number;
|
||||
top: number;
|
||||
width: number;
|
||||
};
|
||||
|
||||
function loadStoredStep(): number | null {
|
||||
if (typeof window === 'undefined') return null;
|
||||
|
||||
@@ -68,18 +52,18 @@ function getTarget(stepId: GuideStepId): HTMLElement | null {
|
||||
);
|
||||
}
|
||||
|
||||
function findAvailableStep(startIndex: number): number | null {
|
||||
for (let index = startIndex; index < GUIDE_STEP_IDS.length; index += 1) {
|
||||
function findAvailableStep(startIndex: number, direction = 1): number | null {
|
||||
for (
|
||||
let index = startIndex;
|
||||
index >= 0 && index < GUIDE_STEP_IDS.length;
|
||||
index += direction
|
||||
) {
|
||||
const target = getTarget(GUIDE_STEP_IDS[index]);
|
||||
if (target) return index;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
function clamp(value: number, min: number, max: number) {
|
||||
return Math.min(Math.max(value, min), Math.max(min, max));
|
||||
}
|
||||
|
||||
export function SidebarGuide() {
|
||||
const { t } = useTranslation();
|
||||
const { isMobile, open, openMobile, setOpen, setOpenMobile } = useSidebar();
|
||||
@@ -88,7 +72,6 @@ export function SidebarGuide() {
|
||||
const [popoverPosition, setPopoverPosition] =
|
||||
useState<PopoverPosition | null>(null);
|
||||
const popoverRef = useRef<HTMLDivElement | null>(null);
|
||||
const confirmButtonRef = useRef<HTMLButtonElement | null>(null);
|
||||
const originalSidebarStateRef = useRef<{
|
||||
open: boolean;
|
||||
openMobile: boolean;
|
||||
@@ -144,45 +127,9 @@ export function SidebarGuide() {
|
||||
};
|
||||
setTargetRect(nextRect);
|
||||
|
||||
const viewportWidth = window.innerWidth;
|
||||
const viewportHeight = window.innerHeight;
|
||||
const popoverHeight = popoverRef.current?.offsetHeight ?? 210;
|
||||
const rightSpace = viewportWidth - nextRect.right - VIEWPORT_GAP * 2;
|
||||
const leftSpace = nextRect.left - VIEWPORT_GAP * 2;
|
||||
|
||||
let width = Math.min(MAX_POPOVER_WIDTH, viewportWidth - VIEWPORT_GAP * 2);
|
||||
let left = VIEWPORT_GAP;
|
||||
let top = nextRect.bottom + VIEWPORT_GAP;
|
||||
|
||||
if (rightSpace >= MIN_POPOVER_WIDTH) {
|
||||
width = Math.min(MAX_POPOVER_WIDTH, rightSpace);
|
||||
left = nextRect.right + VIEWPORT_GAP;
|
||||
top = clamp(
|
||||
nextRect.top,
|
||||
VIEWPORT_GAP,
|
||||
viewportHeight - popoverHeight - VIEWPORT_GAP,
|
||||
);
|
||||
} else if (leftSpace >= MIN_POPOVER_WIDTH) {
|
||||
width = Math.min(MAX_POPOVER_WIDTH, leftSpace);
|
||||
left = nextRect.left - VIEWPORT_GAP - width;
|
||||
top = clamp(
|
||||
nextRect.top,
|
||||
VIEWPORT_GAP,
|
||||
viewportHeight - popoverHeight - VIEWPORT_GAP,
|
||||
);
|
||||
} else {
|
||||
top =
|
||||
nextRect.bottom + VIEWPORT_GAP + popoverHeight <= viewportHeight
|
||||
? nextRect.bottom + VIEWPORT_GAP
|
||||
: nextRect.top - popoverHeight - VIEWPORT_GAP;
|
||||
top = clamp(
|
||||
top,
|
||||
VIEWPORT_GAP,
|
||||
viewportHeight - popoverHeight - VIEWPORT_GAP,
|
||||
);
|
||||
}
|
||||
|
||||
setPopoverPosition({ left, top, width });
|
||||
setPopoverPosition(
|
||||
getTourPosition(nextRect, popoverRef.current?.offsetHeight),
|
||||
);
|
||||
}, [activeStepId]);
|
||||
|
||||
useEffect(() => {
|
||||
@@ -224,6 +171,7 @@ export function SidebarGuide() {
|
||||
|
||||
target.scrollIntoView({ block: 'nearest' });
|
||||
|
||||
const frame = window.requestAnimationFrame(measure);
|
||||
const delayedMeasure = window.setTimeout(measure, 260);
|
||||
const resizeObserver = new ResizeObserver(measure);
|
||||
resizeObserver.observe(target);
|
||||
@@ -231,6 +179,7 @@ export function SidebarGuide() {
|
||||
window.addEventListener('scroll', measure, true);
|
||||
|
||||
return () => {
|
||||
window.cancelAnimationFrame(frame);
|
||||
window.clearTimeout(delayedMeasure);
|
||||
resizeObserver.disconnect();
|
||||
window.removeEventListener('resize', measure);
|
||||
@@ -241,7 +190,6 @@ export function SidebarGuide() {
|
||||
useEffect(() => {
|
||||
if (!isPopoverReady) return;
|
||||
measure();
|
||||
confirmButtonRef.current?.focus();
|
||||
}, [activeStepId, isPopoverReady, measure]);
|
||||
|
||||
useEffect(() => {
|
||||
@@ -249,24 +197,19 @@ export function SidebarGuide() {
|
||||
|
||||
const previousOverflow = document.body.style.overflow;
|
||||
document.body.style.overflow = 'hidden';
|
||||
const blockKeyboardNavigation = (event: KeyboardEvent) => {
|
||||
if (event.key === 'Escape') {
|
||||
event.preventDefault();
|
||||
event.stopPropagation();
|
||||
}
|
||||
if (event.key === 'Tab') {
|
||||
event.preventDefault();
|
||||
confirmButtonRef.current?.focus();
|
||||
}
|
||||
};
|
||||
window.addEventListener('keydown', blockKeyboardNavigation, true);
|
||||
|
||||
return () => {
|
||||
document.body.style.overflow = previousOverflow;
|
||||
window.removeEventListener('keydown', blockKeyboardNavigation, true);
|
||||
};
|
||||
}, [stepIndex]);
|
||||
|
||||
function handlePrevious() {
|
||||
if (stepIndex === null) return;
|
||||
const previousIndex = findAvailableStep(stepIndex - 1, -1);
|
||||
if (previousIndex === null) return;
|
||||
storeGuideProgress(String(previousIndex));
|
||||
setStepIndex(previousIndex);
|
||||
}
|
||||
|
||||
function handleConfirm() {
|
||||
if (stepIndex === null) return;
|
||||
const nextIndex = findAvailableStep(stepIndex + 1);
|
||||
@@ -276,8 +219,6 @@ export function SidebarGuide() {
|
||||
}
|
||||
|
||||
storeGuideProgress(String(nextIndex));
|
||||
setTargetRect(null);
|
||||
setPopoverPosition(null);
|
||||
setStepIndex(nextIndex);
|
||||
}
|
||||
|
||||
@@ -290,70 +231,25 @@ export function SidebarGuide() {
|
||||
return null;
|
||||
}
|
||||
|
||||
const isLastVisibleStep =
|
||||
findAvailableStep((stepIndex ?? GUIDE_STEP_IDS.length - 1) + 1) === null;
|
||||
const titleId = `sidebar-guide-${activeStepId}-title`;
|
||||
|
||||
return createPortal(
|
||||
<div data-testid="sidebar-guide">
|
||||
<div
|
||||
className="fixed inset-0 z-[90] cursor-default"
|
||||
aria-hidden="true"
|
||||
onClick={(event) => event.preventDefault()}
|
||||
/>
|
||||
<div
|
||||
className="pointer-events-none fixed z-[91] rounded-md ring-2 ring-blue-500 ring-offset-2 ring-offset-background transition-[top,left,width,height] duration-200"
|
||||
aria-hidden="true"
|
||||
style={{
|
||||
top: targetRect.top,
|
||||
left: targetRect.left,
|
||||
width: targetRect.width,
|
||||
height: targetRect.height,
|
||||
boxShadow: '0 0 0 9999px rgb(15 23 42 / 0.56)',
|
||||
}}
|
||||
/>
|
||||
<div
|
||||
ref={popoverRef}
|
||||
role="dialog"
|
||||
aria-modal="true"
|
||||
aria-labelledby={titleId}
|
||||
className="fixed z-[92] rounded-lg border bg-popover p-4 text-popover-foreground shadow-xl"
|
||||
style={popoverPosition}
|
||||
>
|
||||
<div className="mb-3 flex items-center justify-between gap-3">
|
||||
<span className="text-xs font-medium text-blue-600 dark:text-blue-400">
|
||||
{t('sidebarGuide.label')}
|
||||
</span>
|
||||
<span className="text-xs tabular-nums text-muted-foreground">
|
||||
{t('sidebarGuide.progress', {
|
||||
current: visibleStepNumber,
|
||||
total: visibleStepCount,
|
||||
})}
|
||||
</span>
|
||||
</div>
|
||||
<h2 id={titleId} className="text-base font-semibold">
|
||||
{t(`sidebarGuide.steps.${activeStepId}.title`)}
|
||||
</h2>
|
||||
<p className="mt-1.5 text-sm leading-6 text-muted-foreground">
|
||||
{t(`sidebarGuide.steps.${activeStepId}.description`)}
|
||||
</p>
|
||||
<Button
|
||||
ref={confirmButtonRef}
|
||||
type="button"
|
||||
className="mt-4 w-full"
|
||||
onClick={handleConfirm}
|
||||
>
|
||||
{isLastVisibleStep ? (
|
||||
<Check className="size-4" />
|
||||
) : (
|
||||
<ChevronRight className="size-4" />
|
||||
)}
|
||||
{isLastVisibleStep
|
||||
? t('sidebarGuide.finish')
|
||||
: t('sidebarGuide.confirm')}
|
||||
</Button>
|
||||
</div>
|
||||
</div>,
|
||||
document.body,
|
||||
return (
|
||||
<TourOverlay
|
||||
testId="sidebar-guide"
|
||||
stepId={activeStepId}
|
||||
current={visibleStepNumber}
|
||||
total={visibleStepCount}
|
||||
title={t(`sidebarGuide.steps.${activeStepId}.title`)}
|
||||
description={t(`sidebarGuide.steps.${activeStepId}.description`)}
|
||||
targetRect={targetRect}
|
||||
position={popoverPosition}
|
||||
popoverRef={popoverRef}
|
||||
modal
|
||||
onPrevious={
|
||||
findAvailableStep((stepIndex ?? 0) - 1, -1) !== null
|
||||
? handlePrevious
|
||||
: undefined
|
||||
}
|
||||
onNext={handleConfirm}
|
||||
onSkip={completeGuide}
|
||||
/>
|
||||
);
|
||||
}
|
||||
|
||||
@@ -56,6 +56,7 @@ interface ProcessorDetailWorkbenchProps {
|
||||
debugDisconnectedLabel?: string;
|
||||
unsavedLabel?: string;
|
||||
monitoring?: ProcessorMonitoringView;
|
||||
onViewChange?: (view: 'workbench' | 'monitoring') => void;
|
||||
}
|
||||
|
||||
export default function ProcessorDetailWorkbench({
|
||||
@@ -82,6 +83,7 @@ export default function ProcessorDetailWorkbench({
|
||||
debugDisconnectedLabel,
|
||||
unsavedLabel,
|
||||
monitoring,
|
||||
onViewChange,
|
||||
}: ProcessorDetailWorkbenchProps) {
|
||||
const [activeView, setActiveView] = useState<'workbench' | 'monitoring'>(
|
||||
'workbench',
|
||||
@@ -92,13 +94,18 @@ export default function ProcessorDetailWorkbench({
|
||||
<Card
|
||||
role="region"
|
||||
aria-label={configTitle}
|
||||
data-guide={`${saveFormId}-config`}
|
||||
className="h-full min-h-[36rem] min-w-0 gap-0 overflow-hidden py-0 lg:min-h-0"
|
||||
>
|
||||
<CardHeader className="flex h-12 shrink-0 flex-row items-center gap-2 border-b px-4 font-medium [.border-b]:pb-0">
|
||||
{configTabs ? (
|
||||
<TabsList aria-label={configTitle}>
|
||||
{configTabs.items.map((tab) => (
|
||||
<TabsTrigger key={tab.value} value={tab.value}>
|
||||
<TabsTrigger
|
||||
key={tab.value}
|
||||
value={tab.value}
|
||||
data-guide={`${saveFormId}-tab-${tab.value}`}
|
||||
>
|
||||
{tab.icon}
|
||||
{tab.label}
|
||||
</TabsTrigger>
|
||||
@@ -137,9 +144,11 @@ export default function ProcessorDetailWorkbench({
|
||||
return (
|
||||
<Tabs
|
||||
value={activeView}
|
||||
onValueChange={(value) =>
|
||||
setActiveView(value as 'workbench' | 'monitoring')
|
||||
}
|
||||
onValueChange={(value) => {
|
||||
const view = value as 'workbench' | 'monitoring';
|
||||
setActiveView(view);
|
||||
onViewChange?.(view);
|
||||
}}
|
||||
className="flex h-full min-h-0 min-w-0 flex-col gap-0"
|
||||
>
|
||||
<div className="flex shrink-0 flex-wrap items-center justify-between gap-3 pb-4">
|
||||
@@ -162,7 +171,11 @@ export default function ProcessorDetailWorkbench({
|
||||
</span>
|
||||
)}
|
||||
</TabsTrigger>
|
||||
<TabsTrigger value="monitoring" className="gap-1.5 px-3">
|
||||
<TabsTrigger
|
||||
value="monitoring"
|
||||
className="gap-1.5 px-3"
|
||||
data-guide={`${saveFormId}-monitoring`}
|
||||
>
|
||||
<BarChart3 className="size-4" />
|
||||
{monitoring.label}
|
||||
</TabsTrigger>
|
||||
@@ -217,6 +230,7 @@ export default function ProcessorDetailWorkbench({
|
||||
<Button
|
||||
type="submit"
|
||||
form={saveFormId}
|
||||
data-guide={`${saveFormId}-save`}
|
||||
disabled={!isDirty || isSaving}
|
||||
>
|
||||
{saveLabel}
|
||||
@@ -258,6 +272,7 @@ export default function ProcessorDetailWorkbench({
|
||||
<Card
|
||||
role="region"
|
||||
aria-label={debugTitle}
|
||||
data-guide={`${saveFormId}-debug`}
|
||||
className="min-h-[32rem] min-w-0 gap-0 overflow-hidden py-0 lg:min-h-0"
|
||||
>
|
||||
<CardHeader className="flex h-12 shrink-0 items-center justify-between gap-3 border-b px-4 [.border-b]:pb-0">
|
||||
|
||||
@@ -347,7 +347,7 @@ export default function KBForm({
|
||||
const steps: GuidedTourStep[] = [
|
||||
{
|
||||
id: 'engine',
|
||||
target: '[data-guide="knowledge-engine"]',
|
||||
target: '[data-guide="knowledge-engine"] [role="combobox"]',
|
||||
title: t('guidedTour.knowledge.engine.title'),
|
||||
description: t('guidedTour.knowledge.engine.description'),
|
||||
action: {
|
||||
|
||||
@@ -51,6 +51,10 @@ export default function PipelineDetailContent({
|
||||
return () => setDetailEntityName(null);
|
||||
}, [id, isCreateMode, pipelines, setDetailEntityName, t]);
|
||||
|
||||
const [activeView, setActiveView] = useState<'workbench' | 'monitoring'>(
|
||||
'workbench',
|
||||
);
|
||||
useEffect(() => setActiveView('workbench'), [id]);
|
||||
const [isWebSocketConnected, setIsWebSocketConnected] = useState(false);
|
||||
const [formDirty, setFormDirty] = useState(false);
|
||||
const [formSaving, setFormSaving] = useState(false);
|
||||
@@ -183,6 +187,7 @@ export default function PipelineDetailContent({
|
||||
<>
|
||||
<ProcessorDetailWorkbench
|
||||
key={id}
|
||||
onViewChange={setActiveView}
|
||||
title={`${pipelineEmoji} ${pipelineName}`}
|
||||
titleAction={
|
||||
canManage ? (
|
||||
@@ -199,6 +204,9 @@ export default function PipelineDetailContent({
|
||||
<fieldset className="contents" disabled={!canManage}>
|
||||
<PipelineFormComponent
|
||||
ref={pipelineFormRef}
|
||||
guideEnabled={canManage && activeView === 'workbench'}
|
||||
debugGuideEnabled={canOperate}
|
||||
monitoringGuideEnabled={canViewMonitoring}
|
||||
onLegacyPipeline={setPipelineDetails}
|
||||
pipelineId={id}
|
||||
isEditMode={true}
|
||||
|
||||
@@ -1,3 +1,6 @@
|
||||
import GuidedTour, {
|
||||
type GuidedTourStep,
|
||||
} from '@/app/home/components/guided-tour/GuidedTour';
|
||||
import EntityLoadState from '@/components/EntityLoadState';
|
||||
import { preserveRunnerConfig } from './RunnerConfigPreservation';
|
||||
import type { ComponentProps } from 'react';
|
||||
@@ -112,6 +115,9 @@ interface PipelineFormComponentProps {
|
||||
onDirtyChange?: (dirty: boolean) => void;
|
||||
onSavingChange?: (saving: boolean) => void;
|
||||
onLegacyPipeline?: (pipeline: Pipeline) => void;
|
||||
guideEnabled?: boolean;
|
||||
debugGuideEnabled?: boolean;
|
||||
monitoringGuideEnabled?: boolean;
|
||||
}
|
||||
|
||||
export interface PipelineFormHandle {
|
||||
@@ -133,6 +139,9 @@ const PipelineFormComponent = forwardRef<
|
||||
isEditMode,
|
||||
pipelineId,
|
||||
showButtons = true,
|
||||
guideEnabled = false,
|
||||
debugGuideEnabled = false,
|
||||
monitoringGuideEnabled = false,
|
||||
onDeletePipeline,
|
||||
onCancel,
|
||||
onDirtyChange,
|
||||
@@ -230,6 +239,52 @@ const PipelineFormComponent = forwardRef<
|
||||
const [activeSection, setActiveSection] = useState(
|
||||
isEditMode ? 'trigger' : 'basic',
|
||||
);
|
||||
const guideSteps = useMemo<GuidedTourStep[]>(() => {
|
||||
const sections = [
|
||||
'trigger',
|
||||
'ai',
|
||||
'output',
|
||||
'safety',
|
||||
'extensions',
|
||||
'basic',
|
||||
];
|
||||
return [
|
||||
...sections.map((section) => ({
|
||||
id: section,
|
||||
target: `[data-guide="pipeline-section-${section}"]`,
|
||||
title: t(`guidedTour.pipeline.${section}.title`),
|
||||
description: t(`guidedTour.pipeline.${section}.description`),
|
||||
onEnter: () => setActiveSection(section),
|
||||
})),
|
||||
...(debugGuideEnabled
|
||||
? [
|
||||
{
|
||||
id: 'debug',
|
||||
target: '[data-guide="pipeline-form-debug"]',
|
||||
title: t('guidedTour.pipeline.debug.title'),
|
||||
description: t('guidedTour.pipeline.debug.description'),
|
||||
},
|
||||
]
|
||||
: []),
|
||||
...(monitoringGuideEnabled
|
||||
? [
|
||||
{
|
||||
id: 'monitoring',
|
||||
target: '[data-guide="pipeline-form-monitoring"]',
|
||||
title: t('guidedTour.pipeline.monitoring.title'),
|
||||
description: t('guidedTour.pipeline.monitoring.description'),
|
||||
},
|
||||
]
|
||||
: []),
|
||||
{
|
||||
id: 'save',
|
||||
target: '[data-guide="pipeline-form-save"]',
|
||||
title: t('guidedTour.pipeline.save.title'),
|
||||
description: t('guidedTour.pipeline.save.description'),
|
||||
onEnter: () => setActiveSection('trigger'),
|
||||
},
|
||||
];
|
||||
}, [t, debugGuideEnabled, monitoringGuideEnabled]);
|
||||
const primarySectionNames = ['trigger', 'ai', 'output'];
|
||||
const primarySections = primarySectionNames
|
||||
.map((name) => formLabelList.find((section) => section.name === name))
|
||||
@@ -808,6 +863,12 @@ const PipelineFormComponent = forwardRef<
|
||||
|
||||
return (
|
||||
<>
|
||||
<GuidedTour
|
||||
enabled={guideEnabled && isEditMode}
|
||||
storageKey="langbot_pipeline_setup_guide_v1"
|
||||
steps={guideSteps}
|
||||
testId="pipeline-setup-guide"
|
||||
/>
|
||||
<div className="h-full p-0 flex flex-col">
|
||||
<Form {...form}>
|
||||
<form
|
||||
@@ -828,6 +889,7 @@ const PipelineFormComponent = forwardRef<
|
||||
return (
|
||||
<TabsTrigger
|
||||
key={section.name}
|
||||
data-guide={`pipeline-section-${section.name}`}
|
||||
value={section.name}
|
||||
>
|
||||
<Icon />
|
||||
@@ -843,6 +905,7 @@ const PipelineFormComponent = forwardRef<
|
||||
return (
|
||||
<Button
|
||||
key={section.name}
|
||||
data-guide={`pipeline-section-${section.name}`}
|
||||
type="button"
|
||||
variant={
|
||||
activeSection === section.name
|
||||
|
||||
@@ -2,33 +2,29 @@ import pipelineMigration from './pipeline-migration/en-US';
|
||||
|
||||
const enUS = {
|
||||
sidebarGuide: {
|
||||
label: 'Workspace tour',
|
||||
progress: '{{current}} of {{total}}',
|
||||
confirm: 'Got it',
|
||||
finish: 'Finish tour',
|
||||
steps: {
|
||||
monitoring: {
|
||||
title: 'Dashboard',
|
||||
title: 'Review activity',
|
||||
description:
|
||||
'Review bot activity, model usage, message volume, and system performance at a glance.',
|
||||
},
|
||||
bots: {
|
||||
title: 'Bots',
|
||||
title: 'Connect chat platforms',
|
||||
description:
|
||||
'Connect LangBot to chat platforms and manage each bot connection from here.',
|
||||
},
|
||||
pipelines: {
|
||||
title: 'Processors',
|
||||
title: 'Configure processors',
|
||||
description:
|
||||
'Build reusable AI pipelines, agents, and event processors that power your bots.',
|
||||
'Create reusable pipelines, Agents, and plugin processor configurations, then connect them to bots.',
|
||||
},
|
||||
knowledge: {
|
||||
title: 'Knowledge bases',
|
||||
title: 'Manage knowledge bases',
|
||||
description:
|
||||
'Organize documents and external knowledge sources used to improve model responses.',
|
||||
},
|
||||
plugins: {
|
||||
title: 'Installed extensions',
|
||||
title: 'Manage installed extensions',
|
||||
description:
|
||||
'Manage installed plugins, MCP servers, and skills, including their runtime status.',
|
||||
},
|
||||
@@ -38,20 +34,96 @@ const enUS = {
|
||||
'Install capabilities from the marketplace, GitHub, or a local extension package.',
|
||||
},
|
||||
models: {
|
||||
title: 'Model configuration',
|
||||
title: 'Configure models',
|
||||
description:
|
||||
'Configure model providers and choose the language, embedding, and other models LangBot uses.',
|
||||
},
|
||||
'api-integration': {
|
||||
title: 'API integration',
|
||||
title: 'Configure API access',
|
||||
description:
|
||||
'Create API keys and configure external access to LangBot services and MCP.',
|
||||
},
|
||||
},
|
||||
},
|
||||
guidedTour: {
|
||||
label: 'Setup guide',
|
||||
progress: '{{current}} of {{total}}',
|
||||
eventDebugDescription:
|
||||
'Choose a supported event, enter test data, and review the output and tool results. Platform actions are simulated; models and other tools run as configured.',
|
||||
|
||||
pipeline: {
|
||||
trigger: {
|
||||
title: 'Choose which messages to answer',
|
||||
description:
|
||||
'Pipelines handle message events and reply automatically with AI. Configure group triggers, private chat rules, and message filters here.',
|
||||
},
|
||||
ai: {
|
||||
title: 'Configure AI capabilities',
|
||||
description:
|
||||
'Choose a local or external platform Runner, then configure its model, prompts, knowledge bases, and other parameters.',
|
||||
},
|
||||
output: {
|
||||
title: 'Adjust replies',
|
||||
description:
|
||||
'Set output rules such as long-text handling to control how AI responses are delivered to users.',
|
||||
},
|
||||
safety: {
|
||||
title: 'Set safety controls',
|
||||
description:
|
||||
'Enable content filtering and rate limits as needed to control message content and processing frequency.',
|
||||
},
|
||||
extensions: {
|
||||
title: 'Choose available extensions',
|
||||
description:
|
||||
'Choose the plugins, MCP servers, and skills this pipeline can use to extend message handling and tools.',
|
||||
},
|
||||
basic: {
|
||||
title: 'Manage the pipeline',
|
||||
description:
|
||||
'Copy this pipeline to create another configuration, or delete a pipeline you no longer need.',
|
||||
},
|
||||
debug: {
|
||||
title: 'Test a conversation',
|
||||
description:
|
||||
'Send test messages to check triggers, AI replies, and output processing. Any configuration changes are saved before testing.',
|
||||
},
|
||||
monitoring: {
|
||||
title: 'Review run history',
|
||||
description:
|
||||
'Use the tab beside the title to review past conversations, processing steps, and errors when replies are missing or unexpected.',
|
||||
},
|
||||
save: {
|
||||
title: 'Save and connect a bot',
|
||||
description:
|
||||
'Save your configuration, then route Message received events to this pipeline on the bot page.',
|
||||
},
|
||||
},
|
||||
pluginProcessor: {
|
||||
select: {
|
||||
title: 'Choose a plugin Runner',
|
||||
description:
|
||||
'Choose a Runner that supports event processing. The plugin author declares which events it handles and implements the processing logic.',
|
||||
},
|
||||
parameters: {
|
||||
title: 'Configure plugin parameters',
|
||||
description:
|
||||
'Fill in the settings provided by the plugin. Save multiple configurations of the same plugin for different bots or use cases.',
|
||||
},
|
||||
debug: {
|
||||
title: 'Test plugin event handling',
|
||||
},
|
||||
logs: {
|
||||
title: 'Review execution results',
|
||||
description:
|
||||
'Review each run’s status, input event, plugin logs, and call results to investigate failures.',
|
||||
},
|
||||
save: {
|
||||
title: 'Save and bind to a bot',
|
||||
description:
|
||||
'After saving, add this configuration in the bot’s Plugin processors section. It automatically receives the plugin’s declared events, with no per-event routing needed.',
|
||||
},
|
||||
},
|
||||
previous: 'Previous',
|
||||
label: 'User guide',
|
||||
progress: 'Step {{current}} of {{total}}',
|
||||
next: 'Next',
|
||||
finish: 'Finish',
|
||||
skip: 'Skip',
|
||||
@@ -60,25 +132,21 @@ const enUS = {
|
||||
title: 'Choose a connection method',
|
||||
description:
|
||||
'Choose one of the connection methods supported by this adapter. The corresponding adapter parameters update automatically.',
|
||||
requirement: 'Select Webhook or persistent connection to continue.',
|
||||
},
|
||||
basic: {
|
||||
title: 'Name this bot',
|
||||
description:
|
||||
'Use a recognizable name so this connection is easy to find in routing and logs.',
|
||||
requirement: 'Enter a bot name to continue.',
|
||||
},
|
||||
adapter: {
|
||||
title: 'Choose a platform adapter',
|
||||
description:
|
||||
'Choose the platform adapter for this bot. Connection methods and platform parameters are configured after creation.',
|
||||
requirement: 'Select an adapter to continue.',
|
||||
},
|
||||
parameters: {
|
||||
title: 'Configure the platform',
|
||||
description:
|
||||
'Fill in the credentials and platform parameters. Use the adapter documentation for settings created on the platform side.',
|
||||
requirement: 'Complete every visible required parameter to continue.',
|
||||
action: 'Open adapter documentation',
|
||||
},
|
||||
routing: {
|
||||
@@ -107,7 +175,6 @@ const enUS = {
|
||||
title: 'Name the processor',
|
||||
description:
|
||||
'Give the processor a recognizable name. Runner and event settings are configured after creation.',
|
||||
requirement: 'Enter a processor name to continue.',
|
||||
},
|
||||
submit: {
|
||||
title: 'Create and continue setup',
|
||||
@@ -116,24 +183,24 @@ const enUS = {
|
||||
},
|
||||
},
|
||||
runner: {
|
||||
debug: {
|
||||
title: 'Test event handling',
|
||||
},
|
||||
select: {
|
||||
title: 'Choose or install a Runner',
|
||||
description:
|
||||
'Select an installed Runner, or install one directly from the Marketplace list in this selector.',
|
||||
requirement: 'Select an available Runner to continue.',
|
||||
action: 'Browse Runner Marketplace',
|
||||
},
|
||||
parameters: {
|
||||
title: 'Configure Runner parameters',
|
||||
description:
|
||||
'Provide the model, credentials, service URL, and other settings declared by the selected Runner.',
|
||||
requirement: 'Complete every visible required parameter to continue.',
|
||||
},
|
||||
events: {
|
||||
title: 'Set events and tools',
|
||||
description:
|
||||
'Open Events & tools to choose what this Agent can receive and which platform or host tools it may use.',
|
||||
requirement: 'Open the Events & tools tab to finish the guide.',
|
||||
},
|
||||
},
|
||||
knowledge: {
|
||||
@@ -141,26 +208,22 @@ const enUS = {
|
||||
title: 'Describe the knowledge base',
|
||||
description:
|
||||
'Set a recognizable name and optional description before choosing its storage and retrieval engine.',
|
||||
requirement: 'Enter a knowledge base name to continue.',
|
||||
},
|
||||
engine: {
|
||||
title: 'Review the knowledge engine',
|
||||
description:
|
||||
'Confirm the engine used by this knowledge base. Its parameters and retrieval settings are configured below.',
|
||||
requirement: 'Select a knowledge engine to continue.',
|
||||
action: 'Browse Knowledge Engine Marketplace',
|
||||
},
|
||||
parameters: {
|
||||
title: 'Configure engine parameters',
|
||||
description:
|
||||
'Fill in the storage, model, credentials, or external-service settings requested by this engine.',
|
||||
requirement: 'Complete every visible required parameter to continue.',
|
||||
},
|
||||
retrieval: {
|
||||
title: 'Configure retrieval',
|
||||
description:
|
||||
'Set how this engine searches and returns relevant content to processors.',
|
||||
requirement: 'Complete every visible required retrieval parameter.',
|
||||
},
|
||||
save: {
|
||||
title: 'Save the knowledge base configuration',
|
||||
|
||||
@@ -1,6 +1,243 @@
|
||||
import pipelineMigration from './pipeline-migration/es-ES';
|
||||
|
||||
const esES = {
|
||||
sidebarGuide: {
|
||||
steps: {
|
||||
monitoring: {
|
||||
title: 'Revisar la actividad',
|
||||
description:
|
||||
'Consulta la actividad de los bots, el uso de modelos, los mensajes y el rendimiento del sistema.',
|
||||
},
|
||||
bots: {
|
||||
title: 'Conectar plataformas de chat',
|
||||
description:
|
||||
'Conecta LangBot a plataformas de chat y administra las conexiones de tus bots.',
|
||||
},
|
||||
pipelines: {
|
||||
title: 'Configurar procesadores',
|
||||
description:
|
||||
'Crea flujos, Agents y configuraciones de procesadores de plugins reutilizables y conéctalos a tus bots.',
|
||||
},
|
||||
knowledge: {
|
||||
title: 'Gestionar bases de conocimiento',
|
||||
description:
|
||||
'Organiza documentos y fuentes externas de conocimiento para mejorar las respuestas.',
|
||||
},
|
||||
plugins: {
|
||||
title: 'Gestionar extensiones instaladas',
|
||||
description:
|
||||
'Administra plugins, servidores MCP y habilidades instalados y consulta su estado.',
|
||||
},
|
||||
'add-extension': {
|
||||
title: 'Añadir extensiones',
|
||||
description:
|
||||
'Instala funciones desde el mercado, GitHub o un paquete local.',
|
||||
},
|
||||
models: {
|
||||
title: 'Configurar modelos',
|
||||
description:
|
||||
'Configura proveedores y elige los modelos de lenguaje, embeddings y otros modelos que usa LangBot.',
|
||||
},
|
||||
'api-integration': {
|
||||
title: 'Configurar acceso API',
|
||||
description:
|
||||
'Crea claves API y configura el acceso externo a los servicios de LangBot y MCP.',
|
||||
},
|
||||
},
|
||||
},
|
||||
|
||||
guidedTour: {
|
||||
eventDebugDescription:
|
||||
'Elige un evento compatible, introduce datos de prueba y revisa la salida y los resultados de las herramientas. Las acciones de plataforma se simulan; los modelos y las demás herramientas se ejecutan según su configuración.',
|
||||
|
||||
bot: {
|
||||
connection: {
|
||||
title: 'Elegir un método de conexión',
|
||||
description:
|
||||
'Elige un método compatible con este adaptador. Sus parámetros se actualizarán automáticamente.',
|
||||
},
|
||||
basic: {
|
||||
title: 'Asignar un nombre al bot',
|
||||
description:
|
||||
'Usa un nombre reconocible para encontrar esta conexión en las rutas y los registros.',
|
||||
},
|
||||
adapter: {
|
||||
title: 'Elegir un adaptador de plataforma',
|
||||
description:
|
||||
'Elige el adaptador de este bot. Configurarás la conexión y los parámetros de la plataforma después de crearlo.',
|
||||
},
|
||||
parameters: {
|
||||
title: 'Configurar la plataforma',
|
||||
description:
|
||||
'Introduce las credenciales y los parámetros. Consulta la documentación del adaptador para los ajustes del lado de la plataforma.',
|
||||
action: 'Abrir documentación del adaptador',
|
||||
},
|
||||
routing: {
|
||||
title: 'Dirigir los eventos entrantes',
|
||||
description: 'Elige qué procesador recibe cada evento de este bot.',
|
||||
},
|
||||
save: {
|
||||
title: 'Guardar la configuración del bot',
|
||||
description:
|
||||
'Comprueba la conexión y las rutas de eventos, y guarda los cambios. Después puedes activar el bot.',
|
||||
},
|
||||
submit: {
|
||||
title: 'Crear el bot',
|
||||
description:
|
||||
'Crea el bot desactivado y continúa configurando la conexión y los parámetros en su página.',
|
||||
},
|
||||
},
|
||||
knowledge: {
|
||||
basic: {
|
||||
title: 'Describir la base de conocimiento',
|
||||
description:
|
||||
'Asigna un nombre y, si lo deseas, una descripción antes de elegir el motor de almacenamiento y búsqueda.',
|
||||
},
|
||||
engine: {
|
||||
title: 'Revisar el motor de conocimiento',
|
||||
description:
|
||||
'Confirma el motor de esta base de conocimiento. Sus parámetros y opciones de búsqueda se configuran debajo.',
|
||||
action: 'Explorar motores de conocimiento',
|
||||
},
|
||||
parameters: {
|
||||
title: 'Configurar parámetros del motor',
|
||||
description:
|
||||
'Completa los ajustes de almacenamiento, modelo, credenciales o servicio externo que solicita el motor.',
|
||||
},
|
||||
retrieval: {
|
||||
title: 'Configurar la búsqueda',
|
||||
description:
|
||||
'Define cómo busca el motor y devuelve contenido relevante a los procesadores.',
|
||||
},
|
||||
save: {
|
||||
title: 'Guardar la base de conocimiento',
|
||||
description:
|
||||
'Comprueba los parámetros del motor y la búsqueda, y guarda la configuración.',
|
||||
},
|
||||
submit: {
|
||||
title: 'Crear la base de conocimiento',
|
||||
description:
|
||||
'Crea la base de conocimiento y añade documentos o conecta fuentes compatibles con el motor elegido.',
|
||||
},
|
||||
},
|
||||
|
||||
pipeline: {
|
||||
trigger: {
|
||||
title: 'Elegir qué mensajes responder',
|
||||
description:
|
||||
'Los flujos procesan eventos de mensajes y responden automáticamente con IA. Configura los activadores de grupo, las reglas de chat privado y los filtros.',
|
||||
},
|
||||
ai: {
|
||||
title: 'Configurar las funciones de IA',
|
||||
description:
|
||||
'Elige un ejecutor local o de una plataforma externa y configura su modelo, instrucciones, bases de conocimiento y otros parámetros.',
|
||||
},
|
||||
output: {
|
||||
title: 'Ajustar las respuestas',
|
||||
description:
|
||||
'Configura reglas de salida, como el tratamiento de textos largos, para decidir cómo se entregan las respuestas.',
|
||||
},
|
||||
safety: {
|
||||
title: 'Configurar controles de seguridad',
|
||||
description:
|
||||
'Activa filtros de contenido y límites de frecuencia según sea necesario.',
|
||||
},
|
||||
extensions: {
|
||||
title: 'Elegir extensiones disponibles',
|
||||
description:
|
||||
'Selecciona los plugins, servidores MCP y habilidades que puede usar este flujo para ampliar el procesamiento y las herramientas.',
|
||||
},
|
||||
basic: {
|
||||
title: 'Administrar el flujo',
|
||||
description:
|
||||
'Copia este flujo para crear otra configuración o elimina un flujo que ya no necesites.',
|
||||
},
|
||||
debug: {
|
||||
title: 'Probar una conversación',
|
||||
description:
|
||||
'Envía mensajes de prueba para comprobar los activadores, las respuestas de IA y el procesamiento de salida. Los cambios se guardan antes de la prueba.',
|
||||
},
|
||||
monitoring: {
|
||||
title: 'Revisar el historial',
|
||||
description:
|
||||
'Usa la pestaña junto al título para revisar conversaciones, pasos de procesamiento y errores cuando falten respuestas o sean inesperadas.',
|
||||
},
|
||||
save: {
|
||||
title: 'Guardar y conectar un bot',
|
||||
description:
|
||||
'Guarda la configuración y asigna los eventos de mensaje recibido a este flujo en la página del bot.',
|
||||
},
|
||||
},
|
||||
pluginProcessor: {
|
||||
select: {
|
||||
title: 'Elegir un ejecutor de plugin',
|
||||
description:
|
||||
'Elige un ejecutor compatible con el procesamiento de eventos. El autor del plugin declara los eventos admitidos y su lógica.',
|
||||
},
|
||||
parameters: {
|
||||
title: 'Configurar parámetros del plugin',
|
||||
description:
|
||||
'Completa los ajustes del plugin. Puedes guardar varias configuraciones del mismo plugin para distintos bots o usos.',
|
||||
},
|
||||
debug: {
|
||||
title: 'Probar el procesamiento de eventos',
|
||||
},
|
||||
logs: {
|
||||
title: 'Revisar resultados',
|
||||
description:
|
||||
'Consulta el estado, el evento de entrada, los registros y los resultados de cada ejecución para investigar fallos.',
|
||||
},
|
||||
save: {
|
||||
title: 'Guardar y vincular a un bot',
|
||||
description:
|
||||
'Tras guardar, añade esta configuración en la sección de procesadores de plugins del bot. Recibirá automáticamente los eventos declarados, sin rutas individuales.',
|
||||
},
|
||||
},
|
||||
label: 'Guía de uso',
|
||||
progress: 'Paso {{current}} de {{total}}',
|
||||
previous: 'Anterior',
|
||||
next: 'Siguiente',
|
||||
finish: 'Finalizar guía',
|
||||
skip: 'Omitir',
|
||||
processorCreate: {
|
||||
type: {
|
||||
title: 'Elegir un tipo de procesador',
|
||||
description:
|
||||
'Los pipelines siguen un flujo de mensajes definido; los agentes deciden con modelos y herramientas, y los procesadores de plugins gestionan los eventos declarados.',
|
||||
},
|
||||
basic: {
|
||||
title: 'Nombrar el procesador',
|
||||
description:
|
||||
'Asigna un nombre reconocible. El ejecutor y los eventos se configuran después de crear el procesador.',
|
||||
},
|
||||
submit: {
|
||||
title: 'Crear y continuar la configuración',
|
||||
description:
|
||||
'Después de crear el procesador, configura el ejecutor, sus parámetros, los eventos y las herramientas que necesite.',
|
||||
},
|
||||
},
|
||||
runner: {
|
||||
debug: {
|
||||
title: 'Probar el procesamiento de eventos',
|
||||
},
|
||||
select: {
|
||||
title: 'Elegir o instalar un ejecutor',
|
||||
description:
|
||||
'Selecciona un ejecutor instalado o instala uno directamente desde la lista del mercado en este selector.',
|
||||
action: 'Explorar ejecutores en el mercado',
|
||||
},
|
||||
parameters: {
|
||||
title: 'Configurar los parámetros del ejecutor',
|
||||
description:
|
||||
'Introduce el modelo, las credenciales, la URL del servicio y los demás ajustes definidos por el ejecutor seleccionado.',
|
||||
},
|
||||
events: {
|
||||
title: 'Configurar eventos y herramientas',
|
||||
description:
|
||||
'Abre Eventos y herramientas para elegir qué eventos recibe este agente y qué herramientas de plataforma o de LangBot puede usar.',
|
||||
},
|
||||
},
|
||||
},
|
||||
pipelineMigration,
|
||||
sidebar: {
|
||||
home: 'Inicio',
|
||||
@@ -18,6 +255,14 @@ const esES = {
|
||||
editionCloud: 'Cloud',
|
||||
},
|
||||
common: {
|
||||
loadFailed: 'No se pudo cargar. Inténtalo de nuevo.',
|
||||
showSecret: 'Mostrar secreto',
|
||||
hideSecret: 'Ocultar secreto',
|
||||
editBasicInfo: 'Editar información básica',
|
||||
editBasicInfoDescription: 'Cambia el nombre, la descripción y el icono.',
|
||||
editBasicInfoDescriptionNoIcon: 'Cambia el nombre y la descripción.',
|
||||
management: 'Administración',
|
||||
|
||||
customValue: 'Personalizado',
|
||||
login: 'Iniciar sesión',
|
||||
logout: 'Cerrar sesión',
|
||||
@@ -407,6 +652,209 @@ const esES = {
|
||||
"Uses the Workspace owner's LangBot Account billing and credits.",
|
||||
},
|
||||
bots: {
|
||||
connectionMode: 'Método de conexión',
|
||||
connectionModeDescription:
|
||||
'Elige un método de conexión compatible con este adaptador.',
|
||||
connectionWebhook: 'Webhook',
|
||||
connectionWebhookDescription:
|
||||
'La plataforma envía eventos a una URL generada por LangBot.',
|
||||
connectionPersistent: 'Conexión persistente',
|
||||
connectionPersistentDescription:
|
||||
'LangBot mantiene abierta una conexión saliente de socket o streaming.',
|
||||
noAdaptersForConnectionMode:
|
||||
'Ningún adaptador instalado admite este método de conexión.',
|
||||
eventBindings: 'Rutas de eventos',
|
||||
addEventBinding: 'Añadir ruta',
|
||||
addBehavior: 'Añadir comportamiento',
|
||||
commonScenarios: 'Escenarios habituales',
|
||||
dragEventRoute: 'Arrastrar ruta {{index}}',
|
||||
behaviorReplyMessages: 'Responder a mensajes',
|
||||
behaviorReplyMessagesDescription:
|
||||
'Envía los mensajes entrantes a un procesador.',
|
||||
behaviorWelcomeMembers: 'Dar la bienvenida a nuevos miembros',
|
||||
behaviorWelcomeMembersDescription:
|
||||
'Ejecuta un procesador cuando alguien se une a un grupo.',
|
||||
behaviorHandleDepartures: 'Gestionar salidas de miembros',
|
||||
behaviorHandleDeparturesDescription:
|
||||
'Ejecuta un procesador cuando alguien sale o es expulsado.',
|
||||
behaviorReviewFriendRequests: 'Revisar solicitudes de amistad',
|
||||
behaviorReviewFriendRequestsDescription:
|
||||
'Envía las nuevas solicitudes de amistad a un procesador.',
|
||||
behaviorHandleModeration: 'Gestionar eventos de moderación',
|
||||
behaviorHandleModerationDescription:
|
||||
'Ejecuta un procesador cuando se restringe a un miembro del grupo.',
|
||||
behaviorCustom: 'Configurar otro evento',
|
||||
behaviorCustomDescription:
|
||||
'Añade una ruta y elige entre los eventos admitidos por este adaptador.',
|
||||
eventPattern: 'Evento',
|
||||
eventPatternPlaceholder: 'Seleccionar evento',
|
||||
targetType: 'Tipo de destino',
|
||||
target: 'Procesador',
|
||||
targetAgent: 'Agent',
|
||||
targetPipeline: 'Flujo',
|
||||
targetDiscard: 'Descartar',
|
||||
selectTarget: 'Seleccionar procesador',
|
||||
searchTarget: 'Buscar procesadores…',
|
||||
noTargetFound: 'No se encontraron procesadores compatibles',
|
||||
priority: 'Prioridad',
|
||||
enabled: 'Activado',
|
||||
eventBindingDescriptionPlaceholder: 'Descripción de la regla',
|
||||
noEventBindings: 'No hay rutas de eventos',
|
||||
unsupportedPipelineEvent: 'Los flujos solo admiten eventos message.*',
|
||||
disable: 'Desactivar',
|
||||
enable: 'Activar',
|
||||
disabledBindings: 'Desactivado',
|
||||
adapterEventsTitle: 'Eventos admitidos',
|
||||
adapterEventsDescription: '{{count}} tipos de evento',
|
||||
adapterEventsMore: '{{count}} más',
|
||||
advancedEventValues: 'Ver todos',
|
||||
eventGroup: 'Grupo',
|
||||
eventGroupNames: {
|
||||
bot: 'Estado del bot',
|
||||
feedback: 'Comentarios',
|
||||
friend: 'Amigos',
|
||||
group: 'Grupos',
|
||||
message: 'Mensajes',
|
||||
platform: 'Plataforma',
|
||||
},
|
||||
routeConflictTitle: 'Algunas rutas se superponen',
|
||||
routeConflictShadowed:
|
||||
'{{shadowed}} podría no ejecutarse porque {{winner}} procesa primero los mismos eventos.',
|
||||
routeConflictMore: 'Hay {{count}} conflictos de rutas adicionales.',
|
||||
routeFallbackCatchAll: '{{route}} es la ruta general.',
|
||||
routeFallbackIgnored:
|
||||
'Se ignoran los eventos sin ruta coincidente. Añade una ruta general solo si todos los eventos necesitan un resultado explícito.',
|
||||
testRoute: 'Comprobar ruta',
|
||||
adapterEventDebugTitle: 'Depuración de eventos de plataforma',
|
||||
adapterEventDebugDescription:
|
||||
'Genera un evento en {{platform}}. Aparecerá aquí cuando lo reciba el adaptador.',
|
||||
adapterEventObserveOnly:
|
||||
'Esta ventana solo observa eventos. Los eventos entrantes siguen las rutas actuales.',
|
||||
adapterEventPreparing: 'Preparando',
|
||||
adapterEventListening: 'Escuchando',
|
||||
adapterEventListenerUnavailable: 'Escucha interrumpida',
|
||||
adapterEventLoadFailed:
|
||||
'No se pudieron leer los eventos. Comprueba que el bot está en ejecución y vuelve a intentarlo.',
|
||||
adapterEventReceivedCount: '{{count}} eventos recibidos',
|
||||
adapterEventClear: 'Limpiar',
|
||||
adapterEventEmptyTitle: 'Esperando un evento de plataforma',
|
||||
adapterEventEmptyDescription:
|
||||
'Envía un mensaje o genera un evento en {{platform}}.',
|
||||
adapterEventData: 'Ver datos del evento',
|
||||
adapterEventNeedsSavedBot: 'Guarda el bot antes de escuchar eventos.',
|
||||
adapterEventCurrentPlatform: 'la plataforma actual',
|
||||
adapterConfigurationTest: 'Probar la configuración del adaptador',
|
||||
adapterConfigurationTestDescription:
|
||||
'Guarda y activa el bot; después genera un evento para comprobar la configuración.',
|
||||
refreshRouteStatus: 'Actualizar estado',
|
||||
routeStatusIdle: 'Aún sin ejecuciones',
|
||||
routeStatusRefreshFailed: 'No se pudo actualizar el estado de la ruta.',
|
||||
routeStatus: {
|
||||
matched: 'Coincide',
|
||||
delivered: 'Entregado',
|
||||
discarded: 'Descartado',
|
||||
failed: 'Fallido',
|
||||
not_matched: 'Sin coincidencia',
|
||||
},
|
||||
routeStatusDetail: {
|
||||
matched: 'Esta ruta coincide con el evento.',
|
||||
delivered: 'El procesador recibió el evento.',
|
||||
discarded: 'El evento se descartó intencionadamente.',
|
||||
failed: 'La ruta no pudo completarse.',
|
||||
not_matched: 'Ninguna ruta configurada coincide con el evento.',
|
||||
},
|
||||
routeFailure: {
|
||||
binding_disabled: 'Esta ruta está desactivada.',
|
||||
event_pattern_mismatch: 'El evento no coincide con esta ruta.',
|
||||
filters_mismatch:
|
||||
'Los datos de prueba no cumplen las condiciones de la ruta.',
|
||||
lower_priority: 'Otra ruta coincidente tiene mayor prioridad.',
|
||||
route_not_found: 'Ninguna ruta coincide con este evento.',
|
||||
processor_incompatible:
|
||||
'El procesador seleccionado no admite este evento.',
|
||||
processor_not_found: 'El procesador seleccionado no está disponible.',
|
||||
runner_failed: 'El ejecutor del Agent falló al procesar el evento.',
|
||||
delivery_failed: 'El procesador terminó, pero la entrega falló.',
|
||||
},
|
||||
dryRunTitle: 'Comprobar ruta de eventos',
|
||||
dryRunDescription:
|
||||
'Elige un evento para ver con qué ruta y procesador coincide.',
|
||||
dryRunEventType: 'Tipo de evento',
|
||||
dryRunSampleReady: 'Evento de ejemplo listo',
|
||||
dryRunSampleDescription:
|
||||
'LangBot ha preparado datos de ejemplo para {{event}}. Normalmente puedes usarlos sin cambios.',
|
||||
dryRunEditPayload: 'Datos de prueba',
|
||||
dryRunHidePayload: 'Ocultar datos',
|
||||
dryRunPayload: 'Datos de prueba (JSON)',
|
||||
dryRunPayloadHint:
|
||||
'Úsalos para probar condiciones de mensajes y conversaciones.',
|
||||
dryRunPayloadJsonError: 'Introduce un JSON válido.',
|
||||
dryRunPayloadObjectError: 'Los datos deben ser un objeto JSON.',
|
||||
dryRunNeedsSavedBot: 'Guarda el bot antes de comprobar las rutas.',
|
||||
dryRunFailed: 'No se pudo comprobar la ruta. Inténtalo más tarde.',
|
||||
dryRunAction: 'Ver coincidencia',
|
||||
dryRunRunning: 'Comprobando…',
|
||||
dryRunMatched: 'Ruta coincidente',
|
||||
dryRunNotMatched: 'Ninguna ruta coincide',
|
||||
dryRunTarget: 'Procesador de destino',
|
||||
dryRunNoTarget: 'Sin destino',
|
||||
dryRunMatchedRule: 'Regla coincidente',
|
||||
dryRunRuleIndex: 'Ruta {{index}}',
|
||||
dryRunNoRule: 'Ninguna regla coincide',
|
||||
dryRunDiagnostics: 'Pasos de diagnóstico',
|
||||
dryRunDiagnosticSelected: 'Se seleccionó {{route}}.',
|
||||
dryRunDiagnosticMatched: '{{route}} coincide. {{reason}}',
|
||||
dryRunDiagnosticSkipped: 'Se omitió {{route}}. {{reason}}',
|
||||
eventCustom: 'Evento personalizado',
|
||||
eventDescriptions: {
|
||||
all: 'Coincide con todos los eventos recibidos por este adaptador.',
|
||||
namespace: 'Coincide con todos los eventos de {{group}}.',
|
||||
namespace_bot:
|
||||
'Coincide con invitaciones, expulsiones, silencios y otros cambios de estado del bot.',
|
||||
namespace_feedback:
|
||||
'Coincide con comentarios recibidos de la plataforma o de usuarios.',
|
||||
namespace_friend: 'Coincide con solicitudes y cambios de amistad.',
|
||||
namespace_group:
|
||||
'Coincide con entradas, salidas, expulsiones y otros eventos de grupo.',
|
||||
namespace_message:
|
||||
'Coincide con mensajes recibidos, editados, eliminados y reacciones.',
|
||||
namespace_platform:
|
||||
'Coincide con eventos específicos de plataforma proporcionados por un adaptador.',
|
||||
custom: 'Evento personalizado o aún sin descripción.',
|
||||
message_received: 'Un usuario o grupo envía un nuevo mensaje al bot.',
|
||||
message_edited:
|
||||
'La plataforma informa de un cambio en un mensaje existente.',
|
||||
message_deleted: 'La plataforma informa de la eliminación de un mensaje.',
|
||||
message_reaction: 'Un usuario añade o elimina una reacción a un mensaje.',
|
||||
feedback_received:
|
||||
'Se reciben comentarios de la plataforma o de un usuario.',
|
||||
friend_request_received: 'Alguien solicita añadir al bot como amigo.',
|
||||
friend_added: 'Se ha creado una relación de amistad.',
|
||||
group_member_joined: 'Un miembro se une a un grupo donde está el bot.',
|
||||
group_member_left: 'Un miembro abandona un grupo donde está el bot.',
|
||||
group_member_banned: 'Un miembro del grupo es bloqueado o expulsado.',
|
||||
bot_invited_to_group: 'El bot es invitado a un grupo.',
|
||||
bot_removed_from_group: 'El bot es expulsado de un grupo.',
|
||||
bot_muted: 'El bot es silenciado en un grupo.',
|
||||
bot_unmuted: 'Se retira el silencio del bot en un grupo.',
|
||||
platform_specific: 'Evento de plataforma específico del adaptador.',
|
||||
},
|
||||
conditions: 'Condiciones',
|
||||
conditionsDescription:
|
||||
'Deben cumplirse todas las condiciones. Déjalo vacío para activar siempre.',
|
||||
conditionsEmpty: 'Sin condiciones: siempre se activa.',
|
||||
addFilter: 'Añadir condición',
|
||||
filterChatType: 'Tipo de sesión',
|
||||
filterChatId: 'ID de sesión',
|
||||
filterMessageText: 'Texto del mensaje',
|
||||
filterMessageElement: 'Elemento del mensaje',
|
||||
operator_eq: 'es igual a',
|
||||
operator_neq: 'no es igual a',
|
||||
operator_contains: 'contiene',
|
||||
operator_not_contains: 'no contiene',
|
||||
operator_starts_with: 'empieza por',
|
||||
operator_regex: 'expresión regular',
|
||||
|
||||
eventWildcard: 'Todos los eventos',
|
||||
eventNamespaceWildcard: '{{namespace}}.*',
|
||||
eventNames: {
|
||||
@@ -610,6 +1058,180 @@ const esES = {
|
||||
},
|
||||
},
|
||||
agents: {
|
||||
chooseType: 'Elegir cómo funciona',
|
||||
chooseTypeDescription:
|
||||
'Elige primero el tipo de procesador. Podrás configurarlo después de crearlo.',
|
||||
diagramHint: 'Cómo funciona',
|
||||
agentDiagramTitle: 'Agent: decidir y actuar',
|
||||
agentDiagramDescription:
|
||||
'Un Agent recibe diversos eventos, usa modelos y herramientas para comprender la situación y decide qué hacer.',
|
||||
pipelineDiagramTitle: 'Flujo: seguir pasos definidos',
|
||||
pipelineDiagramDescription:
|
||||
'Un flujo solo procesa eventos de mensajes y ejecuta los pasos en el orden configurado.',
|
||||
pipelineDiagramFlow: 'Los mensajes siguen una secuencia fija',
|
||||
diagramEvents: 'Eventos de plataforma',
|
||||
diagramAgentCanUse: 'Disponible para el Agent',
|
||||
diagramMessages: 'Mensajes',
|
||||
diagramMembers: 'Miembros',
|
||||
diagramFeedback: 'Comentarios',
|
||||
diagramDecide: 'Comprender y decidir',
|
||||
diagramModel: 'Usar modelo',
|
||||
diagramTools: 'Usar herramientas',
|
||||
diagramActions: 'Actuar',
|
||||
diagramMessage: 'Mensaje',
|
||||
diagramPreprocess: 'Preparar',
|
||||
diagramAI: 'IA',
|
||||
diagramPostprocess: 'Refinar',
|
||||
diagramOutput: 'Salida',
|
||||
eventsAndTools: 'Eventos y herramientas',
|
||||
eventsAndToolsDescription:
|
||||
'Define los eventos de activación y las herramientas disponibles.',
|
||||
configuredEvents: 'Eventos añadidos',
|
||||
configuredEventsCount: '{{count}} en total',
|
||||
addEvent: 'Añadir evento',
|
||||
removeEvent: 'Eliminar evento',
|
||||
eventActions: 'Herramientas activadas automáticamente',
|
||||
eventToolEnabled: 'Activado',
|
||||
eventToolsEnabledCount: '{{count}} herramientas activadas',
|
||||
noEventActions: 'No hay acciones disponibles para este evento.',
|
||||
noEventsConfigured: 'No hay eventos añadidos',
|
||||
noEventsConfiguredDescription: 'Ningún evento puede activar este Agent.',
|
||||
noEventsConfiguredBadge: 'Sin eventos',
|
||||
apiTools: 'Acceso a herramientas',
|
||||
apiToolsDescription: 'Elige qué herramientas puede llamar este Agent.',
|
||||
otherTools: 'Otras herramientas',
|
||||
otherToolsDescription:
|
||||
'Elige herramientas de plataforma, sandbox, MCP, plugins y habilidades.',
|
||||
apiToolsSelected: '{{count}} seleccionadas',
|
||||
apiToolsSecurityHint:
|
||||
'Activa solo las herramientas que necesita este Agent.',
|
||||
apiToolsSearch: 'Buscar herramientas…',
|
||||
eventApiTools: 'Herramientas de eventos',
|
||||
eventToolUnavailable: 'No disponible',
|
||||
eventApiToolsDescription:
|
||||
'Los destinos se fijan a partir del evento actual. El Agent solo proporciona los parámetros de acción.',
|
||||
platformApiTools: 'Herramientas de plataforma',
|
||||
platformApiToolsDescription:
|
||||
'El Agent puede elegir los ID de usuario, grupo o mensaje. Concede solo lo necesario.',
|
||||
apiToolEvents: 'Eventos',
|
||||
apiToolParameters: 'Parámetros del Agent',
|
||||
apiToolSource: 'Origen',
|
||||
apiToolNoParameters: 'ninguno',
|
||||
sandboxTools: 'Sandbox',
|
||||
mcpTools: 'MCP',
|
||||
pluginTools: 'Plugins',
|
||||
skillTools: 'Habilidades',
|
||||
langbotBuiltIn: 'LangBot',
|
||||
apiToolDetails: 'Detalles',
|
||||
apiToolHideDetails: 'Ocultar',
|
||||
apiToolsNoResults: 'Ninguna API o herramienta coincide',
|
||||
apiToolsCatalogUnavailable:
|
||||
'El backend de LangBot no devolvió el catálogo de herramientas API. Comprueba que esté actualizado y reiniciado; esto no significa que la plataforma no tenga herramientas.',
|
||||
hostToolsCatalogUnavailable:
|
||||
'El catálogo de herramientas no está disponible temporalmente.',
|
||||
apiToolRisk: {
|
||||
read: 'Solo lectura',
|
||||
write: 'Acción',
|
||||
dangerous: 'Sensible',
|
||||
},
|
||||
runnerStatusLoading: 'Comprobando estado del ejecutor',
|
||||
runnerStatusCheckFailed: 'No se pudo comprobar el estado del ejecutor',
|
||||
runnerStatusCheckFailedDescription:
|
||||
'Vuelve a comprobarlo. Si sigue fallando, revisa el backend y el entorno de ejecución de plugins.',
|
||||
noRunnersAvailable: 'No hay ejecutores disponibles',
|
||||
noRunnersAvailableDescription:
|
||||
'Instala y activa una extensión de ejecutor antes de configurar este Agent.',
|
||||
installedRunners: 'Ejecutores instalados',
|
||||
marketplaceRunners: 'Plugins de ejecutores en el mercado',
|
||||
viewMarketplace: 'Ver mercado',
|
||||
restoringRunnerInstall:
|
||||
'Restaurando la instalación del plugin y esperando al ejecutor…',
|
||||
noInstalledRunners: 'Aún no hay extensiones de ejecutor instaladas.',
|
||||
installingRunner: 'Instalando {{runner}}...',
|
||||
runnerInstallSuccess:
|
||||
'{{runner}} está instalado y listo para seleccionarse',
|
||||
selectedRunnerUnavailable: 'El ejecutor seleccionado no está disponible',
|
||||
selectedRunnerUnavailableDescription:
|
||||
'{{runner}} no está registrado actualmente. Elige otro ejecutor o restaura su extensión.',
|
||||
noRunnerSelected: 'Ningún ejecutor seleccionado',
|
||||
runnerConfigIncomplete: 'Configuración del ejecutor incompleta',
|
||||
runnerConfigIncompleteDescription:
|
||||
'Completa los campos obligatorios: {{fields}}',
|
||||
runnerReady: 'Ejecutor listo',
|
||||
runnerReadyDescription:
|
||||
'{{runner}} está registrado y el entorno de ejecución de plugins está conectado.',
|
||||
debugTab: 'Depuración de eventos',
|
||||
debugTitle: 'Depuración de eventos del Agent',
|
||||
debugDescription:
|
||||
'Ejecuta el Agent actual con un mensaje o evento de plataforma y revisa el resultado real.',
|
||||
debugResetSession: 'Restablecer sesión',
|
||||
debugEventType: 'Tipo de evento',
|
||||
debugNoEventsTitle: 'No hay eventos para depurar',
|
||||
debugNoEventsDescription:
|
||||
'Añade primero un evento en Eventos y herramientas.',
|
||||
debugMessageReceived: 'Mensaje recibido',
|
||||
debugGroupMemberJoined: 'Miembro añadido al grupo',
|
||||
debugGroupMemberLeft: 'Miembro salió del grupo',
|
||||
debugFriendRequested: 'Solicitud de amistad recibida',
|
||||
debugFeedbackReceived: 'Comentarios recibidos',
|
||||
debugCustomEvent: 'Evento personalizado',
|
||||
debugCustomEventType: 'Nombre del evento personalizado',
|
||||
debugMessageInput: 'Entrada de conversación',
|
||||
debugEventSummary: 'Resumen del evento',
|
||||
debugInputPlaceholder: 'Introduce lo que debe procesar el Agent',
|
||||
debugEventPayload: 'Datos del evento (JSON)',
|
||||
debugSupportedEvents: 'El Agent admite',
|
||||
debugRun: 'Ejecutar prueba',
|
||||
debugSaveAndRun: 'Guardar y ejecutar',
|
||||
debugRunning: 'En ejecución',
|
||||
debugTranscript: 'Registro de depuración',
|
||||
debugTranscriptDescription:
|
||||
'Entradas y respuestas del Agent de esta sesión de depuración.',
|
||||
debugEmptyTitle: 'Comprobar el comportamiento del Agent',
|
||||
debugEmptyTranscript:
|
||||
'Elige un evento, introduce datos de prueba y pulsa «Ejecutar prueba». Los resultados permanecen en esta página.',
|
||||
debugAgentOutput: 'Salida del Agent',
|
||||
debugReasoning: 'Pensando',
|
||||
debugTextOutput: 'Salida de texto',
|
||||
debugPlatformNotice:
|
||||
'Las herramientas de plataforma usan Mock: el Agent realiza llamadas reales, pero las acciones se simulan sin enviar mensajes reales. Las demás herramientas se ejecutan según su configuración.',
|
||||
debugToolSimulated: 'Simulación correcta · Mock',
|
||||
debugStop: 'Detener depuración',
|
||||
debugMockOptions: 'Escenario Mock (JSON)',
|
||||
debugInvalidMock: 'El escenario Mock debe ser un objeto JSON válido.',
|
||||
debugToolMockFailed: 'Fallo simulado · Mock',
|
||||
debugMockOptionsHelp:
|
||||
'De forma predeterminada, las llamadas tienen éxito. Asigna errores por nombre de herramienta en errors, datos de consulta en results y API no admitidas en unsupported_apis. Ejemplo: {"errors":{"event_reply":"Fallo de envío simulado"}}',
|
||||
debugCancelled:
|
||||
'Depuración detenida. Se conservan los registros anteriores.',
|
||||
debugNoToolCalls:
|
||||
'No se registraron llamadas a herramientas. Generar texto no implica haber enviado un mensaje.',
|
||||
debugToolCount:
|
||||
'{{count}} llamadas a herramientas registradas. Consulta su estado y resultados debajo.',
|
||||
debugToolRunning: 'En ejecución',
|
||||
debugToolCompleted: 'Completado',
|
||||
debugToolFailed: 'Fallido',
|
||||
debugToolInterrupted: 'Sin resultado devuelto',
|
||||
debugToolArguments: 'Argumentos',
|
||||
debugToolResult: 'Resultado',
|
||||
debugTestInput: 'Entrada de prueba',
|
||||
debugNoTextOutput: 'La ejecución terminó sin salida de texto.',
|
||||
debugEventTypeRequired: 'Introduce un tipo de evento',
|
||||
debugInputRequired: 'Introduce una entrada de conversación',
|
||||
debugInvalidPayload: 'Los datos del evento deben ser un objeto JSON válido',
|
||||
debugUnsupportedEvent: 'Este evento no está entre los que admite el Agent',
|
||||
debugRunnerConfigInvalidDescription:
|
||||
'La configuración del ejecutor está incompleta: {{message}}',
|
||||
debugRunnerExecutionFailedDescription:
|
||||
'La ejecución falló. Revisa el modelo y la configuración del ejecutor e inténtalo de nuevo.',
|
||||
debugRunnerTimeoutDescription:
|
||||
'Se agotó el tiempo de ejecución. Inténtalo más tarde o ajusta el tiempo límite del ejecutor.',
|
||||
debugApiKeyRequired: 'Falta la clave API',
|
||||
debugOpenRunnerConfig: 'Abrir configuración del ejecutor',
|
||||
debugReviewRunnerConfig: 'Revisar configuración del ejecutor',
|
||||
debugErrorDetails: 'Ver detalles del error',
|
||||
debugRunFailed: 'Falló la depuración del Agent',
|
||||
|
||||
monitoring: {
|
||||
description:
|
||||
'Consulta el evento, la salida del modelo y las herramientas de cada tarea.',
|
||||
@@ -933,6 +1555,13 @@ const esES = {
|
||||
installFromGithubDesc: 'Instalar plugin desde GitHub Release',
|
||||
goToMarketplace: 'Ir a la tienda',
|
||||
installProgress: {
|
||||
updateTitle: 'Actualizando {{name}}',
|
||||
checkingUpdate: 'Buscando actualizaciones',
|
||||
validating: 'Validando paquete',
|
||||
applyingUpdate: 'Aplicando actualización',
|
||||
activating: 'Iniciando y actualizando componentes',
|
||||
updateComplete: 'Plugin actualizado correctamente',
|
||||
|
||||
title: 'Instalando {{name}}',
|
||||
titleGeneric: 'Instalación de Plugin',
|
||||
overallProgress: 'Progreso general',
|
||||
@@ -962,6 +1591,11 @@ const esES = {
|
||||
uploadPluginOnly: 'Solo se admiten paquetes de plugin .lbpkg',
|
||||
},
|
||||
market: {
|
||||
runnerUsage: 'Uso del ejecutor',
|
||||
runnerUsageAll: 'Todos',
|
||||
runnerUsageAgent: 'Agent / Flujo',
|
||||
runnerUsageEvent: 'Procesador de plugin',
|
||||
|
||||
searchPlaceholder: 'Buscar plugins...',
|
||||
searchPlaceholderCount:
|
||||
'Buscar {{count}} extensiones, capacidades o casos de uso...',
|
||||
@@ -1197,6 +1831,8 @@ const esES = {
|
||||
'Una vez eliminada, la configuración de este servidor MCP no se podrá recuperar.',
|
||||
},
|
||||
pipelines: {
|
||||
managementDescription: 'Copia o elimina este flujo.',
|
||||
|
||||
title: 'Flujos',
|
||||
description:
|
||||
'Los Pipelines definen el flujo de procesamiento de eventos de mensajes, se usan para vincular a los Bots',
|
||||
@@ -1320,6 +1956,8 @@ const esES = {
|
||||
selectKnowledgeBases: 'Seleccionar bases de conocimiento',
|
||||
},
|
||||
debugDialog: {
|
||||
saveAndSend: 'Guardar y enviar',
|
||||
|
||||
title: 'Chat del Pipeline',
|
||||
selectPipeline: 'Seleccionar Pipeline',
|
||||
sessionType: 'Tipo de sesión',
|
||||
@@ -1364,6 +2002,26 @@ const esES = {
|
||||
},
|
||||
},
|
||||
knowledge: {
|
||||
installedEngines: 'Motores de conocimiento instalados',
|
||||
noInstalledEngines:
|
||||
'Aún no hay plugins de motores de conocimiento instalados.',
|
||||
marketplaceEngines: 'Plugins de motores de conocimiento en el mercado',
|
||||
noMarketplaceEngines:
|
||||
'No hay plugins de motores de conocimiento disponibles.',
|
||||
loadingEngineCatalog: 'Cargando plugins del mercado…',
|
||||
engineCatalogUnavailable:
|
||||
'El mercado no está disponible temporalmente. Vuelve a abrir el selector para reintentar.',
|
||||
viewMarketplace: 'Ver mercado',
|
||||
installingEngine: 'Instalando {{engine}}…',
|
||||
engineInstallSuccess:
|
||||
'{{engine}} está instalado y listo para seleccionarse',
|
||||
engineInstallFailed: 'Falló la instalación del motor. Inténtalo de nuevo.',
|
||||
engineVersionUnavailable: 'Este plugin no tiene una versión instalable.',
|
||||
engineInstallTimeout:
|
||||
'La instalación continúa. Actualiza la página para comprobar el estado.',
|
||||
engineRegistrationTimeout:
|
||||
'El plugin está instalado, pero su motor aún no está listo.',
|
||||
|
||||
title: 'Conocimiento',
|
||||
createKnowledgeBase: 'Crear base de conocimiento',
|
||||
selectFromSidebar:
|
||||
@@ -1895,6 +2553,47 @@ const esES = {
|
||||
},
|
||||
},
|
||||
storageAnalysis: {
|
||||
notCreated: 'Aún no creado',
|
||||
processStorage: 'Almacenamiento por proceso',
|
||||
processStorageDescription:
|
||||
'Cada entorno de ejecución mide sus propios directorios. Los detalles ya se incluyen en el total del directorio principal.',
|
||||
directory: 'Directorio',
|
||||
size: 'Tamaño',
|
||||
files: 'Archivos',
|
||||
runtimeUnavailable:
|
||||
'Las estadísticas de almacenamiento del entorno de ejecución no están disponibles.',
|
||||
noManagedDirectories: 'No se informaron directorios administrados.',
|
||||
scanWarnings: '{{count}} entradas ilegibles',
|
||||
boxActivity: '{{sessions}} sesiones · {{processes}} procesos administrados',
|
||||
statusLabels: {
|
||||
available: 'Disponible',
|
||||
unavailable: 'No disponible',
|
||||
disabled: 'Desactivado',
|
||||
not_applicable: 'No aplicable',
|
||||
},
|
||||
sourceLabels: {
|
||||
local_process: 'Medido por el proceso LangBot',
|
||||
runtime_rpc:
|
||||
'Medido por el entorno de ejecución mediante RPC autenticado',
|
||||
},
|
||||
scopeLabels: {
|
||||
runtime_host: 'Host del entorno de ejecución',
|
||||
sandbox_sessions: 'Sesiones de sandbox',
|
||||
},
|
||||
processNames: {
|
||||
langbot: 'Proceso principal de LangBot',
|
||||
plugin_runtime: 'Entorno de ejecución de plugins',
|
||||
box_runtime: 'Entorno de ejecución de Box',
|
||||
},
|
||||
processDescriptions: {
|
||||
langbot:
|
||||
'Base de datos, registros, archivos subidos, datos vectoriales y archivos temporales.',
|
||||
plugin_runtime:
|
||||
'Paquetes de plugins, artefactos verificados, entornos de dependencias y datos privados de instalación.',
|
||||
box_runtime:
|
||||
'Espacios de trabajo de sandbox, procesos MCP, directorios de intercambio de adjuntos y habilidades.',
|
||||
},
|
||||
|
||||
title: 'Análisis de almacenamiento',
|
||||
description:
|
||||
'Inspecciona el uso de almacenamiento y los candidatos de limpieza',
|
||||
@@ -1921,6 +2620,22 @@ const esES = {
|
||||
noExpiredUploads: 'No hay archivos subidos caducados',
|
||||
noExpiredLogs: 'No hay registros caducados',
|
||||
sectionNames: {
|
||||
legacy_plugins: 'Paquetes de plugins antiguos',
|
||||
artifacts: 'Artefactos de plugins verificados',
|
||||
dependency_environments: 'Entornos de dependencias',
|
||||
installations: 'Datos de instalación de plugins',
|
||||
staging: 'Archivos provisionales de plugins',
|
||||
rpc_transfer: 'Archivos de transferencia RPC',
|
||||
workspace: 'Espacio de trabajo de sandbox',
|
||||
inbox: 'Adjuntos entrantes',
|
||||
outbox: 'Adjuntos salientes',
|
||||
skills: 'Habilidades',
|
||||
session_workspaces: 'Espacios de trabajo de sesiones sandbox',
|
||||
session_caches: 'Cachés del entorno de sandbox',
|
||||
session_temp: 'Archivos temporales de sandbox',
|
||||
managed_process_workspaces:
|
||||
'Espacios de procesos administrados (incluido MCP)',
|
||||
|
||||
database: 'Base de datos',
|
||||
logs: 'Registros',
|
||||
storage: 'Archivos subidos',
|
||||
@@ -2011,6 +2726,26 @@ const esES = {
|
||||
'Monitorea la actividad del Bot para verificar que la conexión con la plataforma funcione.',
|
||||
},
|
||||
aiEngine: {
|
||||
loadingCatalog: 'Cargando extensiones de ejecutores...',
|
||||
catalogUnavailable: 'El catálogo de ejecutores no está disponible',
|
||||
catalogUnavailableDescription:
|
||||
'Los ejecutores instalados siguen disponibles. Reintenta cargar el catálogo o explora las extensiones.',
|
||||
noMarketplaceRunners: 'Ningún plugin de ejecutor coincide con este uso',
|
||||
noMarketplaceRunnersDescription:
|
||||
'Usa un ejecutor instalado o inténtalo más tarde.',
|
||||
browseRunners: 'Explorar extensiones de ejecutores',
|
||||
installAndContinue: 'Instalar y continuar',
|
||||
installing: 'Instalando...',
|
||||
useInstalled: 'Usar este ejecutor',
|
||||
installedUnavailable: 'Instalado, ejecutor no disponible',
|
||||
installSuccess: '{{runner}} instalado y seleccionado',
|
||||
installFailed: 'No se pudo instalar la extensión de ejecutor',
|
||||
versionUnavailable: 'El mercado no devolvió ninguna versión instalable.',
|
||||
installTimeout:
|
||||
'La instalación del ejecutor agotó el tiempo de espera. Revisa la tarea en Extensiones.',
|
||||
registrationTimeout:
|
||||
'La extensión se instaló, pero el ejecutor no se registró. Revisa el entorno de ejecución de plugins y reinténtalo.',
|
||||
|
||||
defaultModelUnavailable:
|
||||
'No hay un modelo predeterminado disponible. Inténtalo de nuevo.',
|
||||
defaultRunnerUnavailable:
|
||||
|
||||
+268
-35
@@ -2,81 +2,157 @@ import pipelineMigration from './pipeline-migration/ja-JP';
|
||||
|
||||
const jaJP = {
|
||||
sidebarGuide: {
|
||||
label: 'ワークスペースツアー',
|
||||
progress: '{{current}} / {{total}}',
|
||||
confirm: '確認しました',
|
||||
finish: 'ツアーを完了',
|
||||
steps: {
|
||||
monitoring: {
|
||||
title: 'ダッシュボード',
|
||||
title: '稼働状況を確認する',
|
||||
description:
|
||||
'ボットの稼働状況、モデルの使用量、メッセージ数、システムの状態をまとめて確認できます。',
|
||||
},
|
||||
bots: {
|
||||
title: 'ボット',
|
||||
title: 'チャットに接続する',
|
||||
description:
|
||||
'チャットプラットフォームに接続し、各ボットを作成・管理します。',
|
||||
},
|
||||
pipelines: {
|
||||
title: 'プロセッサー',
|
||||
title: '処理を設定する',
|
||||
description:
|
||||
'ボットを動かす AI パイプライン、エージェント、イベントプロセッサーを作成します。',
|
||||
'再利用できるパイプライン、Agent、プラグイン処理の設定を作成し、ボットに接続します。',
|
||||
},
|
||||
knowledge: {
|
||||
title: 'ナレッジベース',
|
||||
title: 'ナレッジベースを管理する',
|
||||
description:
|
||||
'ドキュメントや外部ナレッジを管理し、モデルの回答精度を高めます。',
|
||||
},
|
||||
plugins: {
|
||||
title: 'インストール済み拡張機能',
|
||||
title: 'インストール済み拡張機能を管理する',
|
||||
description:
|
||||
'プラグイン、MCP サーバー、スキルと、それぞれの実行状態を管理します。',
|
||||
},
|
||||
'add-extension': {
|
||||
title: '拡張機能を追加',
|
||||
title: '拡張機能を追加する',
|
||||
description:
|
||||
'マーケット、GitHub、ローカルパッケージから新しい機能を追加します。',
|
||||
},
|
||||
models: {
|
||||
title: 'モデル設定',
|
||||
title: 'モデルを設定する',
|
||||
description:
|
||||
'モデルプロバイダーと、LangBot が使用する言語・埋め込みモデルなどを設定します。',
|
||||
},
|
||||
'api-integration': {
|
||||
title: 'API 連携',
|
||||
title: 'API アクセスを設定する',
|
||||
description:
|
||||
'API キーを作成し、LangBot サービスや MCP への外部アクセスを設定します。',
|
||||
},
|
||||
},
|
||||
},
|
||||
guidedTour: {
|
||||
label: 'セットアップガイド',
|
||||
progress: '{{current}} / {{total}}',
|
||||
eventDebugDescription:
|
||||
'対応するイベントを選び、テストデータを入力して出力とツールの結果を確認します。プラットフォーム操作は模擬実行され、モデルや他のツールは設定に従って実行されます。',
|
||||
|
||||
skip: 'スキップ',
|
||||
|
||||
pipeline: {
|
||||
trigger: {
|
||||
title: '返信するメッセージを選ぶ',
|
||||
description:
|
||||
'パイプラインはメッセージイベントを処理し、AI が自動返信します。グループでの起動条件、個別チャットのルール、メッセージフィルターを設定します。',
|
||||
},
|
||||
ai: {
|
||||
title: 'AI 機能を設定する',
|
||||
description:
|
||||
'ローカルまたは外部プラットフォームのランナーを選び、モデル、プロンプト、ナレッジベースなどを設定します。',
|
||||
},
|
||||
output: {
|
||||
title: '返信方法を調整する',
|
||||
description:
|
||||
'長文の処理などの出力ルールを設定し、AI の回答をどのように届けるかを決めます。',
|
||||
},
|
||||
safety: {
|
||||
title: '安全対策を設定する',
|
||||
description:
|
||||
'必要に応じてコンテンツフィルターやレート制限を有効にし、内容と処理頻度を制御します。',
|
||||
},
|
||||
extensions: {
|
||||
title: '利用する拡張機能を選ぶ',
|
||||
description:
|
||||
'このパイプラインで利用するプラグイン、MCP サーバー、スキルを選び、メッセージ処理やツールを拡張します。',
|
||||
},
|
||||
basic: {
|
||||
title: 'パイプラインを管理する',
|
||||
description:
|
||||
'現在のパイプラインを複製して別の設定を作成したり、不要なパイプラインを削除したりできます。',
|
||||
},
|
||||
debug: {
|
||||
title: '会話をテストする',
|
||||
description:
|
||||
'テストメッセージで起動条件、AI の返信、出力処理を確認します。設定の変更はテスト前に保存されます。',
|
||||
},
|
||||
monitoring: {
|
||||
title: '実行履歴を確認する',
|
||||
description:
|
||||
'タイトル横のタブで過去の会話、処理過程、エラーを確認し、返信がない場合や想定外の回答を調べます。',
|
||||
},
|
||||
save: {
|
||||
title: '保存してボットに接続する',
|
||||
description:
|
||||
'設定を保存し、ボットページのイベントルーティングでメッセージ受信イベントをこのパイプラインに割り当てます。',
|
||||
},
|
||||
},
|
||||
pluginProcessor: {
|
||||
select: {
|
||||
title: 'プラグインのランナーを選ぶ',
|
||||
description:
|
||||
'イベント処理に対応するランナーを選びます。対応するイベントと処理ロジックはプラグイン作者が定義します。',
|
||||
},
|
||||
parameters: {
|
||||
title: 'プラグインのパラメーターを設定する',
|
||||
description:
|
||||
'プラグインの設定項目を入力します。同じプラグインでも、ボットや用途ごとに複数の設定を保存できます。',
|
||||
},
|
||||
debug: {
|
||||
title: 'イベント処理をテストする',
|
||||
},
|
||||
logs: {
|
||||
title: '処理結果を確認する',
|
||||
description:
|
||||
'各実行の状態、入力イベント、プラグインログ、呼び出し結果から失敗の原因を調べます。',
|
||||
},
|
||||
save: {
|
||||
title: '保存してボットに紐付ける',
|
||||
description:
|
||||
'保存後、ボットページのプラグイン処理セクションにこの設定を追加します。宣言されたイベントを自動受信するため、イベントごとのルーティングは不要です。',
|
||||
},
|
||||
},
|
||||
previous: '前へ',
|
||||
label: '使い方ガイド',
|
||||
progress: 'ステップ {{current}} / {{total}}',
|
||||
next: '次へ',
|
||||
finish: '完了',
|
||||
finish: 'ガイドを完了',
|
||||
bot: {
|
||||
save: {
|
||||
title: 'ボット設定を保存する',
|
||||
description:
|
||||
'接続パラメーターとイベントルーティングを確認して保存します。準備ができたらボットを有効にできます。',
|
||||
},
|
||||
|
||||
connection: {
|
||||
title: '接続方式を選択',
|
||||
description:
|
||||
'このアダプターが対応する接続方式から選択すると、関連パラメーターが自動的に更新されます。',
|
||||
requirement: 'Webhook または常時接続を選択してください。',
|
||||
},
|
||||
basic: {
|
||||
title: 'ボット情報を入力',
|
||||
description: 'ルーティングやログで見つけやすい名前を設定します。',
|
||||
requirement: 'ボット名を入力してください。',
|
||||
},
|
||||
adapter: {
|
||||
title: 'プラットフォームアダプターを選択',
|
||||
description:
|
||||
'先にプラットフォームを選択すると、Webhook、常時接続、または両方への対応状況が表示されます。',
|
||||
requirement: 'アダプターを選択してください。',
|
||||
},
|
||||
parameters: {
|
||||
title: 'プラットフォームを設定',
|
||||
description:
|
||||
'認証情報とプラットフォームのパラメーターを入力します。外部側の設定はドキュメントを参照してください。',
|
||||
requirement: '表示されている必須項目をすべて入力してください。',
|
||||
action: 'アダプターのドキュメントを開く',
|
||||
},
|
||||
routing: {
|
||||
@@ -99,61 +175,61 @@ const jaJP = {
|
||||
basic: {
|
||||
title: 'プロセッサー情報を入力',
|
||||
description:
|
||||
'識別しやすい名前を設定し、作成後に Runner、イベント、ツールを設定します。',
|
||||
requirement: 'プロセッサー名を入力してください。',
|
||||
'識別しやすい名前を設定し、作成後にランナー、イベント、ツールを設定します。',
|
||||
},
|
||||
submit: {
|
||||
title: '作成して設定を続行',
|
||||
description:
|
||||
'作成後、必要な Runner、パラメーター、イベント、ツールを設定します。',
|
||||
'作成後、必要なランナー、パラメーター、イベント、ツールを設定します。',
|
||||
},
|
||||
},
|
||||
runner: {
|
||||
debug: {
|
||||
title: 'イベント処理をテスト',
|
||||
},
|
||||
select: {
|
||||
title: 'Runner を選択またはインストール',
|
||||
title: 'ランナーを選択またはインストール',
|
||||
description:
|
||||
'インストール済み Runner を選択するか、この選択欄のマーケット一覧から直接インストールします。',
|
||||
requirement: '利用可能な Runner を選択してください。',
|
||||
action: 'Runner マーケットを見る',
|
||||
'インストール済みランナーを選択するか、この選択欄のマーケット一覧から直接インストールします。',
|
||||
action: 'ランナーマーケットを見る',
|
||||
},
|
||||
parameters: {
|
||||
title: 'Runner のパラメーターを設定',
|
||||
title: 'ランナーのパラメーターを設定',
|
||||
description:
|
||||
'選択した Runner が要求するモデル、認証情報、サービス URL などを入力します。',
|
||||
requirement: '表示されている必須項目をすべて入力してください。',
|
||||
'選択したランナーが要求するモデル、認証情報、サービス URL などを入力します。',
|
||||
},
|
||||
events: {
|
||||
title: 'イベントとツールを設定',
|
||||
description:
|
||||
'「イベントとツール」を開き、Agent が受け取るイベントと使用可能なツールを選びます。',
|
||||
requirement: '「イベントとツール」タブを開いてください。',
|
||||
},
|
||||
},
|
||||
knowledge: {
|
||||
save: {
|
||||
title: 'ナレッジベースの設定を保存する',
|
||||
description: 'エンジンのパラメーターと検索設定を確認して保存します。',
|
||||
},
|
||||
|
||||
basic: {
|
||||
title: 'ナレッジベース情報を入力',
|
||||
description:
|
||||
'名前と任意の説明を設定してから、保存・検索エンジンを選択します。',
|
||||
requirement: 'ナレッジベース名を入力してください。',
|
||||
},
|
||||
engine: {
|
||||
title: 'エンジンを選択またはインストール',
|
||||
description:
|
||||
'インストール済みエンジンを選択するか、この選択欄のマーケットから直接インストールします。',
|
||||
requirement: 'ナレッジエンジンを選択してください。',
|
||||
action: 'ナレッジエンジンのマーケットを見る',
|
||||
},
|
||||
parameters: {
|
||||
title: 'エンジンのパラメーターを設定',
|
||||
description:
|
||||
'エンジンが要求するストレージ、モデル、認証情報、外部サービス設定を入力します。',
|
||||
requirement: '表示されている必須項目をすべて入力してください。',
|
||||
},
|
||||
retrieval: {
|
||||
title: '検索方法を設定',
|
||||
description:
|
||||
'関連コンテンツの検索方法とプロセッサーへの返却方法を設定します。',
|
||||
requirement: '表示されている必須検索項目を入力してください。',
|
||||
},
|
||||
submit: {
|
||||
title: 'ナレッジベースを作成',
|
||||
@@ -971,6 +1047,107 @@ const jaJP = {
|
||||
},
|
||||
},
|
||||
agents: {
|
||||
eventsAndTools: 'イベントとツール',
|
||||
eventsAndToolsDescription: '起動イベントと利用できるツールを設定します。',
|
||||
configuredEvents: '追加済みのイベント',
|
||||
configuredEventsCount: '合計 {{count}} 件',
|
||||
addEvent: 'イベントを追加',
|
||||
removeEvent: 'イベントを削除',
|
||||
eventActions: '自動で有効になるツール',
|
||||
eventToolEnabled: '有効',
|
||||
eventToolsEnabledCount: '{{count}} 個のツールが有効',
|
||||
noEventActions: 'このイベントで利用できるアクションはありません。',
|
||||
noEventsConfigured: 'イベントが未追加です',
|
||||
noEventsConfiguredDescription:
|
||||
'この Agent を起動できるイベントがありません。',
|
||||
noEventsConfiguredBadge: 'イベントなし',
|
||||
apiTools: 'ツールへのアクセス',
|
||||
apiToolsDescription: 'この Agent が呼び出せるツールを選びます。',
|
||||
otherTools: 'その他のツール',
|
||||
otherToolsDescription:
|
||||
'プラットフォーム、サンドボックス、MCP、プラグイン、スキルのツールを選びます。',
|
||||
apiToolsSelected: '{{count}} 個を選択中',
|
||||
apiToolsSecurityHint: 'この Agent に必要なツールだけを有効にしてください。',
|
||||
apiToolsSearch: 'ツールを検索…',
|
||||
eventApiTools: 'イベントツール',
|
||||
eventToolUnavailable: '利用不可',
|
||||
eventApiToolsDescription:
|
||||
'操作対象は現在のイベントから決まります。Agent はアクションのパラメーターのみを指定します。',
|
||||
platformApiTools: 'プラットフォームツール',
|
||||
platformApiToolsDescription:
|
||||
'Agent はユーザー、グループ、メッセージの ID を選べます。必要な権限だけを付与してください。',
|
||||
apiToolEvents: 'イベント',
|
||||
apiToolParameters: 'Agent のパラメーター',
|
||||
apiToolSource: '提供元',
|
||||
apiToolNoParameters: 'なし',
|
||||
sandboxTools: 'サンドボックス',
|
||||
mcpTools: 'MCP',
|
||||
pluginTools: 'プラグイン',
|
||||
skillTools: 'スキル',
|
||||
langbotBuiltIn: 'LangBot',
|
||||
apiToolDetails: '詳細',
|
||||
apiToolHideDetails: '非表示',
|
||||
apiToolsNoResults: '一致する API やツールはありません',
|
||||
apiToolsCatalogUnavailable:
|
||||
'LangBot サーバーが API ツール一覧を返しませんでした。サーバーを更新して再起動したか確認してください。プラットフォームにツールがないという意味ではありません。',
|
||||
hostToolsCatalogUnavailable: 'ツール一覧は一時的に利用できません。',
|
||||
apiToolRisk: {
|
||||
read: '読み取り専用',
|
||||
write: 'アクション',
|
||||
dangerous: '機密性の高い操作',
|
||||
},
|
||||
runnerConfigIncomplete: 'ランナー設定が未完了です',
|
||||
runnerConfigIncompleteDescription: '必須項目を入力してください:{{fields}}',
|
||||
debugTab: 'イベントデバッグ',
|
||||
debugTitle: 'Agent のイベントデバッグ',
|
||||
debugDescription:
|
||||
'現在の Agent にメッセージやプラットフォームイベントを渡して実行し、実際の出力を確認します。',
|
||||
debugResetSession: 'セッションをリセット',
|
||||
debugEventType: 'イベントの種類',
|
||||
debugNoEventsTitle: 'デバッグできるイベントがありません',
|
||||
debugNoEventsDescription:
|
||||
'まず「イベントとツール」でイベントを追加してください。',
|
||||
debugMessageReceived: 'メッセージ受信',
|
||||
debugGroupMemberJoined: 'メンバーのグループ参加',
|
||||
debugGroupMemberLeft: 'メンバーのグループ退出',
|
||||
debugFriendRequested: '友達申請の受信',
|
||||
debugFeedbackReceived: 'フィードバック受信',
|
||||
debugCustomEvent: 'カスタムイベント',
|
||||
debugCustomEventType: 'カスタムイベント名',
|
||||
debugMessageInput: '会話の入力',
|
||||
debugEventSummary: 'イベントの概要',
|
||||
debugInputPlaceholder: 'Agent に処理させる内容を入力',
|
||||
debugEventPayload: 'イベントデータ(JSON)',
|
||||
debugSupportedEvents: 'Agent が対応するイベント',
|
||||
debugRun: 'テストを実行',
|
||||
debugSaveAndRun: '保存して実行',
|
||||
debugRunning: '実行中',
|
||||
debugTranscript: 'デバッグ記録',
|
||||
debugTranscriptDescription:
|
||||
'現在のデバッグセッションの入力と Agent の出力です。',
|
||||
debugEmptyTitle: 'この Agent の動作を確認する',
|
||||
debugEmptyTranscript:
|
||||
'イベントを選び、テスト内容を入力して「テストを実行」を押します。結果はこのページに表示されます。',
|
||||
debugAgentOutput: 'Agent の出力',
|
||||
debugTestInput: 'テスト入力',
|
||||
debugNoTextOutput: 'テキスト出力なしで実行が完了しました。',
|
||||
debugEventTypeRequired: 'イベントの種類を入力してください',
|
||||
debugInputRequired: '会話の入力を記入してください',
|
||||
debugInvalidPayload:
|
||||
'イベントデータは有効な JSON オブジェクトである必要があります',
|
||||
debugUnsupportedEvent: 'このイベントは Agent に紐付けできる範囲外です',
|
||||
debugRunnerConfigInvalidDescription:
|
||||
'ランナー設定が未完了です:{{message}}',
|
||||
debugRunnerExecutionFailedDescription:
|
||||
'実行に失敗しました。選択したモデルとランナー設定を確認し、再試行してください。',
|
||||
debugRunnerTimeoutDescription:
|
||||
'実行がタイムアウトしました。後で再試行するか、ランナーのタイムアウト設定を変更してください。',
|
||||
debugApiKeyRequired: 'API キーがありません',
|
||||
debugOpenRunnerConfig: 'ランナー設定を開く',
|
||||
debugReviewRunnerConfig: 'ランナー設定を確認',
|
||||
debugErrorDetails: 'エラーの詳細を表示',
|
||||
debugRunFailed: 'Agent のデバッグ実行に失敗しました',
|
||||
|
||||
monitoring: {
|
||||
description:
|
||||
'各タスクのトリガーイベント、モデル出力、ツール実行を確認します。',
|
||||
@@ -1755,6 +1932,8 @@ const jaJP = {
|
||||
selectKnowledgeBases: 'ナレッジベースを選択',
|
||||
},
|
||||
debugDialog: {
|
||||
saveAndSend: '保存して送信',
|
||||
|
||||
title: 'パイプラインのチャット',
|
||||
selectPipeline: 'パイプラインを選択',
|
||||
sessionType: 'セッションタイプ',
|
||||
@@ -2419,6 +2598,45 @@ const jaJP = {
|
||||
},
|
||||
},
|
||||
storageAnalysis: {
|
||||
notCreated: '未作成',
|
||||
processStorage: 'プロセス別ストレージ',
|
||||
processStorageDescription:
|
||||
'各ランタイムが管理するディレクトリを計測します。内訳は親ディレクトリの合計に含まれます。',
|
||||
directory: 'ディレクトリ',
|
||||
size: 'サイズ',
|
||||
files: 'ファイル',
|
||||
runtimeUnavailable: 'ランタイムのストレージ統計を取得できません。',
|
||||
noManagedDirectories: '管理対象ディレクトリの報告はありません。',
|
||||
scanWarnings: '読み取り不可:{{count}} 件',
|
||||
boxActivity: '{{sessions}} セッション · {{processes}} 管理プロセス',
|
||||
statusLabels: {
|
||||
available: '利用可能',
|
||||
unavailable: '利用不可',
|
||||
disabled: '無効',
|
||||
not_applicable: '該当なし',
|
||||
},
|
||||
sourceLabels: {
|
||||
local_process: 'LangBot プロセスが計測',
|
||||
runtime_rpc: 'ランタイムプロセスが認証済み RPC 経由で計測',
|
||||
},
|
||||
scopeLabels: {
|
||||
runtime_host: 'ランタイムホスト',
|
||||
sandbox_sessions: 'サンドボックスセッション',
|
||||
},
|
||||
processNames: {
|
||||
langbot: 'LangBot メインプロセス',
|
||||
plugin_runtime: 'プラグインランタイム',
|
||||
box_runtime: 'Box ランタイム',
|
||||
},
|
||||
processDescriptions: {
|
||||
langbot:
|
||||
'アプリケーションのデータベース、ログ、アップロードファイル、ベクトルデータ、一時ファイル。',
|
||||
plugin_runtime:
|
||||
'プラグインパッケージ、検証済み成果物、依存関係の環境、非公開のインストールデータ。',
|
||||
box_runtime:
|
||||
'サンドボックスと MCP プロセスのワークスペース、添付ファイル交換ディレクトリ、スキル。',
|
||||
},
|
||||
|
||||
title: 'ストレージ分析',
|
||||
description: 'ストレージ使用量とクリーンアップ候補を確認します',
|
||||
openDialog: '分析を表示',
|
||||
@@ -2444,6 +2662,21 @@ const jaJP = {
|
||||
noExpiredUploads: '期限切れのアップロードファイルはありません',
|
||||
noExpiredLogs: '期限切れのログファイルはありません',
|
||||
sectionNames: {
|
||||
legacy_plugins: '旧プラグインパッケージ',
|
||||
artifacts: '検証済みプラグイン成果物',
|
||||
dependency_environments: '依存関係の環境',
|
||||
installations: 'プラグインのインストールデータ',
|
||||
staging: 'プラグインのステージングファイル',
|
||||
rpc_transfer: 'ランタイム RPC 転送ファイル',
|
||||
workspace: 'サンドボックスワークスペース',
|
||||
inbox: '受信添付ファイル',
|
||||
outbox: '送信添付ファイル',
|
||||
skills: 'スキル',
|
||||
session_workspaces: 'サンドボックスセッションのワークスペース',
|
||||
session_caches: 'サンドボックスランタイムのキャッシュ',
|
||||
session_temp: 'サンドボックスの一時ファイル',
|
||||
managed_process_workspaces: '管理プロセスのワークスペース(MCP を含む)',
|
||||
|
||||
database: 'データベース',
|
||||
logs: 'ログ',
|
||||
storage: 'アップロードファイル',
|
||||
|
||||
@@ -1,6 +1,244 @@
|
||||
import pipelineMigration from './pipeline-migration/ru-RU';
|
||||
|
||||
const ruRU = {
|
||||
sidebarGuide: {
|
||||
steps: {
|
||||
monitoring: {
|
||||
title: 'Проверьте активность',
|
||||
description:
|
||||
'Просматривайте активность ботов, использование моделей, объём сообщений и производительность системы.',
|
||||
},
|
||||
bots: {
|
||||
title: 'Подключите платформы чата',
|
||||
description:
|
||||
'Подключайте LangBot к платформам чата и управляйте подключениями ботов.',
|
||||
},
|
||||
pipelines: {
|
||||
title: 'Настройте обработчики',
|
||||
description:
|
||||
'Создавайте переиспользуемые конвейеры, Agents и конфигурации обработчиков плагинов, затем подключайте их к ботам.',
|
||||
},
|
||||
knowledge: {
|
||||
title: 'Управляйте базами знаний',
|
||||
description:
|
||||
'Управляйте документами и внешними источниками знаний для улучшения ответов моделей.',
|
||||
},
|
||||
plugins: {
|
||||
title: 'Управляйте расширениями',
|
||||
description:
|
||||
'Управляйте установленными плагинами, серверами MCP и навыками, включая их состояние.',
|
||||
},
|
||||
'add-extension': {
|
||||
title: 'Добавьте расширения',
|
||||
description:
|
||||
'Устанавливайте расширения из магазина, GitHub или локального пакета.',
|
||||
},
|
||||
models: {
|
||||
title: 'Настройте модели',
|
||||
description:
|
||||
'Настройте поставщиков и выберите языковые модели, модели эмбеддингов и другие модели LangBot.',
|
||||
},
|
||||
'api-integration': {
|
||||
title: 'Настройте доступ к API',
|
||||
description:
|
||||
'Создавайте ключи API и настраивайте внешний доступ к сервисам LangBot и MCP.',
|
||||
},
|
||||
},
|
||||
},
|
||||
|
||||
guidedTour: {
|
||||
eventDebugDescription:
|
||||
'Выберите поддерживаемое событие, введите тестовые данные и проверьте вывод и результаты инструментов. Действия платформы имитируются; модели и другие инструменты выполняются согласно настройкам.',
|
||||
|
||||
bot: {
|
||||
connection: {
|
||||
title: 'Выберите способ подключения',
|
||||
description:
|
||||
'Выберите способ подключения, поддерживаемый адаптером. Его параметры обновятся автоматически.',
|
||||
},
|
||||
basic: {
|
||||
title: 'Задайте имя бота',
|
||||
description:
|
||||
'Задайте понятное имя, чтобы находить подключение в маршрутах и журналах.',
|
||||
},
|
||||
adapter: {
|
||||
title: 'Выберите адаптер платформы',
|
||||
description:
|
||||
'Выберите адаптер бота. Способ подключения и параметры платформы настраиваются после создания.',
|
||||
},
|
||||
parameters: {
|
||||
title: 'Настройте платформу',
|
||||
description:
|
||||
'Введите учётные данные и параметры платформы. Настройки на стороне платформы описаны в документации адаптера.',
|
||||
action: 'Открыть документацию адаптера',
|
||||
},
|
||||
routing: {
|
||||
title: 'Настройте маршруты входящих событий',
|
||||
description:
|
||||
'Выберите обработчик для каждого события, получаемого ботом.',
|
||||
},
|
||||
save: {
|
||||
title: 'Сохраните настройки бота',
|
||||
description:
|
||||
'Проверьте параметры подключения и маршруты событий, затем сохраните настройки. После этого можно включить бота.',
|
||||
},
|
||||
submit: {
|
||||
title: 'Создайте бота',
|
||||
description:
|
||||
'Создайте выключенного бота, затем настройте подключение и параметры платформы на его странице.',
|
||||
},
|
||||
},
|
||||
knowledge: {
|
||||
basic: {
|
||||
title: 'Опишите базу знаний',
|
||||
description:
|
||||
'Задайте понятное имя и необязательное описание перед выбором движка хранения и поиска.',
|
||||
},
|
||||
engine: {
|
||||
title: 'Проверьте движок знаний',
|
||||
description:
|
||||
'Проверьте движок этой базы знаний. Его параметры и настройки поиска задаются ниже.',
|
||||
action: 'Открыть магазин движков знаний',
|
||||
},
|
||||
parameters: {
|
||||
title: 'Настройте параметры движка',
|
||||
description:
|
||||
'Заполните требуемые движком настройки хранения, модели, учётных данных или внешнего сервиса.',
|
||||
},
|
||||
retrieval: {
|
||||
title: 'Настройте поиск',
|
||||
description:
|
||||
'Определите, как движок ищет и возвращает подходящий контент обработчикам.',
|
||||
},
|
||||
save: {
|
||||
title: 'Сохраните настройки базы знаний',
|
||||
description:
|
||||
'Проверьте параметры движка и поиска, затем сохраните настройки.',
|
||||
},
|
||||
submit: {
|
||||
title: 'Создайте базу знаний',
|
||||
description:
|
||||
'Создайте базу знаний, затем добавьте документы или подключите источники, поддерживаемые движком.',
|
||||
},
|
||||
},
|
||||
|
||||
pipeline: {
|
||||
trigger: {
|
||||
title: 'Выберите сообщения для ответа',
|
||||
description:
|
||||
'Конвейер обрабатывает события сообщений и автоматически отвечает с помощью ИИ. Здесь задаются условия в группах, правила личных чатов и фильтры сообщений.',
|
||||
},
|
||||
ai: {
|
||||
title: 'Настройте возможности ИИ',
|
||||
description:
|
||||
'Выберите локальный исполнитель или исполнитель внешней платформы, затем настройте модель, инструкции, базы знаний и другие параметры.',
|
||||
},
|
||||
output: {
|
||||
title: 'Настройте ответы',
|
||||
description:
|
||||
'Задайте правила вывода, например обработку длинного текста, чтобы определить способ доставки ответов.',
|
||||
},
|
||||
safety: {
|
||||
title: 'Настройте защиту',
|
||||
description:
|
||||
'При необходимости включите фильтрацию содержимого и ограничения частоты обработки.',
|
||||
},
|
||||
extensions: {
|
||||
title: 'Выберите расширения',
|
||||
description:
|
||||
'Выберите плагины, серверы MCP и навыки, доступные этому конвейеру для обработки сообщений и работы с инструментами.',
|
||||
},
|
||||
basic: {
|
||||
title: 'Управляйте конвейером',
|
||||
description:
|
||||
'Скопируйте конвейер для создания другой конфигурации или удалите ненужный конвейер.',
|
||||
},
|
||||
debug: {
|
||||
title: 'Протестируйте диалог',
|
||||
description:
|
||||
'Отправьте тестовые сообщения, чтобы проверить условия запуска, ответы ИИ и обработку вывода. Изменения сохраняются перед тестом.',
|
||||
},
|
||||
monitoring: {
|
||||
title: 'Посмотрите историю запусков',
|
||||
description:
|
||||
'На вкладке рядом с заголовком доступны прошлые диалоги, этапы обработки и ошибки для диагностики отсутствующих или неожиданных ответов.',
|
||||
},
|
||||
save: {
|
||||
title: 'Сохраните и подключите бота',
|
||||
description:
|
||||
'Сохраните настройки, затем направьте события получения сообщений в этот конвейер на странице бота.',
|
||||
},
|
||||
},
|
||||
pluginProcessor: {
|
||||
select: {
|
||||
title: 'Выберите исполнитель плагина',
|
||||
description:
|
||||
'Выберите исполнитель с поддержкой обработки событий. Автор плагина определяет поддерживаемые события и логику их обработки.',
|
||||
},
|
||||
parameters: {
|
||||
title: 'Настройте параметры плагина',
|
||||
description:
|
||||
'Заполните настройки плагина. Для разных ботов и задач можно сохранить несколько конфигураций одного плагина.',
|
||||
},
|
||||
debug: {
|
||||
title: 'Протестируйте обработку событий',
|
||||
},
|
||||
logs: {
|
||||
title: 'Проверьте результаты',
|
||||
description:
|
||||
'Просмотрите состояние запуска, входное событие, журналы плагина и результаты вызовов, чтобы выяснить причины ошибок.',
|
||||
},
|
||||
save: {
|
||||
title: 'Сохраните и привяжите к боту',
|
||||
description:
|
||||
'После сохранения добавьте конфигурацию в раздел обработчиков плагинов на странице бота. Заявленные события поступают автоматически, без настройки отдельных маршрутов.',
|
||||
},
|
||||
},
|
||||
label: 'Руководство',
|
||||
progress: 'Шаг {{current}} из {{total}}',
|
||||
previous: 'Назад',
|
||||
next: 'Далее',
|
||||
finish: 'Завершить руководство',
|
||||
skip: 'Пропустить',
|
||||
processorCreate: {
|
||||
type: {
|
||||
title: 'Выберите тип обработчика',
|
||||
description:
|
||||
'Конвейеры обрабатывают сообщения по заданному сценарию, агенты принимают решения с помощью моделей и инструментов, а обработчики плагинов обрабатывают заявленные события платформы.',
|
||||
},
|
||||
basic: {
|
||||
title: 'Назовите обработчик',
|
||||
description:
|
||||
'Укажите понятное имя. Исполнитель и события настраиваются после создания.',
|
||||
},
|
||||
submit: {
|
||||
title: 'Создайте и продолжите настройку',
|
||||
description:
|
||||
'После создания настройте исполнителя, параметры, события и инструменты для выбранного типа обработчика.',
|
||||
},
|
||||
},
|
||||
runner: {
|
||||
debug: {
|
||||
title: 'Проверьте обработку событий',
|
||||
},
|
||||
select: {
|
||||
title: 'Выберите или установите исполнителя',
|
||||
description:
|
||||
'Выберите установленного исполнителя или установите его прямо из списка магазина в этом поле.',
|
||||
action: 'Открыть магазин исполнителей',
|
||||
},
|
||||
parameters: {
|
||||
title: 'Настройте параметры исполнителя',
|
||||
description:
|
||||
'Укажите модель, учётные данные, URL сервиса и другие параметры выбранного исполнителя.',
|
||||
},
|
||||
events: {
|
||||
title: 'Настройте события и инструменты',
|
||||
description:
|
||||
'Откройте вкладку событий и инструментов, чтобы выбрать события для агента и разрешённые инструменты платформы или LangBot.',
|
||||
},
|
||||
},
|
||||
},
|
||||
pipelineMigration,
|
||||
sidebar: {
|
||||
home: 'Главная',
|
||||
@@ -18,6 +256,14 @@ const ruRU = {
|
||||
editionCloud: 'Cloud',
|
||||
},
|
||||
common: {
|
||||
loadFailed: 'Не удалось загрузить. Попробуйте ещё раз.',
|
||||
showSecret: 'Показать секрет',
|
||||
hideSecret: 'Скрыть секрет',
|
||||
editBasicInfo: 'Изменить основные сведения',
|
||||
editBasicInfoDescription: 'Измените имя, описание и значок.',
|
||||
editBasicInfoDescriptionNoIcon: 'Измените имя и описание.',
|
||||
management: 'Управление',
|
||||
|
||||
customValue: 'Свой вариант',
|
||||
login: 'Войти',
|
||||
logout: 'Выйти',
|
||||
@@ -403,6 +649,213 @@ const ruRU = {
|
||||
"Uses the Workspace owner's LangBot Account billing and credits.",
|
||||
},
|
||||
bots: {
|
||||
connectionMode: 'Способ подключения',
|
||||
connectionModeDescription:
|
||||
'Выберите способ подключения, поддерживаемый адаптером.',
|
||||
connectionWebhook: 'Webhook',
|
||||
connectionWebhookDescription:
|
||||
'Платформа отправляет события на URL, созданный LangBot.',
|
||||
connectionPersistent: 'Постоянное соединение',
|
||||
connectionPersistentDescription:
|
||||
'LangBot поддерживает исходящее сокетное или потоковое соединение.',
|
||||
noAdaptersForConnectionMode:
|
||||
'Ни один установленный адаптер не поддерживает этот способ подключения.',
|
||||
eventBindings: 'Маршруты событий',
|
||||
addEventBinding: 'Добавить маршрут',
|
||||
addBehavior: 'Добавить поведение',
|
||||
commonScenarios: 'Типовые сценарии',
|
||||
dragEventRoute: 'Перетащить маршрут {{index}}',
|
||||
behaviorReplyMessages: 'Отвечать на сообщения',
|
||||
behaviorReplyMessagesDescription:
|
||||
'Передавайте входящие сообщения обработчику.',
|
||||
behaviorWelcomeMembers: 'Приветствовать новых участников',
|
||||
behaviorWelcomeMembersDescription:
|
||||
'Запускайте обработчик при вступлении участника в группу.',
|
||||
behaviorHandleDepartures: 'Обрабатывать выход участников',
|
||||
behaviorHandleDeparturesDescription:
|
||||
'Запускайте обработчик при выходе или удалении участника.',
|
||||
behaviorReviewFriendRequests: 'Проверять заявки в друзья',
|
||||
behaviorReviewFriendRequestsDescription:
|
||||
'Передавайте новые заявки в друзья обработчику.',
|
||||
behaviorHandleModeration: 'Обрабатывать события модерации',
|
||||
behaviorHandleModerationDescription:
|
||||
'Запускайте обработчик при ограничении участника группы.',
|
||||
behaviorCustom: 'Настроить другое событие',
|
||||
behaviorCustomDescription:
|
||||
'Добавьте маршрут и выберите событие из поддерживаемых адаптером.',
|
||||
eventPattern: 'Событие',
|
||||
eventPatternPlaceholder: 'Выберите событие',
|
||||
targetType: 'Тип назначения',
|
||||
target: 'Обработчик',
|
||||
targetAgent: 'Agent',
|
||||
targetPipeline: 'Конвейер',
|
||||
targetDiscard: 'Отбросить',
|
||||
selectTarget: 'Выберите обработчик',
|
||||
searchTarget: 'Поиск обработчиков…',
|
||||
noTargetFound: 'Совместимые обработчики не найдены',
|
||||
priority: 'Приоритет',
|
||||
enabled: 'Включено',
|
||||
eventBindingDescriptionPlaceholder: 'Описание правила',
|
||||
noEventBindings: 'Нет маршрутов событий',
|
||||
unsupportedPipelineEvent: 'Конвейеры поддерживают только события message.*',
|
||||
disable: 'Отключить',
|
||||
enable: 'Включить',
|
||||
disabledBindings: 'Отключено',
|
||||
adapterEventsTitle: 'Поддерживаемые события',
|
||||
adapterEventsDescription: 'Типов событий: {{count}}',
|
||||
adapterEventsMore: 'Ещё {{count}}',
|
||||
advancedEventValues: 'Показать все',
|
||||
eventGroup: 'Группа',
|
||||
eventGroupNames: {
|
||||
bot: 'Состояние бота',
|
||||
feedback: 'Обратная связь',
|
||||
friend: 'Друзья',
|
||||
group: 'Группы',
|
||||
message: 'Сообщения',
|
||||
platform: 'Платформа',
|
||||
},
|
||||
routeConflictTitle: 'Некоторые маршруты пересекаются',
|
||||
routeConflictShadowed:
|
||||
'{{shadowed}} может не запускаться, поскольку {{winner}} обрабатывает те же события раньше.',
|
||||
routeConflictMore: 'Ещё {{count}} конфликтов маршрутов требуют внимания.',
|
||||
routeFallbackCatchAll: '{{route}} — маршрут для всех событий.',
|
||||
routeFallbackIgnored:
|
||||
'События без подходящего маршрута игнорируются. Добавляйте общий маршрут, только если каждое событие требует явного результата.',
|
||||
testRoute: 'Проверить маршрут',
|
||||
adapterEventDebugTitle: 'Отладка событий платформы',
|
||||
adapterEventDebugDescription:
|
||||
'Вызовите событие в {{platform}}. Оно появится здесь после получения адаптером.',
|
||||
adapterEventObserveOnly:
|
||||
'Это окно только наблюдает за событиями. Входящие события обрабатываются по текущим маршрутам.',
|
||||
adapterEventPreparing: 'Подготовка',
|
||||
adapterEventListening: 'Ожидание событий',
|
||||
adapterEventListenerUnavailable: 'Приём событий прерван',
|
||||
adapterEventLoadFailed:
|
||||
'Не удалось прочитать события платформы. Убедитесь, что бот работает, и повторите попытку.',
|
||||
adapterEventReceivedCount: 'Получено событий: {{count}}',
|
||||
adapterEventClear: 'Очистить',
|
||||
adapterEventEmptyTitle: 'Ожидание события платформы',
|
||||
adapterEventEmptyDescription:
|
||||
'Отправьте сообщение или вызовите событие в {{platform}}.',
|
||||
adapterEventData: 'Показать данные события',
|
||||
adapterEventNeedsSavedBot:
|
||||
'Сохраните бота перед приёмом событий платформы.',
|
||||
adapterEventCurrentPlatform: 'текущей платформе',
|
||||
adapterConfigurationTest: 'Проверка настроек адаптера',
|
||||
adapterConfigurationTestDescription:
|
||||
'Сначала сохраните и включите бота, затем вызовите событие платформы для проверки настроек.',
|
||||
refreshRouteStatus: 'Обновить состояние',
|
||||
routeStatusIdle: 'Ещё не запускался',
|
||||
routeStatusRefreshFailed: 'Не удалось обновить состояние маршрута.',
|
||||
routeStatus: {
|
||||
matched: 'Совпадение',
|
||||
delivered: 'Доставлено',
|
||||
discarded: 'Отброшено',
|
||||
failed: 'Ошибка',
|
||||
not_matched: 'Нет совпадения',
|
||||
},
|
||||
routeStatusDetail: {
|
||||
matched: 'Маршрут соответствует событию.',
|
||||
delivered: 'Обработчик получил событие.',
|
||||
discarded: 'Событие намеренно отброшено.',
|
||||
failed: 'Не удалось завершить обработку маршрута.',
|
||||
not_matched: 'Ни один настроенный маршрут не соответствует событию.',
|
||||
},
|
||||
routeFailure: {
|
||||
binding_disabled: 'Этот маршрут отключён.',
|
||||
event_pattern_mismatch: 'Событие не соответствует маршруту.',
|
||||
filters_mismatch: 'Тестовые данные не соответствуют условиям маршрута.',
|
||||
lower_priority:
|
||||
'Другой подходящий маршрут имеет более высокий приоритет.',
|
||||
route_not_found: 'Для события не найден подходящий маршрут.',
|
||||
processor_incompatible:
|
||||
'Выбранный обработчик не поддерживает это событие.',
|
||||
processor_not_found: 'Выбранный обработчик недоступен.',
|
||||
runner_failed:
|
||||
'Исполнитель Agent завершился с ошибкой при обработке события.',
|
||||
delivery_failed: 'Обработчик завершил работу, но доставка не удалась.',
|
||||
},
|
||||
dryRunTitle: 'Проверка маршрута события',
|
||||
dryRunDescription:
|
||||
'Выберите событие, чтобы определить подходящий маршрут и обработчик.',
|
||||
dryRunEventType: 'Тип события',
|
||||
dryRunSampleReady: 'Пример события готов',
|
||||
dryRunSampleDescription:
|
||||
'LangBot подготовил пример данных для {{event}}. Обычно его можно использовать без изменений.',
|
||||
dryRunEditPayload: 'Тестовые данные',
|
||||
dryRunHidePayload: 'Скрыть данные',
|
||||
dryRunPayload: 'Тестовые данные (JSON)',
|
||||
dryRunPayloadHint: 'Используйте для проверки условий сообщений и диалогов.',
|
||||
dryRunPayloadJsonError: 'Введите корректный JSON.',
|
||||
dryRunPayloadObjectError: 'Данные должны быть объектом JSON.',
|
||||
dryRunNeedsSavedBot: 'Сохраните бота перед проверкой маршрутов.',
|
||||
dryRunFailed: 'Не удалось проверить маршрут. Повторите позже.',
|
||||
dryRunAction: 'Показать совпадение',
|
||||
dryRunRunning: 'Проверка…',
|
||||
dryRunMatched: 'Маршрут найден',
|
||||
dryRunNotMatched: 'Маршрут не найден',
|
||||
dryRunTarget: 'Целевой обработчик',
|
||||
dryRunNoTarget: 'Нет назначения',
|
||||
dryRunMatchedRule: 'Подходящее правило',
|
||||
dryRunRuleIndex: 'Маршрут {{index}}',
|
||||
dryRunNoRule: 'Нет подходящего правила',
|
||||
dryRunDiagnostics: 'Этапы диагностики',
|
||||
dryRunDiagnosticSelected: 'Выбран маршрут {{route}}.',
|
||||
dryRunDiagnosticMatched: '{{route}} соответствует. {{reason}}',
|
||||
dryRunDiagnosticSkipped: '{{route}} пропущен. {{reason}}',
|
||||
eventCustom: 'Пользовательское событие',
|
||||
eventDescriptions: {
|
||||
all: 'Соответствует всем событиям, полученным адаптером.',
|
||||
namespace: 'Соответствует всем событиям {{group}}.',
|
||||
namespace_bot:
|
||||
'Соответствует приглашениям, удалениям, отключению звука бота и другим изменениям состояния.',
|
||||
namespace_feedback:
|
||||
'Соответствует обратной связи от платформы или пользователя.',
|
||||
namespace_friend:
|
||||
'Соответствует заявкам в друзья и изменениям дружеских связей.',
|
||||
namespace_group:
|
||||
'Соответствует вступлениям, выходам, удалениям участников и другим событиям группы.',
|
||||
namespace_message:
|
||||
'Соответствует получению, редактированию, удалению сообщений и реакциям.',
|
||||
namespace_platform:
|
||||
'Соответствует особым событиям платформы, предоставляемым адаптером.',
|
||||
custom: 'Пользовательское событие или событие без описания.',
|
||||
message_received:
|
||||
'Пользователь или группа отправляет новое сообщение боту.',
|
||||
message_edited:
|
||||
'Платформа сообщает об изменении существующего сообщения.',
|
||||
message_deleted: 'Платформа сообщает об удалении сообщения.',
|
||||
message_reaction:
|
||||
'Пользователь добавляет или удаляет реакцию на сообщение.',
|
||||
feedback_received:
|
||||
'Получена обратная связь от платформы или пользователя.',
|
||||
friend_request_received: 'Кто-то отправляет боту заявку в друзья.',
|
||||
friend_added: 'Установлена дружеская связь.',
|
||||
group_member_joined: 'Участник вступает в группу, где есть бот.',
|
||||
group_member_left: 'Участник покидает группу, где есть бот.',
|
||||
group_member_banned: 'Участник группы заблокирован или удалён.',
|
||||
bot_invited_to_group: 'Бот приглашён в группу.',
|
||||
bot_removed_from_group: 'Бот удалён из группы.',
|
||||
bot_muted: 'Боту запрещено отправлять сообщения в группе.',
|
||||
bot_unmuted: 'Боту разрешено отправлять сообщения в группе.',
|
||||
platform_specific: 'Событие платформы, специфичное для адаптера.',
|
||||
},
|
||||
conditions: 'Условия',
|
||||
conditionsDescription:
|
||||
'Для срабатывания должны выполняться все условия. Пустой список означает срабатывание всегда.',
|
||||
conditionsEmpty: 'Нет условий — срабатывает всегда.',
|
||||
addFilter: 'Добавить условие',
|
||||
filterChatType: 'Тип сеанса',
|
||||
filterChatId: 'ID сеанса',
|
||||
filterMessageText: 'Текст сообщения',
|
||||
filterMessageElement: 'Элемент сообщения',
|
||||
operator_eq: 'равно',
|
||||
operator_neq: 'не равно',
|
||||
operator_contains: 'содержит',
|
||||
operator_not_contains: 'не содержит',
|
||||
operator_starts_with: 'начинается с',
|
||||
operator_regex: 'регулярное выражение',
|
||||
|
||||
eventWildcard: 'Все события',
|
||||
eventNamespaceWildcard: '{{namespace}}.*',
|
||||
eventNames: {
|
||||
@@ -605,6 +1058,181 @@ const ruRU = {
|
||||
},
|
||||
},
|
||||
agents: {
|
||||
chooseType: 'Выберите способ работы',
|
||||
chooseTypeDescription:
|
||||
'Сначала выберите тип обработчика. Остальные настройки доступны после создания.',
|
||||
diagramHint: 'Как это работает',
|
||||
agentDiagramTitle: 'Agent: решения и действия',
|
||||
agentDiagramDescription:
|
||||
'Agent получает разные события платформы, использует модели и инструменты для понимания ситуации и решает, что делать дальше.',
|
||||
pipelineDiagramTitle: 'Конвейер: заданная последовательность',
|
||||
pipelineDiagramDescription:
|
||||
'Конвейер обрабатывает только события сообщений и выполняет шаги в заданном порядке.',
|
||||
pipelineDiagramFlow: 'Сообщения проходят фиксированную последовательность',
|
||||
diagramEvents: 'События платформы',
|
||||
diagramAgentCanUse: 'Доступно Agent',
|
||||
diagramMessages: 'Сообщения',
|
||||
diagramMembers: 'Участники',
|
||||
diagramFeedback: 'Обратная связь',
|
||||
diagramDecide: 'Понять и решить',
|
||||
diagramModel: 'Использовать модель',
|
||||
diagramTools: 'Использовать инструменты',
|
||||
diagramActions: 'Выполнить действие',
|
||||
diagramMessage: 'Сообщение',
|
||||
diagramPreprocess: 'Подготовка',
|
||||
diagramAI: 'ИИ',
|
||||
diagramPostprocess: 'Обработка результата',
|
||||
diagramOutput: 'Вывод',
|
||||
eventsAndTools: 'События и инструменты',
|
||||
eventsAndToolsDescription:
|
||||
'Задайте события запуска и доступные инструменты.',
|
||||
configuredEvents: 'Добавленные события',
|
||||
configuredEventsCount: 'Всего: {{count}}',
|
||||
addEvent: 'Добавить событие',
|
||||
removeEvent: 'Удалить событие',
|
||||
eventActions: 'Автоматически включённые инструменты',
|
||||
eventToolEnabled: 'Включено',
|
||||
eventToolsEnabledCount: 'Включено инструментов: {{count}}',
|
||||
noEventActions: 'Для этого события нет доступных действий.',
|
||||
noEventsConfigured: 'События не добавлены',
|
||||
noEventsConfiguredDescription:
|
||||
'Ни одно событие не может запустить этот Agent.',
|
||||
noEventsConfiguredBadge: 'Нет событий',
|
||||
apiTools: 'Доступ к инструментам',
|
||||
apiToolsDescription:
|
||||
'Выберите инструменты, которые может вызывать этот Agent.',
|
||||
otherTools: 'Другие инструменты',
|
||||
otherToolsDescription:
|
||||
'Выберите инструменты платформы, песочницы, MCP, плагинов и навыков.',
|
||||
apiToolsSelected: 'Выбрано: {{count}}',
|
||||
apiToolsSecurityHint:
|
||||
'Включайте только необходимые этому Agent инструменты.',
|
||||
apiToolsSearch: 'Поиск инструментов…',
|
||||
eventApiTools: 'Инструменты событий',
|
||||
eventToolUnavailable: 'Недоступно',
|
||||
eventApiToolsDescription:
|
||||
'Цели фиксируются по текущему событию. Agent передаёт только параметры действия.',
|
||||
platformApiTools: 'Инструменты платформы',
|
||||
platformApiToolsDescription:
|
||||
'Agent может выбирать ID пользователей, групп и сообщений. Предоставляйте только необходимые права.',
|
||||
apiToolEvents: 'События',
|
||||
apiToolParameters: 'Параметры Agent',
|
||||
apiToolSource: 'Источник',
|
||||
apiToolNoParameters: 'нет',
|
||||
sandboxTools: 'Песочница',
|
||||
mcpTools: 'MCP',
|
||||
pluginTools: 'Плагины',
|
||||
skillTools: 'Навыки',
|
||||
langbotBuiltIn: 'LangBot',
|
||||
apiToolDetails: 'Подробности',
|
||||
apiToolHideDetails: 'Скрыть',
|
||||
apiToolsNoResults: 'Подходящие API или инструменты не найдены',
|
||||
apiToolsCatalogUnavailable:
|
||||
'Сервер LangBot не вернул каталог инструментов API. Убедитесь, что сервер обновлён и перезапущен. Это не означает отсутствие инструментов у платформы.',
|
||||
hostToolsCatalogUnavailable: 'Каталог инструментов временно недоступен.',
|
||||
apiToolRisk: {
|
||||
read: 'Только чтение',
|
||||
write: 'Действие',
|
||||
dangerous: 'Чувствительное',
|
||||
},
|
||||
runnerStatusLoading: 'Проверка состояния исполнителя',
|
||||
runnerStatusCheckFailed: 'Не удалось проверить состояние исполнителя',
|
||||
runnerStatusCheckFailedDescription:
|
||||
'Повторите проверку. Если ошибка остаётся, проверьте сервер и среду выполнения плагинов.',
|
||||
noRunnersAvailable: 'Нет доступных исполнителей',
|
||||
noRunnersAvailableDescription:
|
||||
'Установите и включите расширение исполнителя перед настройкой Agent.',
|
||||
installedRunners: 'Установленные исполнители',
|
||||
marketplaceRunners: 'Плагины исполнителей в магазине',
|
||||
viewMarketplace: 'Открыть магазин',
|
||||
restoringRunnerInstall:
|
||||
'Восстановление установки плагина и ожидание исполнителя…',
|
||||
noInstalledRunners: 'Расширения исполнителей ещё не установлены.',
|
||||
installingRunner: 'Установка {{runner}}...',
|
||||
runnerInstallSuccess: '{{runner}} установлен и доступен для выбора',
|
||||
selectedRunnerUnavailable: 'Выбранный исполнитель недоступен',
|
||||
selectedRunnerUnavailableDescription:
|
||||
'{{runner}} сейчас не зарегистрирован. Выберите другой исполнитель или восстановите расширение.',
|
||||
noRunnerSelected: 'Исполнитель не выбран',
|
||||
runnerConfigIncomplete: 'Настройка исполнителя не завершена',
|
||||
runnerConfigIncompleteDescription:
|
||||
'Заполните обязательные поля: {{fields}}',
|
||||
runnerReady: 'Исполнитель готов',
|
||||
runnerReadyDescription:
|
||||
'{{runner}} зарегистрирован, среда выполнения плагинов подключена.',
|
||||
debugTab: 'Отладка событий',
|
||||
debugTitle: 'Отладка событий Agent',
|
||||
debugDescription:
|
||||
'Запустите текущий Agent с сообщением или событием платформы и проверьте фактический результат.',
|
||||
debugResetSession: 'Сбросить сеанс',
|
||||
debugEventType: 'Тип события',
|
||||
debugNoEventsTitle: 'Нет событий для отладки',
|
||||
debugNoEventsDescription:
|
||||
'Сначала добавьте событие в разделе «События и инструменты».',
|
||||
debugMessageReceived: 'Получено сообщение',
|
||||
debugGroupMemberJoined: 'Участник вступил в группу',
|
||||
debugGroupMemberLeft: 'Участник покинул группу',
|
||||
debugFriendRequested: 'Получена заявка в друзья',
|
||||
debugFeedbackReceived: 'Получена обратная связь',
|
||||
debugCustomEvent: 'Пользовательское событие',
|
||||
debugCustomEventType: 'Имя пользовательского события',
|
||||
debugMessageInput: 'Ввод диалога',
|
||||
debugEventSummary: 'Сводка события',
|
||||
debugInputPlaceholder: 'Введите задачу для Agent',
|
||||
debugEventPayload: 'Данные события (JSON)',
|
||||
debugSupportedEvents: 'Agent поддерживает',
|
||||
debugRun: 'Запустить тест',
|
||||
debugSaveAndRun: 'Сохранить и запустить',
|
||||
debugRunning: 'Выполняется',
|
||||
debugTranscript: 'Журнал отладки',
|
||||
debugTranscriptDescription:
|
||||
'Входные данные и результаты Agent в текущем сеансе отладки.',
|
||||
debugEmptyTitle: 'Проверьте поведение Agent',
|
||||
debugEmptyTranscript:
|
||||
'Выберите событие, введите тестовые данные и нажмите «Запустить тест». Результаты останутся на странице.',
|
||||
debugAgentOutput: 'Результат Agent',
|
||||
debugReasoning: 'Размышление',
|
||||
debugTextOutput: 'Текстовый вывод',
|
||||
debugPlatformNotice:
|
||||
'Инструменты платформы используют Mock: Agent вызывает инструменты реально, но действия имитируются без отправки сообщений. Остальные инструменты выполняются согласно настройкам.',
|
||||
debugToolSimulated: 'Успешная имитация · Mock',
|
||||
debugStop: 'Остановить отладку',
|
||||
debugMockOptions: 'Сценарий Mock (JSON)',
|
||||
debugInvalidMock: 'Сценарий Mock должен быть корректным объектом JSON.',
|
||||
debugToolMockFailed: 'Имитация ошибки · Mock',
|
||||
debugMockOptionsHelp:
|
||||
'По умолчанию вызовы успешны. Задайте ошибки по именам инструментов в errors, результаты запросов в results и неподдерживаемые API в unsupported_apis. Пример: {"errors":{"event_reply":"Имитация ошибки отправки"}}',
|
||||
debugCancelled:
|
||||
'Отладка остановлена. Предыдущие записи выполнения сохранены.',
|
||||
debugNoToolCalls:
|
||||
'Вызовы инструментов не зарегистрированы. Создание текста не означает отправку сообщения.',
|
||||
debugToolCount:
|
||||
'Зарегистрировано вызовов инструментов: {{count}}. Состояние и результаты приведены ниже.',
|
||||
debugToolRunning: 'Выполняется',
|
||||
debugToolCompleted: 'Завершено',
|
||||
debugToolFailed: 'Ошибка',
|
||||
debugToolInterrupted: 'Результат не получен',
|
||||
debugToolArguments: 'Аргументы',
|
||||
debugToolResult: 'Результат',
|
||||
debugTestInput: 'Тестовый ввод',
|
||||
debugNoTextOutput: 'Выполнение завершилось без текстового вывода.',
|
||||
debugEventTypeRequired: 'Введите тип события',
|
||||
debugInputRequired: 'Введите сообщение для диалога',
|
||||
debugInvalidPayload: 'Данные события должны быть корректным объектом JSON',
|
||||
debugUnsupportedEvent:
|
||||
'Это событие не входит в допустимый набор событий Agent',
|
||||
debugRunnerConfigInvalidDescription:
|
||||
'Настройка исполнителя не завершена: {{message}}',
|
||||
debugRunnerExecutionFailedDescription:
|
||||
'Выполнение завершилось с ошибкой. Проверьте модель и настройки исполнителя и повторите попытку.',
|
||||
debugRunnerTimeoutDescription:
|
||||
'Превышено время выполнения. Повторите позже или измените тайм-аут исполнителя.',
|
||||
debugApiKeyRequired: 'Отсутствует ключ API',
|
||||
debugOpenRunnerConfig: 'Открыть настройки исполнителя',
|
||||
debugReviewRunnerConfig: 'Проверить настройки исполнителя',
|
||||
debugErrorDetails: 'Показать подробности ошибки',
|
||||
debugRunFailed: 'Ошибка отладки Agent',
|
||||
|
||||
monitoring: {
|
||||
description:
|
||||
'Просмотр события, ответа модели и вызовов инструментов для каждой задачи.',
|
||||
@@ -925,6 +1553,13 @@ const ruRU = {
|
||||
installFromGithubDesc: 'Установить плагин из GitHub Release',
|
||||
goToMarketplace: 'Перейти в маркетплейс',
|
||||
installProgress: {
|
||||
updateTitle: 'Обновление {{name}}',
|
||||
checkingUpdate: 'Проверка обновлений',
|
||||
validating: 'Проверка пакета',
|
||||
applyingUpdate: 'Применение обновления',
|
||||
activating: 'Запуск и обновление компонентов',
|
||||
updateComplete: 'Плагин успешно обновлён',
|
||||
|
||||
title: 'Установка {{name}}',
|
||||
titleGeneric: 'Установка плагина',
|
||||
overallProgress: 'Общий прогресс',
|
||||
@@ -954,6 +1589,11 @@ const ruRU = {
|
||||
uploadPluginOnly: 'Поддерживаются только пакеты плагинов .lbpkg',
|
||||
},
|
||||
market: {
|
||||
runnerUsage: 'Назначение исполнителя',
|
||||
runnerUsageAll: 'Все',
|
||||
runnerUsageAgent: 'Agent / Конвейер',
|
||||
runnerUsageEvent: 'Обработчик плагина',
|
||||
|
||||
searchPlaceholder: 'Поиск плагинов...',
|
||||
searchPlaceholderCount:
|
||||
'Поиск среди {{count}} расширений, возможностей или сценариев...',
|
||||
@@ -1187,6 +1827,8 @@ const ruRU = {
|
||||
'После удаления конфигурация этого MCP-сервера не может быть восстановлена.',
|
||||
},
|
||||
pipelines: {
|
||||
managementDescription: 'Скопируйте или удалите этот конвейер.',
|
||||
|
||||
title: 'Конвейеры',
|
||||
description:
|
||||
'Конвейеры определяют поток обработки событий сообщений и привязываются к ботам',
|
||||
@@ -1306,6 +1948,8 @@ const ruRU = {
|
||||
selectKnowledgeBases: 'Выбрать базы знаний',
|
||||
},
|
||||
debugDialog: {
|
||||
saveAndSend: 'Сохранить и отправить',
|
||||
|
||||
title: 'Чат конвейера',
|
||||
selectPipeline: 'Выберите конвейер',
|
||||
sessionType: 'Тип сессии',
|
||||
@@ -1350,6 +1994,25 @@ const ruRU = {
|
||||
},
|
||||
},
|
||||
knowledge: {
|
||||
installedEngines: 'Установленные движки знаний',
|
||||
noInstalledEngines: 'Плагины движков знаний ещё не установлены.',
|
||||
marketplaceEngines: 'Плагины движков знаний в магазине',
|
||||
noMarketplaceEngines: 'Нет доступных плагинов движков знаний.',
|
||||
loadingEngineCatalog: 'Загрузка плагинов из магазина…',
|
||||
engineCatalogUnavailable:
|
||||
'Магазин временно недоступен. Откройте список выбора заново для повтора.',
|
||||
viewMarketplace: 'Открыть магазин',
|
||||
installingEngine: 'Установка {{engine}}…',
|
||||
engineInstallSuccess: '{{engine}} установлен и доступен для выбора',
|
||||
engineInstallFailed:
|
||||
'Не удалось установить движок знаний. Повторите попытку.',
|
||||
engineVersionUnavailable:
|
||||
'У этого плагина нет доступной для установки версии.',
|
||||
engineInstallTimeout:
|
||||
'Установка продолжается. Обновите страницу для проверки.',
|
||||
engineRegistrationTimeout:
|
||||
'Плагин установлен, но движок знаний ещё не готов.',
|
||||
|
||||
title: 'Знания',
|
||||
createKnowledgeBase: 'Создать базу знаний',
|
||||
selectFromSidebar: 'Выберите базу знаний из боковой панели',
|
||||
@@ -1863,6 +2526,45 @@ const ruRU = {
|
||||
},
|
||||
},
|
||||
storageAnalysis: {
|
||||
notCreated: 'Ещё не создано',
|
||||
processStorage: 'Хранилище по процессам',
|
||||
processStorageDescription:
|
||||
'Каждая среда выполнения измеряет свои каталоги. Детализация уже входит в итог родительского каталога.',
|
||||
directory: 'Каталог',
|
||||
size: 'Размер',
|
||||
files: 'Файлы',
|
||||
runtimeUnavailable: 'Статистика хранилища среды выполнения недоступна.',
|
||||
noManagedDirectories: 'Управляемые каталоги не обнаружены.',
|
||||
scanWarnings: 'Недоступно для чтения: {{count}}',
|
||||
boxActivity: 'Сеансов: {{sessions}} · Управляемых процессов: {{processes}}',
|
||||
statusLabels: {
|
||||
available: 'Доступно',
|
||||
unavailable: 'Недоступно',
|
||||
disabled: 'Отключено',
|
||||
not_applicable: 'Не применимо',
|
||||
},
|
||||
sourceLabels: {
|
||||
local_process: 'Измерено процессом LangBot',
|
||||
runtime_rpc: 'Измерено средой выполнения через аутентифицированный RPC',
|
||||
},
|
||||
scopeLabels: {
|
||||
runtime_host: 'Хост среды выполнения',
|
||||
sandbox_sessions: 'Сеансы песочницы',
|
||||
},
|
||||
processNames: {
|
||||
langbot: 'Основной процесс LangBot',
|
||||
plugin_runtime: 'Среда выполнения плагинов',
|
||||
box_runtime: 'Среда выполнения Box',
|
||||
},
|
||||
processDescriptions: {
|
||||
langbot:
|
||||
'База данных приложения, журналы, загруженные файлы, векторные данные и временные файлы.',
|
||||
plugin_runtime:
|
||||
'Пакеты плагинов, проверенные артефакты, окружения зависимостей и закрытые данные установки.',
|
||||
box_runtime:
|
||||
'Рабочие каталоги песочницы и процессов MCP, каталоги обмена вложениями и навыки.',
|
||||
},
|
||||
|
||||
title: 'Анализ хранилища',
|
||||
description: 'Проверьте использование хранилища и кандидатов на очистку',
|
||||
openDialog: 'Открыть анализ',
|
||||
@@ -1888,6 +2590,22 @@ const ruRU = {
|
||||
noExpiredUploads: 'Нет просроченных загруженных файлов',
|
||||
noExpiredLogs: 'Нет просроченных журналов',
|
||||
sectionNames: {
|
||||
legacy_plugins: 'Старые пакеты плагинов',
|
||||
artifacts: 'Проверенные артефакты плагинов',
|
||||
dependency_environments: 'Окружения зависимостей',
|
||||
installations: 'Данные установки плагинов',
|
||||
staging: 'Промежуточные файлы плагинов',
|
||||
rpc_transfer: 'Файлы передачи RPC среды выполнения',
|
||||
workspace: 'Рабочий каталог песочницы',
|
||||
inbox: 'Входящие вложения',
|
||||
outbox: 'Исходящие вложения',
|
||||
skills: 'Навыки',
|
||||
session_workspaces: 'Рабочие каталоги сеансов песочницы',
|
||||
session_caches: 'Кэш среды выполнения песочницы',
|
||||
session_temp: 'Временные файлы песочницы',
|
||||
managed_process_workspaces:
|
||||
'Рабочие каталоги управляемых процессов (включая MCP)',
|
||||
|
||||
database: 'База данных',
|
||||
logs: 'Журналы',
|
||||
storage: 'Загруженные файлы',
|
||||
@@ -1976,6 +2694,26 @@ const ruRU = {
|
||||
'Отслеживайте активность бота для проверки подключения к платформе.',
|
||||
},
|
||||
aiEngine: {
|
||||
loadingCatalog: 'Загрузка расширений исполнителей...',
|
||||
catalogUnavailable: 'Каталог исполнителей недоступен',
|
||||
catalogUnavailableDescription:
|
||||
'Установленные исполнители доступны. Повторите загрузку каталога или откройте расширения.',
|
||||
noMarketplaceRunners: 'Нет плагинов исполнителей для этого назначения',
|
||||
noMarketplaceRunnersDescription:
|
||||
'Используйте установленный исполнитель или повторите позже.',
|
||||
browseRunners: 'Открыть расширения исполнителей',
|
||||
installAndContinue: 'Установить и продолжить',
|
||||
installing: 'Установка...',
|
||||
useInstalled: 'Использовать этот исполнитель',
|
||||
installedUnavailable: 'Установлено, исполнитель недоступен',
|
||||
installSuccess: '{{runner}} установлен и выбран',
|
||||
installFailed: 'Не удалось установить расширение исполнителя',
|
||||
versionUnavailable: 'Магазин не вернул доступную для установки версию.',
|
||||
installTimeout:
|
||||
'Время ожидания установки истекло. Проверьте задачу в разделе расширений.',
|
||||
registrationTimeout:
|
||||
'Расширение установлено, но исполнитель не зарегистрирован. Проверьте среду выполнения плагинов и повторите попытку.',
|
||||
|
||||
defaultModelUnavailable:
|
||||
'Модель по умолчанию недоступна. Повторите попытку.',
|
||||
defaultRunnerUnavailable: 'Local Agent ещё не готов. Повторите попытку.',
|
||||
|
||||
@@ -1,6 +1,240 @@
|
||||
import pipelineMigration from './pipeline-migration/th-TH';
|
||||
|
||||
const thTH = {
|
||||
sidebarGuide: {
|
||||
steps: {
|
||||
monitoring: {
|
||||
title: 'ดูภาพรวมการทำงาน',
|
||||
description:
|
||||
'ดูการทำงานของบอท การใช้โมเดล ปริมาณข้อความ และประสิทธิภาพระบบ',
|
||||
},
|
||||
bots: {
|
||||
title: 'เชื่อมต่อแพลตฟอร์มแชท',
|
||||
description:
|
||||
'เชื่อมต่อ LangBot กับแพลตฟอร์มแชทและจัดการการเชื่อมต่อบอท',
|
||||
},
|
||||
pipelines: {
|
||||
title: 'ตั้งค่าตัวประมวลผล',
|
||||
description:
|
||||
'สร้างไปป์ไลน์ Agent และการตั้งค่าตัวประมวลผลปลั๊กอินที่ใช้ซ้ำได้ แล้วเชื่อมต่อกับบอท',
|
||||
},
|
||||
knowledge: {
|
||||
title: 'จัดการฐานความรู้',
|
||||
description:
|
||||
'จัดการเอกสารและแหล่งความรู้ภายนอกเพื่อปรับปรุงคำตอบของโมเดล',
|
||||
},
|
||||
plugins: {
|
||||
title: 'จัดการส่วนขยายที่ติดตั้ง',
|
||||
description:
|
||||
'จัดการปลั๊กอิน เซิร์ฟเวอร์ MCP และทักษะที่ติดตั้ง พร้อมดูสถานะการทำงาน',
|
||||
},
|
||||
'add-extension': {
|
||||
title: 'เพิ่มส่วนขยาย',
|
||||
description:
|
||||
'ติดตั้งความสามารถจากตลาด GitHub หรือแพ็กเกจส่วนขยายในเครื่อง',
|
||||
},
|
||||
models: {
|
||||
title: 'ตั้งค่าโมเดล',
|
||||
description:
|
||||
'ตั้งค่าผู้ให้บริการและเลือกโมเดลภาษา เอ็มเบดดิง และโมเดลอื่นที่ LangBot ใช้',
|
||||
},
|
||||
'api-integration': {
|
||||
title: 'ตั้งค่าการเข้าถึง API',
|
||||
description:
|
||||
'สร้างคีย์ API และตั้งค่าการเข้าถึงบริการ LangBot และ MCP จากภายนอก',
|
||||
},
|
||||
},
|
||||
},
|
||||
|
||||
guidedTour: {
|
||||
eventDebugDescription:
|
||||
'เลือกเหตุการณ์ที่รองรับ ใส่ข้อมูลทดสอบ แล้วดูผลลัพธ์และการเรียกเครื่องมือ การกระทำบนแพลตฟอร์มจะถูกจำลอง ส่วนโมเดลและเครื่องมืออื่นทำงานตามการตั้งค่าจริง',
|
||||
|
||||
bot: {
|
||||
connection: {
|
||||
title: 'เลือกวิธีเชื่อมต่อ',
|
||||
description:
|
||||
'เลือกวิธีเชื่อมต่อที่อะแดปเตอร์รองรับ พารามิเตอร์จะปรับโดยอัตโนมัติ',
|
||||
},
|
||||
basic: {
|
||||
title: 'ตั้งชื่อบอท',
|
||||
description:
|
||||
'ใช้ชื่อที่จดจำง่ายเพื่อค้นหาการเชื่อมต่อนี้ในเส้นทางและบันทึก',
|
||||
},
|
||||
adapter: {
|
||||
title: 'เลือกอะแดปเตอร์แพลตฟอร์ม',
|
||||
description:
|
||||
'เลือกอะแดปเตอร์สำหรับบอท แล้วตั้งค่าวิธีเชื่อมต่อและพารามิเตอร์แพลตฟอร์มหลังสร้าง',
|
||||
},
|
||||
parameters: {
|
||||
title: 'ตั้งค่าแพลตฟอร์ม',
|
||||
description:
|
||||
'กรอกข้อมูลรับรองและพารามิเตอร์ ดูเอกสารอะแดปเตอร์สำหรับการตั้งค่าฝั่งแพลตฟอร์ม',
|
||||
action: 'เปิดเอกสารอะแดปเตอร์',
|
||||
},
|
||||
routing: {
|
||||
title: 'กำหนดเส้นทางเหตุการณ์ขาเข้า',
|
||||
description: 'เลือกตัวประมวลผลสำหรับแต่ละเหตุการณ์ที่บอทได้รับ',
|
||||
},
|
||||
save: {
|
||||
title: 'บันทึกการตั้งค่าบอท',
|
||||
description:
|
||||
'ตรวจพารามิเตอร์การเชื่อมต่อและเส้นทางเหตุการณ์แล้วบันทึก จากนั้นเปิดใช้งานบอทเมื่อพร้อม',
|
||||
},
|
||||
submit: {
|
||||
title: 'สร้างบอท',
|
||||
description:
|
||||
'สร้างบอทที่ยังไม่เปิดใช้งาน แล้วตั้งค่าการเชื่อมต่อและพารามิเตอร์ในหน้าบอท',
|
||||
},
|
||||
},
|
||||
knowledge: {
|
||||
basic: {
|
||||
title: 'อธิบายฐานความรู้',
|
||||
description:
|
||||
'ตั้งชื่อที่จดจำง่ายและคำอธิบายเพิ่มเติมก่อนเลือกเอนจินจัดเก็บและค้นคืน',
|
||||
},
|
||||
engine: {
|
||||
title: 'ตรวจสอบเอนจินความรู้',
|
||||
description:
|
||||
'ยืนยันเอนจินของฐานความรู้นี้ ตั้งค่าพารามิเตอร์และการค้นคืนด้านล่าง',
|
||||
action: 'เรียกดูตลาดเอนจินความรู้',
|
||||
},
|
||||
parameters: {
|
||||
title: 'ตั้งค่าพารามิเตอร์เอนจิน',
|
||||
description:
|
||||
'กรอกค่าการจัดเก็บ โมเดล ข้อมูลรับรอง หรือบริการภายนอกที่เอนจินต้องการ',
|
||||
},
|
||||
retrieval: {
|
||||
title: 'ตั้งค่าการค้นคืน',
|
||||
description: 'ตั้งค่าวิธีค้นหาและส่งเนื้อหาที่เกี่ยวข้องให้ตัวประมวลผล',
|
||||
},
|
||||
save: {
|
||||
title: 'บันทึกการตั้งค่าฐานความรู้',
|
||||
description: 'ตรวจพารามิเตอร์เอนจินและการค้นคืนแล้วบันทึก',
|
||||
},
|
||||
submit: {
|
||||
title: 'สร้างฐานความรู้',
|
||||
description:
|
||||
'สร้างฐานความรู้ แล้วเพิ่มเอกสารหรือเชื่อมต่อแหล่งข้อมูลที่เอนจินรองรับ',
|
||||
},
|
||||
},
|
||||
|
||||
pipeline: {
|
||||
trigger: {
|
||||
title: 'เลือกข้อความที่จะตอบ',
|
||||
description:
|
||||
'ไปป์ไลน์ประมวลผลเหตุการณ์ข้อความและตอบด้วย AI อัตโนมัติ ตั้งเงื่อนไขในกลุ่ม กฎแชทส่วนตัว และตัวกรองข้อความได้ที่นี่',
|
||||
},
|
||||
ai: {
|
||||
title: 'ตั้งค่าความสามารถ AI',
|
||||
description:
|
||||
'เลือกรันเนอร์ภายในหรือแพลตฟอร์มภายนอก แล้วตั้งค่าโมเดล พรอมต์ ฐานความรู้ และพารามิเตอร์อื่น',
|
||||
},
|
||||
output: {
|
||||
title: 'ปรับรูปแบบคำตอบ',
|
||||
description:
|
||||
'ตั้งกฎผลลัพธ์ เช่น การจัดการข้อความยาว เพื่อกำหนดวิธีส่งคำตอบให้ผู้ใช้',
|
||||
},
|
||||
safety: {
|
||||
title: 'ตั้งค่าความปลอดภัย',
|
||||
description: 'เปิดตัวกรองเนื้อหาและจำกัดอัตราการประมวลผลตามต้องการ',
|
||||
},
|
||||
extensions: {
|
||||
title: 'เลือกส่วนขยาย',
|
||||
description:
|
||||
'เลือกปลั๊กอิน เซิร์ฟเวอร์ MCP และทักษะที่ไปป์ไลน์นี้ใช้ได้ เพื่อเพิ่มความสามารถในการประมวลผลและเครื่องมือ',
|
||||
},
|
||||
basic: {
|
||||
title: 'จัดการไปป์ไลน์',
|
||||
description:
|
||||
'คัดลอกไปป์ไลน์เพื่อสร้างการตั้งค่าอื่น หรือลบไปป์ไลน์ที่ไม่ต้องการแล้ว',
|
||||
},
|
||||
debug: {
|
||||
title: 'ทดสอบการสนทนา',
|
||||
description:
|
||||
'ส่งข้อความทดสอบเพื่อตรวจเงื่อนไข คำตอบ AI และการประมวลผลผลลัพธ์ การเปลี่ยนแปลงจะถูกบันทึกก่อนทดสอบ',
|
||||
},
|
||||
monitoring: {
|
||||
title: 'ดูประวัติการทำงาน',
|
||||
description:
|
||||
'ใช้แท็บข้างชื่อเพื่อดูบทสนทนา ขั้นตอนการประมวลผล และข้อผิดพลาด เมื่อไม่มีคำตอบหรือได้คำตอบที่ไม่คาดคิด',
|
||||
},
|
||||
save: {
|
||||
title: 'บันทึกและเชื่อมต่อบอท',
|
||||
description:
|
||||
'บันทึกการตั้งค่า แล้วกำหนดเส้นทางเหตุการณ์รับข้อความให้ไปป์ไลน์นี้ในหน้าบอท',
|
||||
},
|
||||
},
|
||||
pluginProcessor: {
|
||||
select: {
|
||||
title: 'เลือกรันเนอร์ปลั๊กอิน',
|
||||
description:
|
||||
'เลือกรันเนอร์ที่รองรับการประมวลผลเหตุการณ์ ผู้สร้างปลั๊กอินเป็นผู้กำหนดเหตุการณ์ที่รองรับและวิธีประมวลผล',
|
||||
},
|
||||
parameters: {
|
||||
title: 'ตั้งค่าพารามิเตอร์ปลั๊กอิน',
|
||||
description:
|
||||
'กรอกค่าตามที่ปลั๊กอินกำหนด สามารถบันทึกหลายการตั้งค่าของปลั๊กอินเดียวกันสำหรับบอทหรือการใช้งานต่างกัน',
|
||||
},
|
||||
debug: {
|
||||
title: 'ทดสอบการประมวลผลเหตุการณ์',
|
||||
},
|
||||
logs: {
|
||||
title: 'ดูผลการประมวลผล',
|
||||
description:
|
||||
'ตรวจสถานะ เหตุการณ์ขาเข้า บันทึกปลั๊กอิน และผลการเรียกใช้แต่ละครั้งเพื่อหาสาเหตุข้อผิดพลาด',
|
||||
},
|
||||
save: {
|
||||
title: 'บันทึกและผูกกับบอท',
|
||||
description:
|
||||
'หลังบันทึก เพิ่มการตั้งค่านี้ในส่วนตัวประมวลผลปลั๊กอินของหน้าบอท ระบบจะรับเหตุการณ์ที่ปลั๊กอินประกาศโดยอัตโนมัติ ไม่ต้องตั้งเส้นทางแยกแต่ละเหตุการณ์',
|
||||
},
|
||||
},
|
||||
label: 'คำแนะนำการใช้งาน',
|
||||
progress: 'ขั้นตอน {{current}} จาก {{total}}',
|
||||
previous: 'ขั้นตอนก่อนหน้า',
|
||||
next: 'ถัดไป',
|
||||
finish: 'จบคำแนะนำ',
|
||||
skip: 'ข้าม',
|
||||
processorCreate: {
|
||||
type: {
|
||||
title: 'เลือกประเภทตัวประมวลผล',
|
||||
description:
|
||||
'ไปป์ไลน์ประมวลผลข้อความตามลำดับที่กำหนด Agent ตัดสินใจด้วยโมเดลและเครื่องมือ ส่วนตัวประมวลผลปลั๊กอินจัดการเหตุการณ์แพลตฟอร์มที่ประกาศไว้',
|
||||
},
|
||||
basic: {
|
||||
title: 'ตั้งชื่อตัวประมวลผล',
|
||||
description:
|
||||
'ตั้งชื่อที่จดจำได้ง่าย แล้วตั้งค่ารันเนอร์และเหตุการณ์หลังจากสร้าง',
|
||||
},
|
||||
submit: {
|
||||
title: 'สร้างและตั้งค่าต่อ',
|
||||
description:
|
||||
'หลังจากสร้าง ให้ตั้งค่ารันเนอร์ พารามิเตอร์ เหตุการณ์ และเครื่องมือที่ตัวประมวลผลประเภทนี้ต้องใช้',
|
||||
},
|
||||
},
|
||||
runner: {
|
||||
debug: {
|
||||
title: 'ทดสอบการจัดการเหตุการณ์',
|
||||
},
|
||||
select: {
|
||||
title: 'เลือกหรือติดตั้งรันเนอร์',
|
||||
description:
|
||||
'เลือกรันเนอร์ที่ติดตั้งแล้ว หรือติดตั้งโดยตรงจากรายการตลาดในตัวเลือกนี้',
|
||||
action: 'เรียกดูตลาดรันเนอร์',
|
||||
},
|
||||
parameters: {
|
||||
title: 'ตั้งค่าพารามิเตอร์รันเนอร์',
|
||||
description:
|
||||
'กรอกโมเดล ข้อมูลรับรอง URL บริการ และค่าอื่น ๆ ตามที่รันเนอร์ที่เลือกกำหนด',
|
||||
},
|
||||
events: {
|
||||
title: 'ตั้งค่าเหตุการณ์และเครื่องมือ',
|
||||
description:
|
||||
'เปิดแท็บเหตุการณ์และเครื่องมือเพื่อเลือกเหตุการณ์ที่ Agent รับได้ และเครื่องมือของแพลตฟอร์มหรือ LangBot ที่อนุญาตให้ใช้',
|
||||
},
|
||||
},
|
||||
},
|
||||
pipelineMigration,
|
||||
sidebar: {
|
||||
home: 'หน้าแรก',
|
||||
@@ -17,6 +251,14 @@ const thTH = {
|
||||
editionCloud: 'Cloud',
|
||||
},
|
||||
common: {
|
||||
loadFailed: 'โหลดไม่สำเร็จ โปรดลองอีกครั้ง',
|
||||
showSecret: 'แสดงข้อมูลลับ',
|
||||
hideSecret: 'ซ่อนข้อมูลลับ',
|
||||
editBasicInfo: 'แก้ไขข้อมูลพื้นฐาน',
|
||||
editBasicInfoDescription: 'เปลี่ยนชื่อ คำอธิบาย และไอคอน',
|
||||
editBasicInfoDescriptionNoIcon: 'เปลี่ยนชื่อและคำอธิบาย',
|
||||
management: 'การจัดการ',
|
||||
|
||||
customValue: 'กำหนดเอง',
|
||||
login: 'เข้าสู่ระบบ',
|
||||
logout: 'ออกจากระบบ',
|
||||
@@ -389,6 +631,196 @@ const thTH = {
|
||||
"Uses the Workspace owner's LangBot Account billing and credits.",
|
||||
},
|
||||
bots: {
|
||||
connectionMode: 'วิธีเชื่อมต่อ',
|
||||
connectionModeDescription: 'เลือกวิธีเชื่อมต่อที่อะแดปเตอร์รองรับ',
|
||||
connectionWebhook: 'Webhook',
|
||||
connectionWebhookDescription:
|
||||
'แพลตฟอร์มส่งเหตุการณ์ไปยัง URL ที่ LangBot สร้าง',
|
||||
connectionPersistent: 'การเชื่อมต่อถาวร',
|
||||
connectionPersistentDescription:
|
||||
'LangBot เปิดการเชื่อมต่อซ็อกเก็ตหรือสตรีมขาออกค้างไว้',
|
||||
noAdaptersForConnectionMode:
|
||||
'ไม่มีอะแดปเตอร์ที่ติดตั้งรองรับวิธีเชื่อมต่อนี้',
|
||||
eventBindings: 'เส้นทางเหตุการณ์',
|
||||
addEventBinding: 'เพิ่มเส้นทาง',
|
||||
addBehavior: 'เพิ่มพฤติกรรม',
|
||||
commonScenarios: 'สถานการณ์ทั่วไป',
|
||||
dragEventRoute: 'ลากเส้นทาง {{index}}',
|
||||
behaviorReplyMessages: 'ตอบข้อความ',
|
||||
behaviorReplyMessagesDescription: 'ส่งข้อความขาเข้าไปยังตัวประมวลผล',
|
||||
behaviorWelcomeMembers: 'ต้อนรับสมาชิกใหม่',
|
||||
behaviorWelcomeMembersDescription: 'เรียกตัวประมวลผลเมื่อมีคนเข้ากลุ่ม',
|
||||
behaviorHandleDepartures: 'จัดการสมาชิกออกจากกลุ่ม',
|
||||
behaviorHandleDeparturesDescription:
|
||||
'เรียกตัวประมวลผลเมื่อมีคนออกหรือถูกนำออกจากกลุ่ม',
|
||||
behaviorReviewFriendRequests: 'ตรวจคำขอเป็นเพื่อน',
|
||||
behaviorReviewFriendRequestsDescription:
|
||||
'ส่งคำขอเป็นเพื่อนใหม่ไปยังตัวประมวลผล',
|
||||
behaviorHandleModeration: 'จัดการเหตุการณ์ควบคุมกลุ่ม',
|
||||
behaviorHandleModerationDescription:
|
||||
'เรียกตัวประมวลผลเมื่อสมาชิกกลุ่มถูกจำกัดสิทธิ์',
|
||||
behaviorCustom: 'ตั้งค่าเหตุการณ์อื่น',
|
||||
behaviorCustomDescription:
|
||||
'เพิ่มเส้นทางและเลือกจากเหตุการณ์ที่อะแดปเตอร์รองรับ',
|
||||
eventPattern: 'เหตุการณ์',
|
||||
eventPatternPlaceholder: 'เลือกเหตุการณ์',
|
||||
targetType: 'ประเภทปลายทาง',
|
||||
target: 'ตัวประมวลผล',
|
||||
targetAgent: 'Agent',
|
||||
targetPipeline: 'ไปป์ไลน์',
|
||||
targetDiscard: 'ละทิ้ง',
|
||||
selectTarget: 'เลือกตัวประมวลผล',
|
||||
searchTarget: 'ค้นหาตัวประมวลผล…',
|
||||
noTargetFound: 'ไม่พบตัวประมวลผลที่รองรับ',
|
||||
priority: 'ลำดับความสำคัญ',
|
||||
enabled: 'เปิดใช้งาน',
|
||||
eventBindingDescriptionPlaceholder: 'คำอธิบายกฎ',
|
||||
noEventBindings: 'ไม่มีเส้นทางเหตุการณ์',
|
||||
unsupportedPipelineEvent: 'ไปป์ไลน์ใช้ได้กับเหตุการณ์ message.* เท่านั้น',
|
||||
disable: 'ปิดใช้งาน',
|
||||
enable: 'เปิดใช้งาน',
|
||||
disabledBindings: 'ปิดใช้งาน',
|
||||
adapterEventsTitle: 'เหตุการณ์ที่รองรับ',
|
||||
adapterEventsDescription: 'เหตุการณ์ {{count}} ประเภท',
|
||||
adapterEventsMore: 'อีก {{count}} รายการ',
|
||||
advancedEventValues: 'ดูทั้งหมด',
|
||||
eventGroup: 'กลุ่ม',
|
||||
eventGroupNames: {
|
||||
bot: 'สถานะบอท',
|
||||
feedback: 'ข้อเสนอแนะ',
|
||||
friend: 'เพื่อน',
|
||||
group: 'กลุ่ม',
|
||||
message: 'ข้อความ',
|
||||
platform: 'แพลตฟอร์ม',
|
||||
},
|
||||
routeConflictTitle: 'บางเส้นทางซ้อนทับกัน',
|
||||
routeConflictShadowed:
|
||||
'{{shadowed}} อาจไม่ทำงาน เพราะ {{winner}} จัดการเหตุการณ์เดียวกันก่อน',
|
||||
routeConflictMore: 'มีข้อขัดแย้งเส้นทางอีก {{count}} รายการ',
|
||||
routeFallbackCatchAll: '{{route}} เป็นเส้นทางรับทุกเหตุการณ์',
|
||||
routeFallbackIgnored:
|
||||
'เหตุการณ์ที่ไม่ตรงกับเส้นทางจะถูกละเว้น เพิ่มเส้นทางรับทั้งหมดเฉพาะเมื่อต้องกำหนดผลลัพธ์ให้ทุกเหตุการณ์',
|
||||
testRoute: 'ตรวจเส้นทาง',
|
||||
adapterEventDebugTitle: 'ดีบักเหตุการณ์แพลตฟอร์ม',
|
||||
adapterEventDebugDescription:
|
||||
'สร้างเหตุการณ์ใน {{platform}} จะแสดงที่นี่เมื่ออะแดปเตอร์ได้รับ',
|
||||
adapterEventObserveOnly:
|
||||
'หน้าต่างนี้ใช้สังเกตเหตุการณ์เท่านั้น เหตุการณ์ขาเข้ายังคงใช้เส้นทางปัจจุบัน',
|
||||
adapterEventPreparing: 'กำลังเตรียม',
|
||||
adapterEventListening: 'กำลังรับฟัง',
|
||||
adapterEventListenerUnavailable: 'การรับฟังถูกขัดจังหวะ',
|
||||
adapterEventLoadFailed:
|
||||
'อ่านเหตุการณ์ไม่ได้ ตรวจว่าบอททำงานอยู่แล้วลองอีกครั้ง',
|
||||
adapterEventReceivedCount: 'ได้รับ {{count}} เหตุการณ์',
|
||||
adapterEventClear: 'ล้าง',
|
||||
adapterEventEmptyTitle: 'กำลังรอเหตุการณ์จากแพลตฟอร์ม',
|
||||
adapterEventEmptyDescription: 'ส่งข้อความหรือสร้างเหตุการณ์ใน {{platform}}',
|
||||
adapterEventData: 'ดูข้อมูลเหตุการณ์',
|
||||
adapterEventNeedsSavedBot: 'บันทึกบอทก่อนรับฟังเหตุการณ์แพลตฟอร์ม',
|
||||
adapterEventCurrentPlatform: 'แพลตฟอร์มปัจจุบัน',
|
||||
adapterConfigurationTest: 'ทดสอบการตั้งค่าอะแดปเตอร์',
|
||||
adapterConfigurationTestDescription:
|
||||
'บันทึกและเปิดบอทก่อน แล้วสร้างเหตุการณ์แพลตฟอร์มเพื่อตรวจการตั้งค่า',
|
||||
refreshRouteStatus: 'รีเฟรชสถานะ',
|
||||
routeStatusIdle: 'ยังไม่เคยทำงาน',
|
||||
routeStatusRefreshFailed: 'รีเฟรชสถานะเส้นทางไม่สำเร็จ',
|
||||
routeStatus: {
|
||||
matched: 'ตรงกัน',
|
||||
delivered: 'ส่งถึงแล้ว',
|
||||
discarded: 'ละทิ้งแล้ว',
|
||||
failed: 'ล้มเหลว',
|
||||
not_matched: 'ไม่ตรงกัน',
|
||||
},
|
||||
routeStatusDetail: {
|
||||
matched: 'เส้นทางนี้ตรงกับเหตุการณ์',
|
||||
delivered: 'ตัวประมวลผลได้รับเหตุการณ์แล้ว',
|
||||
discarded: 'เหตุการณ์ถูกละทิ้งตามที่กำหนด',
|
||||
failed: 'เส้นทางทำงานไม่สำเร็จ',
|
||||
not_matched: 'ไม่มีเส้นทางที่ตั้งค่าไว้ตรงกับเหตุการณ์',
|
||||
},
|
||||
routeFailure: {
|
||||
binding_disabled: 'เส้นทางนี้ปิดใช้งานอยู่',
|
||||
event_pattern_mismatch: 'เหตุการณ์ไม่ตรงกับเส้นทางนี้',
|
||||
filters_mismatch: 'ข้อมูลทดสอบไม่ตรงตามเงื่อนไขเส้นทาง',
|
||||
lower_priority: 'เส้นทางอื่นที่ตรงกันมีลำดับความสำคัญสูงกว่า',
|
||||
route_not_found: 'ไม่มีเส้นทางตรงกับเหตุการณ์นี้',
|
||||
processor_incompatible: 'ตัวประมวลผลที่เลือกไม่รองรับเหตุการณ์นี้',
|
||||
processor_not_found: 'ตัวประมวลผลที่เลือกไม่พร้อมใช้งาน',
|
||||
runner_failed: 'รันเนอร์ของ Agent ประมวลผลเหตุการณ์ไม่สำเร็จ',
|
||||
delivery_failed: 'ตัวประมวลผลทำงานเสร็จ แต่ส่งผลลัพธ์ไม่สำเร็จ',
|
||||
},
|
||||
dryRunTitle: 'ตรวจเส้นทางเหตุการณ์',
|
||||
dryRunDescription: 'เลือกเหตุการณ์เพื่อดูว่าตรงกับเส้นทางและตัวประมวลผลใด',
|
||||
dryRunEventType: 'ประเภทเหตุการณ์',
|
||||
dryRunSampleReady: 'เหตุการณ์ตัวอย่างพร้อมแล้ว',
|
||||
dryRunSampleDescription:
|
||||
'LangBot เตรียมข้อมูลตัวอย่างสำหรับ {{event}} แล้ว โดยทั่วไปใช้ทดสอบได้ทันที',
|
||||
dryRunEditPayload: 'ข้อมูลทดสอบ',
|
||||
dryRunHidePayload: 'ซ่อนข้อมูล',
|
||||
dryRunPayload: 'ข้อมูลทดสอบ (JSON)',
|
||||
dryRunPayloadHint: 'ใช้ทดสอบเงื่อนไขข้อความและการสนทนา',
|
||||
dryRunPayloadJsonError: 'กรอก JSON ที่ถูกต้อง',
|
||||
dryRunPayloadObjectError: 'ข้อมูลต้องเป็นออบเจ็กต์ JSON',
|
||||
dryRunNeedsSavedBot: 'บันทึกบอทก่อนตรวจเส้นทาง',
|
||||
dryRunFailed: 'ตรวจเส้นทางไม่สำเร็จ โปรดลองภายหลัง',
|
||||
dryRunAction: 'ดูผลการจับคู่',
|
||||
dryRunRunning: 'กำลังตรวจสอบ…',
|
||||
dryRunMatched: 'พบเส้นทางที่ตรงกัน',
|
||||
dryRunNotMatched: 'ไม่พบเส้นทางที่ตรงกัน',
|
||||
dryRunTarget: 'ตัวประมวลผลปลายทาง',
|
||||
dryRunNoTarget: 'ไม่มีปลายทาง',
|
||||
dryRunMatchedRule: 'กฎที่ตรงกัน',
|
||||
dryRunRuleIndex: 'เส้นทาง {{index}}',
|
||||
dryRunNoRule: 'ไม่มีกฎที่ตรงกัน',
|
||||
dryRunDiagnostics: 'ขั้นตอนวินิจฉัย',
|
||||
dryRunDiagnosticSelected: 'เลือก {{route}} แล้ว',
|
||||
dryRunDiagnosticMatched: '{{route}} ตรงกัน {{reason}}',
|
||||
dryRunDiagnosticSkipped: 'ข้าม {{route}} แล้ว {{reason}}',
|
||||
eventCustom: 'เหตุการณ์กำหนดเอง',
|
||||
eventDescriptions: {
|
||||
all: 'ตรงกับทุกเหตุการณ์ที่อะแดปเตอร์นี้ได้รับ',
|
||||
namespace: 'ตรงกับทุกเหตุการณ์ของ {{group}}',
|
||||
namespace_bot:
|
||||
'ตรงกับการเชิญ การนำบอทออก การปิดเสียง และเหตุการณ์สถานะอื่น',
|
||||
namespace_feedback: 'ตรงกับเหตุการณ์ข้อเสนอแนะจากแพลตฟอร์มหรือผู้ใช้',
|
||||
namespace_friend: 'ตรงกับคำขอเป็นเพื่อนและการเปลี่ยนแปลงความสัมพันธ์',
|
||||
namespace_group:
|
||||
'ตรงกับการเข้ากลุ่ม ออกจากกลุ่ม ถูกนำออก และเหตุการณ์กลุ่มอื่น',
|
||||
namespace_message: 'ตรงกับการรับ แก้ไข ลบข้อความ และแสดงปฏิกิริยา',
|
||||
namespace_platform: 'ตรงกับเหตุการณ์เฉพาะแพลตฟอร์มที่อะแดปเตอร์ให้มา',
|
||||
custom: 'เหตุการณ์กำหนดเองหรือยังไม่มีคำอธิบาย',
|
||||
message_received: 'ผู้ใช้หรือกลุ่มส่งข้อความใหม่ให้บอท',
|
||||
message_edited: 'แพลตฟอร์มแจ้งว่าข้อความเดิมถูกแก้ไข',
|
||||
message_deleted: 'แพลตฟอร์มแจ้งว่าข้อความถูกลบ',
|
||||
message_reaction: 'ผู้ใช้เพิ่มหรือลบปฏิกิริยาต่อข้อความ',
|
||||
feedback_received: 'ได้รับข้อเสนอแนะจากแพลตฟอร์มหรือผู้ใช้',
|
||||
friend_request_received: 'มีคนขอเพิ่มบอทเป็นเพื่อน',
|
||||
friend_added: 'สร้างความสัมพันธ์เพื่อนแล้ว',
|
||||
group_member_joined: 'สมาชิกเข้าร่วมกลุ่มที่มีบอท',
|
||||
group_member_left: 'สมาชิกออกจากกลุ่มที่มีบอท',
|
||||
group_member_banned: 'สมาชิกกลุ่มถูกแบนหรือนำออก',
|
||||
bot_invited_to_group: 'บอทได้รับเชิญเข้ากลุ่ม',
|
||||
bot_removed_from_group: 'บอทถูกนำออกจากกลุ่ม',
|
||||
bot_muted: 'บอทถูกปิดเสียงในกลุ่ม',
|
||||
bot_unmuted: 'บอทถูกยกเลิกการปิดเสียงในกลุ่ม',
|
||||
platform_specific: 'เหตุการณ์แพลตฟอร์มเฉพาะอะแดปเตอร์',
|
||||
},
|
||||
conditions: 'เงื่อนไข',
|
||||
conditionsDescription:
|
||||
'ต้องตรงทุกเงื่อนไขจึงจะทำงาน เว้นว่างเพื่อให้ทำงานเสมอ',
|
||||
conditionsEmpty: 'ไม่มีเงื่อนไข — ทำงานเสมอ',
|
||||
addFilter: 'เพิ่มเงื่อนไข',
|
||||
filterChatType: 'ประเภทเซสชัน',
|
||||
filterChatId: 'ID เซสชัน',
|
||||
filterMessageText: 'ข้อความ',
|
||||
filterMessageElement: 'องค์ประกอบข้อความ',
|
||||
operator_eq: 'เท่ากับ',
|
||||
operator_neq: 'ไม่เท่ากับ',
|
||||
operator_contains: 'มี',
|
||||
operator_not_contains: 'ไม่มี',
|
||||
operator_starts_with: 'ขึ้นต้นด้วย',
|
||||
operator_regex: 'นิพจน์ทั่วไป',
|
||||
|
||||
eventWildcard: 'ทุกเหตุการณ์',
|
||||
eventNamespaceWildcard: '{{namespace}}.*',
|
||||
eventNames: {
|
||||
@@ -590,6 +1022,171 @@ const thTH = {
|
||||
},
|
||||
},
|
||||
agents: {
|
||||
chooseType: 'เลือกวิธีทำงาน',
|
||||
chooseTypeDescription:
|
||||
'เลือกประเภทตัวประมวลผลก่อน แล้วตั้งค่าเพิ่มเติมหลังสร้าง',
|
||||
diagramHint: 'วิธีทำงาน',
|
||||
agentDiagramTitle: 'Agent: ตัดสินใจและลงมือ',
|
||||
agentDiagramDescription:
|
||||
'Agent รับเหตุการณ์หลายประเภท ใช้โมเดลและเครื่องมือทำความเข้าใจ แล้วตัดสินใจทำงานต่อ',
|
||||
pipelineDiagramTitle: 'ไปป์ไลน์: ทำตามขั้นตอนที่กำหนด',
|
||||
pipelineDiagramDescription:
|
||||
'ไปป์ไลน์ประมวลผลเฉพาะเหตุการณ์ข้อความและทำตามลำดับที่ตั้งไว้',
|
||||
pipelineDiagramFlow: 'ข้อความผ่านขั้นตอนตามลำดับคงที่',
|
||||
diagramEvents: 'เหตุการณ์แพลตฟอร์ม',
|
||||
diagramAgentCanUse: 'สิ่งที่ Agent ใช้ได้',
|
||||
diagramMessages: 'ข้อความ',
|
||||
diagramMembers: 'สมาชิก',
|
||||
diagramFeedback: 'ข้อเสนอแนะ',
|
||||
diagramDecide: 'ทำความเข้าใจและตัดสินใจ',
|
||||
diagramModel: 'ใช้โมเดล',
|
||||
diagramTools: 'ใช้เครื่องมือ',
|
||||
diagramActions: 'ลงมือทำ',
|
||||
diagramMessage: 'ข้อความ',
|
||||
diagramPreprocess: 'เตรียม',
|
||||
diagramAI: 'AI',
|
||||
diagramPostprocess: 'ปรับแต่ง',
|
||||
diagramOutput: 'ผลลัพธ์',
|
||||
eventsAndTools: 'เหตุการณ์และเครื่องมือ',
|
||||
eventsAndToolsDescription: 'ตั้งเหตุการณ์กระตุ้นและเครื่องมือที่ใช้ได้',
|
||||
configuredEvents: 'เหตุการณ์ที่เพิ่มแล้ว',
|
||||
configuredEventsCount: 'ทั้งหมด {{count}} รายการ',
|
||||
addEvent: 'เพิ่มเหตุการณ์',
|
||||
removeEvent: 'ลบเหตุการณ์',
|
||||
eventActions: 'เครื่องมือที่เปิดอัตโนมัติ',
|
||||
eventToolEnabled: 'เปิดใช้งาน',
|
||||
eventToolsEnabledCount: 'เปิดใช้ {{count}} เครื่องมือ',
|
||||
noEventActions: 'ไม่มีการกระทำสำหรับเหตุการณ์นี้',
|
||||
noEventsConfigured: 'ยังไม่ได้เพิ่มเหตุการณ์',
|
||||
noEventsConfiguredDescription: 'ไม่มีเหตุการณ์ใดกระตุ้น Agent นี้ได้',
|
||||
noEventsConfiguredBadge: 'ไม่มีเหตุการณ์',
|
||||
apiTools: 'สิทธิ์ใช้เครื่องมือ',
|
||||
apiToolsDescription: 'เลือกเครื่องมือที่ Agent นี้เรียกใช้ได้',
|
||||
otherTools: 'เครื่องมืออื่น',
|
||||
otherToolsDescription:
|
||||
'เลือกเครื่องมือแพลตฟอร์ม แซนด์บ็อกซ์ MCP ปลั๊กอิน และทักษะ',
|
||||
apiToolsSelected: 'เลือกแล้ว {{count}} รายการ',
|
||||
apiToolsSecurityHint: 'เปิดเฉพาะเครื่องมือที่ Agent นี้จำเป็นต้องใช้',
|
||||
apiToolsSearch: 'ค้นหาเครื่องมือ…',
|
||||
eventApiTools: 'เครื่องมือเหตุการณ์',
|
||||
eventToolUnavailable: 'ไม่พร้อมใช้งาน',
|
||||
eventApiToolsDescription:
|
||||
'ปลายทางกำหนดจากเหตุการณ์ปัจจุบัน Agent ส่งเฉพาะพารามิเตอร์การกระทำ',
|
||||
platformApiTools: 'เครื่องมือแพลตฟอร์ม',
|
||||
platformApiToolsDescription:
|
||||
'Agent เลือก ID ผู้ใช้ กลุ่ม หรือข้อความได้ ให้สิทธิ์เท่าที่จำเป็น',
|
||||
apiToolEvents: 'เหตุการณ์',
|
||||
apiToolParameters: 'พารามิเตอร์ Agent',
|
||||
apiToolSource: 'แหล่งที่มา',
|
||||
apiToolNoParameters: 'ไม่มี',
|
||||
sandboxTools: 'แซนด์บ็อกซ์',
|
||||
mcpTools: 'MCP',
|
||||
pluginTools: 'ปลั๊กอิน',
|
||||
skillTools: 'ทักษะ',
|
||||
langbotBuiltIn: 'LangBot',
|
||||
apiToolDetails: 'รายละเอียด',
|
||||
apiToolHideDetails: 'ซ่อน',
|
||||
apiToolsNoResults: 'ไม่พบ API หรือเครื่องมือที่ตรงกัน',
|
||||
apiToolsCatalogUnavailable:
|
||||
'เซิร์ฟเวอร์ LangBot ไม่ส่งรายการเครื่องมือ API กลับมา ตรวจว่าอัปเดตและเริ่มใหม่แล้ว ไม่ได้หมายความว่าแพลตฟอร์มไม่มีเครื่องมือ',
|
||||
hostToolsCatalogUnavailable: 'รายการเครื่องมือไม่พร้อมใช้งานชั่วคราว',
|
||||
apiToolRisk: {
|
||||
read: 'อ่านอย่างเดียว',
|
||||
write: 'การกระทำ',
|
||||
dangerous: 'มีความอ่อนไหว',
|
||||
},
|
||||
runnerStatusLoading: 'กำลังตรวจสถานะรันเนอร์',
|
||||
runnerStatusCheckFailed: 'ตรวจสถานะรันเนอร์ไม่สำเร็จ',
|
||||
runnerStatusCheckFailedDescription:
|
||||
'ลองตรวจอีกครั้ง หากยังไม่ได้ ให้ตรวจเซิร์ฟเวอร์และรันไทม์ปลั๊กอิน',
|
||||
noRunnersAvailable: 'ไม่มีรันเนอร์พร้อมใช้งาน',
|
||||
noRunnersAvailableDescription:
|
||||
'ติดตั้งและเปิดส่วนขยายรันเนอร์ก่อนตั้งค่า Agent นี้',
|
||||
installedRunners: 'รันเนอร์ที่ติดตั้ง',
|
||||
marketplaceRunners: 'ปลั๊กอินรันเนอร์ในตลาด',
|
||||
viewMarketplace: 'ดูตลาด',
|
||||
restoringRunnerInstall: 'กำลังกู้คืนการติดตั้งปลั๊กอินและรอรันเนอร์…',
|
||||
noInstalledRunners: 'ยังไม่ได้ติดตั้งส่วนขยายรันเนอร์',
|
||||
installingRunner: 'กำลังติดตั้ง {{runner}}...',
|
||||
runnerInstallSuccess: 'ติดตั้ง {{runner}} แล้ว พร้อมให้เลือก',
|
||||
selectedRunnerUnavailable: 'รันเนอร์ที่เลือกไม่พร้อมใช้งาน',
|
||||
selectedRunnerUnavailableDescription:
|
||||
'{{runner}} ยังไม่ได้ลงทะเบียน เลือกรันเนอร์อื่นหรือคืนค่าส่วนขยาย',
|
||||
noRunnerSelected: 'ยังไม่ได้เลือกรันเนอร์',
|
||||
runnerConfigIncomplete: 'การตั้งค่ารันเนอร์ไม่ครบ',
|
||||
runnerConfigIncompleteDescription: 'กรอกช่องที่จำเป็น: {{fields}}',
|
||||
runnerReady: 'รันเนอร์พร้อมแล้ว',
|
||||
runnerReadyDescription:
|
||||
'{{runner}} ลงทะเบียนแล้ว และรันไทม์ปลั๊กอินเชื่อมต่ออยู่',
|
||||
debugTab: 'ดีบักเหตุการณ์',
|
||||
debugTitle: 'ดีบักเหตุการณ์ Agent',
|
||||
debugDescription:
|
||||
'เรียก Agent ปัจจุบันด้วยข้อความหรือเหตุการณ์แพลตฟอร์ม แล้วดูผลลัพธ์จริง',
|
||||
debugResetSession: 'รีเซ็ตเซสชัน',
|
||||
debugEventType: 'ประเภทเหตุการณ์',
|
||||
debugNoEventsTitle: 'ไม่มีเหตุการณ์ให้ดีบัก',
|
||||
debugNoEventsDescription: 'เพิ่มเหตุการณ์ในส่วนเหตุการณ์และเครื่องมือก่อน',
|
||||
debugMessageReceived: 'ได้รับข้อความ',
|
||||
debugGroupMemberJoined: 'สมาชิกเข้ากลุ่ม',
|
||||
debugGroupMemberLeft: 'สมาชิกออกจากกลุ่ม',
|
||||
debugFriendRequested: 'ได้รับคำขอเป็นเพื่อน',
|
||||
debugFeedbackReceived: 'ได้รับข้อเสนอแนะ',
|
||||
debugCustomEvent: 'เหตุการณ์กำหนดเอง',
|
||||
debugCustomEventType: 'ชื่อเหตุการณ์กำหนดเอง',
|
||||
debugMessageInput: 'ข้อความสนทนา',
|
||||
debugEventSummary: 'สรุปเหตุการณ์',
|
||||
debugInputPlaceholder: 'ใส่สิ่งที่ต้องการให้ Agent จัดการ',
|
||||
debugEventPayload: 'ข้อมูลเหตุการณ์ (JSON)',
|
||||
debugSupportedEvents: 'Agent รองรับ',
|
||||
debugRun: 'เรียกใช้การทดสอบ',
|
||||
debugSaveAndRun: 'บันทึกและเรียกใช้',
|
||||
debugRunning: 'กำลังทำงาน',
|
||||
debugTranscript: 'บันทึกการดีบัก',
|
||||
debugTranscriptDescription: 'ข้อมูลเข้าและผลลัพธ์ Agent ของเซสชันดีบักนี้',
|
||||
debugEmptyTitle: 'ตรวจการทำงานของ Agent นี้',
|
||||
debugEmptyTranscript:
|
||||
'เลือกเหตุการณ์ ใส่ข้อมูลทดสอบ แล้วเลือก “เรียกใช้การทดสอบ” ผลลัพธ์จะแสดงในหน้านี้',
|
||||
debugAgentOutput: 'ผลลัพธ์ Agent',
|
||||
debugReasoning: 'กำลังคิด',
|
||||
debugTextOutput: 'ผลลัพธ์ข้อความ',
|
||||
debugPlatformNotice:
|
||||
'เครื่องมือแพลตฟอร์มใช้ Mock: Agent เรียกเครื่องมือจริง แต่จำลองการกระทำโดยไม่ส่งข้อความจริง เครื่องมืออื่นทำงานตามที่ตั้งค่า',
|
||||
debugToolSimulated: 'จำลองสำเร็จ · Mock',
|
||||
debugStop: 'หยุดดีบัก',
|
||||
debugMockOptions: 'สถานการณ์ Mock (JSON)',
|
||||
debugInvalidMock: 'สถานการณ์ Mock ต้องเป็นออบเจ็กต์ JSON ที่ถูกต้อง',
|
||||
debugToolMockFailed: 'จำลองความล้มเหลว · Mock',
|
||||
debugMockOptionsHelp:
|
||||
'ค่าเริ่มต้นคือสำเร็จ ระบุข้อผิดพลาดตามชื่อเครื่องมือใน errors ข้อมูลตอบกลับใน results และ API ที่ไม่รองรับใน unsupported_apis ตัวอย่าง: {"errors":{"event_reply":"จำลองการส่งล้มเหลว"}}',
|
||||
debugCancelled: 'หยุดดีบักแล้ว บันทึกก่อนหน้ายังคงอยู่',
|
||||
debugNoToolCalls:
|
||||
'ไม่มีบันทึกการเรียกเครื่องมือ การสร้างข้อความไม่ได้หมายความว่าส่งข้อความแล้ว',
|
||||
debugToolCount:
|
||||
'บันทึกการเรียกเครื่องมือ {{count}} ครั้ง ดูสถานะและผลลัพธ์ด้านล่าง',
|
||||
debugToolRunning: 'กำลังทำงาน',
|
||||
debugToolCompleted: 'เสร็จสิ้น',
|
||||
debugToolFailed: 'ล้มเหลว',
|
||||
debugToolInterrupted: 'ไม่มีผลลัพธ์ตอบกลับ',
|
||||
debugToolArguments: 'อาร์กิวเมนต์',
|
||||
debugToolResult: 'ผลลัพธ์',
|
||||
debugTestInput: 'ข้อมูลทดสอบ',
|
||||
debugNoTextOutput: 'ทำงานเสร็จโดยไม่มีผลลัพธ์ข้อความ',
|
||||
debugEventTypeRequired: 'ใส่ประเภทเหตุการณ์',
|
||||
debugInputRequired: 'ใส่ข้อความสนทนา',
|
||||
debugInvalidPayload: 'ข้อมูลเหตุการณ์ต้องเป็นออบเจ็กต์ JSON ที่ถูกต้อง',
|
||||
debugUnsupportedEvent: 'เหตุการณ์นี้อยู่นอกขอบเขตที่ Agent รองรับ',
|
||||
debugRunnerConfigInvalidDescription:
|
||||
'การตั้งค่ารันเนอร์ไม่ครบ: {{message}}',
|
||||
debugRunnerExecutionFailedDescription:
|
||||
'การทำงานล้มเหลว ตรวจโมเดลและการตั้งค่ารันเนอร์แล้วลองใหม่',
|
||||
debugRunnerTimeoutDescription:
|
||||
'หมดเวลาทำงาน ลองภายหลังหรือปรับเวลาสูงสุดของรันเนอร์',
|
||||
debugApiKeyRequired: 'ไม่มีคีย์ API',
|
||||
debugOpenRunnerConfig: 'เปิดการตั้งค่ารันเนอร์',
|
||||
debugReviewRunnerConfig: 'ตรวจการตั้งค่ารันเนอร์',
|
||||
debugErrorDetails: 'ดูรายละเอียดข้อผิดพลาด',
|
||||
debugRunFailed: 'ดีบัก Agent ไม่สำเร็จ',
|
||||
|
||||
monitoring: {
|
||||
description:
|
||||
'ดูเหตุการณ์เริ่มต้น ผลลัพธ์โมเดล และการเรียกเครื่องมือของแต่ละงาน',
|
||||
@@ -901,6 +1498,13 @@ const thTH = {
|
||||
installFromGithubDesc: 'ติดตั้งปลั๊กอินจาก GitHub Release',
|
||||
goToMarketplace: 'ไปที่ตลาดปลั๊กอิน',
|
||||
installProgress: {
|
||||
updateTitle: 'กำลังอัปเดต {{name}}',
|
||||
checkingUpdate: 'กำลังตรวจการอัปเดต',
|
||||
validating: 'กำลังตรวจสอบแพ็กเกจ',
|
||||
applyingUpdate: 'กำลังใช้การอัปเดต',
|
||||
activating: 'กำลังเริ่มและรีเฟรชคอมโพเนนต์',
|
||||
updateComplete: 'อัปเดตปลั๊กอินสำเร็จ',
|
||||
|
||||
title: 'กำลังติดตั้ง {{name}}',
|
||||
titleGeneric: 'การติดตั้งปลั๊กอิน',
|
||||
overallProgress: 'ความคืบหน้าโดยรวม',
|
||||
@@ -929,6 +1533,11 @@ const thTH = {
|
||||
uploadPluginOnly: 'รองรับเฉพาะแพ็กเกจปลั๊กอิน .lbpkg',
|
||||
},
|
||||
market: {
|
||||
runnerUsage: 'การใช้งานรันเนอร์',
|
||||
runnerUsageAll: 'ทั้งหมด',
|
||||
runnerUsageAgent: 'Agent / ไปป์ไลน์',
|
||||
runnerUsageEvent: 'ตัวประมวลผลปลั๊กอิน',
|
||||
|
||||
searchPlaceholder: 'ค้นหาปลั๊กอิน...',
|
||||
searchPlaceholderCount:
|
||||
'ค้นหา {{count}} ส่วนขยาย ความสามารถ หรือกรณีใช้งาน...',
|
||||
@@ -1159,6 +1768,8 @@ const thTH = {
|
||||
'เมื่อลบแล้ว การกำหนดค่าเซิร์ฟเวอร์ MCP นี้จะไม่สามารถกู้คืนได้',
|
||||
},
|
||||
pipelines: {
|
||||
managementDescription: 'คัดลอกหรือลบไปป์ไลน์นี้',
|
||||
|
||||
title: 'ไปป์ไลน์',
|
||||
description:
|
||||
'Pipeline กำหนดกระบวนการประมวลผลเหตุการณ์ข้อความ ใช้เพื่อผูกกับ Bot',
|
||||
@@ -1276,6 +1887,8 @@ const thTH = {
|
||||
selectKnowledgeBases: 'เลือกคลังความรู้',
|
||||
},
|
||||
debugDialog: {
|
||||
saveAndSend: 'บันทึกและส่ง',
|
||||
|
||||
title: 'แชท Pipeline',
|
||||
selectPipeline: 'เลือก Pipeline',
|
||||
sessionType: 'ประเภทเซสชัน',
|
||||
@@ -1320,6 +1933,22 @@ const thTH = {
|
||||
},
|
||||
},
|
||||
knowledge: {
|
||||
installedEngines: 'เอนจินความรู้ที่ติดตั้ง',
|
||||
noInstalledEngines: 'ยังไม่ได้ติดตั้งปลั๊กอินเอนจินความรู้',
|
||||
marketplaceEngines: 'ปลั๊กอินเอนจินความรู้ในตลาด',
|
||||
noMarketplaceEngines: 'ไม่มีปลั๊กอินเอนจินความรู้พร้อมใช้งาน',
|
||||
loadingEngineCatalog: 'กำลังโหลดปลั๊กอินจากตลาด…',
|
||||
engineCatalogUnavailable:
|
||||
'ตลาดไม่พร้อมใช้งานชั่วคราว เปิดตัวเลือกอีกครั้งเพื่อลองใหม่',
|
||||
viewMarketplace: 'ดูตลาด',
|
||||
installingEngine: 'กำลังติดตั้ง {{engine}}…',
|
||||
engineInstallSuccess: 'ติดตั้ง {{engine}} แล้ว พร้อมให้เลือก',
|
||||
engineInstallFailed: 'ติดตั้งเอนจินความรู้ไม่สำเร็จ โปรดลองอีกครั้ง',
|
||||
engineVersionUnavailable: 'ปลั๊กอินนี้ไม่มีเวอร์ชันที่ติดตั้งได้',
|
||||
engineInstallTimeout: 'ยังติดตั้งอยู่ รีเฟรชหน้าเพื่อตรวจอีกครั้ง',
|
||||
engineRegistrationTimeout:
|
||||
'ติดตั้งปลั๊กอินแล้ว แต่เอนจินความรู้ยังไม่พร้อม',
|
||||
|
||||
title: 'ฐานความรู้',
|
||||
createKnowledgeBase: 'สร้างฐานความรู้',
|
||||
selectFromSidebar: 'เลือกฐานความรู้จากแถบด้านข้าง',
|
||||
@@ -1828,6 +2457,44 @@ const thTH = {
|
||||
},
|
||||
},
|
||||
storageAnalysis: {
|
||||
notCreated: 'ยังไม่ได้สร้าง',
|
||||
processStorage: 'พื้นที่จัดเก็บตามโพรเซส',
|
||||
processStorageDescription:
|
||||
'แต่ละรันไทม์วัดไดเรกทอรีของตน รายการย่อยรวมอยู่ในยอดของไดเรกทอรีแม่แล้ว',
|
||||
directory: 'ไดเรกทอรี',
|
||||
size: 'ขนาด',
|
||||
files: 'ไฟล์',
|
||||
runtimeUnavailable: 'สถิติพื้นที่จัดเก็บรันไทม์ไม่พร้อมใช้งาน',
|
||||
noManagedDirectories: 'ไม่มีรายงานไดเรกทอรีที่จัดการ',
|
||||
scanWarnings: 'อ่านไม่ได้ {{count}} รายการ',
|
||||
boxActivity: '{{sessions}} เซสชัน · {{processes}} โพรเซสที่จัดการ',
|
||||
statusLabels: {
|
||||
available: 'พร้อมใช้งาน',
|
||||
unavailable: 'ไม่พร้อมใช้งาน',
|
||||
disabled: 'ปิดใช้งาน',
|
||||
not_applicable: 'ไม่เกี่ยวข้อง',
|
||||
},
|
||||
sourceLabels: {
|
||||
local_process: 'วัดโดยโพรเซส LangBot',
|
||||
runtime_rpc: 'วัดโดยโพรเซสรันไทม์ผ่าน RPC ที่ยืนยันตัวตนแล้ว',
|
||||
},
|
||||
scopeLabels: {
|
||||
runtime_host: 'โฮสต์รันไทม์',
|
||||
sandbox_sessions: 'เซสชันแซนด์บ็อกซ์',
|
||||
},
|
||||
processNames: {
|
||||
langbot: 'โพรเซสหลัก LangBot',
|
||||
plugin_runtime: 'รันไทม์ปลั๊กอิน',
|
||||
box_runtime: 'รันไทม์ Box',
|
||||
},
|
||||
processDescriptions: {
|
||||
langbot: 'ฐานข้อมูลแอป บันทึก ไฟล์อัปโหลด ข้อมูลเวกเตอร์ และไฟล์ชั่วคราว',
|
||||
plugin_runtime:
|
||||
'แพ็กเกจปลั๊กอิน อาร์ติแฟกต์ที่ตรวจสอบแล้ว สภาพแวดล้อมการพึ่งพา และข้อมูลติดตั้งส่วนตัว',
|
||||
box_runtime:
|
||||
'พื้นที่ทำงานแซนด์บ็อกซ์และโพรเซส MCP ไดเรกทอรีแลกเปลี่ยนไฟล์แนบ และทักษะ',
|
||||
},
|
||||
|
||||
title: 'วิเคราะห์พื้นที่จัดเก็บ',
|
||||
description: 'ตรวจสอบการใช้พื้นที่จัดเก็บและรายการที่สามารถล้างได้',
|
||||
openDialog: 'ดูการวิเคราะห์',
|
||||
@@ -1853,6 +2520,21 @@ const thTH = {
|
||||
noExpiredUploads: 'ไม่มีไฟล์อัปโหลดที่หมดอายุ',
|
||||
noExpiredLogs: 'ไม่มีบันทึกที่หมดอายุ',
|
||||
sectionNames: {
|
||||
legacy_plugins: 'แพ็กเกจปลั๊กอินรุ่นเก่า',
|
||||
artifacts: 'อาร์ติแฟกต์ปลั๊กอินที่ตรวจสอบแล้ว',
|
||||
dependency_environments: 'สภาพแวดล้อมการพึ่งพา',
|
||||
installations: 'ข้อมูลติดตั้งปลั๊กอิน',
|
||||
staging: 'ไฟล์พักการติดตั้งปลั๊กอิน',
|
||||
rpc_transfer: 'ไฟล์ถ่ายโอน RPC รันไทม์',
|
||||
workspace: 'พื้นที่ทำงานแซนด์บ็อกซ์',
|
||||
inbox: 'ไฟล์แนบขาเข้า',
|
||||
outbox: 'ไฟล์แนบขาออก',
|
||||
skills: 'ทักษะ',
|
||||
session_workspaces: 'พื้นที่ทำงานเซสชันแซนด์บ็อกซ์',
|
||||
session_caches: 'แคชรันไทม์แซนด์บ็อกซ์',
|
||||
session_temp: 'ไฟล์ชั่วคราวแซนด์บ็อกซ์',
|
||||
managed_process_workspaces: 'พื้นที่ทำงานโพรเซสที่จัดการ (รวม MCP)',
|
||||
|
||||
database: 'ฐานข้อมูล',
|
||||
logs: 'บันทึก',
|
||||
storage: 'ไฟล์อัปโหลด',
|
||||
@@ -1937,6 +2619,25 @@ const thTH = {
|
||||
'ตรวจสอบกิจกรรม Bot เพื่อยืนยันว่าการเชื่อมต่อแพลตฟอร์มทำงานอยู่',
|
||||
},
|
||||
aiEngine: {
|
||||
loadingCatalog: 'กำลังโหลดส่วนขยายรันเนอร์...',
|
||||
catalogUnavailable: 'รายการรันเนอร์ไม่พร้อมใช้งาน',
|
||||
catalogUnavailableDescription:
|
||||
'รันเนอร์ที่ติดตั้งยังใช้ได้ ลองโหลดรายการใหม่หรือเรียกดูส่วนขยาย',
|
||||
noMarketplaceRunners: 'ไม่มีปลั๊กอินรันเนอร์ตรงกับการใช้งานนี้',
|
||||
noMarketplaceRunnersDescription:
|
||||
'ใช้รันเนอร์ที่ติดตั้งแล้วหรือลองภายหลัง',
|
||||
browseRunners: 'เรียกดูส่วนขยายรันเนอร์',
|
||||
installAndContinue: 'ติดตั้งและดำเนินการต่อ',
|
||||
installing: 'กำลังติดตั้ง...',
|
||||
useInstalled: 'ใช้รันเนอร์นี้',
|
||||
installedUnavailable: 'ติดตั้งแล้ว แต่รันเนอร์ไม่พร้อมใช้',
|
||||
installSuccess: 'ติดตั้งและเลือก {{runner}} แล้ว',
|
||||
installFailed: 'ติดตั้งส่วนขยายรันเนอร์ไม่สำเร็จ',
|
||||
versionUnavailable: 'ตลาดไม่ส่งเวอร์ชันที่ติดตั้งได้กลับมา',
|
||||
installTimeout: 'หมดเวลาติดตั้งรันเนอร์ ตรวจงานในส่วนขยาย',
|
||||
registrationTimeout:
|
||||
'ติดตั้งส่วนขยายแล้ว แต่รันเนอร์ไม่ได้ลงทะเบียน ตรวจรันไทม์ปลั๊กอินแล้วลองใหม่',
|
||||
|
||||
defaultModelUnavailable:
|
||||
'ไม่มีโมเดลเริ่มต้นที่พร้อมใช้งาน โปรดลองอีกครั้ง',
|
||||
defaultRunnerUnavailable: 'Local Agent ยังไม่พร้อม โปรดลองอีกครั้ง',
|
||||
|
||||
@@ -1,6 +1,241 @@
|
||||
import pipelineMigration from './pipeline-migration/vi-VN';
|
||||
|
||||
const viVN = {
|
||||
sidebarGuide: {
|
||||
steps: {
|
||||
monitoring: {
|
||||
title: 'Xem hoạt động',
|
||||
description:
|
||||
'Xem hoạt động bot, mức sử dụng mô hình, lượng tin nhắn và hiệu suất hệ thống.',
|
||||
},
|
||||
bots: {
|
||||
title: 'Kết nối nền tảng trò chuyện',
|
||||
description:
|
||||
'Kết nối LangBot với nền tảng trò chuyện và quản lý từng kết nối bot.',
|
||||
},
|
||||
pipelines: {
|
||||
title: 'Cấu hình bộ xử lý',
|
||||
description:
|
||||
'Tạo pipeline, Agent và cấu hình bộ xử lý plugin có thể tái sử dụng rồi kết nối với bot.',
|
||||
},
|
||||
knowledge: {
|
||||
title: 'Quản lý cơ sở tri thức',
|
||||
description:
|
||||
'Sắp xếp tài liệu và nguồn tri thức bên ngoài để cải thiện câu trả lời của mô hình.',
|
||||
},
|
||||
plugins: {
|
||||
title: 'Quản lý tiện ích đã cài',
|
||||
description:
|
||||
'Quản lý plugin, máy chủ MCP, kỹ năng đã cài đặt và trạng thái hoạt động.',
|
||||
},
|
||||
'add-extension': {
|
||||
title: 'Thêm tiện ích',
|
||||
description:
|
||||
'Cài đặt tính năng từ chợ tiện ích, GitHub hoặc gói tiện ích cục bộ.',
|
||||
},
|
||||
models: {
|
||||
title: 'Cấu hình mô hình',
|
||||
description:
|
||||
'Cấu hình nhà cung cấp và chọn mô hình ngôn ngữ, embedding cùng các mô hình khác cho LangBot.',
|
||||
},
|
||||
'api-integration': {
|
||||
title: 'Cấu hình truy cập API',
|
||||
description:
|
||||
'Tạo khóa API và cấu hình truy cập từ bên ngoài vào dịch vụ LangBot và MCP.',
|
||||
},
|
||||
},
|
||||
},
|
||||
|
||||
guidedTour: {
|
||||
eventDebugDescription:
|
||||
'Chọn sự kiện được hỗ trợ, nhập dữ liệu thử rồi xem đầu ra và kết quả công cụ. Hành động nền tảng được mô phỏng; mô hình và công cụ khác chạy theo cấu hình.',
|
||||
|
||||
bot: {
|
||||
connection: {
|
||||
title: 'Chọn phương thức kết nối',
|
||||
description:
|
||||
'Chọn phương thức được bộ chuyển đổi hỗ trợ. Các tham số tương ứng sẽ tự động cập nhật.',
|
||||
},
|
||||
basic: {
|
||||
title: 'Đặt tên bot',
|
||||
description:
|
||||
'Dùng tên dễ nhận biết để tìm kết nối này trong định tuyến và nhật ký.',
|
||||
},
|
||||
adapter: {
|
||||
title: 'Chọn bộ chuyển đổi nền tảng',
|
||||
description:
|
||||
'Chọn bộ chuyển đổi cho bot. Phương thức kết nối và tham số nền tảng được cấu hình sau khi tạo.',
|
||||
},
|
||||
parameters: {
|
||||
title: 'Cấu hình nền tảng',
|
||||
description:
|
||||
'Nhập thông tin xác thực và tham số. Xem tài liệu bộ chuyển đổi để thiết lập phía nền tảng.',
|
||||
action: 'Mở tài liệu bộ chuyển đổi',
|
||||
},
|
||||
routing: {
|
||||
title: 'Định tuyến sự kiện đến',
|
||||
description: 'Chọn bộ xử lý cho từng sự kiện bot nhận được.',
|
||||
},
|
||||
save: {
|
||||
title: 'Lưu cấu hình bot',
|
||||
description:
|
||||
'Kiểm tra tham số kết nối và định tuyến sự kiện rồi lưu. Sau đó bật bot khi sẵn sàng.',
|
||||
},
|
||||
submit: {
|
||||
title: 'Tạo bot',
|
||||
description:
|
||||
'Tạo bot ở trạng thái tắt rồi tiếp tục cấu hình kết nối và tham số trên trang bot.',
|
||||
},
|
||||
},
|
||||
knowledge: {
|
||||
basic: {
|
||||
title: 'Mô tả cơ sở tri thức',
|
||||
description:
|
||||
'Đặt tên dễ nhận biết và mô tả tùy chọn trước khi chọn bộ máy lưu trữ và truy xuất.',
|
||||
},
|
||||
engine: {
|
||||
title: 'Kiểm tra bộ máy tri thức',
|
||||
description:
|
||||
'Xác nhận bộ máy của cơ sở tri thức này. Tham số và thiết lập truy xuất nằm bên dưới.',
|
||||
action: 'Duyệt chợ bộ máy tri thức',
|
||||
},
|
||||
parameters: {
|
||||
title: 'Cấu hình tham số bộ máy',
|
||||
description:
|
||||
'Điền thiết lập lưu trữ, mô hình, thông tin xác thực hoặc dịch vụ bên ngoài mà bộ máy yêu cầu.',
|
||||
},
|
||||
retrieval: {
|
||||
title: 'Cấu hình truy xuất',
|
||||
description:
|
||||
'Đặt cách bộ máy tìm và trả về nội dung liên quan cho bộ xử lý.',
|
||||
},
|
||||
save: {
|
||||
title: 'Lưu cấu hình cơ sở tri thức',
|
||||
description: 'Kiểm tra tham số bộ máy và thiết lập truy xuất rồi lưu.',
|
||||
},
|
||||
submit: {
|
||||
title: 'Tạo cơ sở tri thức',
|
||||
description:
|
||||
'Tạo cơ sở tri thức rồi thêm tài liệu hoặc kết nối nguồn mà bộ máy hỗ trợ.',
|
||||
},
|
||||
},
|
||||
|
||||
pipeline: {
|
||||
trigger: {
|
||||
title: 'Chọn tin nhắn cần trả lời',
|
||||
description:
|
||||
'Pipeline xử lý sự kiện tin nhắn và tự động trả lời bằng AI. Đặt điều kiện kích hoạt trong nhóm, quy tắc trò chuyện riêng và bộ lọc tin nhắn tại đây.',
|
||||
},
|
||||
ai: {
|
||||
title: 'Cấu hình khả năng AI',
|
||||
description:
|
||||
'Chọn trình chạy cục bộ hoặc nền tảng bên ngoài, rồi cấu hình mô hình, lời nhắc, cơ sở tri thức và các tham số khác.',
|
||||
},
|
||||
output: {
|
||||
title: 'Điều chỉnh câu trả lời',
|
||||
description:
|
||||
'Đặt quy tắc đầu ra, chẳng hạn cách xử lý văn bản dài, để quyết định cách gửi câu trả lời cho người dùng.',
|
||||
},
|
||||
safety: {
|
||||
title: 'Thiết lập kiểm soát an toàn',
|
||||
description: 'Bật lọc nội dung và giới hạn tần suất xử lý khi cần.',
|
||||
},
|
||||
extensions: {
|
||||
title: 'Chọn tiện ích mở rộng',
|
||||
description:
|
||||
'Chọn plugin, máy chủ MCP và kỹ năng mà pipeline này có thể dùng để mở rộng khả năng xử lý và công cụ.',
|
||||
},
|
||||
basic: {
|
||||
title: 'Quản lý pipeline',
|
||||
description:
|
||||
'Sao chép pipeline này để tạo cấu hình khác hoặc xóa pipeline không còn cần thiết.',
|
||||
},
|
||||
debug: {
|
||||
title: 'Thử cuộc trò chuyện',
|
||||
description:
|
||||
'Gửi tin nhắn thử để kiểm tra điều kiện kích hoạt, câu trả lời AI và xử lý đầu ra. Thay đổi cấu hình được lưu trước khi thử.',
|
||||
},
|
||||
monitoring: {
|
||||
title: 'Xem lịch sử chạy',
|
||||
description:
|
||||
'Dùng thẻ cạnh tiêu đề để xem cuộc trò chuyện, các bước xử lý và lỗi khi không có phản hồi hoặc phản hồi không đúng dự kiến.',
|
||||
},
|
||||
save: {
|
||||
title: 'Lưu và kết nối bot',
|
||||
description:
|
||||
'Lưu cấu hình rồi định tuyến sự kiện nhận tin nhắn tới pipeline này trên trang bot.',
|
||||
},
|
||||
},
|
||||
pluginProcessor: {
|
||||
select: {
|
||||
title: 'Chọn trình chạy plugin',
|
||||
description:
|
||||
'Chọn trình chạy hỗ trợ xử lý sự kiện. Tác giả plugin khai báo các sự kiện được hỗ trợ và triển khai logic xử lý.',
|
||||
},
|
||||
parameters: {
|
||||
title: 'Cấu hình tham số plugin',
|
||||
description:
|
||||
'Điền các thiết lập do plugin cung cấp. Có thể lưu nhiều cấu hình của cùng một plugin cho các bot hoặc mục đích khác nhau.',
|
||||
},
|
||||
debug: {
|
||||
title: 'Thử xử lý sự kiện',
|
||||
},
|
||||
logs: {
|
||||
title: 'Xem kết quả xử lý',
|
||||
description:
|
||||
'Xem trạng thái, sự kiện đầu vào, nhật ký plugin và kết quả gọi của mỗi lần chạy để tìm nguyên nhân lỗi.',
|
||||
},
|
||||
save: {
|
||||
title: 'Lưu và gắn vào bot',
|
||||
description:
|
||||
'Sau khi lưu, thêm cấu hình vào mục bộ xử lý plugin trên trang bot. Các sự kiện plugin khai báo được nhận tự động, không cần định tuyến riêng từng sự kiện.',
|
||||
},
|
||||
},
|
||||
label: 'Hướng dẫn sử dụng',
|
||||
progress: 'Bước {{current}} / {{total}}',
|
||||
previous: 'Bước trước',
|
||||
next: 'Tiếp theo',
|
||||
finish: 'Hoàn tất hướng dẫn',
|
||||
skip: 'Bỏ qua',
|
||||
processorCreate: {
|
||||
type: {
|
||||
title: 'Chọn loại bộ xử lý',
|
||||
description:
|
||||
'Pipeline xử lý tin nhắn theo luồng cố định, Agent ra quyết định bằng mô hình và công cụ, còn bộ xử lý plugin xử lý các sự kiện nền tảng đã khai báo.',
|
||||
},
|
||||
basic: {
|
||||
title: 'Đặt tên bộ xử lý',
|
||||
description:
|
||||
'Đặt tên dễ nhận biết. Trình chạy và sự kiện sẽ được cấu hình sau khi tạo.',
|
||||
},
|
||||
submit: {
|
||||
title: 'Tạo và tiếp tục cấu hình',
|
||||
description:
|
||||
'Sau khi tạo, cấu hình trình chạy, tham số, sự kiện và công cụ cần thiết cho loại bộ xử lý này.',
|
||||
},
|
||||
},
|
||||
runner: {
|
||||
debug: {
|
||||
title: 'Kiểm thử xử lý sự kiện',
|
||||
},
|
||||
select: {
|
||||
title: 'Chọn hoặc cài đặt trình chạy',
|
||||
description:
|
||||
'Chọn trình chạy đã cài đặt hoặc cài đặt trực tiếp từ danh sách chợ trong bộ chọn này.',
|
||||
action: 'Duyệt chợ trình chạy',
|
||||
},
|
||||
parameters: {
|
||||
title: 'Cấu hình tham số trình chạy',
|
||||
description:
|
||||
'Nhập mô hình, thông tin xác thực, URL dịch vụ và các tham số khác do trình chạy đã chọn khai báo.',
|
||||
},
|
||||
events: {
|
||||
title: 'Thiết lập sự kiện và công cụ',
|
||||
description:
|
||||
'Mở thẻ Sự kiện và công cụ để chọn sự kiện Agent nhận và các công cụ nền tảng hoặc LangBot được phép sử dụng.',
|
||||
},
|
||||
},
|
||||
},
|
||||
pipelineMigration,
|
||||
sidebar: {
|
||||
home: 'Trang chủ',
|
||||
@@ -18,6 +253,14 @@ const viVN = {
|
||||
editionCloud: 'Cloud',
|
||||
},
|
||||
common: {
|
||||
loadFailed: 'Không tải được. Vui lòng thử lại.',
|
||||
showSecret: 'Hiện thông tin bí mật',
|
||||
hideSecret: 'Ẩn thông tin bí mật',
|
||||
editBasicInfo: 'Sửa thông tin cơ bản',
|
||||
editBasicInfoDescription: 'Đổi tên, mô tả và biểu tượng.',
|
||||
editBasicInfoDescriptionNoIcon: 'Đổi tên và mô tả.',
|
||||
management: 'Quản lý',
|
||||
|
||||
customValue: 'Tùy chỉnh',
|
||||
login: 'Đăng nhập',
|
||||
logout: 'Đăng xuất',
|
||||
@@ -398,6 +641,201 @@ const viVN = {
|
||||
"Uses the Workspace owner's LangBot Account billing and credits.",
|
||||
},
|
||||
bots: {
|
||||
connectionMode: 'Phương thức kết nối',
|
||||
connectionModeDescription:
|
||||
'Chọn phương thức kết nối được bộ chuyển đổi hỗ trợ.',
|
||||
connectionWebhook: 'Webhook',
|
||||
connectionWebhookDescription:
|
||||
'Nền tảng gửi sự kiện đến URL do LangBot tạo.',
|
||||
connectionPersistent: 'Kết nối liên tục',
|
||||
connectionPersistentDescription:
|
||||
'LangBot duy trì kết nối socket hoặc luồng đi ra.',
|
||||
noAdaptersForConnectionMode:
|
||||
'Không có bộ chuyển đổi đã cài đặt nào hỗ trợ phương thức này.',
|
||||
eventBindings: 'Định tuyến sự kiện',
|
||||
addEventBinding: 'Thêm tuyến',
|
||||
addBehavior: 'Thêm hành vi',
|
||||
commonScenarios: 'Tình huống phổ biến',
|
||||
dragEventRoute: 'Kéo tuyến {{index}}',
|
||||
behaviorReplyMessages: 'Trả lời tin nhắn',
|
||||
behaviorReplyMessagesDescription: 'Gửi tin nhắn đến bộ xử lý.',
|
||||
behaviorWelcomeMembers: 'Chào mừng thành viên mới',
|
||||
behaviorWelcomeMembersDescription:
|
||||
'Chạy bộ xử lý khi có người tham gia nhóm.',
|
||||
behaviorHandleDepartures: 'Xử lý thành viên rời nhóm',
|
||||
behaviorHandleDeparturesDescription:
|
||||
'Chạy bộ xử lý khi có người rời hoặc bị xóa khỏi nhóm.',
|
||||
behaviorReviewFriendRequests: 'Xem xét yêu cầu kết bạn',
|
||||
behaviorReviewFriendRequestsDescription:
|
||||
'Gửi yêu cầu kết bạn mới đến bộ xử lý.',
|
||||
behaviorHandleModeration: 'Xử lý sự kiện kiểm duyệt',
|
||||
behaviorHandleModerationDescription:
|
||||
'Chạy bộ xử lý khi thành viên nhóm bị hạn chế.',
|
||||
behaviorCustom: 'Cấu hình sự kiện khác',
|
||||
behaviorCustomDescription:
|
||||
'Thêm tuyến và chọn sự kiện được bộ chuyển đổi hỗ trợ.',
|
||||
eventPattern: 'Sự kiện',
|
||||
eventPatternPlaceholder: 'Chọn sự kiện',
|
||||
targetType: 'Loại đích',
|
||||
target: 'Bộ xử lý',
|
||||
targetAgent: 'Agent',
|
||||
targetPipeline: 'Pipeline',
|
||||
targetDiscard: 'Loại bỏ',
|
||||
selectTarget: 'Chọn bộ xử lý',
|
||||
searchTarget: 'Tìm bộ xử lý…',
|
||||
noTargetFound: 'Không tìm thấy bộ xử lý tương thích',
|
||||
priority: 'Độ ưu tiên',
|
||||
enabled: 'Đã bật',
|
||||
eventBindingDescriptionPlaceholder: 'Mô tả quy tắc',
|
||||
noEventBindings: 'Chưa có tuyến sự kiện',
|
||||
unsupportedPipelineEvent: 'Pipeline chỉ hỗ trợ sự kiện message.*',
|
||||
disable: 'Tắt',
|
||||
enable: 'Bật',
|
||||
disabledBindings: 'Đã tắt',
|
||||
adapterEventsTitle: 'Sự kiện được hỗ trợ',
|
||||
adapterEventsDescription: '{{count}} loại sự kiện',
|
||||
adapterEventsMore: 'Thêm {{count}}',
|
||||
advancedEventValues: 'Xem tất cả',
|
||||
eventGroup: 'Nhóm',
|
||||
eventGroupNames: {
|
||||
bot: 'Trạng thái bot',
|
||||
feedback: 'Phản hồi',
|
||||
friend: 'Bạn bè',
|
||||
group: 'Nhóm',
|
||||
message: 'Tin nhắn',
|
||||
platform: 'Nền tảng',
|
||||
},
|
||||
routeConflictTitle: 'Một số tuyến bị chồng lấp',
|
||||
routeConflictShadowed:
|
||||
'{{shadowed}} có thể không chạy vì {{winner}} xử lý cùng sự kiện trước.',
|
||||
routeConflictMore: 'Còn {{count}} xung đột tuyến cần xem xét.',
|
||||
routeFallbackCatchAll: '{{route}} là tuyến nhận mọi sự kiện.',
|
||||
routeFallbackIgnored:
|
||||
'Sự kiện không khớp tuyến nào sẽ bị bỏ qua. Chỉ thêm tuyến nhận tất cả khi mọi sự kiện cần kết quả rõ ràng.',
|
||||
testRoute: 'Kiểm tra tuyến',
|
||||
adapterEventDebugTitle: 'Gỡ lỗi sự kiện nền tảng',
|
||||
adapterEventDebugDescription:
|
||||
'Tạo sự kiện trên {{platform}}. Sự kiện sẽ xuất hiện khi bộ chuyển đổi nhận được.',
|
||||
adapterEventObserveOnly:
|
||||
'Cửa sổ này chỉ quan sát sự kiện. Sự kiện đến vẫn đi theo định tuyến hiện tại.',
|
||||
adapterEventPreparing: 'Đang chuẩn bị',
|
||||
adapterEventListening: 'Đang lắng nghe',
|
||||
adapterEventListenerUnavailable: 'Lắng nghe bị gián đoạn',
|
||||
adapterEventLoadFailed:
|
||||
'Không đọc được sự kiện nền tảng. Đảm bảo bot đang chạy rồi thử lại.',
|
||||
adapterEventReceivedCount: 'Đã nhận {{count}} sự kiện',
|
||||
adapterEventClear: 'Xóa',
|
||||
adapterEventEmptyTitle: 'Đang chờ sự kiện nền tảng',
|
||||
adapterEventEmptyDescription:
|
||||
'Gửi tin nhắn hoặc tạo sự kiện trên {{platform}}.',
|
||||
adapterEventData: 'Xem dữ liệu sự kiện',
|
||||
adapterEventNeedsSavedBot: 'Lưu bot trước khi lắng nghe sự kiện nền tảng.',
|
||||
adapterEventCurrentPlatform: 'nền tảng hiện tại',
|
||||
adapterConfigurationTest: 'Kiểm tra cấu hình bộ chuyển đổi',
|
||||
adapterConfigurationTestDescription:
|
||||
'Lưu và bật bot trước, sau đó tạo sự kiện nền tảng để kiểm tra cấu hình.',
|
||||
refreshRouteStatus: 'Làm mới trạng thái',
|
||||
routeStatusIdle: 'Chưa có lần chạy',
|
||||
routeStatusRefreshFailed: 'Không làm mới được trạng thái tuyến.',
|
||||
routeStatus: {
|
||||
matched: 'Khớp',
|
||||
delivered: 'Đã chuyển đến',
|
||||
discarded: 'Đã loại bỏ',
|
||||
failed: 'Thất bại',
|
||||
not_matched: 'Không khớp',
|
||||
},
|
||||
routeStatusDetail: {
|
||||
matched: 'Tuyến này khớp với sự kiện.',
|
||||
delivered: 'Bộ xử lý đã nhận sự kiện.',
|
||||
discarded: 'Sự kiện đã bị loại bỏ có chủ đích.',
|
||||
failed: 'Tuyến không thể hoàn tất.',
|
||||
not_matched: 'Không có tuyến đã cấu hình nào khớp sự kiện.',
|
||||
},
|
||||
routeFailure: {
|
||||
binding_disabled: 'Tuyến này đã bị tắt.',
|
||||
event_pattern_mismatch: 'Sự kiện không khớp tuyến này.',
|
||||
filters_mismatch: 'Dữ liệu mẫu không đáp ứng điều kiện tuyến.',
|
||||
lower_priority: 'Một tuyến khớp khác có độ ưu tiên cao hơn.',
|
||||
route_not_found: 'Không có tuyến nào khớp sự kiện này.',
|
||||
processor_incompatible: 'Bộ xử lý đã chọn không hỗ trợ sự kiện này.',
|
||||
processor_not_found: 'Bộ xử lý đã chọn không khả dụng.',
|
||||
runner_failed: 'Trình chạy Agent gặp lỗi khi xử lý sự kiện.',
|
||||
delivery_failed: 'Bộ xử lý đã hoàn tất nhưng chuyển kết quả thất bại.',
|
||||
},
|
||||
dryRunTitle: 'Kiểm tra định tuyến sự kiện',
|
||||
dryRunDescription: 'Chọn sự kiện để xem tuyến và bộ xử lý phù hợp.',
|
||||
dryRunEventType: 'Loại sự kiện',
|
||||
dryRunSampleReady: 'Sự kiện mẫu đã sẵn sàng',
|
||||
dryRunSampleDescription:
|
||||
'LangBot đã chuẩn bị dữ liệu mẫu cho {{event}}. Phần lớn kiểm tra tuyến có thể dùng ngay.',
|
||||
dryRunEditPayload: 'Dữ liệu thử',
|
||||
dryRunHidePayload: 'Ẩn dữ liệu',
|
||||
dryRunPayload: 'Dữ liệu thử (JSON)',
|
||||
dryRunPayloadHint:
|
||||
'Dùng để kiểm tra điều kiện tin nhắn và cuộc trò chuyện.',
|
||||
dryRunPayloadJsonError: 'Nhập JSON hợp lệ.',
|
||||
dryRunPayloadObjectError: 'Dữ liệu phải là đối tượng JSON.',
|
||||
dryRunNeedsSavedBot: 'Lưu bot trước khi kiểm tra tuyến.',
|
||||
dryRunFailed: 'Không kiểm tra được tuyến. Hãy thử lại sau.',
|
||||
dryRunAction: 'Xem kết quả khớp',
|
||||
dryRunRunning: 'Đang kiểm tra…',
|
||||
dryRunMatched: 'Đã khớp tuyến',
|
||||
dryRunNotMatched: 'Không có tuyến khớp',
|
||||
dryRunTarget: 'Bộ xử lý đích',
|
||||
dryRunNoTarget: 'Không có đích',
|
||||
dryRunMatchedRule: 'Quy tắc khớp',
|
||||
dryRunRuleIndex: 'Tuyến {{index}}',
|
||||
dryRunNoRule: 'Không có quy tắc khớp',
|
||||
dryRunDiagnostics: 'Các bước chẩn đoán',
|
||||
dryRunDiagnosticSelected: 'Đã chọn {{route}}.',
|
||||
dryRunDiagnosticMatched: '{{route}} khớp. {{reason}}',
|
||||
dryRunDiagnosticSkipped: 'Đã bỏ qua {{route}}. {{reason}}',
|
||||
eventCustom: 'Sự kiện tùy chỉnh',
|
||||
eventDescriptions: {
|
||||
all: 'Khớp mọi sự kiện bộ chuyển đổi này nhận được.',
|
||||
namespace: 'Khớp mọi sự kiện {{group}}.',
|
||||
namespace_bot:
|
||||
'Khớp sự kiện mời, xóa, tắt tiếng bot và các thay đổi trạng thái khác.',
|
||||
namespace_feedback: 'Khớp sự kiện phản hồi từ nền tảng hoặc người dùng.',
|
||||
namespace_friend: 'Khớp yêu cầu kết bạn và thay đổi quan hệ bạn bè.',
|
||||
namespace_group:
|
||||
'Khớp sự kiện tham gia, rời, bị xóa khỏi nhóm và sự kiện nhóm khác.',
|
||||
namespace_message: 'Khớp sự kiện nhận, sửa, xóa và thả cảm xúc tin nhắn.',
|
||||
namespace_platform:
|
||||
'Khớp sự kiện riêng của nền tảng do bộ chuyển đổi cung cấp.',
|
||||
custom: 'Sự kiện tùy chỉnh hoặc chưa có mô tả.',
|
||||
message_received: 'Người dùng hoặc nhóm gửi tin nhắn mới đến bot.',
|
||||
message_edited: 'Nền tảng thông báo một tin nhắn hiện có đã thay đổi.',
|
||||
message_deleted: 'Nền tảng thông báo một tin nhắn đã bị xóa.',
|
||||
message_reaction: 'Người dùng thêm hoặc xóa cảm xúc trên tin nhắn.',
|
||||
feedback_received: 'Nhận phản hồi từ nền tảng hoặc người dùng.',
|
||||
friend_request_received: 'Có người yêu cầu kết bạn với bot.',
|
||||
friend_added: 'Đã tạo quan hệ bạn bè.',
|
||||
group_member_joined: 'Thành viên tham gia nhóm có bot.',
|
||||
group_member_left: 'Thành viên rời nhóm có bot.',
|
||||
group_member_banned: 'Thành viên nhóm bị cấm hoặc xóa.',
|
||||
bot_invited_to_group: 'Bot được mời vào nhóm.',
|
||||
bot_removed_from_group: 'Bot bị xóa khỏi nhóm.',
|
||||
bot_muted: 'Bot bị tắt tiếng trong nhóm.',
|
||||
bot_unmuted: 'Bot được bỏ tắt tiếng trong nhóm.',
|
||||
platform_specific: 'Sự kiện nền tảng riêng của bộ chuyển đổi.',
|
||||
},
|
||||
conditions: 'Điều kiện',
|
||||
conditionsDescription:
|
||||
'Phải khớp mọi điều kiện để kích hoạt. Để trống để luôn kích hoạt.',
|
||||
conditionsEmpty: 'Không có điều kiện — luôn kích hoạt.',
|
||||
addFilter: 'Thêm điều kiện',
|
||||
filterChatType: 'Loại phiên',
|
||||
filterChatId: 'ID phiên',
|
||||
filterMessageText: 'Nội dung tin nhắn',
|
||||
filterMessageElement: 'Thành phần tin nhắn',
|
||||
operator_eq: 'bằng',
|
||||
operator_neq: 'không bằng',
|
||||
operator_contains: 'chứa',
|
||||
operator_not_contains: 'không chứa',
|
||||
operator_starts_with: 'bắt đầu bằng',
|
||||
operator_regex: 'biểu thức chính quy',
|
||||
|
||||
eventWildcard: 'Tất cả sự kiện',
|
||||
eventNamespaceWildcard: '{{namespace}}.*',
|
||||
eventNames: {
|
||||
@@ -600,6 +1038,174 @@ const viVN = {
|
||||
},
|
||||
},
|
||||
agents: {
|
||||
chooseType: 'Chọn cách hoạt động',
|
||||
chooseTypeDescription:
|
||||
'Chọn loại bộ xử lý trước. Bạn có thể cấu hình thêm sau khi tạo.',
|
||||
diagramHint: 'Cách hoạt động',
|
||||
agentDiagramTitle: 'Agent: quyết định và hành động',
|
||||
agentDiagramDescription:
|
||||
'Agent nhận nhiều sự kiện nền tảng, dùng mô hình và công cụ để hiểu tình huống rồi quyết định hành động.',
|
||||
pipelineDiagramTitle: 'Pipeline: theo quy trình định sẵn',
|
||||
pipelineDiagramDescription:
|
||||
'Pipeline chỉ xử lý sự kiện tin nhắn và chạy từng bước theo thứ tự đã cấu hình.',
|
||||
pipelineDiagramFlow: 'Tin nhắn đi qua chuỗi bước cố định',
|
||||
diagramEvents: 'Sự kiện nền tảng',
|
||||
diagramAgentCanUse: 'Khả năng của Agent',
|
||||
diagramMessages: 'Tin nhắn',
|
||||
diagramMembers: 'Thành viên',
|
||||
diagramFeedback: 'Phản hồi',
|
||||
diagramDecide: 'Hiểu và quyết định',
|
||||
diagramModel: 'Dùng mô hình',
|
||||
diagramTools: 'Dùng công cụ',
|
||||
diagramActions: 'Thực hiện hành động',
|
||||
diagramMessage: 'Tin nhắn',
|
||||
diagramPreprocess: 'Chuẩn bị',
|
||||
diagramAI: 'AI',
|
||||
diagramPostprocess: 'Tinh chỉnh',
|
||||
diagramOutput: 'Đầu ra',
|
||||
eventsAndTools: 'Sự kiện và công cụ',
|
||||
eventsAndToolsDescription: 'Đặt sự kiện kích hoạt và công cụ có thể dùng.',
|
||||
configuredEvents: 'Sự kiện đã thêm',
|
||||
configuredEventsCount: 'Tổng {{count}}',
|
||||
addEvent: 'Thêm sự kiện',
|
||||
removeEvent: 'Xóa sự kiện',
|
||||
eventActions: 'Công cụ tự động bật',
|
||||
eventToolEnabled: 'Đã bật',
|
||||
eventToolsEnabledCount: 'Đã bật {{count}} công cụ',
|
||||
noEventActions: 'Không có hành động nào cho sự kiện này.',
|
||||
noEventsConfigured: 'Chưa thêm sự kiện',
|
||||
noEventsConfiguredDescription:
|
||||
'Không sự kiện nào có thể kích hoạt Agent này.',
|
||||
noEventsConfiguredBadge: 'Không có sự kiện',
|
||||
apiTools: 'Quyền dùng công cụ',
|
||||
apiToolsDescription: 'Chọn công cụ Agent này có thể gọi.',
|
||||
otherTools: 'Công cụ khác',
|
||||
otherToolsDescription:
|
||||
'Chọn công cụ nền tảng, sandbox, MCP, plugin và kỹ năng.',
|
||||
apiToolsSelected: 'Đã chọn {{count}}',
|
||||
apiToolsSecurityHint: 'Chỉ bật công cụ Agent này cần.',
|
||||
apiToolsSearch: 'Tìm công cụ…',
|
||||
eventApiTools: 'Công cụ sự kiện',
|
||||
eventToolUnavailable: 'Không khả dụng',
|
||||
eventApiToolsDescription:
|
||||
'Đích được cố định theo sự kiện hiện tại. Agent chỉ cung cấp tham số hành động.',
|
||||
platformApiTools: 'Công cụ nền tảng',
|
||||
platformApiToolsDescription:
|
||||
'Agent có thể chọn ID người dùng, nhóm hoặc tin nhắn. Chỉ cấp quyền cần thiết.',
|
||||
apiToolEvents: 'Sự kiện',
|
||||
apiToolParameters: 'Tham số Agent',
|
||||
apiToolSource: 'Nguồn',
|
||||
apiToolNoParameters: 'không có',
|
||||
sandboxTools: 'Sandbox',
|
||||
mcpTools: 'MCP',
|
||||
pluginTools: 'Plugin',
|
||||
skillTools: 'Kỹ năng',
|
||||
langbotBuiltIn: 'LangBot',
|
||||
apiToolDetails: 'Chi tiết',
|
||||
apiToolHideDetails: 'Ẩn',
|
||||
apiToolsNoResults: 'Không có API hoặc công cụ phù hợp',
|
||||
apiToolsCatalogUnavailable:
|
||||
'Máy chủ LangBot không trả về danh mục công cụ API. Kiểm tra đã cập nhật và khởi động lại máy chủ; điều này không có nghĩa nền tảng không có công cụ.',
|
||||
hostToolsCatalogUnavailable: 'Danh mục công cụ tạm thời không khả dụng.',
|
||||
apiToolRisk: {
|
||||
read: 'Chỉ đọc',
|
||||
write: 'Hành động',
|
||||
dangerous: 'Nhạy cảm',
|
||||
},
|
||||
runnerStatusLoading: 'Đang kiểm tra trạng thái trình chạy',
|
||||
runnerStatusCheckFailed: 'Không kiểm tra được trạng thái trình chạy',
|
||||
runnerStatusCheckFailedDescription:
|
||||
'Thử kiểm tra lại. Nếu vẫn lỗi, kiểm tra máy chủ và môi trường chạy plugin.',
|
||||
noRunnersAvailable: 'Không có trình chạy khả dụng',
|
||||
noRunnersAvailableDescription:
|
||||
'Cài và bật tiện ích trình chạy trước khi cấu hình Agent này.',
|
||||
installedRunners: 'Trình chạy đã cài đặt',
|
||||
marketplaceRunners: 'Plugin trình chạy trên chợ',
|
||||
viewMarketplace: 'Xem chợ tiện ích',
|
||||
restoringRunnerInstall: 'Đang khôi phục cài đặt plugin và chờ trình chạy…',
|
||||
noInstalledRunners: 'Chưa cài tiện ích trình chạy nào.',
|
||||
installingRunner: 'Đang cài {{runner}}...',
|
||||
runnerInstallSuccess: 'Đã cài {{runner}} và có thể chọn',
|
||||
selectedRunnerUnavailable: 'Trình chạy đã chọn không khả dụng',
|
||||
selectedRunnerUnavailableDescription:
|
||||
'{{runner}} hiện chưa được đăng ký. Chọn trình chạy khác hoặc khôi phục tiện ích.',
|
||||
noRunnerSelected: 'Chưa chọn trình chạy',
|
||||
runnerConfigIncomplete: 'Cấu hình trình chạy chưa đầy đủ',
|
||||
runnerConfigIncompleteDescription: 'Điền các trường bắt buộc: {{fields}}',
|
||||
runnerReady: 'Trình chạy đã sẵn sàng',
|
||||
runnerReadyDescription:
|
||||
'{{runner}} đã đăng ký và môi trường chạy plugin đã kết nối.',
|
||||
debugTab: 'Gỡ lỗi sự kiện',
|
||||
debugTitle: 'Gỡ lỗi sự kiện Agent',
|
||||
debugDescription:
|
||||
'Chạy Agent hiện tại với tin nhắn hoặc sự kiện nền tảng và kiểm tra đầu ra thực tế.',
|
||||
debugResetSession: 'Đặt lại phiên',
|
||||
debugEventType: 'Loại sự kiện',
|
||||
debugNoEventsTitle: 'Không có sự kiện để gỡ lỗi',
|
||||
debugNoEventsDescription:
|
||||
'Thêm sự kiện trong mục Sự kiện và công cụ trước.',
|
||||
debugMessageReceived: 'Đã nhận tin nhắn',
|
||||
debugGroupMemberJoined: 'Thành viên tham gia nhóm',
|
||||
debugGroupMemberLeft: 'Thành viên rời nhóm',
|
||||
debugFriendRequested: 'Đã nhận yêu cầu kết bạn',
|
||||
debugFeedbackReceived: 'Đã nhận phản hồi',
|
||||
debugCustomEvent: 'Sự kiện tùy chỉnh',
|
||||
debugCustomEventType: 'Tên sự kiện tùy chỉnh',
|
||||
debugMessageInput: 'Nội dung hội thoại',
|
||||
debugEventSummary: 'Tóm tắt sự kiện',
|
||||
debugInputPlaceholder: 'Nhập nội dung Agent cần xử lý',
|
||||
debugEventPayload: 'Dữ liệu sự kiện (JSON)',
|
||||
debugSupportedEvents: 'Agent hỗ trợ',
|
||||
debugRun: 'Chạy thử',
|
||||
debugSaveAndRun: 'Lưu và chạy',
|
||||
debugRunning: 'Đang chạy',
|
||||
debugTranscript: 'Nhật ký gỡ lỗi',
|
||||
debugTranscriptDescription:
|
||||
'Đầu vào và đầu ra Agent trong phiên gỡ lỗi hiện tại.',
|
||||
debugEmptyTitle: 'Kiểm tra hành vi Agent',
|
||||
debugEmptyTranscript:
|
||||
'Chọn sự kiện, nhập nội dung thử rồi chọn “Chạy thử”. Kết quả hiển thị ngay trên trang này.',
|
||||
debugAgentOutput: 'Đầu ra Agent',
|
||||
debugReasoning: 'Đang suy nghĩ',
|
||||
debugTextOutput: 'Đầu ra văn bản',
|
||||
debugPlatformNotice:
|
||||
'Công cụ nền tảng dùng Mock: Agent gọi công cụ thật nhưng hành động được mô phỏng, không gửi tin nhắn thật. Công cụ khác chạy theo cấu hình.',
|
||||
debugToolSimulated: 'Mô phỏng thành công · Mock',
|
||||
debugStop: 'Dừng gỡ lỗi',
|
||||
debugMockOptions: 'Kịch bản Mock (JSON)',
|
||||
debugInvalidMock: 'Kịch bản Mock phải là đối tượng JSON hợp lệ.',
|
||||
debugToolMockFailed: 'Mô phỏng thất bại · Mock',
|
||||
debugMockOptionsHelp:
|
||||
'Mặc định là thành công. Đặt lỗi theo tên công cụ trong errors, dữ liệu truy vấn trong results và API không hỗ trợ trong unsupported_apis. Ví dụ: {"errors":{"event_reply":"Mô phỏng lỗi gửi"}}',
|
||||
debugCancelled: 'Đã dừng gỡ lỗi. Nhật ký thực thi trước đó được giữ lại.',
|
||||
debugNoToolCalls:
|
||||
'Chưa ghi nhận lệnh gọi công cụ. Văn bản được tạo không có nghĩa tin nhắn đã được gửi.',
|
||||
debugToolCount:
|
||||
'Đã ghi nhận {{count}} lệnh gọi công cụ. Xem trạng thái và kết quả bên dưới.',
|
||||
debugToolRunning: 'Đang chạy',
|
||||
debugToolCompleted: 'Hoàn tất',
|
||||
debugToolFailed: 'Thất bại',
|
||||
debugToolInterrupted: 'Không có kết quả trả về',
|
||||
debugToolArguments: 'Đối số',
|
||||
debugToolResult: 'Kết quả',
|
||||
debugTestInput: 'Đầu vào thử nghiệm',
|
||||
debugNoTextOutput: 'Lần chạy đã hoàn tất mà không có đầu ra văn bản.',
|
||||
debugEventTypeRequired: 'Nhập loại sự kiện',
|
||||
debugInputRequired: 'Nhập nội dung hội thoại',
|
||||
debugInvalidPayload: 'Dữ liệu sự kiện phải là đối tượng JSON hợp lệ',
|
||||
debugUnsupportedEvent: 'Sự kiện này nằm ngoài phạm vi Agent có thể nhận',
|
||||
debugRunnerConfigInvalidDescription:
|
||||
'Cấu hình trình chạy chưa đầy đủ: {{message}}',
|
||||
debugRunnerExecutionFailedDescription:
|
||||
'Lần chạy thất bại. Kiểm tra mô hình và cấu hình trình chạy rồi thử lại.',
|
||||
debugRunnerTimeoutDescription:
|
||||
'Lần chạy hết thời gian chờ. Thử lại sau hoặc điều chỉnh thời gian chờ của trình chạy.',
|
||||
debugApiKeyRequired: 'Thiếu khóa API',
|
||||
debugOpenRunnerConfig: 'Mở cấu hình trình chạy',
|
||||
debugReviewRunnerConfig: 'Kiểm tra cấu hình trình chạy',
|
||||
debugErrorDetails: 'Xem chi tiết lỗi',
|
||||
debugRunFailed: 'Chạy gỡ lỗi Agent thất bại',
|
||||
|
||||
monitoring: {
|
||||
description:
|
||||
'Xem sự kiện kích hoạt, đầu ra mô hình và quá trình gọi công cụ của mỗi tác vụ.',
|
||||
@@ -917,6 +1523,13 @@ const viVN = {
|
||||
installFromGithubDesc: 'Cài đặt plugin từ GitHub Release',
|
||||
goToMarketplace: 'Đi đến chợ ứng dụng',
|
||||
installProgress: {
|
||||
updateTitle: 'Đang cập nhật {{name}}',
|
||||
checkingUpdate: 'Đang kiểm tra cập nhật',
|
||||
validating: 'Đang xác thực gói',
|
||||
applyingUpdate: 'Đang áp dụng cập nhật',
|
||||
activating: 'Đang khởi chạy và làm mới thành phần',
|
||||
updateComplete: 'Đã cập nhật plugin thành công',
|
||||
|
||||
title: 'Đang cài đặt {{name}}',
|
||||
titleGeneric: 'Cài đặt Plugin',
|
||||
overallProgress: 'Tiến độ tổng thể',
|
||||
@@ -945,6 +1558,11 @@ const viVN = {
|
||||
uploadPluginOnly: 'Chỉ hỗ trợ gói plugin .lbpkg',
|
||||
},
|
||||
market: {
|
||||
runnerUsage: 'Mục đích trình chạy',
|
||||
runnerUsageAll: 'Tất cả',
|
||||
runnerUsageAgent: 'Agent / Pipeline',
|
||||
runnerUsageEvent: 'Bộ xử lý plugin',
|
||||
|
||||
searchPlaceholder: 'Tìm kiếm plugin...',
|
||||
searchPlaceholderCount:
|
||||
'Tìm kiếm {{count}} tiện ích mở rộng, khả năng hoặc tình huống...',
|
||||
@@ -1176,6 +1794,8 @@ const viVN = {
|
||||
deleteMCPHint: 'Sau khi xóa, cấu hình máy chủ MCP này không thể khôi phục.',
|
||||
},
|
||||
pipelines: {
|
||||
managementDescription: 'Sao chép hoặc xóa pipeline này.',
|
||||
|
||||
title: 'Quy trình',
|
||||
description:
|
||||
'Pipeline xác định luồng xử lý sự kiện tin nhắn, dùng để liên kết với Bot',
|
||||
@@ -1295,6 +1915,8 @@ const viVN = {
|
||||
selectKnowledgeBases: 'Chọn kho tri thức',
|
||||
},
|
||||
debugDialog: {
|
||||
saveAndSend: 'Lưu và gửi',
|
||||
|
||||
title: 'Trò chuyện Pipeline',
|
||||
selectPipeline: 'Chọn Pipeline',
|
||||
sessionType: 'Loại phiên',
|
||||
@@ -1338,6 +1960,22 @@ const viVN = {
|
||||
},
|
||||
},
|
||||
knowledge: {
|
||||
installedEngines: 'Bộ máy tri thức đã cài đặt',
|
||||
noInstalledEngines: 'Chưa cài plugin bộ máy tri thức nào.',
|
||||
marketplaceEngines: 'Plugin bộ máy tri thức trên chợ',
|
||||
noMarketplaceEngines: 'Không có plugin bộ máy tri thức khả dụng.',
|
||||
loadingEngineCatalog: 'Đang tải plugin trên chợ…',
|
||||
engineCatalogUnavailable:
|
||||
'Chợ tiện ích tạm thời không khả dụng. Mở lại bộ chọn để thử lại.',
|
||||
viewMarketplace: 'Xem chợ tiện ích',
|
||||
installingEngine: 'Đang cài {{engine}}…',
|
||||
engineInstallSuccess: 'Đã cài {{engine}} và có thể chọn',
|
||||
engineInstallFailed: 'Cài bộ máy tri thức thất bại. Vui lòng thử lại.',
|
||||
engineVersionUnavailable: 'Plugin này chưa có phiên bản có thể cài đặt.',
|
||||
engineInstallTimeout: 'Đang tiếp tục cài đặt. Làm mới trang để kiểm tra.',
|
||||
engineRegistrationTimeout:
|
||||
'Đã cài plugin nhưng bộ máy tri thức chưa sẵn sàng.',
|
||||
|
||||
title: 'Cơ sở tri thức',
|
||||
createKnowledgeBase: 'Tạo cơ sở tri thức',
|
||||
selectFromSidebar: 'Chọn một cơ sở tri thức từ thanh bên',
|
||||
@@ -1854,6 +2492,45 @@ const viVN = {
|
||||
},
|
||||
},
|
||||
storageAnalysis: {
|
||||
notCreated: 'Chưa tạo',
|
||||
processStorage: 'Lưu trữ theo tiến trình',
|
||||
processStorageDescription:
|
||||
'Mỗi môi trường chạy đo các thư mục mình quản lý. Chi tiết đã được tính trong tổng thư mục cha.',
|
||||
directory: 'Thư mục',
|
||||
size: 'Kích thước',
|
||||
files: 'Tệp',
|
||||
runtimeUnavailable: 'Thống kê lưu trữ của môi trường chạy không khả dụng.',
|
||||
noManagedDirectories: 'Không có thư mục được quản lý nào được báo cáo.',
|
||||
scanWarnings: '{{count}} mục không đọc được',
|
||||
boxActivity: '{{sessions}} phiên · {{processes}} tiến trình được quản lý',
|
||||
statusLabels: {
|
||||
available: 'Khả dụng',
|
||||
unavailable: 'Không khả dụng',
|
||||
disabled: 'Đã tắt',
|
||||
not_applicable: 'Không áp dụng',
|
||||
},
|
||||
sourceLabels: {
|
||||
local_process: 'Đo bởi tiến trình LangBot',
|
||||
runtime_rpc: 'Đo bởi tiến trình môi trường chạy qua RPC có xác thực',
|
||||
},
|
||||
scopeLabels: {
|
||||
runtime_host: 'Máy chủ môi trường chạy',
|
||||
sandbox_sessions: 'Phiên sandbox',
|
||||
},
|
||||
processNames: {
|
||||
langbot: 'Tiến trình chính LangBot',
|
||||
plugin_runtime: 'Môi trường chạy plugin',
|
||||
box_runtime: 'Môi trường chạy Box',
|
||||
},
|
||||
processDescriptions: {
|
||||
langbot:
|
||||
'Cơ sở dữ liệu ứng dụng, nhật ký, tệp tải lên, dữ liệu vector và tệp tạm.',
|
||||
plugin_runtime:
|
||||
'Gói plugin, thành phẩm đã xác minh, môi trường phụ thuộc và dữ liệu cài đặt riêng.',
|
||||
box_runtime:
|
||||
'Không gian sandbox, không gian tiến trình MCP, thư mục trao đổi tệp đính kèm và kỹ năng.',
|
||||
},
|
||||
|
||||
title: 'Phân tích lưu trữ',
|
||||
description: 'Kiểm tra dung lượng lưu trữ và các mục có thể dọn dẹp',
|
||||
openDialog: 'Xem phân tích',
|
||||
@@ -1879,6 +2556,22 @@ const viVN = {
|
||||
noExpiredUploads: 'Không có tệp tải lên hết hạn',
|
||||
noExpiredLogs: 'Không có nhật ký hết hạn',
|
||||
sectionNames: {
|
||||
legacy_plugins: 'Gói plugin cũ',
|
||||
artifacts: 'Thành phẩm plugin đã xác minh',
|
||||
dependency_environments: 'Môi trường phụ thuộc',
|
||||
installations: 'Dữ liệu cài đặt plugin',
|
||||
staging: 'Tệp chuẩn bị cài plugin',
|
||||
rpc_transfer: 'Tệp truyền RPC của môi trường chạy',
|
||||
workspace: 'Không gian làm việc sandbox',
|
||||
inbox: 'Tệp đính kèm đầu vào',
|
||||
outbox: 'Tệp đính kèm đầu ra',
|
||||
skills: 'Kỹ năng',
|
||||
session_workspaces: 'Không gian phiên sandbox',
|
||||
session_caches: 'Bộ nhớ đệm môi trường sandbox',
|
||||
session_temp: 'Tệp tạm sandbox',
|
||||
managed_process_workspaces:
|
||||
'Không gian tiến trình được quản lý (bao gồm MCP)',
|
||||
|
||||
database: 'Cơ sở dữ liệu',
|
||||
logs: 'Nhật ký',
|
||||
storage: 'Tệp tải lên',
|
||||
@@ -1965,6 +2658,26 @@ const viVN = {
|
||||
'Giám sát hoạt động Bot để xác minh kết nối nền tảng đang hoạt động.',
|
||||
},
|
||||
aiEngine: {
|
||||
loadingCatalog: 'Đang tải tiện ích trình chạy...',
|
||||
catalogUnavailable: 'Danh mục trình chạy không khả dụng',
|
||||
catalogUnavailableDescription:
|
||||
'Trình chạy đã cài vẫn dùng được. Thử tải lại danh mục hoặc duyệt tiện ích.',
|
||||
noMarketplaceRunners: 'Không có plugin trình chạy phù hợp mục đích này',
|
||||
noMarketplaceRunnersDescription:
|
||||
'Dùng trình chạy đã cài hoặc thử lại sau.',
|
||||
browseRunners: 'Duyệt tiện ích trình chạy',
|
||||
installAndContinue: 'Cài đặt và tiếp tục',
|
||||
installing: 'Đang cài đặt...',
|
||||
useInstalled: 'Dùng trình chạy này',
|
||||
installedUnavailable: 'Đã cài, trình chạy không khả dụng',
|
||||
installSuccess: 'Đã cài và chọn {{runner}}',
|
||||
installFailed: 'Không cài được tiện ích trình chạy',
|
||||
versionUnavailable: 'Chợ tiện ích không trả về phiên bản có thể cài đặt.',
|
||||
installTimeout:
|
||||
'Cài trình chạy hết thời gian chờ. Kiểm tra tác vụ trong mục Tiện ích.',
|
||||
registrationTimeout:
|
||||
'Đã cài tiện ích nhưng trình chạy chưa đăng ký. Kiểm tra môi trường chạy plugin rồi thử lại.',
|
||||
|
||||
defaultModelUnavailable: 'Chưa có mô hình mặc định. Vui lòng thử lại.',
|
||||
defaultRunnerUnavailable: 'Local Agent chưa sẵn sàng. Vui lòng thử lại.',
|
||||
preparingDefault: 'Đang chuẩn bị AI mặc định…',
|
||||
|
||||
+100
-40
@@ -2,31 +2,27 @@ import pipelineMigration from './pipeline-migration/zh-Hans';
|
||||
|
||||
const zhHans = {
|
||||
sidebarGuide: {
|
||||
label: '工作台导览',
|
||||
progress: '第 {{current}} 项,共 {{total}} 项',
|
||||
confirm: '我知道了',
|
||||
finish: '完成引导',
|
||||
steps: {
|
||||
monitoring: {
|
||||
title: '仪表盘',
|
||||
title: '查看运行概况',
|
||||
description: '集中查看机器人活动、模型调用、消息量和系统运行情况。',
|
||||
},
|
||||
bots: {
|
||||
title: '机器人',
|
||||
title: '连接聊天平台',
|
||||
description: '连接聊天平台,并在这里创建和管理每一个机器人。',
|
||||
},
|
||||
pipelines: {
|
||||
title: '处理器',
|
||||
title: '配置处理器',
|
||||
description:
|
||||
'创建可复用的 AI 流水线、智能体和事件处理器,为机器人提供能力。',
|
||||
'创建可复用的流水线、Agent 和插件处理器配置,再将它们接入机器人。',
|
||||
},
|
||||
knowledge: {
|
||||
title: '知识库',
|
||||
title: '管理知识库',
|
||||
description:
|
||||
'管理文档和外部知识源,帮助模型生成更准确、更贴合业务的回复。',
|
||||
},
|
||||
plugins: {
|
||||
title: '已安装扩展',
|
||||
title: '管理已安装扩展',
|
||||
description: '管理已安装的插件、MCP 服务和技能,并查看它们的运行状态。',
|
||||
},
|
||||
'add-extension': {
|
||||
@@ -34,47 +30,116 @@ const zhHans = {
|
||||
description: '从扩展市场、GitHub 或本地安装包为 LangBot 添加新能力。',
|
||||
},
|
||||
models: {
|
||||
title: '模型配置',
|
||||
title: '配置模型',
|
||||
description:
|
||||
'配置模型供应商,以及 LangBot 使用的语言模型、嵌入模型等。',
|
||||
},
|
||||
'api-integration': {
|
||||
title: 'API 集成',
|
||||
title: '配置 API 访问',
|
||||
description:
|
||||
'创建 API 密钥,并配置外部系统访问 LangBot 服务和 MCP 的方式。',
|
||||
},
|
||||
},
|
||||
},
|
||||
guidedTour: {
|
||||
label: '配置引导',
|
||||
eventDebugDescription:
|
||||
'选择支持的事件并填写测试数据,运行后查看输出和工具调用结果。平台操作仅模拟执行,模型和其他工具按实际配置执行。',
|
||||
|
||||
pipeline: {
|
||||
trigger: {
|
||||
title: '选择要回复的消息',
|
||||
description:
|
||||
'流水线只处理消息事件,并由 AI 自动回复。在这里设置群聊触发方式、私聊规则和消息过滤条件。',
|
||||
},
|
||||
ai: {
|
||||
title: '配置 AI 能力',
|
||||
description:
|
||||
'选择本地运行器或外部平台运行器,再按所选运行器配置模型、提示词、知识库等参数。',
|
||||
},
|
||||
output: {
|
||||
title: '调整回复方式',
|
||||
description:
|
||||
'设置长文本处理等输出规则,决定 AI 生成的内容如何发给用户。',
|
||||
},
|
||||
safety: {
|
||||
title: '设置安全控制',
|
||||
description: '按需启用内容过滤和速率限制,控制消息内容与处理频率。',
|
||||
},
|
||||
extensions: {
|
||||
title: '选择可用扩展',
|
||||
description:
|
||||
'选择这条流水线可使用的插件、MCP 服务和技能,扩展消息处理与工具能力。',
|
||||
},
|
||||
basic: {
|
||||
title: '管理流水线',
|
||||
description: '复制当前流水线以创建其他配置,或删除不再需要的流水线。',
|
||||
},
|
||||
debug: {
|
||||
title: '测试对话效果',
|
||||
description:
|
||||
'发送测试消息,检查触发规则、AI 回复和输出处理是否符合预期;修改配置后,测试前会先保存。',
|
||||
},
|
||||
monitoring: {
|
||||
title: '查看运行日志',
|
||||
description:
|
||||
'打开标题旁的“运行日志”,查看历史对话、处理过程和错误,排查回复异常。',
|
||||
},
|
||||
save: {
|
||||
title: '保存并接入机器人',
|
||||
description:
|
||||
'保存配置后,在机器人的事件路由中,将“收到消息”交给这条流水线处理。',
|
||||
},
|
||||
},
|
||||
pluginProcessor: {
|
||||
select: {
|
||||
title: '选择插件运行器',
|
||||
description:
|
||||
'选择支持事件处理的运行器。可处理的事件和处理逻辑由插件作者预先声明。',
|
||||
},
|
||||
parameters: {
|
||||
title: '配置插件参数',
|
||||
description:
|
||||
'按照插件提供的配置项填写业务参数。同一插件可以保存多份配置,用于不同机器人或场景。',
|
||||
},
|
||||
debug: {
|
||||
title: '测试插件处理逻辑',
|
||||
},
|
||||
logs: {
|
||||
title: '查看处理结果',
|
||||
description:
|
||||
'查看每次运行的状态、输入事件、插件日志和调用结果,排查失败原因。',
|
||||
},
|
||||
save: {
|
||||
title: '保存并绑定机器人',
|
||||
description:
|
||||
'保存后,到机器人页面的“插件处理器”板块添加这份配置。它会自动接收插件声明的事件,无需逐条配置事件路由。',
|
||||
},
|
||||
},
|
||||
previous: '上一步',
|
||||
label: '使用指引',
|
||||
progress: '第 {{current}} 步,共 {{total}} 步',
|
||||
next: '下一步',
|
||||
finish: '完成引导',
|
||||
finish: '完成指引',
|
||||
skip: '跳过',
|
||||
bot: {
|
||||
connection: {
|
||||
title: '选择接入方式',
|
||||
description:
|
||||
'从该适配器支持的方式中选择一种,相关适配器参数会自动同步。',
|
||||
requirement: '请选择 Webhook 或长连接后继续。',
|
||||
description: '选择适配器支持的接入方式,下方会显示对应的平台参数。',
|
||||
},
|
||||
basic: {
|
||||
title: '填写机器人信息',
|
||||
description: '使用容易识别的名称,便于之后在事件路由和日志中快速找到。',
|
||||
requirement: '请先填写机器人名称。',
|
||||
},
|
||||
adapter: {
|
||||
title: '选择平台适配器',
|
||||
description:
|
||||
'选择机器人使用的平台适配器;接入方式和平台参数将在创建后配置。',
|
||||
requirement: '请选择一个适配器。',
|
||||
},
|
||||
parameters: {
|
||||
title: '配置平台参数',
|
||||
description:
|
||||
'填写凭据和平台参数;需要在平台侧创建的配置可按适配器文档操作。',
|
||||
requirement: '请填写当前可见的全部必填参数。',
|
||||
action: '打开适配器文档',
|
||||
'填写平台凭据和连接参数。平台侧的配置步骤可查看适配器文档。',
|
||||
action: '查看适配器文档',
|
||||
},
|
||||
routing: {
|
||||
title: '设置事件路由',
|
||||
@@ -98,34 +163,32 @@ const zhHans = {
|
||||
},
|
||||
basic: {
|
||||
title: '填写处理器信息',
|
||||
description: '先设置容易识别的名称,创建后再配置 Runner、事件和工具。',
|
||||
requirement: '请先填写处理器名称。',
|
||||
description: '先设置容易识别的名称,创建后再配置运行器、事件和工具。',
|
||||
},
|
||||
submit: {
|
||||
title: '创建并继续配置',
|
||||
description:
|
||||
'创建后继续完成该类型处理器所需的 Runner、参数、事件和工具设置。',
|
||||
'创建后继续完成该类型处理器所需的运行器、参数、事件和工具设置。',
|
||||
},
|
||||
},
|
||||
runner: {
|
||||
debug: {
|
||||
title: '测试事件处理',
|
||||
},
|
||||
select: {
|
||||
title: '选择或安装 Runner',
|
||||
title: '选择或安装运行器',
|
||||
description:
|
||||
'选择已安装的 Runner,也可以直接在此选择器的市场列表中安装。',
|
||||
requirement: '请选择一个可用的 Runner。',
|
||||
action: '浏览 Runner 市场',
|
||||
'选择已安装的运行器,或在下拉列表中安装市场里的运行器插件。',
|
||||
action: '浏览运行器市场',
|
||||
},
|
||||
parameters: {
|
||||
title: '配置 Runner 参数',
|
||||
description:
|
||||
'按照所选 Runner 的定义填写模型、凭据、服务地址和其他参数。',
|
||||
requirement: '请填写当前可见的全部必填参数。',
|
||||
title: '配置运行器参数',
|
||||
description: '填写所选运行器需要的模型、凭据、服务地址等参数。',
|
||||
},
|
||||
events: {
|
||||
title: '设置事件和工具',
|
||||
description:
|
||||
'打开“事件和工具”,选择 Agent 可接收的事件以及允许使用的平台或主机工具。',
|
||||
requirement: '请打开“事件和工具”页签以完成引导。',
|
||||
'打开“事件和工具”,选择 Agent 可接收的事件,以及允许调用的工具。',
|
||||
},
|
||||
},
|
||||
knowledge: {
|
||||
@@ -133,23 +196,20 @@ const zhHans = {
|
||||
title: '填写知识库信息',
|
||||
description:
|
||||
'设置容易识别的名称和可选描述,然后选择知识的存储与检索引擎。',
|
||||
requirement: '请先填写知识库名称。',
|
||||
},
|
||||
engine: {
|
||||
title: '确认知识引擎',
|
||||
description: '确认该知识库使用的引擎,并在下方配置引擎参数和检索方式。',
|
||||
requirement: '请选择一个知识引擎。',
|
||||
description:
|
||||
'查看当前知识库使用的引擎。下方可继续配置引擎参数和检索方式。',
|
||||
action: '浏览知识引擎市场',
|
||||
},
|
||||
parameters: {
|
||||
title: '配置引擎参数',
|
||||
description: '填写该引擎要求的存储、模型、凭据或外部服务设置。',
|
||||
requirement: '请填写当前可见的全部必填参数。',
|
||||
},
|
||||
retrieval: {
|
||||
title: '配置检索方式',
|
||||
description: '设置引擎如何搜索内容,以及如何把相关结果返回给处理器。',
|
||||
requirement: '请填写当前可见的全部必填检索参数。',
|
||||
},
|
||||
save: {
|
||||
title: '保存知识库配置',
|
||||
|
||||
+545
-37
@@ -2,77 +2,150 @@ import pipelineMigration from './pipeline-migration/zh-Hant';
|
||||
|
||||
const zhHant = {
|
||||
sidebarGuide: {
|
||||
label: '工作台導覽',
|
||||
progress: '第 {{current}} 項,共 {{total}} 項',
|
||||
confirm: '我知道了',
|
||||
finish: '完成導覽',
|
||||
steps: {
|
||||
monitoring: {
|
||||
title: '儀表板',
|
||||
title: '查看執行概況',
|
||||
description: '集中查看機器人活動、模型呼叫、訊息量和系統運行情況。',
|
||||
},
|
||||
bots: {
|
||||
title: '機器人',
|
||||
title: '連接聊天平台',
|
||||
description: '連接聊天平台,並在這裡建立和管理每一個機器人。',
|
||||
},
|
||||
pipelines: {
|
||||
title: '處理器',
|
||||
title: '配置處理器',
|
||||
description:
|
||||
'建立可重複使用的 AI 流程、代理和事件處理器,為機器人提供能力。',
|
||||
'建立可重複使用的流水線、Agent 和插件處理器配置,再將它們接入機器人。',
|
||||
},
|
||||
knowledge: {
|
||||
title: '知識庫',
|
||||
title: '管理知識庫',
|
||||
description:
|
||||
'管理文件和外部知識來源,協助模型產生更準確、更符合業務的回覆。',
|
||||
},
|
||||
plugins: {
|
||||
title: '已安裝擴充功能',
|
||||
title: '管理已安裝擴充',
|
||||
description: '管理已安裝的外掛、MCP 服務和技能,並查看它們的運行狀態。',
|
||||
},
|
||||
'add-extension': {
|
||||
title: '新增擴充功能',
|
||||
title: '新增擴充',
|
||||
description: '從擴充功能市集、GitHub 或本機安裝包為 LangBot 新增能力。',
|
||||
},
|
||||
models: {
|
||||
title: '模型設定',
|
||||
title: '配置模型',
|
||||
description:
|
||||
'設定模型供應商,以及 LangBot 使用的語言模型、嵌入模型等。',
|
||||
},
|
||||
'api-integration': {
|
||||
title: 'API 整合',
|
||||
title: '配置 API 存取',
|
||||
description:
|
||||
'建立 API 金鑰,並設定外部系統存取 LangBot 服務和 MCP 的方式。',
|
||||
},
|
||||
},
|
||||
},
|
||||
guidedTour: {
|
||||
label: '設定引導',
|
||||
eventDebugDescription:
|
||||
'選擇支援的事件並填寫測試資料,執行後查看輸出和工具呼叫結果。平台操作僅模擬執行,模型和其他工具依實際配置執行。',
|
||||
|
||||
skip: '跳過',
|
||||
|
||||
pipeline: {
|
||||
trigger: {
|
||||
title: '選擇要回覆的訊息',
|
||||
description:
|
||||
'流水線只處理訊息事件,並由 AI 自動回覆。在這裡設定群聊觸發方式、私聊規則和訊息過濾條件。',
|
||||
},
|
||||
ai: {
|
||||
title: '設定 AI 能力',
|
||||
description:
|
||||
'選擇本地運行器或外部平台運行器,再依所選運行器設定模型、提示詞、知識庫等參數。',
|
||||
},
|
||||
output: {
|
||||
title: '調整回覆方式',
|
||||
description:
|
||||
'設定長文字處理等輸出規則,決定 AI 產生的內容如何傳送給使用者。',
|
||||
},
|
||||
safety: {
|
||||
title: '設定安全控制',
|
||||
description: '按需啟用內容過濾和速率限制,控制訊息內容與處理頻率。',
|
||||
},
|
||||
extensions: {
|
||||
title: '選擇可用擴充',
|
||||
description:
|
||||
'選擇這條流水線可使用的插件、MCP 服務和技能,擴充訊息處理與工具能力。',
|
||||
},
|
||||
basic: {
|
||||
title: '管理流水線',
|
||||
description: '複製目前流水線以建立其他設定,或刪除不再需要的流水線。',
|
||||
},
|
||||
debug: {
|
||||
title: '測試對話效果',
|
||||
description:
|
||||
'傳送測試訊息,檢查觸發規則、AI 回覆和輸出處理是否符合預期;修改設定後,測試前會先儲存。',
|
||||
},
|
||||
monitoring: {
|
||||
title: '查看執行日誌',
|
||||
description:
|
||||
'開啟標題旁的「執行日誌」,查看歷史對話、處理過程和錯誤,排查回覆異常。',
|
||||
},
|
||||
save: {
|
||||
title: '儲存並接入機器人',
|
||||
description:
|
||||
'儲存設定後,在機器人的事件路由中,將「收到訊息」交給這條流水線處理。',
|
||||
},
|
||||
},
|
||||
pluginProcessor: {
|
||||
select: {
|
||||
title: '選擇插件運行器',
|
||||
description:
|
||||
'選擇支援事件處理的運行器。它處理哪些事件、執行什麼邏輯,由插件作者預先宣告。',
|
||||
},
|
||||
parameters: {
|
||||
title: '配置插件參數',
|
||||
description:
|
||||
'依照插件提供的設定項目填寫業務參數。同一插件可以儲存多份設定,用於不同機器人或情境。',
|
||||
},
|
||||
debug: {
|
||||
title: '測試插件處理邏輯',
|
||||
},
|
||||
logs: {
|
||||
title: '查看處理結果',
|
||||
description:
|
||||
'這裡記錄每次執行的狀態、輸入事件、插件日誌和呼叫結果,可用於排查失敗原因。',
|
||||
},
|
||||
save: {
|
||||
title: '儲存並綁定機器人',
|
||||
description:
|
||||
'儲存後,到機器人頁面的「插件處理器」區塊新增這份設定。它會自動接收插件宣告的事件,無需逐條設定事件路由。',
|
||||
},
|
||||
},
|
||||
previous: '上一步',
|
||||
label: '使用指引',
|
||||
progress: '第 {{current}} 步,共 {{total}} 步',
|
||||
next: '下一步',
|
||||
finish: '完成引導',
|
||||
finish: '完成指引',
|
||||
bot: {
|
||||
save: {
|
||||
title: '儲存機器人配置',
|
||||
description: '確認接入參數和事件路由後儲存;準備完成後即可啟用機器人。',
|
||||
},
|
||||
|
||||
connection: {
|
||||
title: '選擇接入方式',
|
||||
description:
|
||||
'從此適配器支援的方式中選擇一種,相關適配器參數會自動同步。',
|
||||
requirement: '請選擇 Webhook 或長連線後繼續。',
|
||||
},
|
||||
basic: {
|
||||
title: '填寫機器人資訊',
|
||||
description: '使用容易辨識的名稱,方便之後在事件路由和日誌中找到。',
|
||||
requirement: '請先填寫機器人名稱。',
|
||||
},
|
||||
adapter: {
|
||||
title: '選擇平台適配器',
|
||||
description:
|
||||
'先選擇平台,LangBot 會再判斷此適配器支援 Webhook、長連線或兩者皆支援。',
|
||||
requirement: '請選擇一個適配器。',
|
||||
},
|
||||
parameters: {
|
||||
title: '設定平台參數',
|
||||
description: '填寫憑證和平台參數;平台端的設定請依適配器文件操作。',
|
||||
requirement: '請填寫目前可見的所有必填參數。',
|
||||
action: '開啟適配器文件',
|
||||
action: '查看適配器文件',
|
||||
},
|
||||
routing: {
|
||||
title: '設定事件路由',
|
||||
@@ -92,55 +165,54 @@ const zhHant = {
|
||||
},
|
||||
basic: {
|
||||
title: '填寫處理器資訊',
|
||||
description: '先設定容易辨識的名稱,建立後再設定 Runner、事件和工具。',
|
||||
requirement: '請先填寫處理器名稱。',
|
||||
description: '先設定容易辨識的名稱,建立後再設定運行器、事件和工具。',
|
||||
},
|
||||
submit: {
|
||||
title: '建立並繼續設定',
|
||||
description: '建立後繼續完成此處理器所需的 Runner、參數、事件和工具。',
|
||||
description: '建立後繼續完成此處理器所需的運行器、參數、事件和工具。',
|
||||
},
|
||||
},
|
||||
runner: {
|
||||
debug: {
|
||||
title: '測試事件處理',
|
||||
},
|
||||
select: {
|
||||
title: '選擇或安裝 Runner',
|
||||
description:
|
||||
'選擇已安裝的 Runner,也可以直接從選擇器中的市集清單安裝。',
|
||||
requirement: '請選擇一個可用的 Runner。',
|
||||
action: '瀏覽 Runner 市集',
|
||||
title: '選擇或安裝運行器',
|
||||
description: '選擇已安裝的運行器,也可以直接從選擇器中的市集清單安裝。',
|
||||
action: '瀏覽運行器市集',
|
||||
},
|
||||
parameters: {
|
||||
title: '設定 Runner 參數',
|
||||
description: '依所選 Runner 的定義填寫模型、憑證、服務位址和其他參數。',
|
||||
requirement: '請填寫目前可見的所有必填參數。',
|
||||
title: '設定運行器參數',
|
||||
description: '依所選運行器的定義填寫模型、憑證、服務位址和其他參數。',
|
||||
},
|
||||
events: {
|
||||
title: '設定事件和工具',
|
||||
description:
|
||||
'開啟「事件和工具」,選擇 Agent 可接收的事件與可使用的工具。',
|
||||
requirement: '請開啟「事件和工具」頁籤以完成引導。',
|
||||
'開啟「事件和工具」,選擇 Agent 可接收的事件,以及允許呼叫的工具。',
|
||||
},
|
||||
},
|
||||
knowledge: {
|
||||
save: {
|
||||
title: '儲存知識庫配置',
|
||||
description: '確認引擎參數和檢索設置後儲存配置。',
|
||||
},
|
||||
|
||||
basic: {
|
||||
title: '填寫知識庫資訊',
|
||||
description: '設定容易辨識的名稱和選填說明,再選擇儲存與檢索引擎。',
|
||||
requirement: '請先填寫知識庫名稱。',
|
||||
},
|
||||
engine: {
|
||||
title: '選擇或安裝知識引擎',
|
||||
description: '選擇已安裝的知識引擎,也可以從選擇器的市集區域直接安裝。',
|
||||
requirement: '請選擇一個知識引擎。',
|
||||
action: '瀏覽知識引擎市集',
|
||||
},
|
||||
parameters: {
|
||||
title: '設定引擎參數',
|
||||
description: '填寫此引擎要求的儲存、模型、憑證或外部服務設定。',
|
||||
requirement: '請填寫目前可見的所有必填參數。',
|
||||
},
|
||||
retrieval: {
|
||||
title: '設定檢索方式',
|
||||
description: '設定引擎如何搜尋內容,以及如何將相關結果傳回處理器。',
|
||||
requirement: '請填寫目前可見的所有必填檢索參數。',
|
||||
},
|
||||
submit: {
|
||||
title: '建立知識庫',
|
||||
@@ -164,6 +236,14 @@ const zhHant = {
|
||||
editionCloud: 'Cloud',
|
||||
},
|
||||
common: {
|
||||
loadFailed: '載入失敗,請重試。',
|
||||
showSecret: '顯示密鑰',
|
||||
hideSecret: '隱藏密鑰',
|
||||
editBasicInfo: '編輯基本資訊',
|
||||
editBasicInfoDescription: '修改名稱、描述和圖標。',
|
||||
editBasicInfoDescriptionNoIcon: '修改名稱和描述。',
|
||||
management: '管理',
|
||||
|
||||
customValue: '自訂',
|
||||
login: '登入',
|
||||
logout: '登出',
|
||||
@@ -525,6 +605,179 @@ const zhHant = {
|
||||
"Uses the Workspace owner's LangBot Account billing and credits.",
|
||||
},
|
||||
bots: {
|
||||
eventBindings: '事件路由',
|
||||
addEventBinding: '添加路由',
|
||||
addBehavior: '添加行爲',
|
||||
commonScenarios: '常用場景',
|
||||
dragEventRoute: '拖動第 {{index}} 條路由',
|
||||
behaviorReplyMessages: '回覆收到的訊息',
|
||||
behaviorReplyMessagesDescription: '把收到的訊息交給處理器。',
|
||||
behaviorWelcomeMembers: '歡迎新成員',
|
||||
behaviorWelcomeMembersDescription: '有人加入羣組時運行處理器。',
|
||||
behaviorHandleDepartures: '處理成員離羣',
|
||||
behaviorHandleDeparturesDescription: '有人離開或被移出羣組時運行處理器。',
|
||||
behaviorReviewFriendRequests: '審核好友請求',
|
||||
behaviorReviewFriendRequestsDescription: '把新的好友請求交給處理器。',
|
||||
behaviorHandleModeration: '處理羣管理事件',
|
||||
behaviorHandleModerationDescription: '羣成員受到限制時運行處理器。',
|
||||
behaviorCustom: '配置其他事件',
|
||||
behaviorCustomDescription: '添加路由,並從此適配器支持的全部事件中選擇。',
|
||||
eventPattern: '事件',
|
||||
eventPatternPlaceholder: '選擇事件',
|
||||
targetType: '目標類型',
|
||||
target: '處理器',
|
||||
targetAgent: 'Agent',
|
||||
targetPipeline: 'Pipeline',
|
||||
targetDiscard: '丟棄',
|
||||
selectTarget: '選擇處理器',
|
||||
searchTarget: '搜索處理器…',
|
||||
noTargetFound: '未找到兼容處理器',
|
||||
priority: '優先級',
|
||||
enabled: '啟用',
|
||||
eventBindingDescriptionPlaceholder: '規則說明',
|
||||
noEventBindings: '暫無事件路由',
|
||||
unsupportedPipelineEvent: 'Pipeline 僅可用於 message.* 事件',
|
||||
disable: '禁用',
|
||||
enable: '啟用',
|
||||
disabledBindings: '已禁用',
|
||||
adapterEventsTitle: '支持的事件',
|
||||
adapterEventsDescription: '共 {{count}} 類',
|
||||
adapterEventsMore: '另有 {{count}} 類',
|
||||
advancedEventValues: '查看全部',
|
||||
eventGroup: '事件組',
|
||||
eventGroupNames: {
|
||||
bot: '機器人狀態',
|
||||
feedback: '反饋',
|
||||
friend: '好友',
|
||||
group: '羣組',
|
||||
message: '訊息',
|
||||
platform: '平臺',
|
||||
},
|
||||
routeConflictTitle: '部分路由存在覆蓋衝突',
|
||||
routeConflictShadowed:
|
||||
'{{shadowed}} 可能永遠不會運行,因爲 {{winner}} 會先處理相同事件。',
|
||||
routeConflictMore: '另有 {{count}} 個路由衝突需要處理。',
|
||||
routeFallbackCatchAll: '{{route}} 是兜底路由。',
|
||||
routeFallbackIgnored:
|
||||
'未命中任何路由的事件會被忽略。只有需要爲每個事件指定結果時,才添加全局兜底路由。',
|
||||
testRoute: '檢查路由',
|
||||
adapterEventDebugTitle: '平臺事件調試',
|
||||
adapterEventDebugDescription:
|
||||
'在 {{platform}} 中觸發事件,適配器收到後會顯示在這裏。',
|
||||
adapterEventObserveOnly:
|
||||
'此視窗只負責觀察;收到的事件仍會按當前路由正常處理。',
|
||||
adapterEventPreparing: '準備中',
|
||||
adapterEventListening: '正在監聽',
|
||||
adapterEventListenerUnavailable: '監聽已中斷',
|
||||
adapterEventLoadFailed:
|
||||
'無法讀取平臺事件。請確認機器人正在運行,然後稍後重試。',
|
||||
adapterEventReceivedCount: '已收到 {{count}} 個事件',
|
||||
adapterEventClear: '清空',
|
||||
adapterEventEmptyTitle: '等待平臺事件',
|
||||
adapterEventEmptyDescription: '請在 {{platform}} 中發送訊息或觸發事件。',
|
||||
adapterEventData: '查看事件資料',
|
||||
adapterEventNeedsSavedBot: '請先儲存機器人後再監聽平臺事件。',
|
||||
adapterEventCurrentPlatform: '當前平臺',
|
||||
adapterConfigurationTest: '適配器測試',
|
||||
adapterConfigurationTestDescription:
|
||||
'請先儲存並啟用機器人,再到當前平臺觸發事件,確認這組配置是否已經生效。',
|
||||
refreshRouteStatus: '刷新狀態',
|
||||
routeStatusIdle: '暫無運行記錄',
|
||||
routeStatusRefreshFailed: '刷新路由狀態失敗。',
|
||||
routeStatus: {
|
||||
matched: '已命中',
|
||||
delivered: '已投遞',
|
||||
discarded: '已丟棄',
|
||||
failed: '失敗',
|
||||
not_matched: '未命中',
|
||||
},
|
||||
routeStatusDetail: {
|
||||
matched: '此路由已命中事件。',
|
||||
delivered: '處理器已收到事件。',
|
||||
discarded: '此事件已按路由配置丟棄。',
|
||||
failed: '此路由未能完成。',
|
||||
not_matched: '沒有已配置路由命中此事件。',
|
||||
},
|
||||
routeFailure: {
|
||||
binding_disabled: '此路由已禁用。',
|
||||
event_pattern_mismatch: '事件與此路由不匹配。',
|
||||
filters_mismatch: '示例資料不滿足路由條件。',
|
||||
lower_priority: '另一條命中路由的優先級更高。',
|
||||
route_not_found: '沒有路由命中此事件。',
|
||||
processor_incompatible: '所選處理器無法處理此事件。',
|
||||
processor_not_found: '所選處理器不可用。',
|
||||
runner_failed: '運行器處理事件時失敗。',
|
||||
delivery_failed: '處理器已完成,但結果投遞失敗。',
|
||||
},
|
||||
dryRunTitle: '檢查事件路由',
|
||||
dryRunDescription: '選擇事件,查看它會匹配哪條路由、交給哪個處理器。',
|
||||
dryRunEventType: '事件類型',
|
||||
dryRunSampleReady: '示例事件已準備好',
|
||||
dryRunSampleDescription:
|
||||
'LangBot 已爲“{{event}}”準備示例資料,大多數路由測試可直接使用。',
|
||||
dryRunEditPayload: '測試資料',
|
||||
dryRunHidePayload: '收起資料',
|
||||
dryRunPayload: '測試資料(JSON)',
|
||||
dryRunPayloadHint: '用於測試訊息內容、會話類型等條件。',
|
||||
dryRunPayloadJsonError: '請輸入合法 JSON。',
|
||||
dryRunPayloadObjectError: '載荷必須是 JSON 對象。',
|
||||
dryRunNeedsSavedBot: '請先儲存機器人後再檢查路由。',
|
||||
dryRunFailed: '無法檢查路由,請稍後重試。',
|
||||
dryRunAction: '查看匹配結果',
|
||||
dryRunRunning: '檢查中…',
|
||||
dryRunMatched: '已命中路由',
|
||||
dryRunNotMatched: '未命中路由',
|
||||
dryRunTarget: '目標處理器',
|
||||
dryRunNoTarget: '無目標',
|
||||
dryRunMatchedRule: '命中規則',
|
||||
dryRunRuleIndex: '第 {{index}} 條路由',
|
||||
dryRunNoRule: '無命中規則',
|
||||
dryRunDiagnostics: '診斷步驟',
|
||||
dryRunDiagnosticSelected: '已選擇{{route}}。',
|
||||
dryRunDiagnosticMatched: '{{route}}已命中。{{reason}}',
|
||||
dryRunDiagnosticSkipped: '{{route}}已跳過。{{reason}}',
|
||||
eventCustom: '自定義事件',
|
||||
eventDescriptions: {
|
||||
all: '匹配此適配器收到的全部事件。',
|
||||
namespace: '匹配所有{{group}}事件。',
|
||||
namespace_bot: '匹配機器人入羣、退羣、禁言和解除禁言等狀態事件。',
|
||||
namespace_feedback: '匹配平臺或使用者反饋事件。',
|
||||
namespace_friend: '匹配好友請求、好友添加成功等好友關係事件。',
|
||||
namespace_group: '匹配成員加入、離開或被移出羣組等羣組成員事件。',
|
||||
namespace_message: '匹配訊息接收、編輯、刪除和表態事件。',
|
||||
namespace_platform: '匹配適配器提供的平臺專屬事件。',
|
||||
custom: '自定義或暫未提供說明的事件。',
|
||||
message_received: '使用者或羣組向機器人發送新訊息。',
|
||||
message_edited: '平臺通知已有訊息內容發生變更。',
|
||||
message_deleted: '平臺通知已有訊息被刪除。',
|
||||
message_reaction: '使用者對訊息添加或移除表態。',
|
||||
feedback_received: '收到來自平臺或使用者的反饋事件。',
|
||||
friend_request_received: '有人請求添加機器人爲好友。',
|
||||
friend_added: '好友關係建立成功。',
|
||||
group_member_joined: '有成員加入機器人所在羣組。',
|
||||
group_member_left: '有成員離開機器人所在羣組。',
|
||||
group_member_banned: '羣成員被封禁或移出。',
|
||||
bot_invited_to_group: '機器人被邀請加入羣組。',
|
||||
bot_removed_from_group: '機器人被移出羣組。',
|
||||
bot_muted: '機器人在羣組中被禁言。',
|
||||
bot_unmuted: '機器人在羣組中解除禁言。',
|
||||
platform_specific: '適配器保留的平臺專屬事件。',
|
||||
},
|
||||
conditions: '觸發條件',
|
||||
conditionsDescription: '滿足所有條件時才觸發此綁定,不添加則無條件觸發。',
|
||||
conditionsEmpty: '無條件,始終觸發。',
|
||||
addFilter: '添加條件',
|
||||
filterChatType: '會話類型',
|
||||
filterChatId: '會話 ID',
|
||||
filterMessageText: '訊息文本',
|
||||
filterMessageElement: '訊息元素',
|
||||
operator_eq: '等於',
|
||||
operator_neq: '不等於',
|
||||
operator_contains: '包含',
|
||||
operator_not_contains: '不包含',
|
||||
operator_starts_with: '前綴匹配',
|
||||
operator_regex: '正則匹配',
|
||||
|
||||
eventWildcard: '全部事件',
|
||||
eventNamespaceWildcard: '{{namespace}}.*',
|
||||
eventNames: {
|
||||
@@ -726,6 +979,162 @@ const zhHant = {
|
||||
},
|
||||
},
|
||||
agents: {
|
||||
chooseType: '選擇處理方式',
|
||||
chooseTypeDescription: '先選擇處理器的工作方式,創建後可繼續完善配置。',
|
||||
diagramHint: '工作方式示意',
|
||||
agentDiagramTitle: 'Agent:自主判斷並行動',
|
||||
agentDiagramDescription:
|
||||
'Agent 可以接收多種平臺事件,結合模型和工具理解當前情況,並自主決定下一步動作。',
|
||||
pipelineDiagramTitle: 'Pipeline:按流程逐步處理',
|
||||
pipelineDiagramDescription:
|
||||
'Pipeline 只處理訊息事件,並嚴格按照你編排的固定步驟依次執行。',
|
||||
pipelineDiagramFlow: '訊息沿固定流程依次處理',
|
||||
diagramEvents: '平臺事件',
|
||||
diagramAgentCanUse: 'Agent 可使用',
|
||||
diagramMessages: '訊息',
|
||||
diagramMembers: '羣成員',
|
||||
diagramFeedback: '反饋',
|
||||
diagramDecide: '理解事件並決定下一步',
|
||||
diagramModel: '調用模型',
|
||||
diagramTools: '使用工具',
|
||||
diagramActions: '執行動作',
|
||||
diagramMessage: '收到訊息',
|
||||
diagramPreprocess: '預處理',
|
||||
diagramAI: 'AI 處理',
|
||||
diagramPostprocess: '後處理',
|
||||
diagramOutput: '輸出',
|
||||
eventsAndTools: '事件與工具',
|
||||
eventsAndToolsDescription: '設置觸發範圍和可用工具。',
|
||||
configuredEvents: '已添加事件',
|
||||
configuredEventsCount: '共 {{count}} 項',
|
||||
addEvent: '添加事件',
|
||||
removeEvent: '移除事件',
|
||||
eventActions: '已自動啟用的工具',
|
||||
eventToolEnabled: '已啟用',
|
||||
eventToolsEnabledCount: '已啟用 {{count}} 個工具',
|
||||
noEventActions: '該事件暫無可用動作。',
|
||||
noEventsConfigured: '暫未添加事件',
|
||||
noEventsConfiguredDescription: '此 Agent 不會被任何事件觸發。',
|
||||
noEventsConfiguredBadge: '未配置事件',
|
||||
apiTools: '工具權限',
|
||||
apiToolsDescription: '選擇 Agent 可以調用的工具。',
|
||||
otherTools: '其他工具',
|
||||
otherToolsDescription: '選擇平臺、沙盒、MCP、插件和技能工具。',
|
||||
apiToolsSelected: '已選 {{count}}',
|
||||
apiToolsSecurityHint: '只開放實際需要的工具。',
|
||||
apiToolsSearch: '搜索工具…',
|
||||
eventApiTools: '事件工具',
|
||||
eventToolUnavailable: '不適用',
|
||||
eventApiToolsDescription:
|
||||
'目標從當前事件凍結,Agent 只能提供動作參數,適合回覆、審核請求和處理相關成員。',
|
||||
platformApiTools: '平臺工具',
|
||||
platformApiToolsDescription:
|
||||
'Agent 可以指定使用者、羣組或訊息標識。請只按實際業務需要授權。',
|
||||
apiToolEvents: '適用事件',
|
||||
apiToolParameters: 'Agent 可填寫參數',
|
||||
apiToolSource: '來源',
|
||||
apiToolNoParameters: '無',
|
||||
sandboxTools: '沙盒',
|
||||
mcpTools: 'MCP',
|
||||
pluginTools: '插件',
|
||||
skillTools: '技能',
|
||||
langbotBuiltIn: 'LangBot',
|
||||
apiToolDetails: '詳情',
|
||||
apiToolHideDetails: '收起',
|
||||
apiToolsNoResults: '沒有匹配的 API 或工具',
|
||||
apiToolsCatalogUnavailable:
|
||||
'LangBot 主程序沒有返回 API 工具目錄。請確認後端已更新並重啟;該狀態不代表當前平臺沒有可用工具。',
|
||||
hostToolsCatalogUnavailable: '暫時無法載入工具目錄。',
|
||||
apiToolRisk: {
|
||||
read: '只讀',
|
||||
write: '操作',
|
||||
dangerous: '敏感',
|
||||
},
|
||||
runnerStatusLoading: '正在檢查運行器狀態',
|
||||
runnerStatusCheckFailed: '無法檢查運行器狀態',
|
||||
runnerStatusCheckFailedDescription:
|
||||
'請重試檢查;如果仍然失敗,請確認後端和插件運行時正常。',
|
||||
noRunnersAvailable: '沒有可用的運行器',
|
||||
noRunnersAvailableDescription: '請先安裝並啟用運行器擴展,再配置此 Agent。',
|
||||
installedRunners: '已安裝的運行器',
|
||||
marketplaceRunners: '插件市場中的運行器插件',
|
||||
viewMarketplace: '查看市場',
|
||||
restoringRunnerInstall: '正在恢復運行器插件安裝並等待運行器就緒…',
|
||||
noInstalledRunners: '尚未安裝任何運行器擴展。',
|
||||
installingRunner: '正在安裝 {{runner}}...',
|
||||
runnerInstallSuccess: '{{runner}} 已安裝,可從已安裝列表中選擇',
|
||||
selectedRunnerUnavailable: '所選運行器不可用',
|
||||
selectedRunnerUnavailableDescription:
|
||||
'{{runner}} 當前未註冊。請選擇其他運行器,或恢復對應擴展。',
|
||||
noRunnerSelected: '尚未選擇運行器',
|
||||
runnerConfigIncomplete: '運行器配置待完善',
|
||||
runnerConfigIncompleteDescription: '請填寫必填項:{{fields}}',
|
||||
runnerReady: '運行器已就緒',
|
||||
runnerReadyDescription: '{{runner}} 已註冊,插件運行時連線正常。',
|
||||
debugTab: '事件調試',
|
||||
debugTitle: 'Agent 事件調試',
|
||||
debugDescription: '用訊息或平臺事件直接運行當前 Agent,並查看真實輸出。',
|
||||
debugResetSession: '重置會話',
|
||||
debugEventType: '事件類型',
|
||||
debugNoEventsTitle: '暫無可調試事件',
|
||||
debugNoEventsDescription: '請先在事件與工具中添加一個事件。',
|
||||
debugMessageReceived: '收到訊息',
|
||||
debugGroupMemberJoined: '成員加入羣組',
|
||||
debugGroupMemberLeft: '成員離開羣組',
|
||||
debugFriendRequested: '收到好友請求',
|
||||
debugFeedbackReceived: '收到反饋',
|
||||
debugCustomEvent: '自定義事件',
|
||||
debugCustomEventType: '自定義事件名稱',
|
||||
debugMessageInput: '對話內容',
|
||||
debugEventSummary: '事件說明',
|
||||
debugInputPlaceholder: '輸入希望 Agent 處理的內容',
|
||||
debugEventPayload: '事件載荷(JSON)',
|
||||
debugSupportedEvents: 'Agent 支持',
|
||||
debugRun: '運行測試',
|
||||
debugSaveAndRun: '儲存並運行',
|
||||
debugRunning: '運行中',
|
||||
debugTranscript: '調試記錄',
|
||||
debugTranscriptDescription: '當前調試會話中的輸入與 Agent 輸出。',
|
||||
debugEmptyTitle: '在這裏驗證 Agent 的實際效果',
|
||||
debugEmptyTranscript:
|
||||
'選擇事件類型,填寫測試內容,然後點擊“運行測試”。結果只會顯示在這裏。',
|
||||
debugAgentOutput: 'Agent 輸出',
|
||||
debugReasoning: '思考內容',
|
||||
debugTextOutput: '文本輸出',
|
||||
debugPlatformNotice:
|
||||
'平臺工具使用 Mock:Agent 真實調用工具,回覆、發送等平臺動作模擬執行,不發送真實訊息。其他工具仍按實際配置執行。',
|
||||
debugToolSimulated: '模擬執行成功 · Mock',
|
||||
debugStop: '停止調試',
|
||||
debugMockOptions: 'Mock 場景(JSON)',
|
||||
debugInvalidMock: 'Mock 場景必須是有效的 JSON 對象。',
|
||||
debugToolMockFailed: '模擬執行失敗 · Mock',
|
||||
debugMockOptionsHelp:
|
||||
'預設模擬成功。errors 按工具名設置失敗原因,results 設置查詢結果,unsupported_apis 設置不支持的接口。例如:{"errors":{"event_reply":"模擬發送失敗"}}',
|
||||
debugCancelled: '已停止調試,保留停止前的執行記錄。',
|
||||
debugNoToolCalls: '未記錄到工具調用;生成文本不代表訊息已發送。',
|
||||
debugToolCount: '已記錄 {{count}} 次工具調用,執行狀態和結果見下方。',
|
||||
debugToolRunning: '執行中',
|
||||
debugToolCompleted: '已完成',
|
||||
debugToolFailed: '執行失敗',
|
||||
debugToolInterrupted: '未返回結果',
|
||||
debugToolArguments: '調用參數',
|
||||
debugToolResult: '執行結果',
|
||||
debugTestInput: '測試輸入',
|
||||
debugNoTextOutput: '運行完成,但沒有產生文本輸出。',
|
||||
debugEventTypeRequired: '請輸入事件類型',
|
||||
debugInputRequired: '請輸入對話內容',
|
||||
debugInvalidPayload: '事件載荷必須是有效的 JSON 對象',
|
||||
debugUnsupportedEvent: '這個事件不在當前 Agent 的可綁定事件範圍內',
|
||||
debugRunnerConfigInvalidDescription: '運行器配置不完整:{{message}}',
|
||||
debugRunnerExecutionFailedDescription:
|
||||
'本次運行失敗。請檢查所選模型和運行器配置後重試。',
|
||||
debugRunnerTimeoutDescription: '運行超時。請稍後重試或調整運行器超時時間。',
|
||||
debugApiKeyRequired: 'API Key 未填寫',
|
||||
debugOpenRunnerConfig: '前往運行器配置',
|
||||
debugReviewRunnerConfig: '檢查運行器配置',
|
||||
debugErrorDetails: '查看詳細錯誤',
|
||||
debugRunFailed: 'Agent 調試運行失敗',
|
||||
|
||||
monitoring: {
|
||||
description: '查看每次任務的觸發事件、模型輸出和工具執行過程。',
|
||||
empty: '尚無執行紀錄。觸發平台事件或執行除錯後,可在此查看。',
|
||||
@@ -1028,6 +1437,13 @@ const zhHant = {
|
||||
installFromGithubDesc: '從 GitHub Release 安裝插件',
|
||||
goToMarketplace: '前往外掛市場',
|
||||
installProgress: {
|
||||
updateTitle: '正在更新 {{name}}',
|
||||
checkingUpdate: '檢查最新版本',
|
||||
validating: '校驗插件包',
|
||||
applyingUpdate: '應用插件更新',
|
||||
activating: '啟動並刷新組件',
|
||||
updateComplete: '插件更新成功',
|
||||
|
||||
title: '正在安裝 {{name}}',
|
||||
titleGeneric: '外掛安裝',
|
||||
overallProgress: '整體進度',
|
||||
@@ -1056,6 +1472,11 @@ const zhHant = {
|
||||
uploadPluginOnly: '僅支援 .lbpkg 外掛包',
|
||||
},
|
||||
market: {
|
||||
runnerUsage: '運行器用途',
|
||||
runnerUsageAll: '全部',
|
||||
runnerUsageAgent: 'Agent / 流水線',
|
||||
runnerUsageEvent: '插件處理器',
|
||||
|
||||
searchPlaceholder: '搜尋插件...',
|
||||
searchPlaceholderCount: '搜尋 {{count}} 個擴展、能力或場景...',
|
||||
searchResults: '搜尋到 {{count}} 個擴展',
|
||||
@@ -1278,6 +1699,8 @@ const zhHant = {
|
||||
deleteMCPHint: '刪除後,此 MCP 伺服器設定將無法恢復。',
|
||||
},
|
||||
pipelines: {
|
||||
managementDescription: '複製或刪除此流水線。',
|
||||
|
||||
title: '流程線',
|
||||
description: '流程線定義了對訊息事件的處理流程,用於綁定到機器人',
|
||||
createPipeline: '建立流程線',
|
||||
@@ -1393,6 +1816,8 @@ const zhHant = {
|
||||
selectKnowledgeBases: '選擇知識庫',
|
||||
},
|
||||
debugDialog: {
|
||||
saveAndSend: '儲存併發送',
|
||||
|
||||
title: '流程線對話',
|
||||
selectPipeline: '選擇流程線',
|
||||
sessionType: '對話類型',
|
||||
@@ -1436,6 +1861,20 @@ const zhHant = {
|
||||
},
|
||||
},
|
||||
knowledge: {
|
||||
installedEngines: '已安裝的知識引擎',
|
||||
noInstalledEngines: '尚未安裝任何知識引擎插件。',
|
||||
marketplaceEngines: '插件市場中的知識引擎插件',
|
||||
noMarketplaceEngines: '暫無可安裝的知識引擎插件。',
|
||||
loadingEngineCatalog: '正在載入插件市場…',
|
||||
engineCatalogUnavailable: '插件市場暫時不可用,重新打開選擇器即可重試。',
|
||||
viewMarketplace: '查看市場',
|
||||
installingEngine: '正在安裝 {{engine}}…',
|
||||
engineInstallSuccess: '{{engine}} 已安裝,可從已安裝列表中選擇',
|
||||
engineInstallFailed: '知識引擎安裝失敗,請稍後重試。',
|
||||
engineVersionUnavailable: '該插件沒有可安裝的版本。',
|
||||
engineInstallTimeout: '安裝仍未完成,請稍後刷新頁面查看。',
|
||||
engineRegistrationTimeout: '插件已安裝,但知識引擎組件尚未就緒。',
|
||||
|
||||
title: '知識庫',
|
||||
createKnowledgeBase: '建立知識庫',
|
||||
selectFromSidebar: '從側邊欄選擇一個知識庫',
|
||||
@@ -1927,6 +2366,42 @@ const zhHant = {
|
||||
},
|
||||
},
|
||||
storageAnalysis: {
|
||||
notCreated: '尚未創建',
|
||||
processStorage: '各進程管理的存儲',
|
||||
processStorageDescription:
|
||||
'由每個運行時直接統計其負責的目錄;明細目錄已包含在上級目錄的總佔用中。',
|
||||
directory: '目錄',
|
||||
size: '佔用',
|
||||
files: '檔案數',
|
||||
runtimeUnavailable: '暫時無法獲取該運行時的存儲統計。',
|
||||
noManagedDirectories: '該進程未報告任何受管目錄。',
|
||||
scanWarnings: '{{count}} 項無法讀取',
|
||||
boxActivity: '{{sessions}} 個會話 · {{processes}} 個受管進程',
|
||||
statusLabels: {
|
||||
available: '統計正常',
|
||||
unavailable: '運行時未連線',
|
||||
disabled: '未啟用',
|
||||
not_applicable: '不適用',
|
||||
},
|
||||
sourceLabels: {
|
||||
local_process: '由 LangBot 主進程直接統計',
|
||||
runtime_rpc: '由運行時進程通過鑑權 RPC 直接統計',
|
||||
},
|
||||
scopeLabels: {
|
||||
runtime_host: '運行時宿主目錄',
|
||||
sandbox_sessions: '沙箱會話內部',
|
||||
},
|
||||
processNames: {
|
||||
langbot: 'LangBot 主程序',
|
||||
plugin_runtime: 'Plugin Runtime',
|
||||
box_runtime: 'Box Runtime',
|
||||
},
|
||||
processDescriptions: {
|
||||
langbot: '應用資料庫、日誌、上傳檔案、向量資料和主程序臨時檔案。',
|
||||
plugin_runtime: '插件包、校驗後的製品、依賴環境和安裝實例私有資料。',
|
||||
box_runtime: '沙箱工作區、MCP 進程工作區、附件交換目錄和技能目錄。',
|
||||
},
|
||||
|
||||
title: '儲存分析',
|
||||
description: '查看儲存占用和可清理檔案',
|
||||
openDialog: '查看分析',
|
||||
@@ -1952,6 +2427,21 @@ const zhHant = {
|
||||
noExpiredUploads: '暫無過期上傳檔案',
|
||||
noExpiredLogs: '暫無過期日誌',
|
||||
sectionNames: {
|
||||
legacy_plugins: '舊版插件包',
|
||||
artifacts: '已校驗插件製品',
|
||||
dependency_environments: '插件依賴環境',
|
||||
installations: '插件安裝實例資料',
|
||||
staging: '插件安裝暫存區',
|
||||
rpc_transfer: '運行時 RPC 傳輸檔案',
|
||||
workspace: '沙箱工作區',
|
||||
inbox: '輸入附件',
|
||||
outbox: '輸出附件',
|
||||
skills: '技能目錄',
|
||||
session_workspaces: '沙箱會話工作區',
|
||||
session_caches: '沙箱運行時緩存',
|
||||
session_temp: '沙箱臨時檔案',
|
||||
managed_process_workspaces: '受管進程工作區(包括 MCP)',
|
||||
|
||||
database: '資料庫',
|
||||
logs: '日誌',
|
||||
storage: '上傳檔案',
|
||||
@@ -2028,6 +2518,24 @@ const zhHant = {
|
||||
logsDescription: '監控機器人活動,確認平台連接是否正常運作。',
|
||||
},
|
||||
aiEngine: {
|
||||
loadingCatalog: '正在載入運行器擴展...',
|
||||
catalogUnavailable: '無法載入運行器目錄',
|
||||
catalogUnavailableDescription:
|
||||
'已安裝的運行器仍可使用。你可以重試,或前往擴展頁面查看。',
|
||||
noMarketplaceRunners: '暫無適用於此用途的運行器插件',
|
||||
noMarketplaceRunnersDescription: '可以使用已安裝的運行器,或稍後重試。',
|
||||
browseRunners: '瀏覽運行器擴展',
|
||||
installAndContinue: '安裝並繼續',
|
||||
installing: '正在安裝...',
|
||||
useInstalled: '使用此運行器',
|
||||
installedUnavailable: '已安裝,運行器不可用',
|
||||
installSuccess: '{{runner}} 已安裝並選中',
|
||||
installFailed: '運行器擴展安裝失敗',
|
||||
versionUnavailable: '擴展市場未返回可安裝版本。',
|
||||
installTimeout: '運行器安裝超時,請前往擴展頁面檢查任務。',
|
||||
registrationTimeout:
|
||||
'擴展已安裝,但運行器未完成註冊。請檢查插件運行時後重試。',
|
||||
|
||||
defaultModelUnavailable: '暫無可用的預設對話模型,請重試。',
|
||||
defaultRunnerUnavailable: '本地 Agent 尚未就緒,請重試。',
|
||||
preparingDefault: '正在準備預設 AI…',
|
||||
|
||||
Reference in New Issue
Block a user