国际化
语言标签
RFC 5646 (BCP 47) 规定的语言标签的格式如下:
language-script-region-variant-extension-privateuse
language
:这部分使用的是 ISO 639-1, ISO 639-2, ISO 639-3, ISO 639-5 中定义的语言代码,必填- 这个部分由
primary-extlang
两个部分构成 primary
部分使用 ISO 639-1, ISO 639-2, ISO 639-3, ISO 639-5 中定义的语言代码,优先使用 ISO 639-1 中定义的条目,比如汉语zh
extlang
部分是在某些历史性的兼容性的原因,在需要非常细致地区别primary
语言的时候使用,使用 ISO 639-3 中定义的三个字母的代码,比如普通话cmn
- 虽然
language
可以只写extlang
省略primary
部分,但出于兼容性的考虑,还是建议加上primary
部分
- 这个部分由
script
: 这部分使用的是 ISO 15924 (Wikipedia) 中定义的语言代码,比如简体汉字是zh-Hans
,繁体汉字是zh-Hant
。region
: 这部分使用的是 [ISO 3166-1][iso3166-1] ([Wikipedia][iso3166-1_wiki]) 中定义的地理区域代码,比如zh-Hans-CN
就是中国大陆使用的简体中文。variant
: 用来表示extlang
的定义里没有包含的方言,具体的使用方法可以参考 RFC 5646 。extension
: 用来为自己的应用做一些语言上的额外的扩展,具体的使用方法可以参考 RFC 5646 。privateuse
: 用来表示私有协议中约定的一些语言上的区别,具体的使用方法可以参考 RFC 5646 。
其中只有 language
部分是必须的,其他部分都是可选的;不过为了便于编写程序,建议设计接口时约定语言标签的结构,比如统一使用 language-script-region
的形式( zh-Hans-CN
, zh-Hant-HK
等等)。
语言标签是大小写不敏感的,但按照惯例,建议 script
部分首字母大写, region
部分全部大写,其余部分全部小写。
有一点需要注意,任何合法的标签都必须经过 IANA 的认证,已通过认证的标签可以在这个网页查到。此外,网上还有一个非官方的标签搜索引擎。
相关资料:
- ISO 639-1 Code List (Wikipedia)
- ISO 639-2 Code List (Wikipedia)
- ISO 639-3 Code List
- ISO 639-5 Code List (Wikipedia)
- ISO 639-3 Macrolanguage Mappings (Wikipedia)
- Relationship between ISO 639-3 and the other parts of ISO 639
- 网页头部的声明应该是用 lang=”zh” 还是 lang=”zh-cn”? - 知乎
- IETF language tag - Wikipedia
- 语种名称代码 :文中对带有方言(
extlang
)部分的标签介绍有误 - Language tags in HTML and XML
- Choosing a Language Tag
时区
客户端请求服务器时,如果对时间有特殊要求(如某段时间每天的统计信息),则可以参考 IETF 相关草案 增加请求头 Timezone
。
Timezone: 2016-11-06 23:55:52+08:00;;Asia/Shanghai
具体格式说明:
Timezone: RFC3339 约定的时间格式;POSIX 1003.1 约定的时区字符串;tz datebase 里的时区名称
客户端最好提供所有字段,如果没有办法提供,则应该使用空字符串
如果客户端请求时没有指定相应的时区,则服务端默认使用最后一次已知时区或者 UTC 时间返回相应数据。
PS 考虑到存在夏时制这种东西,所以不推荐客户端在请求时使用 Offset 。
相关资料:
- RFC3339
- tz datebase (Wikipedia)
- POSIX 1003.1 时区字符串的说明文档
时间格式
时间格式遵循 ISO 8601(Wikipedia) 建议的格式:
- 日期
2014-07-09
- 时间
14:31:22+0800
- 具体时间
2007-11-06T16:34:41Z
- 持续时间
P1Y3M5DT6H7M30S
(表示在一年三个月五天六小时七分三十秒内) - 时间区间
2007-03-01T13:00:00Z/2008-05-11T15:30:00Z
、2007-03-01T13:00:00Z/P1Y2M10DT2H30M
、P1Y2M10DT2H30M/2008-05-11T15:30:00Z
- 重复时间
R3/2004-05-06T13:00:00+08/P0Y6M5DT3H0M0S
(表示从2004年5月6日北京时间下午1点起,在半年零5天3小时内,重复3次)
相关资料:
货币名称
货币名称可以参考 ISO 4217(Wikipedia) 中的约定,标准为货币名称规定了三个字母的货币代码,其中的前两个字母是 [ISO 3166-1]iso3166-1 中定义的双字母国家代码,第三个字母通常是货币的首字母。在货币上使用这些代码消除了货币名称(比如 dollar )或符号(比如 $ )的歧义。
相关资料:
- 《RESTful Web Services Cookbook 中文版》 3.9 节《如何在表述中使用可移植的数据格式》