SerenityOS 界面文案规范指南:Text.md 全文解读与 LibGUI 源码印证
本篇指南基于 SerenityOS 仓库中的 Documentation/HumanInterfaceGuidelines/Text.md 展开,系统讲解 SerenityOS 用户界面文本(按钮、菜单、标签、消息框等)的两套大小写规则与省略号(Ellipsis)使用约定。文章在完整继承原文档全部规则与示例的基础上,结合 Userland 下 LibGUI 与各应用的源码实现,逐一印证这些规范在实际界面中的落地方式,帮助开发者在为 SerenityOS 编写应用界面时写出风格统一、符合系统气质与用户习惯的文案。
概述:为什么界面文案需要规范
在 SerenityOS 这样一套从零构建的操作系统中,用户界面文本是用户与系统交互的第一语言。文案的大小写风格是否统一、省略号用得是否恰当,直接影响界面观感与操作预期的一致性。为此,SerenityOS 在 Human Interface Guidelines(HIG)中给出了明确的书面规范,约束按钮、菜单、窗口标题、状态栏、消息框等各类界面元素上的文字表达。
原文档(Text.md)篇幅精炼,但包含两条核心规则:大小写(Capitalization) 与 省略号(Ellipses)。下文逐一展开,并到源码中寻找真实用例。
大小写规范:两种风格,两套场景
SerenityOS 的界面文本统一采用两种大小写风格,且每种风格都有严格限定的适用场景,两者不可混用:
- Book title capitalization(书籍标题式大小写)
- Sentence-style capitalization(句子式大小写)
Book title capitalization:书名标题式
在这种风格下,第一个词与最后一个词的首字母大写,中间所有词的首字母也大写,但以下三类词除外:
- 冠词(articles):a、an、the
- 七个并列连词(coordinating conjunctions):for、and、nor、but、or、yet、so
- 不超过四个字母的介词(prepositions):at、by、for、with、into 等
原文档示例
- Create New Layer
- Copy URL
- Move to Front
- Save and Exit
- Sort by Name
注意其中 "Save and Exit" 中的 and、"Move to Front" 中的 to、"Sort by Name" 中的 by 均保持小写,正是上述"短介词与连词小写"规则的直观体现。
适用场景
Book title capitalization 仅用于以下界面元素:
- 按钮文本(Button text)
- 图标标签(Icon labels)
- 菜单名称(Menu names)
- 菜单项(Menu items)
- 标签页标题(Tab titles)
- 窗口标题(Window titles)
- 工具提示(Tooltips)
源码印证
在仓库源码中,这些场景均能找到符合该风格的实现:
- 按钮与菜单项:Userland/Applications/TextEditor/MainWidget.cpp 中,新建(New)、打开(Open)、保存(Save)、另存为(Save As)等动作同时挂入工具栏与文件菜单,采用的就是"首词大写"的书名标题式风格。
- 动作文本:Userland/Applications/FileManager/main.cpp 创建 "Open" 动作,Userland/Applications/Browser/Tab.cpp 中右键菜单动态设置为 "Copy &Email Address"、"Copy &Phone Number"、"Copy &URL",均保持首字母大写的标题式风格(其中的 & 是键盘助记符,不影响大小写规则)。
- 图层命名:Userland/Applications/PixelPaint/ImageEditor.cpp 新建图层时以 "New Layer" 命名,与规范示例完全一致。
Sentence-style capitalization:句子式
这种风格遵循基础英语句子的大小写规则:首词首字母大写,专有名词、星期等专名首字母大写,其余一律小写。
原文档示例
- An error occurred
- Use system defaults
- Copy the selected text
- Enable Linux compatibility hacks
适用场景
Sentence-style capitalization 用于以下界面元素:
- 复选框标签(Check box labels)
- 分组框标签(Group box labels)
- 列表项(List items)
- 消息(如消息框中的提示文字,Messages)
- 单选按钮标签(Radio button labels)
- 状态栏文本(Status bar text)
- 文本框标签(Text box labels)
源码印证
- 复选框:Userland/Applications/PixelPaint/CreateNewImageDialog.cpp 中 "Use these settings as default"、Userland/Applications/PixelPaint/Tools/EraseTool.cpp 中 "Use secondary color",都是首词大写、其余小写的句子式风格。
- 状态栏文本:Userland/Libraries/LibGUI/Statusbar.cpp 的
set_text接口承载状态栏文案,状态栏属于句子式场景,因此显示的内容按句子规则书写。 - 消息框文案:Userland/Libraries/LibGUI/MessageBox.cpp 中"未保存更改"提示的正文由
try_append逐段拼装:"Save changes to "..." before closing?",并追加 "Last saved ... ago." 这类完整句子,属于典型的消息文本句子式写法。
省略号规范:三种点,两种使命
省略号(Ellipsis,即连续的三个点 ...)在 SerenityOS 界面中有两种截然不同的职能:
- Eliding text(文本截断):由程序自动执行,当文本超出可用空间时以省略号代替被裁掉的内容。
- Foreshadowing additional user input(预示后续输入):需要作者在手动书写文案时谨慎把握。
第一种是程序行为,不需要人工干预;第二种才是本文规范讨论的重点。
何时必须使用省略号
凡是表示"某个动作尚未完成、还需要用户进一步输入"的控件文本,必须以省略号结尾。 判断标准是:打开一个新窗口本身并不能成为使用省略号的理由,只有当这个对话框是"完成该动作过程中的中间步骤"时,才允许(且应当)加省略号。
这一规则与"动作立即生效"型按钮(如 Save、Delete)形成清晰区分:点击后动作立刻完成的按钮不加省略号,点击后弹出后续交互窗口的按钮加省略号。
原文档示例
- Save As...
- Browse...
- Insert Emoji...
克制使用,避免混淆
省略号在其他场合应尽量少用,以免与"文本截断产生的省略号"混淆——用户看到 ... 时无法区分是"还有下一步"还是"文字被裁掉了"。
源码印证
- Save As...:Userland/Libraries/LibGUI/MessageBox.cpp 中,"未保存更改"对话框的按钮文本会根据文件是否有已知路径动态切换:无路径(untitled document)时按钮为 "Save As...",有路径时则为 "Save"。"Save As..." 需要用户在弹出的文件选择器中指定保存位置,动作尚未完成,故加省略号;而 "Save" 会直接写回原文件,动作即刻生效,不加省略号。这是"省略号 = 尚需后续输入"规则最典型的源码级体现。
- Browse...:Userland/Applications/DisplaySettings/BackgroundSettings.gml 与 Userland/Applications/Run/Run.gml 中的 "Browse..." 按钮均用于打开文件选择对话框,属于典型的"为完成动作而弹出中间步骤",故保留省略号。
- 这些字符串同样可在 Userland/Libraries/LibGUI/MessageBox.cpp 中对照
try_ask_about_unsaved_changes的完整逻辑阅读:对话框通过set_text动态生成正文,通过按钮文本区分 Save / Save As,将规范中的"中间步骤"原则落实为可运行代码。
实践要点总结
将上述规范浓缩为可操作的检查清单:
| 界面元素 | 大小写风格 | 省略号 |
|---|---|---|
| 按钮文本 | Book title | 动作未完成且需后续输入时加 |
| 菜单名 / 菜单项 | Book title | 需后续输入的菜单项加 |
| 窗口标题 | Book title | 不加 |
| 标签页标题 / 工具提示 / 图标标签 | Book title | 不加 |
| 复选框 / 单选按钮标签 | Sentence-style | 不加 |
| 分组框 / 文本框标签 | Sentence-style | 不加 |
| 列表项 | Sentence-style | 不加 |
| 消息框正文 | Sentence-style | 不加 |
| 状态栏文本 | Sentence-style | 不加 |
核心判断口诀:
- 标题式还是句子式:看元素类型——按钮、菜单、窗口标题用标题式;控件标签、消息、状态栏用句子式。
- 加不加省略号:看动作是否"立即完成"——点击后还需用户进一步输入的(如 Save As、Browse、Insert Emoji)加
...;点击即完成的(如 Save、Open)不加。 - 少用慎用:除非确属"尚需输入",否则不轻易使用省略号,避免与程序化文本截断混淆。
延伸阅读
- 界面文案规范全文:Documentation/HumanInterfaceGuidelines/Text.md
- 消息框实现(省略号规则的代码级落地):Userland/Libraries/LibGUI/MessageBox.cpp
- 状态栏组件:Userland/Libraries/LibGUI/Statusbar.cpp
- 更多界面设计指导可参考 Documentation/HumanInterfaceGuidelines 目录下的其他 HIG 文档。
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust4.21 K635- DDeepSeek-V4.1-FlashDeepSeek-V4.1-Flash 是一个多模态混合专家(MoE)模型,拥有 5520 亿骨干参数,并支持最多一百万 token 的上下文长度。该模型原生支持图像和文本输入,并以自回归方式生成文本Python70
jforgamejforgame是一个一站式游戏服务器开发框架。包含游戏服务器开发所需要的各种组件,比如网关,socket服务端与客户端,自定义高效消息编解码,游戏热更新,游戏通用工具等等。包含游戏服,跨服,匹配服,后台管理系统等实现,同时提供大量业务案例以供学习。亦可用于其他socket应用,例如及时聊天等。Java161
fizz-gateway-nodeAn Aggregation API Gateway in Java . FizzGate 是一个基于 Java开发的微服务聚合网关,是拥有自主知识产权的应用网关国产化替代方案,能够实现热服务编排聚合、自动授权选择、线上服务脚本编码、在线测试、高性能路由、API审核管理、回调管理等目的,拥有强大的自定义插件系统可以自行扩展,并且提供友好的图形化配置界面,能够快速帮助企业进行API服务治理、减少中间层胶水代码以及降低编码投入、提高 API 服务的稳定性和安全性。Java90
certd开源SSL证书管理工具;全自动证书申请、更新、续期;通配符证书,泛域名证书申请;证书自动化部署到阿里云、腾讯云、主机、群晖、宝塔;https证书,pfx证书,der证书,TLS证书,nginx证书自动续签自动部署JavaScript120
Spark-X2.5-1.7BSpark-X2.5-1.7B 旨在让强大的 AI 更加实用、高效且易于获取。这些模型在广泛的日常任务中表现出色,涵盖对话、写作、翻译、推理、编程、工具调用和智能体工作流,并在同等规模的开源模型中取得领先结果。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python300