capsule AI-native Unix-like composition layer

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