- 添加 prompt_locale 参数支持简体中文、繁体中文和英文提示词本地化 - 移除内置 agents 配置以简化系统架构 - 更新 ContextBuilder 使用动态提示词模板而非硬编码内容 - 在 AgentLoop、Web 接口和 AgentService 中传递 locale 参数 - 添加输出语言指令确保用户界面内容按指定语言生成 - 扩展前端 LanguageSwitcher 组件支持三种语言选项 - 优化 Header 和侧边栏组件的响应式布局和文本截断处理 - 更新测试用例验证不同语言环境下的提示词正确性
68 lines
2.4 KiB
TypeScript
68 lines
2.4 KiB
TypeScript
'use client';
|
|
|
|
import { useAppI18n } from '@/lib/i18n/provider';
|
|
import { Badge } from '@/components/ui/badge';
|
|
import { cn } from '@/lib/utils';
|
|
import type { TaskRuntimeStatus } from '@/lib/task-runtime';
|
|
import { taskRuntimeStatusLabel } from '@/lib/task-runtime';
|
|
|
|
export function TaskRuntimeStatusBadge({
|
|
status,
|
|
className,
|
|
}: {
|
|
status: TaskRuntimeStatus;
|
|
className?: string;
|
|
}) {
|
|
const { locale } = useAppI18n();
|
|
|
|
return (
|
|
<Badge
|
|
variant="outline"
|
|
className={cn(
|
|
'border text-[11px]',
|
|
status === 'done' && 'border-[#B7C2B5] bg-[#E3E8E2] text-[#657162]',
|
|
status === 'running' && 'border-[#BCC4CE] bg-[#E4E7EB] text-[#697281]',
|
|
status === 'waiting' && 'border-[#B8AEA8] bg-[#E7E2DE] text-[#5F5550]',
|
|
status === 'blocked' && 'border-[#B8AEA8] bg-[#E7E2DE] text-[#5F5550]',
|
|
status === 'queued' && 'border-[#D8D2CE] bg-[#ECE8E5] text-[#4F4642]',
|
|
status === 'error' && 'border-[#B8AEA8] bg-[#E7E2DE] text-[#342E2B]',
|
|
status === 'cancelled' && 'border-[#D8D2CE] bg-[#ECE8E5] text-[#6A5E58]',
|
|
className
|
|
)}
|
|
>
|
|
{taskRuntimeStatusLabel(status, locale)}
|
|
</Badge>
|
|
);
|
|
}
|
|
|
|
export function formatTaskRuntimeTime(value?: string | null, locale: string = 'zh-CN'): string {
|
|
if (!value) return '-';
|
|
const date = new Date(value);
|
|
if (Number.isNaN(date.getTime())) return value;
|
|
return new Intl.DateTimeFormat(locale, {
|
|
month: '2-digit',
|
|
day: '2-digit',
|
|
hour: '2-digit',
|
|
minute: '2-digit',
|
|
}).format(date);
|
|
}
|
|
|
|
export function formatTaskRuntimeDuration(durationMs: number | null, locale: string = 'zh-CN'): string {
|
|
if (durationMs === null || durationMs < 0) return '-';
|
|
if (durationMs < 1000) return locale === 'en-US' ? '<1s' : '<1秒';
|
|
|
|
const seconds = Math.floor(durationMs / 1000);
|
|
const hours = Math.floor(seconds / 3600);
|
|
const minutes = Math.floor((seconds % 3600) / 60);
|
|
const remainingSeconds = seconds % 60;
|
|
|
|
if (hours > 0) return locale === 'en-US' ? `${hours}h ${minutes}m` : `${hours}小时 ${minutes}分`;
|
|
if (minutes > 0) return locale === 'en-US' ? `${minutes}m ${remainingSeconds}s` : `${minutes}分 ${remainingSeconds}秒`;
|
|
return locale === 'en-US' ? `${remainingSeconds}s` : `${remainingSeconds}秒`;
|
|
}
|
|
|
|
export function progressPercent(value: number | null, max: number | null): number {
|
|
if (value === null || max === null || max <= 0) return 0;
|
|
return Math.max(0, Math.min(100, Math.round((value / max) * 100)));
|
|
}
|