摘要

  • RFC 1766 让语言标签呈现出可读的分段形式,但要求应用把完整值当作一个 token;子标签是管理机制,不是菜单。
  • ISO 编码、IANA 注册值和私用空间占据语法中的不同位置。标签与信息对象之间的关系,则由使用该标签的上下文规范来定义。
  • 后续规范确实增加了明确的匹配操作,但没有把 1995 年语法里的每个连字符都变成导航路径。

连字符看起来像面包屑

1995 年 3 月,RFC 1766 提供了一种简洁方式,用来标记信息对象所使用的语言。它的外观容易让人联想到树状路径:先有一个主标签,再接若干由连字符隔开的可选片段。en-US 看起来直观,az-arabic 与 az-cyrillic 则有相同的开头。但 RFC 对这种直觉设下了清楚边界:应用应始终把整个语言标签视为单一 token。主标签与子标签的划分是管理机制,而不是导航工具。

这条规则说明,可读的字符串不等于命令层级。主标签由一至八个字母组成,每个子标签也受同一长度限制。标签内部不得出现空白。大小写不会改变标签含义;虽然存在国家代码大写、语言代码小写之类的惯例,RFC 1766 也明确说这类大小写本身不携带意义。

命名空间有既定边界。两字母主标签依照 ISO 639;i 留给 IANA 定义的注册值;x 表示私用,其后续子标签不会由 IANA 注册。其他主标签则要等标准修订后才能分配。第一段子标签中的两字母值依照 ISO 3166 alpha-2,三至八字母值可以向 IANA 注册;再往后的子标签也可以注册。

因此,这种结构同时承担了两件容易被混为一谈的工作:它让字符串可以逐段阅读,也为命名空间提供行政管理方法。但它没有规定应用必须像遍历目录那样逐段处理,也没有给所有应用中的每个片段赋予同一种含义。RFC 1766 把标签与信息对象之间的关系留给具体使用场景的规范。

注册记录让标签可以公开核验

RFC 1766 的例子包括国家标识(en-US)、方言或变体(no-nynorsk、en-cockney)、由 IANA 注册的语言(i-cherokee),以及文字变体(az-arabic、az-cyrillic)。文件还加了一条重要说明:其中展示的子标签当时都尚未分配。它们用于解释语法,不是可用标签清单。

若要使用 ISO 预设范围之外的值,申请人需要填写语言标签注册表,提供语言名称、本族语名称、已出版的语言描述及其他资料。申请先发到公开邮件列表,接受两周审查。由 IETF 应用领域主管任命的审查者可以把申请转交 IANA,也可以在出现重大异议后拒绝;相关决定可以向 IESG 申诉。要让一种拼写成为他人可核查的共享参考,靠的是公开登记记录,而不是在连字符后面随手添加一个后缀。

这套机制的范围也很窄:它登记标识符和相关资料,并不创建通用用户界面。语言标签本身不会告诉每个协议应该选择哪种表示、筛选哪个文库、打开哪条路由,或显示哪一种语言菜单。具体行为取决于使用标签的上下文。

标头可以列出语言,但不会替应用定义选择器

RFC 1766 还定义了 Content-Language,允许列出多个完整标签。对于 MIME 的 multipart/alternative,文件增加了 Differences 参数,让消息可以声明不同部分之间的差异来自内容语言。RFC 解释了阅读器为什么可能会使用这项信息,但把实际选择显示哪个部分的机制留在规范范围之外。

这样,三个问题保持分离:哪个字符串标识对象所用的语言、哪个协议元素负责传递它,以及接收应用将如何使用它。标签可以放在内容标头里;容器可以表示自己包含不同语言的替代内容;阅读器仍需要自己的选择逻辑。RFC 给出了共享标签和承载位置,没有定义通用导航界面。

后续版本让这种区分更具体。2001 年发布的 RFC 3066 允许子标签出现数字,并引入 language-range 匹配。一个范围可以匹配完整标签,也可以匹配恰好在连字符边界结束的前缀。那是一项有明确定义的匹配操作。RFC 3282 后来规定了 Content-Language 和 Accept-Language 标头,其中包含偏好语言范围与可选的质量值。这些扩展为语言标签增加了明确的协议行为,却没有把 1995 年的连字符变成通用路径。

RFC 4646(2006)与 RFC 5646(2009)继续推进 BCP 47 的修订。它们说明语法和注册规则仍会演变,却不能证明所有客户端都正确处理每个值,也不能证明标签会自动选择页面、译文或渲染方式。RFC 1766 的历史意义更具体:一个有内部结构的标识符,对应用而言仍可以是不可拆分的整体,而它的片段只服务于行政管理惯例。

来源与证据边界

核心规范是 RFC 1766。后续变化见 RFC 3066、RFC 3282、RFC 4646 与 RFC 5646。这些文件可以证明语法、注册程序及后续协议变化,不能证明普遍实现或部署。