本文共 1890 字,大约阅读时间需要 6 分钟。
最近加入到新项目组负责前端技术预研和选型,其中涉及到一个熟悉又陌生的需求——国际化&本地化。熟悉的是之前的项目也玩过,陌生的是之前的实现仅仅停留在"有"的阶段而已。趁着这个机会好好学习整理一下,为后面的技术选型做准备。
本篇作为系列的最后一篇,打算和大家一起看看HTTP的Content Negotiation机制和更多关于本地化的应用方向。 记得第一次接触国际化和本地化时是指服务端根据请求头字段Accept-Language
获取language-tag然后向用户返回相应的内容,这其实是利用HTTP提供的Content Negotiation机制。
Accept
,Accept-Language
和Accept-Encoding
等请求头字段作为依据对存在多个可用展现方式的某一资源选择最优的展现方式返回给用户,如语言文化、适合在屏幕上浏览还是用于打印等。 这里又分为服务端协商(Server-driven Negotiation)和代理端协商(Agent-driven Negotiation) 一般通过Accept
,Accept-Language
,Accept-Encoding
和User-Agent
等请求头字段作为依据去选择最优解。
注意这里是先从服务端接收一个基本的响应,然后代理根据这个响应再计算最优的展现方式。那么这个基本的响应是什么呢?HTTP/1.1定义300(Multiple Choices)和406(Not Acceptable)两个HTTP status code来通知代理端这个请求是的采用Agent-driven Negotiation.
300 Multiple Choices
当请求的资源在多个位置找到时,这些位置将以列表的形式作为响应报文返回给用户,由用户自行选择具体要访问哪个位置。若服务端打算推荐某个位置作为优先选择时,可将该位置作为响应头字段Location
的值返回. 406 Not Acceptable
当服务端发现无法满足请求头的Accept
,Accept-Charset
,Accept-Encoding
或Accept-Language
时,则会返回406状态编码。因此406不是表示存在多个选择而是表示没有适合的选项。缺点: 这里看来国际化/本地化是Content Negotiation的子集哦!
:lang
已经加入对BCP 47高级匹配算法的支持,即有以下玩法
甚至还有支持通配符En janvier, toutes les boutiques de Londres affichent des panneaux SALE, mais en fait ces magasins sont bien propres!
BIG SALE
*
(虽然现在未被浏览器支持) Hi guy!
Hi man!
本系列粗略归纳了国际化&本地化相关内容,若有纰漏请各位指正,谢谢!
尊重原创,转载请注明来自: ^_^肥仔John