Skip to content

MikuMikuAR 专业术语规范

定位:代码级规范(面向开发者)— 图标规则/状态栏规范/Go 错误消息/命名约定。

本文档统一全项目 UI 用语、图标规则、状态栏格式、Go 错误消息风格。所有新增代码必须遵守此规范。


一、图标使用规则

核心原则:Iconify 为主,Emoji 禁入 label

位置允许禁止理由
PopupRow.iconIconify 图标名(lucide:xxx / tabler:xxxEmojiMenuStack 渲染走 <iconify-icon>
PopupRow.label纯文字Emoji 前缀label 是语义文本,图标由 icon 字段负责
setStatus()规范前缀符号(见 §四)Emoji状态栏不是图标展示区
HTML data-hint纯文字Emoji辅助功能/屏幕阅读器不读 Emoji
HTML 静态内容Iconify 组件 / 纯文字Emoji一致性

唯一允许 Emoji 的位置

位置允许的 Emoji理由
空状态提示📭 🎬无 Iconify 替代的大号装饰图标
拖拽遮罩📦视觉反馈,非菜单项
播放按钮⏸ ▶Unicode 控制字符,非 Emoji
粒子类型按钮🌸 🌧 ❄ 🎆内容标识(粒子类型),Lucide 无对应多色图标,选用 emoji 保持视觉区分

二、功能术语对照表

2.1 菜单标签(label)

统一使用中文动词短语,不加英文注释,不加 Emoji。

概念标准用语禁止用语Go Binding
浏览 PMX 文件加载模型模型库浏览、打开模型
浏览 VMD 文件加载动作动作库浏览、打开动作
收藏/取消收藏收藏 / 取消收藏加星、标记、收藏此模型ToggleFavorite
查看模型元数据模型信息PMX 信息、元数据GetModelMetaBatch
管理 VMD 绑定动作绑定VMD 绑定、动作管理
位置/缩放/旋转变换转换、Transform
显示/隐藏模型可见性显示控制、Visibility
管理标签标签🏷 标签、Tag 管理AddTag / RemoveTag
相机对准模型聚焦🎯 聚焦、Focus
从场景删除模型移除🗑 移除、删除模型、Remove
在 MMD 中打开导出到 MMD📤 导出到 MMD、Open in MMDOpenInMMD
在 Blender 中编辑在 Blender 中编辑✏️ 在 Blender 中编辑、Edit in BlenderOpenInBlender
暂停/继续动作暂停动作 / 继续动作⏸ 暂停、Pause
恢复 T-Pose重置动作🔄 重置动作、Reset Motion
自动循环开关循环开 / 循环关🔁 循环、Loop
更换 VMD更换动作换动作、Change Motion
相机模式相机模式📷 相机、Camera Mode
灯光控制灯光💡 灯光、Lighting
渲染设置渲染🎨 渲染、Render Settings
后处理效果后处理✨ 后处理、Post Process
舞台环境舞台🎬 舞台、Stage
渲染预设渲染预设🎭 渲染预设、Render PresetSaveRenderPreset / DeleteRenderPreset
保存场景保存场景💾 保存、Save SceneSaveSceneFile
加载场景加载场景📂 加载、Load SceneLoadSceneFile
软件管理软件管理🧰 软件管理、Software ManagerScanSoftwareDir / LaunchSoftware
外部库外部库🔌 外部库、External LibraryAddExternalPath / RemoveExternalPath
显示名称优先级显示🎨 显示、DisplaySetDisplayNamePriority
系统设置系统⚙ 系统、SystemClearExtractCache
清除缓存清除提取缓存清除缓存、Clean CacheClearExtractCache
检测 MMD检测 MMD 路径📤 检测 MMD、Auto Detect MMDAutoDetectMMD
设置 MMD 路径设置 MMD 路径📂 设置 MMD、Set MMD PathSetMMDPath
设置 Blender 路径设置 Blender 路径✏️ 设置 Blender、Set Blender PathSetBlenderPath
打开软件目录打开目录📂 打开目录、Open DirOpenSoftwareDir
重新扫描重新扫描🔄 重新扫描、RescanScanModelDir

2.2 多语言翻译基准(五语言对照)

定位:本表是翻译决策的单一事实源,frontend/src/core/i18n/locales/*.ts 的对应 key 应与本表一致。新增 UI 字符串时,先在此表登记推荐译法,再写入 bundle。 与 bundle 的关系:bundle 是完整数据源(1236 key),本表只收录需要术语决策的关键概念(约 30 项),避免重复维护。社区惯用变体允许译者在 bundle 内微调,但本表的"推荐译法"是默认值。

概念 (zh-CN)i18n keyenjakozh-TW备注
加载模型library.loadModelLoad Modelモデルを読み込む모델 로드載入模型ja 社区变体:モデル読込(名词化,更紧凑,MMD UI 常见)
模型库library.titleModel Libraryモデルライブラリ모델 라이브러리模型庫
动作motion.titleMotionモーション모션動作ja 社区亦用 アニメーション,但 MMD 语境 モーション 更准确
动作绑定motion.bindingTitleMotion Bindingモーション割当모션 바인딩動作綁定
变换model-detail.transformTransform変換변환變換ja 禁用 トランスフォーム(片假名冗余)
可见性model-detail.visibilityVisibility表示切替표시 여부可見性ja 表示切替可視性 更自然
聚焦library.focusModelSet as focusフォーカス포커스聚焦
舞台scene.stageStageステージ무대舞台
渲染scene.renderRenderレンダー렌더渲染ja 亦用 レンダリング(名词化),レンダー 更短适合菜单
后处理scene.postProcessPost-processingポストプロセス포스트 프로세싱後處理ja 社区亦用 ポストエフェクト
物理scene.physicsPhysics物理물리物理
渲染预设scene.renderPresetsRender Presetsレンダープリセット렌더 프리셋渲染預設
保存场景scene.saveSceneSave Sceneシーン保存장면 저장儲存場景zh-TW 用「儲存」非「保存」(「保存」在繁中偏「保留」义)
软件settings.softwareSoftwareソフトウェア소프트웨어軟體zh-TW 用「軟體」非「軟件」
路径settings.pathsPathsパス경로路徑
截图settings.screenshotScreenshotスクリーンショット스크린샷截圖
音频settings.audioAudioオーディオ오디오音訊zh-TW 用「音訊」非「音頻」
关于settings.aboutAboutバージョン情報정보關於ja 用 バージョン情報(版本信息)比直译 について 更符合设置页语境
语言settings.languageLanguage言語언어語言
确认dialog.confirmConfirm確認확인確認
取消dialog.cancelCancelキャンセル취소取消
收藏model-detail.favedFavoritedお気に入り즐겨찾기收藏ja お気に入り 是社区惯用,ko 亦用 즐겨찾기(浏览器沿用)
标签model-detail.tagsTagsタグ태그標籤
模型信息model-detail.infoInfo情報정보模型資訊ja 情報、ko 정보、zh-TW 資訊(非「信息」)
更换动作motion.changeMotionChange Motionモーション変更모션 변경更換動作

翻译决策原则

  1. 推荐译法是默认值,不是唯一合法值。译者在 bundle 内可按上下文微调(如按钮用动词形、标题用名词形),但不得偏离概念语义。
  2. 社区惯用优先于直译。如 ja「加载模型」推荐 モデルを読み込む(动词形),但 UI 空间紧张时可用 モデル読込(名词化);ko「收藏」用 즐겨찾기(沿袭浏览器用语)而非生造 즐겨찾기하기
  3. zh-TW 用语差异须遵守:保存→儲存、软件→軟體、音频→音訊、信息→資訊、视频→影片、数据→資料。这些是繁中用户的硬性预期,机翻常错。
  4. 新增 key 时本表与 bundle 同步:CI 的 i18n-check.mjs --strict 守门 key 集合对齐,本表守门术语决策一致性。两者互补。

2.3 sublabel 规范

sublabel 是灰色辅助说明,分三种类型:

类型格式示例
功能说明动词短语"从动作库选择"、"相机对准此模型"
状态显示名词 + 状态值"当前: 舞蹈动作.vmd"、"可见性: 隐藏"
空状态短语"暂无收藏"、"无动作"

禁止:技术术语裸露(如 "PMX 元数据" → 改为 "模型名称与描述")

2.4 底部导航栏

按钮标签图标data-hint
模型库模型tabler:cube-3d-sphere浏览和加载 PMX 模型 · Ctrl+1
动作库动作lucide:music浏览和加载 VMD 动作 · Ctrl+2
场景场景lucide:monitor相机、灯光和渲染设置 · Ctrl+3
设置设置lucide:settings应用偏好设置 · Ctrl+4

三、Go 端错误消息规范

3.1 用户可见错误(前端会显示)

格式:中文描述,无技术细节

go
// ✅ 正确
return fmt.Errorf("未找到 Blender,请在设置中配置路径")
return fmt.Errorf("启动 MMD 失败")

// ❌ 错误 — 暴露内部错误链
return fmt.Errorf("启动 Blender 失败: %w", err)
return fmt.Errorf("extractedDir: %w", err)
return fmt.Errorf("no .pmx found in zip")
场景标准消息
软件未找到未找到 {软件名},请在设置中配置路径
启动失败启动 {软件名} 失败
文件读取失败读取文件失败
目录不存在目录不存在
zip 内无 PMX压缩包内未找到模型文件
缓存写入失败写入缓存失败

3.2 内部错误(仅日志)

格式:英文 + %w 包装,仅用于 runtime.LogInfof / runtime.LogErrorf

go
// ✅ 正确 — 内部日志用英文
runtime.LogErrorf(a.ctx, "ExtractZip: open zip: %w", err)

// ✅ 正确 — 返回给前端的用户错误用中文
return nil, fmt.Errorf("压缩包内未找到模型文件")

四、状态栏消息规范

4.1 前缀符号

类型前缀示例
成功✓ 解压完成
失败✗ 启动 MMD 失败
进行中无前缀扫描模型库...
信息无前缀循环: 开

禁止:Emoji 前缀(🎯 📤 ✏️ 🗑 🏷 💾 📷 🎭 🔄 🔁

4.2 消息格式

场景格式示例
操作成功✓ {动作}完成✓ 解压完成✓ 场景已保存
操作失败✗ {动作}失败✗ 解压失败✗ 启动 MMD 失败
切换状态{属性}: {值}循环: 开线框模式: 关
聚焦模型✓ 已聚焦: {名称}✓ 已聚焦: 初音ミク
移除模型✓ 已移除: {名称}✓ 已移除: 初音ミク
切换模型✓ 已切换至: {名称}✓ 已切换至: 鏡音リン
保存预设✓ 预设已保存: {名称}✓ 预设已保存: 暖光
删除预设✓ 预设已删除: {名称}✓ 预设已删除: 暖光
应用预设✓ 预设: {名称}✓ 预设: 赛博朋克
标签操作✓ 已添加标签: {标签} / ✓ 已移除标签: {标签}✓ 已添加标签: 角色
收藏操作✓ 已收藏 / ✓ 已取消收藏
重命名✓ 已重命名: {名称}✓ 已重命名: 我的库
路径设置✓ {软件}路径已设置✓ MMD 路径已设置
路径检测✓ MMD 已检测: {路径}✓ MMD 已检测: C:\MMD\mmd.exe
软件启动✓ 已启动: {名称}✓ 已启动: MikuMikuDance

五、Hover Hint 规范

纯文字,无 Emoji。底部导航栏 hint 见 §2.3,其余常用 target 规范:

targethint 文本
detail:fav收藏或取消收藏此模型
detail:focus相机对准此模型
detail:remove从场景中移除此模型
detail:export-mmd在 MikuMikuDance 中打开此模型
detail:blender在 Blender 中编辑此模型
detail:motion:pause暂停或继续当前动作
detail:motion:reset移除动作,恢复初始姿势
detail:motion:loop切换动作自动循环

六、HTML 静态文本规范

元素规范文本
#statusBar 默认点击模型按钮打开模型库 · 拖拽旋转 · 滚轮缩放
#btnMainAction data-hint浏览和加载 PMX 模型 · Ctrl+1
#btnMotionPopup data-hint浏览和加载 VMD 动作 · Ctrl+2
#btnScene data-hint相机、灯光和渲染设置 · Ctrl+3
#btnSettings data-hint应用偏好设置 · Ctrl+4
#popupEmpty此目录为空
#motionPopupEmpty未找到动作文件
#dropOverlay 文字释放文件以导入
#dropOverlay 提示支持 .zip · .pmx · .vmd

七、命名约定

7.1 Go Binding 命名

模式格式示例
获取配置Get{Entity}GetConfig, GetFavorites
批量获取Get{Entity}BatchGetModelMetaBatch, GetThumbnailBatch
设置配置Set{Property}SetLibraryRoot, SetBlenderPath
切换状态Toggle{State}ToggleFavorite
添加/移除Add{Entity} / Remove{Entity}AddTag, RemoveExternalPath
重命名Rename{Entity}RenameExternalPath
扫描Scan{Target}ScanModelDir, ScanSoftwareDir
启动/停止Start{Action} / Stop{Action}StartFileServer, StopFileServer
打开Open{Target}OpenInBlender, OpenInMMD, OpenSoftwareDir
保存/加载Save{Entity} / Load{Entity}SaveSceneFile, LoadSceneFile
选择文件Select{Purpose}FileSelectSceneSaveFile, SelectSceneOpenFile
自动检测AutoDetect{Software}AutoDetectMMD
导入Import{Format}ImportZip
提取Extract{Format}ExtractZip
清除Clear{Target}ClearExtractCache
清理Clean{Target}CleanOrphanCache
隔离Isolate{Target}IsolateModelDir

7.3 Menu ID 命名

规则来源:ADR-214(Menu ID 命名规范治理)

强制规则

  1. 格式:所有 Menu ID 必须使用 domain:topic:subtopic 的冒号分隔层级格式,全小写 + 连字符(kebab-case)。
  2. 禁止零级 ID:所有 Menu ID 必须至少含一个冒号(:),禁止 id: 'sky' 这类无 domain 前缀的 ID。
  3. 禁止驼峰:禁止大写字母,所有单词用连字符连接。autoCenterauto-centerbigWaveHeightbig-wave-height
  4. 禁止点号:分隔符统一为冒号(:),禁止点号(.)。menu.scene.loadStagemenu:scene:load-stage

i18n key 对齐公约

Menu ID 的 domain 字段应尽量与对应 i18n key 的第一段保持一致。 从 settings:perf:*settings.perf.* 可通过简单的分隔符替换(:.)完成映射。

Menu ID domaini18n key domain对齐状态
env:*env.*已对齐
plaza:*plaza.*已对齐
model:*model.*已对齐
perception:*perception.*已对齐
motion:*motion.*已对齐
about:*about.*已对齐
graphics:*settings.graphics.*待对齐(menu 缺 settings: 前缀)
appearance:*settings.appearance.*待对齐(同上)
controls:*settings.perf.*严重错位(domain 名不同:controls vs perf

例外

  • 纯 UI 分组节点(无对应 i18n key)允许自定义 domain,但必须遵守格式规则(冒号分隔 + kebab-case)。
  • 历史遗留的不对齐 domain(如上表「待对齐」项)在后续 PR 中逐步迁移,不做一次性强制对齐。

禁止示例

id: 'sky'                          // 零级 ID,无 domain
id: 'controls:autoCenter'          // 驼峰
id: 'env.groundPresetCyberGrid'    // 点号分隔 + 驼峰
id: 'menu.scene.loadProp'          // 点号分隔

正确示例

id: 'env:sky'
id: 'controls:auto-center'
id: 'env:ground:preset:cyber-grid'
id: 'menu:scene:load-prop'
id: 'settings:graphics:frame-cap'

八、开发沟通风格

  • 简洁:能用 1 句话不说 2 句
  • 精确:给行号、文件路径、函数名
  • 结构化:表格 > 段落
  • 不废话:不做无谓的「总的来说」「总结一下」
  • 不改不拆:发现不够改的问题先问「要修吗」