使用扩展或私有使用子标签时Java消息束属性文件命名规范
Java ResourceBundle 对BCP-47扩展/私有使用子标签的命名规范
JDK7及之后版本原生支持BCP-47区域标签解析,但扩展子标签、私有使用子标签的文件名分隔规则和语言、国家、变体段不同,不要用单下划线拼接这类标签。
正确命名方式
如果你要使用带私有使用子标签RandomTag的en_US区域设置:
- 构造Locale实例时不要把私有标签塞到variant字段,要用标准BCP47方式构造:
Locale locale = Locale.forLanguageTag("en-US-x-RandomTag"); - 对应的属性文件命名为:
message_en_US__x-RandomTag.properties
注意私有标签段x-RandomTag前面是两个连续下划线,标签内部的短横线保留,不需要替换成下划线。
规则细节
- 所有BCP-47扩展段(包含单字符前缀的通用扩展、x开头的私有使用段),在文件名中都以两个下划线作为前缀,和前面的语言、国家、变体段做分隔。比如带日历扩展
u-ca-gregory的zh_CN区域,对应文件名为message_zh_CN__u-ca-gregory.properties。 - 标准BCP-47变体表仍然用单下划线拼接在国家段之后,和扩展段完全分隔,不会出现命名冲突。比如同时带标准变体
scotland和私有标签RandomTag的en_GB区域,对应文件名为message_en_GB_scotland__x-RandomTag.properties,语义清晰无歧义。 - 匹配回退逻辑和普通资源束一致:加载时会从最具体的文件名开始匹配,逐段去掉后缀回退。以上文的
en-US-x-RandomTag为例,查找顺序为:message_en_US__x-RandomTag.propertiesmessage_en_US.propertiesmessage.properties(根默认资源)
常见踩坑点
如果误把扩展/私有标签段前的两个下划线写成一个,Java会把整段内容识别为variant值,相当于退化成「把自定义标签塞到variant字段」的写法,后续接入标准BCP47变体时必然出现匹配优先级混乱、命名冲突的问题。
内容的提问来源于stack exchange,提问作者Ashish Padakannaya
相关产品推荐
相关产品推荐

