文章出處

前言

 最近加入到新項目組負責前端技術預研和選型,其中涉及到一個熟悉又陌生的需求——國際化&本地化。熟悉的是之前的項目也玩過,陌生的是之前的實現僅僅停留在"有"的階段而已。趁著這個機會好好學習整理一下,為后面的技術選型做準備。
 本篇作為系列的最后一篇,打算和大家一起看看HTTP的Content Negotiation機制和更多關于本地化的應用方向。

Content Negotiation(內容協同)

 記得第一次接觸國際化和本地化時是指服務端根據請求頭字段Accept-Language獲取language-tag然后向用戶返回相應的內容,這其實是利用HTTP提供的Content Negotiation機制。
 所謂Content Negotiation機制其實就是通過Accept,Accept-LanguageAccept-Encoding等請求頭字段作為依據對存在多個可用展現方式的某一資源選擇最優的展現方式返回給用戶,如語言文化、適合在屏幕上瀏覽還是用于打印等。
 這里又分為服務端協商(Server-driven Negotiation)和代理端協商(Agent-driven Negotiation)

  1. Server-driven Negotiation
     就是擇優返回展現方式的算法由服務端提供的Content Negotiation就是Server-driven Negotiation了。
     一般通過Accept,Accept-Language,Accept-EncodingUser-Agent等請求頭字段作為依據去選擇最優解。
    缺點:

a. 服務端永遠無法精準地計算出最優解,部分原因是因為內容如何展現是由代理端決定,而請求中無法獲取代理端的所有信息,若允許獲取代理端的所有信息,那么網絡傳送的數據量將變大而且會涉及隱私安全的問題;

b. 服務端實現復雜度提高;

c. 由于對于同一個url可能會返回不同的響應報文,因此不能利用公用的緩存去暫存響應報文,從而喪失進一步的優化空間。

  1. Agent-driven Negotiation
     就是代理端從服務端接收到一個基本的響應后,然后擇優展現方式的算法由代理端(實際上就是讓用戶自行選擇最優展現方式)提供的Content Negotiation就是Agent-driven Negotiation了。
     注意這里是先從服務端接收一個基本的響應,然后代理根據這個響應再計算最優的展現方式。那么這個基本的響應是什么呢?HTTP/1.1定義300(Multiple Choices)和406(Not Acceptable)兩個HTTP status code來通知代理端這個請求是的采用Agent-driven Negotiation.
    300 Multiple Choices
     當請求的資源在多個位置找到時,這些位置將以列表的形式作為響應報文返回給用戶,由用戶自行選擇具體要訪問哪個位置。若服務端打算推薦某個位置作為優先選擇時,可將該位置作為響應頭字段Location的值返回.
    300
    406 Not Acceptable
     當服務端發現無法滿足請求頭的Accept,Accept-Charset,Accept-EncodingAccept-Language時,則會返回406狀態編碼。因此406不是表示存在多個選擇而是表示沒有適合的選項。
    缺點:

a. 經過代理端計算后,需要發起第二個請求來獲取最優展現形式的具體內容,響應延遲提高。
 綜合上述兩種方式得到一種稱為透明協商(Transparent Negotiation)的方式,其實就是對緩存系統作修改,讓其除URL外還可以識別其他請求頭字段等信息,來映射特定展現方式的響應報文。也就是說擇優算法部分還是由服務端提供。

這里看來國際化/本地化是Content Negotiation的子集哦!

樣式因文化而不同 by :lang

Selectors Level 4已經加入對BCP 47高級匹配算法的支持,即有以下玩法

<style>
:lang(en){ color: red; }
div:lang(en-GB){ color: red; }
</style>
<p>En janvier, toutes les boutiques de Londres affichent des panneaux 
<span lang="en-GB">SALE</span>, mais en fait ces magasins sont bien propres!</p>
<div lang="en-GB">BIG SALE</div>

Screenshot_from_2016_09_20_17_45_39
甚至還有支持通配符*(雖然現在未被瀏覽器支持)

<style>
:lang(*-CH){color: red}
</style>
<p lang="de-CH">Hi guy!</p>
<p lang="it-CH">Hi man!</p>

總結

本系列粗略歸納了國際化&本地化相關內容,若有紕漏請各位指正,謝謝!
尊重原創,轉載請注明來自: http://www.cnblogs.com/fsjohnhuang/p/5915072.html ^_^肥仔John

感謝

HTTP 請求406如何解決?有截圖
趣解HTTP狀態碼


文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()