feat(i18n): replace hardcoded Chinese in frontend components with i18n calls
Replace all user-visible hardcoded Chinese strings in 7 component files with $t() / t() calls using vue-i18n: - Step1GraphBuild: ontology generation, graph build, status badges - Step2EnvSetup: simulation setup, agent personas, platform config, time config, initial activation, modal profile details - Step3Simulation: report generation button - Step4Report: section loading text, interaction button - Step5Interaction: chat interface, survey UI, tool descriptions, error messages, agent selection - GraphPanel: graph status hints, loading states, tooltips - HistoryDatabase: history cards, modal, replay buttons Added missing translation keys to both zh.json and en.json locale files. Added useI18n imports to components that need script-level translations.
This commit is contained in:
@@ -6,18 +6,18 @@
|
||||
<div class="card-header">
|
||||
<div class="step-info">
|
||||
<span class="step-num">01</span>
|
||||
<span class="step-title">模拟实例初始化</span>
|
||||
<span class="step-title">{{ $t('step2.simInstanceInit') }}</span>
|
||||
</div>
|
||||
<div class="step-status">
|
||||
<span v-if="phase > 0" class="badge success">已完成</span>
|
||||
<span v-else class="badge processing">初始化</span>
|
||||
<span v-if="phase > 0" class="badge success">{{ $t('common.completed') }}</span>
|
||||
<span v-else class="badge processing">{{ $t('step2.initializing') }}</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="card-content">
|
||||
<p class="api-note">POST /api/simulation/create</p>
|
||||
<p class="description">
|
||||
新建simulation实例,拉取模拟世界参数模版
|
||||
{{ $t('step2.simInstanceDesc') }}
|
||||
</p>
|
||||
|
||||
<div v-if="simulationId" class="info-card">
|
||||
@@ -35,7 +35,7 @@
|
||||
</div>
|
||||
<div class="info-row">
|
||||
<span class="info-label">Task ID</span>
|
||||
<span class="info-value mono">{{ taskId || '异步任务已完成' }}</span>
|
||||
<span class="info-value mono">{{ taskId || $t('step2.asyncTaskDone') }}</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -46,41 +46,41 @@
|
||||
<div class="card-header">
|
||||
<div class="step-info">
|
||||
<span class="step-num">02</span>
|
||||
<span class="step-title">生成 Agent 人设</span>
|
||||
<span class="step-title">{{ $t('step2.generateAgentPersona') }}</span>
|
||||
</div>
|
||||
<div class="step-status">
|
||||
<span v-if="phase > 1" class="badge success">已完成</span>
|
||||
<span v-if="phase > 1" class="badge success">{{ $t('common.completed') }}</span>
|
||||
<span v-else-if="phase === 1" class="badge processing">{{ prepareProgress }}%</span>
|
||||
<span v-else class="badge pending">等待</span>
|
||||
<span v-else class="badge pending">{{ $t('common.pending') }}</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="card-content">
|
||||
<p class="api-note">POST /api/simulation/prepare</p>
|
||||
<p class="description">
|
||||
结合上下文,自动调用工具从知识图谱梳理实体与关系,初始化模拟个体,并基于现实种子赋予他们独特的行为与记忆
|
||||
{{ $t('step2.generateAgentPersonaDesc') }}
|
||||
</p>
|
||||
|
||||
<!-- Profiles Stats -->
|
||||
<div v-if="profiles.length > 0" class="stats-grid">
|
||||
<div class="stat-card">
|
||||
<span class="stat-value">{{ profiles.length }}</span>
|
||||
<span class="stat-label">当前Agent数</span>
|
||||
<span class="stat-label">{{ $t('step2.currentAgentCount') }}</span>
|
||||
</div>
|
||||
<div class="stat-card">
|
||||
<span class="stat-value">{{ expectedTotal || '-' }}</span>
|
||||
<span class="stat-label">预期Agent总数</span>
|
||||
<span class="stat-label">{{ $t('step2.expectedAgentTotal') }}</span>
|
||||
</div>
|
||||
<div class="stat-card">
|
||||
<span class="stat-value">{{ totalTopicsCount }}</span>
|
||||
<span class="stat-label">现实种子当前关联话题数</span>
|
||||
<span class="stat-label">{{ $t('step2.relatedTopicsCount') }}</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Profiles List Preview -->
|
||||
<div v-if="profiles.length > 0" class="profiles-preview">
|
||||
<div class="preview-header">
|
||||
<span class="preview-title">已生成的 Agent 人设</span>
|
||||
<span class="preview-title">{{ $t('step2.generatedAgentPersonas') }}</span>
|
||||
</div>
|
||||
<div class="profiles-list">
|
||||
<div
|
||||
@@ -94,9 +94,9 @@
|
||||
<span class="profile-username">@{{ profile.name || `agent_${idx}` }}</span>
|
||||
</div>
|
||||
<div class="profile-meta">
|
||||
<span class="profile-profession">{{ profile.profession || '未知职业' }}</span>
|
||||
<span class="profile-profession">{{ profile.profession || $t('step2.unknownProfession') }}</span>
|
||||
</div>
|
||||
<p class="profile-bio">{{ profile.bio || '暂无简介' }}</p>
|
||||
<p class="profile-bio">{{ profile.bio || $t('step2.noBio') }}</p>
|
||||
<div v-if="profile.interested_topics?.length" class="profile-topics">
|
||||
<span
|
||||
v-for="topic in profile.interested_topics.slice(0, 3)"
|
||||
@@ -118,19 +118,19 @@
|
||||
<div class="card-header">
|
||||
<div class="step-info">
|
||||
<span class="step-num">03</span>
|
||||
<span class="step-title">生成双平台模拟配置</span>
|
||||
<span class="step-title">{{ $t('step2.dualPlatformConfig') }}</span>
|
||||
</div>
|
||||
<div class="step-status">
|
||||
<span v-if="phase > 2" class="badge success">已完成</span>
|
||||
<span v-else-if="phase === 2" class="badge processing">生成中</span>
|
||||
<span v-else class="badge pending">等待</span>
|
||||
<span v-if="phase > 2" class="badge success">{{ $t('common.completed') }}</span>
|
||||
<span v-else-if="phase === 2" class="badge processing">{{ $t('step2.generating') }}</span>
|
||||
<span v-else class="badge pending">{{ $t('common.pending') }}</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="card-content">
|
||||
<p class="api-note">POST /api/simulation/prepare</p>
|
||||
<p class="description">
|
||||
LLM 根据模拟需求与现实种子,智能设置世界时间流速、推荐算法、每个个体的活跃时间段、发言频率、事件触发等参数
|
||||
{{ $t('step2.dualPlatformConfigDesc') }}
|
||||
</p>
|
||||
|
||||
<!-- Config Preview -->
|
||||
@@ -139,40 +139,40 @@
|
||||
<div class="config-block">
|
||||
<div class="config-grid">
|
||||
<div class="config-item">
|
||||
<span class="config-item-label">模拟时长</span>
|
||||
<span class="config-item-value">{{ simulationConfig.time_config?.total_simulation_hours || '-' }} 小时</span>
|
||||
<span class="config-item-label">{{ $t('step2.simulationDuration') }}</span>
|
||||
<span class="config-item-value">{{ simulationConfig.time_config?.total_simulation_hours || '-' }} {{ $t('common.hours') }}</span>
|
||||
</div>
|
||||
<div class="config-item">
|
||||
<span class="config-item-label">每轮时长</span>
|
||||
<span class="config-item-value">{{ simulationConfig.time_config?.minutes_per_round || '-' }} 分钟</span>
|
||||
<span class="config-item-label">{{ $t('step2.roundDuration') }}</span>
|
||||
<span class="config-item-value">{{ simulationConfig.time_config?.minutes_per_round || '-' }} {{ $t('common.minutes') }}</span>
|
||||
</div>
|
||||
<div class="config-item">
|
||||
<span class="config-item-label">总轮次</span>
|
||||
<span class="config-item-value">{{ Math.floor((simulationConfig.time_config?.total_simulation_hours * 60 / simulationConfig.time_config?.minutes_per_round)) || '-' }} 轮</span>
|
||||
<span class="config-item-label">{{ $t('step2.totalRounds') }}</span>
|
||||
<span class="config-item-value">{{ Math.floor((simulationConfig.time_config?.total_simulation_hours * 60 / simulationConfig.time_config?.minutes_per_round)) || '-' }} {{ $t('common.rounds') }}</span>
|
||||
</div>
|
||||
<div class="config-item">
|
||||
<span class="config-item-label">每小时活跃</span>
|
||||
<span class="config-item-label">{{ $t('step2.activePerHour') }}</span>
|
||||
<span class="config-item-value">{{ simulationConfig.time_config?.agents_per_hour_min }}-{{ simulationConfig.time_config?.agents_per_hour_max }}</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="time-periods">
|
||||
<div class="period-item">
|
||||
<span class="period-label">高峰时段</span>
|
||||
<span class="period-label">{{ $t('step2.peakHours') }}</span>
|
||||
<span class="period-hours">{{ simulationConfig.time_config?.peak_hours?.join(':00, ') }}:00</span>
|
||||
<span class="period-multiplier">×{{ simulationConfig.time_config?.peak_activity_multiplier }}</span>
|
||||
</div>
|
||||
<div class="period-item">
|
||||
<span class="period-label">工作时段</span>
|
||||
<span class="period-label">{{ $t('step2.workHours') }}</span>
|
||||
<span class="period-hours">{{ simulationConfig.time_config?.work_hours?.[0] }}:00-{{ simulationConfig.time_config?.work_hours?.slice(-1)[0] }}:00</span>
|
||||
<span class="period-multiplier">×{{ simulationConfig.time_config?.work_activity_multiplier }}</span>
|
||||
</div>
|
||||
<div class="period-item">
|
||||
<span class="period-label">早间时段</span>
|
||||
<span class="period-label">{{ $t('step2.morningHours') }}</span>
|
||||
<span class="period-hours">{{ simulationConfig.time_config?.morning_hours?.[0] }}:00-{{ simulationConfig.time_config?.morning_hours?.slice(-1)[0] }}:00</span>
|
||||
<span class="period-multiplier">×{{ simulationConfig.time_config?.morning_activity_multiplier }}</span>
|
||||
</div>
|
||||
<div class="period-item">
|
||||
<span class="period-label">低谷时段</span>
|
||||
<span class="period-label">{{ $t('step2.offPeakHours') }}</span>
|
||||
<span class="period-hours">{{ simulationConfig.time_config?.off_peak_hours?.[0] }}:00-{{ simulationConfig.time_config?.off_peak_hours?.slice(-1)[0] }}:00</span>
|
||||
<span class="period-multiplier">×{{ simulationConfig.time_config?.off_peak_activity_multiplier }}</span>
|
||||
</div>
|
||||
@@ -182,8 +182,8 @@
|
||||
<!-- Agent 配置 -->
|
||||
<div class="config-block">
|
||||
<div class="config-block-header">
|
||||
<span class="config-block-title">Agent 配置</span>
|
||||
<span class="config-block-badge">{{ simulationConfig.agent_configs?.length || 0 }} 个</span>
|
||||
<span class="config-block-title">{{ $t('step2.agentConfig') }}</span>
|
||||
<span class="config-block-badge">{{ simulationConfig.agent_configs?.length || 0 }} {{ $t('common.items') }}</span>
|
||||
</div>
|
||||
<div class="agents-cards">
|
||||
<div
|
||||
@@ -205,7 +205,7 @@
|
||||
|
||||
<!-- 活跃时间轴 -->
|
||||
<div class="agent-timeline">
|
||||
<span class="timeline-label">活跃时段</span>
|
||||
<span class="timeline-label">{{ $t('step2.activeTimePeriod') }}</span>
|
||||
<div class="mini-timeline">
|
||||
<div
|
||||
v-for="hour in 24"
|
||||
@@ -228,34 +228,34 @@
|
||||
<div class="agent-params">
|
||||
<div class="param-group">
|
||||
<div class="param-item">
|
||||
<span class="param-label">发帖/时</span>
|
||||
<span class="param-label">{{ $t('step2.postsPerHour') }}</span>
|
||||
<span class="param-value">{{ agent.posts_per_hour }}</span>
|
||||
</div>
|
||||
<div class="param-item">
|
||||
<span class="param-label">评论/时</span>
|
||||
<span class="param-label">{{ $t('step2.commentsPerHour') }}</span>
|
||||
<span class="param-value">{{ agent.comments_per_hour }}</span>
|
||||
</div>
|
||||
<div class="param-item">
|
||||
<span class="param-label">响应延迟</span>
|
||||
<span class="param-label">{{ $t('step2.responseDelay') }}</span>
|
||||
<span class="param-value">{{ agent.response_delay_min }}-{{ agent.response_delay_max }}min</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="param-group">
|
||||
<div class="param-item">
|
||||
<span class="param-label">活跃度</span>
|
||||
<span class="param-label">{{ $t('step2.activityLevel') }}</span>
|
||||
<span class="param-value with-bar">
|
||||
<span class="mini-bar" :style="{ width: (agent.activity_level * 100) + '%' }"></span>
|
||||
{{ (agent.activity_level * 100).toFixed(0) }}%
|
||||
</span>
|
||||
</div>
|
||||
<div class="param-item">
|
||||
<span class="param-label">情感倾向</span>
|
||||
<span class="param-label">{{ $t('step2.sentimentBias') }}</span>
|
||||
<span class="param-value" :class="agent.sentiment_bias > 0 ? 'positive' : agent.sentiment_bias < 0 ? 'negative' : 'neutral'">
|
||||
{{ agent.sentiment_bias > 0 ? '+' : '' }}{{ agent.sentiment_bias?.toFixed(1) }}
|
||||
</span>
|
||||
</div>
|
||||
<div class="param-item">
|
||||
<span class="param-label">影响力</span>
|
||||
<span class="param-label">{{ $t('step2.influenceWeight') }}</span>
|
||||
<span class="param-value highlight">{{ agent.influence_weight?.toFixed(1) }}</span>
|
||||
</div>
|
||||
</div>
|
||||
@@ -267,59 +267,59 @@
|
||||
<!-- 平台配置 -->
|
||||
<div class="config-block">
|
||||
<div class="config-block-header">
|
||||
<span class="config-block-title">推荐算法配置</span>
|
||||
<span class="config-block-title">{{ $t('step2.recommendAlgoConfig') }}</span>
|
||||
</div>
|
||||
<div class="platforms-grid">
|
||||
<div v-if="simulationConfig.twitter_config" class="platform-card">
|
||||
<div class="platform-card-header">
|
||||
<span class="platform-name">平台 1:广场 / 信息流</span>
|
||||
<span class="platform-name">{{ $t('step2.platform1Name') }}</span>
|
||||
</div>
|
||||
<div class="platform-params">
|
||||
<div class="param-row">
|
||||
<span class="param-label">时效权重</span>
|
||||
<span class="param-label">{{ $t('step2.recencyWeight') }}</span>
|
||||
<span class="param-value">{{ simulationConfig.twitter_config.recency_weight }}</span>
|
||||
</div>
|
||||
<div class="param-row">
|
||||
<span class="param-label">热度权重</span>
|
||||
<span class="param-label">{{ $t('step2.popularityWeight') }}</span>
|
||||
<span class="param-value">{{ simulationConfig.twitter_config.popularity_weight }}</span>
|
||||
</div>
|
||||
<div class="param-row">
|
||||
<span class="param-label">相关性权重</span>
|
||||
<span class="param-label">{{ $t('step2.relevanceWeight') }}</span>
|
||||
<span class="param-value">{{ simulationConfig.twitter_config.relevance_weight }}</span>
|
||||
</div>
|
||||
<div class="param-row">
|
||||
<span class="param-label">病毒阈值</span>
|
||||
<span class="param-label">{{ $t('step2.viralThreshold') }}</span>
|
||||
<span class="param-value">{{ simulationConfig.twitter_config.viral_threshold }}</span>
|
||||
</div>
|
||||
<div class="param-row">
|
||||
<span class="param-label">回音室强度</span>
|
||||
<span class="param-label">{{ $t('step2.echoChamberStrength') }}</span>
|
||||
<span class="param-value">{{ simulationConfig.twitter_config.echo_chamber_strength }}</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div v-if="simulationConfig.reddit_config" class="platform-card">
|
||||
<div class="platform-card-header">
|
||||
<span class="platform-name">平台 2:话题 / 社区</span>
|
||||
<span class="platform-name">{{ $t('step2.platform2Name') }}</span>
|
||||
</div>
|
||||
<div class="platform-params">
|
||||
<div class="param-row">
|
||||
<span class="param-label">时效权重</span>
|
||||
<span class="param-label">{{ $t('step2.recencyWeight') }}</span>
|
||||
<span class="param-value">{{ simulationConfig.reddit_config.recency_weight }}</span>
|
||||
</div>
|
||||
<div class="param-row">
|
||||
<span class="param-label">热度权重</span>
|
||||
<span class="param-label">{{ $t('step2.popularityWeight') }}</span>
|
||||
<span class="param-value">{{ simulationConfig.reddit_config.popularity_weight }}</span>
|
||||
</div>
|
||||
<div class="param-row">
|
||||
<span class="param-label">相关性权重</span>
|
||||
<span class="param-label">{{ $t('step2.relevanceWeight') }}</span>
|
||||
<span class="param-value">{{ simulationConfig.reddit_config.relevance_weight }}</span>
|
||||
</div>
|
||||
<div class="param-row">
|
||||
<span class="param-label">病毒阈值</span>
|
||||
<span class="param-label">{{ $t('step2.viralThreshold') }}</span>
|
||||
<span class="param-value">{{ simulationConfig.reddit_config.viral_threshold }}</span>
|
||||
</div>
|
||||
<div class="param-row">
|
||||
<span class="param-label">回音室强度</span>
|
||||
<span class="param-label">{{ $t('step2.echoChamberStrength') }}</span>
|
||||
<span class="param-value">{{ simulationConfig.reddit_config.echo_chamber_strength }}</span>
|
||||
</div>
|
||||
</div>
|
||||
@@ -330,7 +330,7 @@
|
||||
<!-- LLM 配置推理 -->
|
||||
<div v-if="simulationConfig.generation_reasoning" class="config-block">
|
||||
<div class="config-block-header">
|
||||
<span class="config-block-title">LLM 配置推理</span>
|
||||
<span class="config-block-title">{{ $t('step2.llmConfigReasoning') }}</span>
|
||||
</div>
|
||||
<div class="reasoning-content">
|
||||
<div
|
||||
@@ -351,19 +351,19 @@
|
||||
<div class="card-header">
|
||||
<div class="step-info">
|
||||
<span class="step-num">04</span>
|
||||
<span class="step-title">初始激活编排</span>
|
||||
<span class="step-title">{{ $t('step2.initialActivation') }}</span>
|
||||
</div>
|
||||
<div class="step-status">
|
||||
<span v-if="phase > 3" class="badge success">已完成</span>
|
||||
<span v-else-if="phase === 3" class="badge processing">编排中</span>
|
||||
<span v-else class="badge pending">等待</span>
|
||||
<span v-if="phase > 3" class="badge success">{{ $t('common.completed') }}</span>
|
||||
<span v-else-if="phase === 3" class="badge processing">{{ $t('step2.orchestrating') }}</span>
|
||||
<span v-else class="badge pending">{{ $t('common.pending') }}</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="card-content">
|
||||
<p class="api-note">POST /api/simulation/prepare</p>
|
||||
<p class="description">
|
||||
基于叙事方向,自动生成初始激活事件与热点话题,引导模拟世界的初始状态
|
||||
{{ $t('step2.initialActivationDesc') }}
|
||||
</p>
|
||||
|
||||
<div v-if="simulationConfig?.event_config" class="orchestration-content">
|
||||
@@ -380,14 +380,14 @@
|
||||
</linearGradient>
|
||||
</defs>
|
||||
</svg>
|
||||
叙事引导方向
|
||||
{{ $t('step2.narrativeDirection') }}
|
||||
</span>
|
||||
<p class="narrative-text">{{ simulationConfig.event_config.narrative_direction }}</p>
|
||||
</div>
|
||||
|
||||
<!-- 热点话题 -->
|
||||
<div class="topics-section">
|
||||
<span class="box-label">初始热点话题</span>
|
||||
<span class="box-label">{{ $t('step2.initialHotTopics') }}</span>
|
||||
<div class="hot-topics-grid">
|
||||
<span v-for="topic in simulationConfig.event_config.hot_topics" :key="topic" class="hot-topic-tag">
|
||||
# {{ topic }}
|
||||
@@ -397,7 +397,7 @@
|
||||
|
||||
<!-- 初始帖子流 -->
|
||||
<div class="initial-posts-section">
|
||||
<span class="box-label">初始激活序列 ({{ simulationConfig.event_config.initial_posts.length }})</span>
|
||||
<span class="box-label">{{ $t('step2.initialActivationSeq', { count: simulationConfig.event_config.initial_posts.length }) }}</span>
|
||||
<div class="posts-timeline">
|
||||
<div v-for="(post, idx) in simulationConfig.event_config.initial_posts" :key="idx" class="timeline-item">
|
||||
<div class="timeline-marker"></div>
|
||||
@@ -423,29 +423,29 @@
|
||||
<div class="card-header">
|
||||
<div class="step-info">
|
||||
<span class="step-num">05</span>
|
||||
<span class="step-title">准备完成</span>
|
||||
<span class="step-title">{{ $t('step2.setupComplete') }}</span>
|
||||
</div>
|
||||
<div class="step-status">
|
||||
<span v-if="phase >= 4" class="badge processing">进行中</span>
|
||||
<span v-else class="badge pending">等待</span>
|
||||
<span v-if="phase >= 4" class="badge processing">{{ $t('step1.inProgress') }}</span>
|
||||
<span v-else class="badge pending">{{ $t('common.pending') }}</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="card-content">
|
||||
<p class="api-note">POST /api/simulation/start</p>
|
||||
<p class="description">模拟环境已准备完成,可以开始运行模拟</p>
|
||||
<p class="description">{{ $t('step2.setupCompleteDesc') }}</p>
|
||||
|
||||
<!-- 模拟轮数配置 - 只有在配置生成完成且轮数计算出来后才显示 -->
|
||||
<div v-if="simulationConfig && autoGeneratedRounds" class="rounds-config-section">
|
||||
<div class="rounds-header">
|
||||
<div class="header-left">
|
||||
<span class="section-title">模拟轮数设定</span>
|
||||
<span class="section-desc">MiroFish 自动规划推演现实 <span class="desc-highlight">{{ simulationConfig?.time_config?.total_simulation_hours || '-' }}</span> 小时,每轮代表现实 <span class="desc-highlight">{{ simulationConfig?.time_config?.minutes_per_round || '-' }}</span> 分钟时间流逝</span>
|
||||
<span class="section-title">{{ $t('step2.roundsConfig') }}</span>
|
||||
<span class="section-desc">{{ $t('step2.roundsConfigDesc', { hours: simulationConfig?.time_config?.total_simulation_hours || '-', minutesPerRound: simulationConfig?.time_config?.minutes_per_round || '-' }) }}</span>
|
||||
</div>
|
||||
<label class="switch-control">
|
||||
<input type="checkbox" v-model="useCustomRounds">
|
||||
<span class="switch-track"></span>
|
||||
<span class="switch-label">自定义</span>
|
||||
<span class="switch-label">{{ $t('step2.customToggle') }}</span>
|
||||
</label>
|
||||
</div>
|
||||
|
||||
@@ -454,10 +454,10 @@
|
||||
<div class="slider-display">
|
||||
<div class="slider-main-value">
|
||||
<span class="val-num">{{ customMaxRounds }}</span>
|
||||
<span class="val-unit">轮</span>
|
||||
<span class="val-unit">{{ $t('step2.roundsUnit') }}</span>
|
||||
</div>
|
||||
<div class="slider-meta-info">
|
||||
<span>若Agent规模为100:预计耗时约 {{ Math.round(customMaxRounds * 0.6) }} 分钟</span>
|
||||
<span>{{ $t('step2.estimatedDuration', { minutes: Math.round(customMaxRounds * 0.6) }) }}</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -478,7 +478,7 @@
|
||||
:class="{ active: customMaxRounds === 40 }"
|
||||
@click="customMaxRounds = 40"
|
||||
:style="{ position: 'absolute', left: `calc(${(40 - 10) / (autoGeneratedRounds - 10) * 100}% - 30px)` }"
|
||||
>40 (推荐)</span>
|
||||
>{{ $t('step2.recommendedRounds', { rounds: 40 }) }}</span>
|
||||
<span>{{ autoGeneratedRounds }}</span>
|
||||
</div>
|
||||
</div>
|
||||
@@ -488,7 +488,7 @@
|
||||
<div class="auto-info-card">
|
||||
<div class="auto-value">
|
||||
<span class="val-num">{{ autoGeneratedRounds }}</span>
|
||||
<span class="val-unit">轮</span>
|
||||
<span class="val-unit">{{ $t('step2.roundsUnit') }}</span>
|
||||
</div>
|
||||
<div class="auto-content">
|
||||
<div class="auto-meta-row">
|
||||
@@ -497,11 +497,11 @@
|
||||
<circle cx="12" cy="12" r="10"></circle>
|
||||
<polyline points="12 6 12 12 16 14"></polyline>
|
||||
</svg>
|
||||
若Agent规模为100:预计耗时 {{ Math.round(autoGeneratedRounds * 0.6) }} 分钟
|
||||
{{ $t('step2.estimatedDurationFull', { minutes: Math.round(autoGeneratedRounds * 0.6) }) }}
|
||||
</span>
|
||||
</div>
|
||||
<div class="auto-desc">
|
||||
<p class="highlight-tip" @click="useCustomRounds = true">若首次运行,强烈建议切换至‘自定义模式’减少模拟轮数,以便快速预览效果并降低报错风险 ➝</p>
|
||||
<p class="highlight-tip" @click="useCustomRounds = true">{{ $t(‘step2.customTip’) }} ➝</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -514,14 +514,14 @@
|
||||
class="action-btn secondary"
|
||||
@click="$emit('go-back')"
|
||||
>
|
||||
← 返回图谱构建
|
||||
← {{ $t('step2.backToGraphBuild') }}
|
||||
</button>
|
||||
<button
|
||||
class="action-btn primary"
|
||||
:disabled="phase < 4"
|
||||
@click="handleStartSimulation"
|
||||
>
|
||||
开始双世界并行模拟 ➝
|
||||
{{ $t('step2.startDualWorldSim') }} ➝
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
@@ -547,32 +547,32 @@
|
||||
<!-- 基本信息 -->
|
||||
<div class="modal-info-grid">
|
||||
<div class="info-item">
|
||||
<span class="info-label">事件外显年龄</span>
|
||||
<span class="info-value">{{ selectedProfile.age || '-' }} 岁</span>
|
||||
<span class="info-label">{{ $t('step2.profileModalAge') }}</span>
|
||||
<span class="info-value">{{ selectedProfile.age || '-' }} {{ $t('step2.yearsOld') }}</span>
|
||||
</div>
|
||||
<div class="info-item">
|
||||
<span class="info-label">事件外显性别</span>
|
||||
<span class="info-value">{{ { male: '男', female: '女', other: '其他' }[selectedProfile.gender] || selectedProfile.gender }}</span>
|
||||
<span class="info-label">{{ $t('step2.profileModalGender') }}</span>
|
||||
<span class="info-value">{{ { male: $t('step2.genderMale'), female: $t('step2.genderFemale'), other: $t('step2.genderOther') }[selectedProfile.gender] || selectedProfile.gender }}</span>
|
||||
</div>
|
||||
<div class="info-item">
|
||||
<span class="info-label">国家/地区</span>
|
||||
<span class="info-label">{{ $t('step2.profileModalCountry') }}</span>
|
||||
<span class="info-value">{{ selectedProfile.country || '-' }}</span>
|
||||
</div>
|
||||
<div class="info-item">
|
||||
<span class="info-label">事件外显MBTI</span>
|
||||
<span class="info-label">{{ $t('step2.profileModalMbti') }}</span>
|
||||
<span class="info-value mbti">{{ selectedProfile.mbti || '-' }}</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 简介 -->
|
||||
<div class="modal-section">
|
||||
<span class="section-label">人设简介</span>
|
||||
<p class="section-bio">{{ selectedProfile.bio || '暂无简介' }}</p>
|
||||
<span class="section-label">{{ $t('step2.profileModalBio') }}</span>
|
||||
<p class="section-bio">{{ selectedProfile.bio || $t('step2.noBio') }}</p>
|
||||
</div>
|
||||
|
||||
<!-- 关注话题 -->
|
||||
<div class="modal-section" v-if="selectedProfile.interested_topics?.length">
|
||||
<span class="section-label">现实种子关联话题</span>
|
||||
<span class="section-label">{{ $t('step2.profileModalTopics') }}</span>
|
||||
<div class="topics-grid">
|
||||
<span
|
||||
v-for="topic in selectedProfile.interested_topics"
|
||||
@@ -584,25 +584,25 @@
|
||||
|
||||
<!-- 详细人设 -->
|
||||
<div class="modal-section" v-if="selectedProfile.persona">
|
||||
<span class="section-label">详细人设背景</span>
|
||||
<span class="section-label">{{ $t('step2.profileModalPersona') }}</span>
|
||||
|
||||
<!-- 人设维度概览 -->
|
||||
<div class="persona-dimensions">
|
||||
<div class="dimension-card">
|
||||
<span class="dim-title">事件全景经历</span>
|
||||
<span class="dim-desc">在此事件中的完整行为轨迹</span>
|
||||
<span class="dim-title">{{ $t('step2.personaDimExperience') }}</span>
|
||||
<span class="dim-desc">{{ $t('step2.personaDimExperienceDesc') }}</span>
|
||||
</div>
|
||||
<div class="dimension-card">
|
||||
<span class="dim-title">行为模式侧写</span>
|
||||
<span class="dim-desc">经验总结与行事风格偏好</span>
|
||||
<span class="dim-title">{{ $t('step2.personaDimBehavior') }}</span>
|
||||
<span class="dim-desc">{{ $t('step2.personaDimBehaviorDesc') }}</span>
|
||||
</div>
|
||||
<div class="dimension-card">
|
||||
<span class="dim-title">独特记忆印记</span>
|
||||
<span class="dim-desc">基于现实种子形成的记忆</span>
|
||||
<span class="dim-title">{{ $t('step2.personaDimMemory') }}</span>
|
||||
<span class="dim-desc">{{ $t('step2.personaDimMemoryDesc') }}</span>
|
||||
</div>
|
||||
<div class="dimension-card">
|
||||
<span class="dim-title">社会关系网络</span>
|
||||
<span class="dim-desc">个体链接与交互图谱</span>
|
||||
<span class="dim-title">{{ $t('step2.personaDimSocial') }}</span>
|
||||
<span class="dim-desc">{{ $t('step2.personaDimSocialDesc') }}</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -633,14 +633,17 @@
|
||||
|
||||
<script setup>
|
||||
import { ref, computed, watch, onMounted, onUnmounted, nextTick } from 'vue'
|
||||
import {
|
||||
prepareSimulation,
|
||||
getPrepareStatus,
|
||||
import { useI18n } from 'vue-i18n'
|
||||
import {
|
||||
prepareSimulation,
|
||||
getPrepareStatus,
|
||||
getSimulationProfilesRealtime,
|
||||
getSimulationConfig,
|
||||
getSimulationConfigRealtime
|
||||
getSimulationConfigRealtime
|
||||
} from '../api/simulation'
|
||||
|
||||
const { t } = useI18n()
|
||||
|
||||
const props = defineProps({
|
||||
simulationId: String, // 从父组件传入
|
||||
projectData: Object,
|
||||
|
||||
Reference in New Issue
Block a user