src/frontend/src/i18n/messages.ts
19,661 bytes · 479 lines · capsule://quake0day/[email protected]
raw on github
export const baseMessages = {
'zh-CN': {
locale: {
zh: '简体中文',
en: 'English',
switchLabel: '切换语言',
},
common: {
brand: 'CyberVerse',
back: '← 返回',
searchCharacters: '搜索角色...',
settings: '系统设置',
serviceConnected: '推理服务已连接',
serviceDisconnected: '推理服务未连接',
loading: '加载中...',
save: '保存',
saving: '保存中...',
cancel: '取消',
provider: 'Provider',
model: '模型',
voice: '音色',
check: 'check',
show: '显示',
hide: '隐藏',
refresh: '刷新',
delete: '删除',
notConnected: '未连接',
emptyDash: '—',
},
landing: {
protocol: 'city gateway protocol',
voiceOnline: 'voice online',
voiceOffline: 'voice offline',
search: 'Search',
district: 'district 01 / public gateway / role access',
subtitle: '一个面向数字身份、语音会话和合成存在感的霓虹入口。',
enter: 'Enter CyberVerse',
footer: 'v0.1.0 - {count} 个 persona channels 可用 - voice sync ready',
},
setup: {
title: '系统尚未配置',
body: '请先配置 DashScope 或所选组件的服务凭证,以便正常启动数字人会话。',
action: '去配置 →',
},
characterList: {
title: '选择角色',
subtitle: '选择一个数字人角色开始互动,或创建你自己的专属角色',
create: '+ 创建角色',
deleteConfirm: '确定要删除这个角色吗?',
emptyTitle: '还没有创建任何角色',
emptyBody: '创建你的第一个数字人角色<br/>开始智能对话',
createFirst: '+ 创建第一个角色',
},
characterCard: {
noDescription: '暂无描述',
launch: '启动 →',
},
avatarUpload: {
pending: '待上传',
active: '当前头像',
setActive: '设为头像',
addImage: '添加图片',
title: '上传角色头像',
hint: '支持 PNG、JPG,建议 512x512',
faceCrop: '是否裁剪人脸',
faceCropHint: '开启后将自动检测并裁剪图片中的人脸区域',
},
characterEdit: {
breadcrumbs: {
list: '角色列表',
edit: '编辑角色',
create: '创建角色',
},
pageTitleEdit: '编辑角色',
pageTitleCreate: '创建新角色',
randomAvatar: '随机切换头像',
randomAvatarHint: '开启后每次进入会话时随机选择一张头像',
basicInfo: '基本信息',
name: '角色名称',
namePlaceholder: '输入角色名称...',
description: '角色描述',
descriptionPlaceholder: '简要描述该角色的特点和用途...',
components: '组件配置',
modeToggleLabel: '切换模式,当前为 {mode}',
modeHelpLabel: '查看模式说明',
omniMode: '全模态模型',
omniModel: '全模态模型',
standardHelp: '用户语音先由 ASR 转成文本,再交给 LLM 生成回复,最后由 TTS 合成为语音并驱动数字人。',
omniHelp: '由支持语音理解、对话生成和语音合成的全模态模型完成端到端交互。',
voiceType: '声线类型',
lineVoice: '声线',
officialVoice: '官方音色',
clonedVoice: '克隆音色',
customSpeakerPlaceholder: '输入 speaker_id',
registeredSpeakerPlaceholder: '输入已注册成功的 speaker_id,例如 S_123456',
customSpeakerRequired: '请输入已注册的 SC2.0 自定义 speaker_id',
canPreviewAt: '可到',
previewVoice: '试听音色',
qwenTTSVoiceList: 'Qwen TTS 官方音色列表',
qwenOmniVoiceList: 'Qwen Omni 官方音色列表',
doubaoVoiceConsole: '火山引擎语音克隆控制台',
clonePrerequisitePrefix: '请先前往',
clonePrerequisiteSuffix: '生成 SC2.0 克隆音色',
personaStyle: '人设与风格',
speakingStyle: '说话风格',
speakingStylePlaceholder: '温柔、专业',
speakingStyleHint: '描述角色的语言风格,如"幽默风趣"、"严谨专业"',
personality: '角色性格',
personalityPlaceholder: '温柔体贴、善于倾听,喜欢用比喻来解释复杂的概念...',
personalityHint: '描述角色的性格特征,会和角色提示词一起组成角色设定',
welcomeMessage: '欢迎语',
welcomeMessagePlaceholder: '你好,我是小雪,有什么可以帮助你的吗?',
welcomeMessageHint: '角色开场白,连接后自动播放',
systemPrompt: '角色提示词',
systemPromptPlaceholder: '写这个角色是谁、和用户的关系、背景设定、偏好的称呼和人设边界。',
knowledgeBase: '素材库',
knowledgeBaseHint: '导入素材文件,角色问答会自动检索这些素材。',
uploadDropTitle: '点击上传或将文件/文件夹拖到此区域',
uploadDropHint: '支持单文件、多文件和文件夹上传。文件夹会按文件逐条导入。',
chooseMaterialFiles: '选择文件',
chooseMaterialFolder: '选择文件夹',
supportedMaterialFiles: '所有文件都会保存;文本、Markdown、JSON、PDF、Word 会参与检索。',
uploadingMaterials: '正在上传素材...',
skippedMaterialFiles: '已跳过 {count} 个文件:{files}',
noSupportedMaterials: '没有可上传的文件',
materialIndexed: '参与检索',
materialStoredOnly: '仅保存',
materialFileCount: '{count} 个文件',
noMaterials: '还没有导入素材',
reindexMaterial: '重建索引',
deleteCharacter: '删除角色',
deleteConfirm: '确定要删除这个角色吗?此操作不可撤销。',
saveCharacter: '保存角色',
},
settings: {
breadcrumbs: {
list: '角色列表',
settings: '系统设置',
},
title: '系统设置',
subtitle: '配置服务凭证,角色可在组件配置中选择已启用的模型组件',
doubaoVoice: '豆包语音',
inferenceConnection: '推理服务连接',
grpcAddress: 'gRPC 地址',
connectionSuccess: '连接成功',
connectionFailed: '连接失败',
testing: '测试中...',
testConnection: '测试连接',
},
launch: {
breadcrumb: '角色列表 / 部署配置',
voice: '声线',
speakingStyle: '说话风格',
personality: '性格',
welcomeMessage: '欢迎语',
editCharacter: '编辑角色 →',
title: '部署配置',
subtitle: '根据您的硬件环境调整推理参数。当前运行模型:{model}',
loadingConfig: '加载配置中...',
restartHint: '保存当前配置,然后重启 inference 推理服务,使配置生效',
loadConfigFailed: '加载配置失败',
savedRequiresRestart: '配置已保存,需要重启推理服务才能生效',
saved: '配置已保存',
saveFailed: '保存配置失败',
launchFailed: '启动失败',
runtimeMismatch: '配置文件默认模型是 {configured},但当前推理进程实际运行的是 {active}。部署页以运行时模型为准;修改默认模型后需要重启推理服务。',
restartRequired: '需重启',
saveConfig: '保存配置',
launching: '连接中...',
launch: '启动数字人',
sections: {
avatar: '头像模型 (Avatar)',
video_output: '视频输出',
gpu: 'GPU 配置',
},
},
session: {
back: '← 返回',
expandChat: '展开对话',
closeVisualInput: '关闭视频输入',
cameraOff: '关闭摄像头输入',
cameraOn: '开启摄像头输入',
collapseChat: '收起对话',
enableSound: '启用声音',
outputMute: '静音数字人声音',
outputUnmute: '取消静音数字人声音',
chatTitle: '对话',
clear: '清空',
micInput: '麦克风输入',
footerHint: 'Shift+Enter 换行 · 全模态模式下可直接语音对话',
frameJitter: 'Frame Jitter',
meanInterval: 'Mean interval',
stddev: 'Stddev',
p95: 'P95',
max: 'Max',
stutters: 'Stutters',
playback: 'Playback',
decoded: 'Decoded',
dropped: 'Dropped',
readyState: 'Ready state',
displayMode: 'Display mode',
network: 'Network (WebRTC)',
jitterRTP: 'Jitter (RTP)',
packetLoss: 'Packet loss',
nackPliFir: 'NACK / PLI / FIR',
jitterBuffer: 'Jitter buffer',
resolution: 'Resolution',
codec: 'Codec',
notes: 'Notes',
noEvents: 'No events',
},
chat: {
loadMore: '↑ 向上滚动加载更多',
historyEnd: '— 已加载全部历史 —',
previousConversation: '上一次对话',
currentConversation: '当前对话',
inputPlaceholder: '输入消息...',
send: '发送',
sendFailedNoSession: '发送失败:会话未初始化,请刷新后重试。',
sendFailedNetwork: '发送失败:网络异常,请稍后重试。',
},
controlBar: {
connect: 'Connect',
disconnect: 'Disconnect',
connecting: 'Connecting...',
mute: 'Mute',
unmute: 'Unmute',
},
visualInput: {
disabled: '当前会话未启用视觉输入',
insecureContext: '摄像头和屏幕共享需要 HTTPS 或 localhost',
cameraDenied: '摄像头权限被拒绝',
screenDenied: '屏幕共享权限被拒绝',
startFailed: '无法启动视觉输入',
},
voices: {
cloned: '克隆音色 · {id}',
},
},
'en-US': {
locale: {
zh: '简体中文',
en: 'English',
switchLabel: 'Switch language',
},
common: {
brand: 'CyberVerse',
back: '← Back',
searchCharacters: 'Search characters...',
settings: 'Settings',
serviceConnected: 'Inference service connected',
serviceDisconnected: 'Inference service disconnected',
loading: 'Loading...',
save: 'Save',
saving: 'Saving...',
cancel: 'Cancel',
provider: 'Provider',
model: 'Model',
voice: 'Voice',
check: 'check',
show: 'Show',
hide: 'Hide',
refresh: 'Refresh',
delete: 'Delete',
notConnected: 'Not connected',
emptyDash: '—',
},
landing: {
protocol: 'city gateway protocol',
voiceOnline: 'voice online',
voiceOffline: 'voice offline',
search: 'Search',
district: 'district 01 / public gateway / role access',
subtitle: 'A neon gateway for digital identities, voice sessions, and synthetic presence.',
enter: 'Enter CyberVerse',
footer: 'v0.1.0 - {count} persona channels available - voice sync ready',
},
setup: {
title: 'System is not configured',
body: 'Configure DashScope or the selected component credentials before starting a digital human session.',
action: 'Configure →',
},
characterList: {
title: 'Choose a Character',
subtitle: 'Pick a digital human to start interacting, or create your own character.',
create: '+ Create Character',
deleteConfirm: 'Delete this character?',
emptyTitle: 'No characters yet',
emptyBody: 'Create your first digital human character<br/>to start an AI conversation',
createFirst: '+ Create First Character',
},
characterCard: {
noDescription: 'No description',
launch: 'Launch →',
},
avatarUpload: {
pending: 'Pending upload',
active: 'Current avatar',
setActive: 'Set as avatar',
addImage: 'Add image',
title: 'Upload character avatar',
hint: 'PNG and JPG supported, 512x512 recommended',
faceCrop: 'Crop face',
faceCropHint: 'When enabled, CyberVerse detects and crops the face region automatically.',
},
characterEdit: {
breadcrumbs: {
list: 'Characters',
edit: 'Edit Character',
create: 'Create Character',
},
pageTitleEdit: 'Edit Character',
pageTitleCreate: 'Create New Character',
randomAvatar: 'Randomize avatar',
randomAvatarHint: 'Randomly choose an avatar image each time a session starts.',
basicInfo: 'Basic Info',
name: 'Character Name',
namePlaceholder: 'Enter character name...',
description: 'Character Description',
descriptionPlaceholder: 'Briefly describe this character and what it is for...',
components: 'Component Configuration',
modeToggleLabel: 'Switch mode, current mode is {mode}',
modeHelpLabel: 'View mode description',
omniMode: 'omni',
omniModel: 'Omni Model',
standardHelp: 'User speech is transcribed by ASR, answered by LLM, then synthesized by TTS to drive the digital human.',
omniHelp: 'End-to-end interaction handled by an omni model that supports speech understanding, dialog generation, and speech synthesis.',
voiceType: 'Voice Type',
lineVoice: 'Voice',
officialVoice: 'Official voice',
clonedVoice: 'Cloned voice',
customSpeakerPlaceholder: 'Enter speaker_id',
registeredSpeakerPlaceholder: 'Enter a registered speaker_id, for example S_123456',
customSpeakerRequired: 'Enter a registered SC2.0 custom speaker_id',
canPreviewAt: 'Preview at',
previewVoice: 'voice samples',
qwenTTSVoiceList: 'Qwen TTS official voice list',
qwenOmniVoiceList: 'Qwen Omni official voice list',
doubaoVoiceConsole: 'Volcengine voice clone console',
clonePrerequisitePrefix: 'Go to',
clonePrerequisiteSuffix: 'to create an SC2.0 cloned voice',
personaStyle: 'Persona and Style',
speakingStyle: 'Speaking Style',
speakingStylePlaceholder: 'Gentle, professional',
speakingStyleHint: 'Describe the character language style, such as "witty" or "precise and professional".',
personality: 'Personality',
personalityPlaceholder: 'Warm, attentive, and good at explaining complex ideas with analogies...',
personalityHint: 'Describe personality traits. These are combined with the role prompt.',
welcomeMessage: 'Welcome Message',
welcomeMessagePlaceholder: 'Hi, I am Xiaoxue. How can I help?',
welcomeMessageHint: 'Opening line played automatically after connection.',
systemPrompt: 'Role Prompt',
systemPromptPlaceholder: 'Describe who this character is, the relationship with users, background, preferred address, and boundaries.',
knowledgeBase: 'Knowledge Base',
knowledgeBaseHint: 'Import material files. Character Q&A will retrieve them automatically.',
uploadDropTitle: 'Click to upload or drag files/folders here',
uploadDropHint: 'Single files, multiple files, and folders are supported. Folders are imported file by file.',
chooseMaterialFiles: 'Choose Files',
chooseMaterialFolder: 'Choose Folder',
supportedMaterialFiles: 'All files are saved. Text, Markdown, JSON, PDF, and Word files are searchable.',
uploadingMaterials: 'Uploading materials...',
skippedMaterialFiles: 'Skipped {count} files: {files}',
noSupportedMaterials: 'No files to upload',
materialIndexed: 'Searchable',
materialStoredOnly: 'Stored only',
materialFileCount: '{count} files',
noMaterials: 'No materials imported yet',
reindexMaterial: 'Reindex',
deleteCharacter: 'Delete Character',
deleteConfirm: 'Delete this character? This cannot be undone.',
saveCharacter: 'Save Character',
},
settings: {
breadcrumbs: {
list: 'Characters',
settings: 'Settings',
},
title: 'Settings',
subtitle: 'Configure service credentials. Characters can choose enabled model components in component configuration.',
doubaoVoice: 'Doubao Voice',
inferenceConnection: 'Inference Service Connection',
grpcAddress: 'gRPC Address',
connectionSuccess: 'Connection succeeded',
connectionFailed: 'Connection failed',
testing: 'Testing...',
testConnection: 'Test Connection',
},
launch: {
breadcrumb: 'Characters / Launch Configuration',
voice: 'Voice',
speakingStyle: 'Speaking Style',
personality: 'Personality',
welcomeMessage: 'Welcome Message',
editCharacter: 'Edit Character →',
title: 'Launch Configuration',
subtitle: 'Tune inference parameters for your hardware. Current runtime model: {model}',
loadingConfig: 'Loading configuration...',
restartHint: 'Save the current configuration, then restart the inference service for changes to take effect.',
loadConfigFailed: 'Failed to load configuration',
savedRequiresRestart: 'Configuration saved. Restart the inference service for changes to take effect.',
saved: 'Configuration saved',
saveFailed: 'Failed to save configuration',
launchFailed: 'Failed to launch',
runtimeMismatch: 'The config file default model is {configured}, but the running inference process uses {active}. This page follows the runtime model. Restart inference after changing the default model.',
restartRequired: 'Restart required',
saveConfig: 'Save Configuration',
launching: 'Connecting...',
launch: 'Launch Digital Human',
sections: {
avatar: 'Avatar Model',
video_output: 'Video Output',
gpu: 'GPU Configuration',
},
},
session: {
back: '← Back',
expandChat: 'Expand chat',
closeVisualInput: 'Close video input',
cameraOff: 'Disable camera input',
cameraOn: 'Enable camera input',
collapseChat: 'Collapse chat',
enableSound: 'Enable sound',
outputMute: 'Mute digital human audio',
outputUnmute: 'Unmute digital human audio',
chatTitle: 'Chat',
clear: 'Clear',
micInput: 'Mic input',
footerHint: 'Shift+Enter for newline · Omni mode supports direct voice conversation',
frameJitter: 'Frame Jitter',
meanInterval: 'Mean interval',
stddev: 'Stddev',
p95: 'P95',
max: 'Max',
stutters: 'Stutters',
playback: 'Playback',
decoded: 'Decoded',
dropped: 'Dropped',
readyState: 'Ready state',
displayMode: 'Display mode',
network: 'Network (WebRTC)',
jitterRTP: 'Jitter (RTP)',
packetLoss: 'Packet loss',
nackPliFir: 'NACK / PLI / FIR',
jitterBuffer: 'Jitter buffer',
resolution: 'Resolution',
codec: 'Codec',
notes: 'Notes',
noEvents: 'No events',
},
chat: {
loadMore: '↑ Scroll up to load more',
historyEnd: '— All history loaded —',
previousConversation: 'Previous conversation',
currentConversation: 'Current conversation',
inputPlaceholder: 'Type a message...',
send: 'Send',
sendFailedNoSession: 'Send failed: session is not initialized. Refresh and try again.',
sendFailedNetwork: 'Send failed: network error. Try again later.',
},
controlBar: {
connect: 'Connect',
disconnect: 'Disconnect',
connecting: 'Connecting...',
mute: 'Mute',
unmute: 'Unmute',
},
visualInput: {
disabled: 'Visual input is disabled for this session',
insecureContext: 'Camera and screen sharing require HTTPS or localhost',
cameraDenied: 'Camera permission denied',
screenDenied: 'Screen sharing permission denied',
startFailed: 'Unable to start visual input',
},
voices: {
cloned: 'Cloned voice · {id}',
},
},
} as const