Accept-Language與多語言網(wǎng)站應(yīng)用

Accept-Language

我們能從請求頭中獲取到瀏覽器愿意接收的語言類型

let http = require('http');
http.createServer(function(req,res){
    res.end(req.headers['accept-language']);
}).listen(8080);

<<< 輸出
zh-CN,zh;q=0.9

其中多種語言之間用,隔開,而每種語言又可用;分隔,分隔的前面為該種語言的簡稱,后面為其權(quán)重(優(yōu)先級)。

image

langPackage/語言包

一般支持多語言的網(wǎng)站,其服務(wù)器都存儲了多種語言包。當(dāng)客戶端向其請求時(shí),服務(wù)器會查看請求頭看一看客戶端所愿意支持的語言,然后在自己的語言包中進(jìn)行查找??蛻舳私o的接收清單中包含每一種語言的權(quán)重,服務(wù)器會返回客戶端它有的且客戶端相對更喜歡的那一種。如果服務(wù)器所存儲的語言包和客戶端給的清單匹配不上,那么一般來說會使用服務(wù)器所預(yù)置的默認(rèn)語言包。

語言包示例

let langPack = {
    "zh":{
        title:'哈啰 世界!'
    }
    ,"en":{
        title:"hello world!"
    }
}

封裝 getLang

該方法能自動識別客戶端愿意接收的語言類型,然后從服務(wù)器所儲存的多種語言包中選擇一種最合適的來返回?cái)?shù)據(jù)。

最終使用效果像這樣

getLang(req,'title')

設(shè)計(jì)思路

將accept-language解析成一個(gè)數(shù)組,并按照權(quán)重進(jìn)行排序

首先需要對accept-language進(jìn)行解析,將其解析成一個(gè)個(gè)對象。每個(gè)對象代表一種語言,它有兩個(gè)屬性:

  • langType:語言的類型

  • q:語言的權(quán)重
    幫助我們篩選出客戶端相對較喜歡的那一種語言

接著將每個(gè)對象放在一個(gè)數(shù)組中,按照權(quán)重從大到小排列。

選擇語言類型

然后依次將數(shù)組成員的langType和服務(wù)器中所儲存的語言包進(jìn)行匹配,直到匹配成功或遍歷結(jié)束,如果遍歷結(jié)束時(shí)仍沒有匹配成功則按照服務(wù)器的默認(rèn)的語言類型來返回?cái)?shù)據(jù)。

返回索要的數(shù)據(jù)

最后我們選擇了一種語言,我們可以通過getLang方法的第二個(gè)參數(shù)來決定從這個(gè)語言包中拿什么數(shù)據(jù)。

源碼

function getLang(req,dataKey){
  let langPack = {
    'zh':{
      data:'哈啰 世界!'
    }
    ,'en':{
      data:'hello world!'
    }
  };
  //-------------------------------------------------
  let acceptLanguage = req.headers['accept-language']
    ,langs = acceptLanguage.split(',')
    ,langType = 'en';

  // 將accept-language解析成一個(gè)數(shù)組,并按照權(quán)重進(jìn)行排序
  langs = langs.map(function(lang){
    let [langType,langQ] = lang.split(';');
    let q = langQ?parseFloat(langQ.split('=')[1]):1;
    lang = {
      langType
      ,q
    };
    return lang;
  }).sort((a,b)=>b.q-a.q);

  // 選擇語言類型
  for(let i=0;i<langs.length;++i){
    let curType = langs[i].langType;
    if(langPack[curType]){
      langType = curType;
      break;
    }
  }

// 返回索要的數(shù)據(jù)
  return langPack[langType][dataKey];
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,663評論 19 139
  • 本文是《圖解HTTP》讀書筆記的第二篇,主要包括此書的第六章內(nèi)容,因?yàn)榈诹碌膬?nèi)容較多,而且比較重要,所以單獨(dú)寫為...
    lijiankun24閱讀 1,502評論 0 6
  • 前言:最近發(fā)現(xiàn)自己在網(wǎng)絡(luò)相關(guān)這一塊基礎(chǔ)很是欠缺,所以準(zhǔn)備花時(shí)間了解一下,本文主要是講http協(xié)議的一些基礎(chǔ),和一些...
    justCode_閱讀 2,151評論 0 23
  • 教學(xué)目標(biāo): 1、引導(dǎo)學(xué)生體會并學(xué)習(xí)描寫看畫、讀書、聽課等情狀。 2、反復(fù)朗讀,通過誦讀體味作者的思想感情。 3、認(rèn)...
    改變自己369閱讀 1,039評論 0 0
  • 今天突然想到一個(gè)梗:每天早晨叫醒你的,不是夢想,而是鬧鐘。 一個(gè)老梗了。笑笑之余,猛然間腦子一陣空白——我的夢想是...
    誰用了我的尼瓦納閱讀 242評論 0 0

友情鏈接更多精彩內(nèi)容