多語言切換實現(xiàn)

???????為了順應(yīng)國際化的腳步,有時會碰到多語言切換的需求,例如Amazon官網(wǎng)上的這一幕


???????那么為了協(xié)商使用何種語言顯示頁面,就可以通過Accept-Language檢測瀏覽器的語言(每種語言類型用逗號進(jìn)行分隔,其權(quán)重值由分號進(jìn)行分隔,未設(shè)置的權(quán)重默認(rèn)為1)
請求頭字段Accept-Language

接著用代碼簡單模擬一遍實現(xiàn)流程~~

  • 準(zhǔn)備好語言包后首先將Accept-Language解析成一個個對象并存入數(shù)組當(dāng)中。每個對象都含有兩個屬性:語言類型和權(quán)重值
  • 按照權(quán)重值從大到小對數(shù)組進(jìn)行排序
  • 依次將數(shù)組中每個對象的語言類型與服務(wù)端的語言包進(jìn)行匹配,一旦匹配成功則結(jié)束遍歷,否則按默認(rèn)語言類型返回數(shù)據(jù)
let http = require('http');
let server = http.createServer(request);
server.listen(8080);
// 簡單版的語言包
const lanPack = {
    en: {
        title: 'Hey,bro'
    },
    zh: {
        title: '嘿,兄弟'
    },
    default: 'en'
}
function request(req, res) {
    // 實現(xiàn)服務(wù)器和客戶端的協(xié)議,選擇客戶端最想要的,并且服務(wù)器剛好有的
    // Accept-Language: en,zh-CN;q=0.9,zh;q=0.8
    let acceptLanguage = req.headers['accept-language'];
    if (acceptLanguage) {
        const lans = acceptLanguage.split(',').map(function (item) {
            let values = item.split(';');
            let name = values[0];
            let q = values[1] ? parseFloat(values[1].split('=')[1]) : 1;
            return {
                name, q
            }
        }).sort((a, b) => b.q - a.q);
        let lan = lanPack.default;// 默認(rèn)語種
        console.log(lans); // [ { name: 'en', q: 1 },  { name: 'zh-CN', q: 0.9 },  { name: 'zh', q: 0.8 } ]

        for (let i = 0; i < lans.length; i++) {
            // 如果說此語言在語言包里有,那么就使用此語言
            if (lanPack[lans[i].name]) {
                lan = lans[i].name;
                break;
            }
        }
        res.end(lanPack[lan].title);
    }
}

最后,補充一下,如果想要修改Accept-Language中的優(yōu)先順序,可以參考Chrome瀏覽器如何修改Accept Language?

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

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

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