← MessageFormat 2 · 给人看的消息怎么写 / 标记:让译者也能安全地加粗、加链接 待审核 6 / 8
markup · 标记

标记:让译者也能安全地加粗、加链接

句子里要把某几个词加粗套链接,传统做法是把 <b> / <a> 直接塞进译文——译者一不小心就破坏标签、还可能注入 HTML。MF2 用标记占位符解决:{#tag}…{/tag} 只标出「这段要套某种装饰」,不绑定任何具体含义;到底渲染成 <b> 还是别的,由宿主程序读 formatToParts() 自己决定。译文里只有抽象标签,无法破坏结构也注入不了。

1 · 三种标记

开标记 {#tag}、闭标记 {/tag}、独立标记 {#tag /}(自闭合,如换行 / 图片)。标记可带选项,写法和函数选项一样:{#link href=|/buy| title=Go}

2 · 动手试:标记 → 真实 DOM

左边写带标记的消息源,右边是宿主程序formatToParts() 里的 markup part 解释成真实元素后的渲染(这里把 #b→加粗、#i→斜体、#link<a>#br→换行)。下方是 parts 序列——注意 markup part 只带 kind / name / options,不含任何 HTML。

为什么不直接写 HTML?同一条译文可能渲染到网页、终端、PDF、语音——markup 标签让装饰意图呈现方式解耦:Web 端把 #b<strong>,终端端变 ANSI 加粗,互不影响。译者只接触 {#b}…{/b},既无法破坏结构,也无法注入脚本。

format() 会丢掉标记。纯字符串输出无处安放标签,format() 只保留可见文本(标签被忽略)。要用上 markup,必须formatToParts() 自己渲染。下方对照同一条消息两种出口: