nodejs 國際化 ,多語言

在這里插入圖片描述

什么是多語言?

我們平時訪問一些文檔類型的網(wǎng)站時盼理,經(jīng)程干剑可以看到頁面右上角有一個下拉框用來選擇當(dāng)前頁面支持的語言,并在選中后將整個網(wǎng)頁的內(nèi)容切換為選中的語言宏怔,這就是項目中的多語言奏路,多語言可以根據(jù)瀏覽器請求發(fā)送的語言類型在服務(wù)器進(jìn)行設(shè)置,也可以在請求服務(wù)器時返回多種語言臊诊,并根據(jù)權(quán)重和瀏覽器的支持情況進(jìn)行選擇和渲染鸽粉。

功能描述

在本文中我們通過客戶端向服務(wù)器發(fā)送請求告訴服務(wù)器客戶端所支持的語言及權(quán)重,服務(wù)器檢索語言包并根據(jù)客戶端發(fā)送的語言類型和權(quán)重返回對應(yīng)語言的內(nèi)容抓艳。

在這個過程中客戶端向服務(wù)器發(fā)送請求需要使用請求頭 Accept-Language触机,值中設(shè)置語言類型和權(quán)重,語言與語言之間使用 , 隔開,語言與權(quán)重之間使用 ; 隔開儡首,權(quán)重用 q 表示片任,與值用 = 隔開,如果權(quán)重值為 1 則可省略(最大值)蔬胯,值的格式為 zh-CN, zh;q=0.7, en;q=0.8, fr;q=0.1对供。

服務(wù)器響應(yīng)時,應(yīng)通過響應(yīng)頭告訴瀏覽器返回的內(nèi)容為何種語言笔宿,響應(yīng)頭為 Content-Language, 值的格式為 zh-CN, en犁钟,多個語言之間使用 , 隔開。

服務(wù)器的實現(xiàn)

// 文件:server.js
const http = require("http");
const querystring = require("querystring");

// 語言包
let languagesPackage = {
    "zh-CN": "你好",
    en: "Hello",
    fr: "Bonjour"
};

// 默認(rèn)語言為英語
languagesPackage.defaultLanguage = "en";

// 創(chuàng)建服務(wù)器
const server = http.createServer((req, res) => {
    // 獲取請求頭中的語言和權(quán)重
    let languages = req.headers["accept-language"];

    // 如果客戶端設(shè)置了語言
    if (languages) {
        // 解析語言為 [{ name: 'zh-CN', q: 1 }, { name: 'en', q: '0.8' }] 格式
        let lans = languages
            .split(",")
            .map(lang => {
                let [name, q = 1] = Object.keys(
                    querystring.parse(lang.tirm(), ";q=")
                );
                return { name, q };
            })
            .sort((a, b) => b.q - a.q); // 并按照權(quán)重逆序排序

        // 循環(huán)檢測 languagesPackage 是否存在客戶端的語言
        for (let i = 0; i < lans.length; i++) {
            let { name } = lans[i];
            let content = languagesPackage[name];

            // 如果存在直接設(shè)置響應(yīng)頭并返回內(nèi)容
            if (content) {
                res.setHeader("Content-Type", name);
                return res.end(content);
            }
        }
    }

    // 如果客戶端沒設(shè)置語言活語言找不到時返回服務(wù)器設(shè)置的默認(rèn)語言
    res.setHeader("Content-Type", languagesPackage.defaultLanguage);
    res.end(languagesPackage[languagesPackage.defaultLanguage]);
});

server.listen(3000, () => {
    console.log("server start 3000");
});

其實上面服務(wù)器和客戶端配合實現(xiàn)多語言的思路就是客戶端向服務(wù)器發(fā)送 Accept-Language 告訴服務(wù)器需要的語言和權(quán)重泼橘,服務(wù)器解析后根據(jù)權(quán)重從大到小排序涝动,然后循環(huán)判斷語言包中是否含有客戶端需要的語言,如果有炬灭,則中斷循環(huán)直接設(shè)置響應(yīng)頭和返回對應(yīng)內(nèi)容醋粟,如果不存在客戶端的需要的語言或者客戶端沒有向后臺發(fā)送 Accept-Language 則返回服務(wù)器默認(rèn)設(shè)置的語言類型和內(nèi)容。

驗證多語言

為了方便我們使用 curl 模擬客戶端向服務(wù)器發(fā)送請求查看返回內(nèi)容是否正確重归,之所以使用 curl 是因為只發(fā)送驗證的請求米愿,方便設(shè)置 Accept-Language 請求頭,更靈活的控制多語言的類型和權(quán)重鼻吮。

啟動服務(wù)器 server.js育苟,打開命令行窗口,輸入下面的命令執(zhí)行椎木,查看返回命令行響應(yīng)體中的內(nèi)容和設(shè)置的語言是否對應(yīng)违柏。

curl -v --header “Accept-Language: zh-CN, zh;q=0.7, en;q=0.8, fr;q=0.1” http://localhost:3000

總結(jié)

這樣我們就實現(xiàn)了一個簡單的多語言,其實真正的多語言在服務(wù)器是需要做繁瑣的解析和性能優(yōu)化的(只解析界面有的單詞返回香椎,保證響應(yīng)體中的內(nèi)容最惺),在前端可以通過 JavaScript 的庫 il8n(國際化語言包)來實現(xiàn)畜伐。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末馍惹,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子玛界,更是在濱河造成了極大的恐慌万矾,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件慎框,死亡現(xiàn)場離奇詭異良狈,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)鲤脏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進(jìn)店門们颜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來吕朵,“玉大人,你說我怎么就攤上這事窥突∨#” “怎么了?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵阻问,是天一觀的道長梧税。 經(jīng)常有香客問我,道長称近,這世上最難降的妖魔是什么第队? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮刨秆,結(jié)果婚禮上凳谦,老公的妹妹穿的比我還像新娘。我一直安慰自己衡未,他們只是感情好尸执,可當(dāng)我...
    茶點故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著缓醋,像睡著了一般如失。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上送粱,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天褪贵,我揣著相機(jī)與錄音,去河邊找鬼抗俄。 笑死脆丁,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的橄镜。 我是一名探鬼主播偎快,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼冯乘,長吁一口氣:“原來是場噩夢啊……” “哼洽胶!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起裆馒,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤姊氓,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后喷好,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體翔横,經(jīng)...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年梗搅,在試婚紗的時候發(fā)現(xiàn)自己被綠了禾唁。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片效览。...
    茶點故事閱讀 39,926評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖荡短,靈堂內(nèi)的尸體忽然破棺而出丐枉,到底是詐尸還是另有隱情,我是刑警寧澤掘托,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布瘦锹,位于F島的核電站,受9級特大地震影響闪盔,放射性物質(zhì)發(fā)生泄漏弯院。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一泪掀、第九天 我趴在偏房一處隱蔽的房頂上張望听绳。 院中可真熱鬧,春花似錦异赫、人聲如沸辫红。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽贴妻。三九已至,卻和暖如春蝙斜,著一層夾襖步出監(jiān)牢的瞬間名惩,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工孕荠, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留娩鹉,地道東北人。 一個月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓稚伍,卻偏偏與公主長得像弯予,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子个曙,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,871評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 本文是《圖解HTTP》讀書筆記的第二篇锈嫩,主要包括此書的第六章內(nèi)容,因為第六章的內(nèi)容較多垦搬,而且比較重要呼寸,所以單獨寫為...
    lijiankun24閱讀 1,364評論 0 6
  • 作者:李成文;標(biāo)簽: http首部 HTTP報文首部 HTTP協(xié)議的請求和響應(yīng)報文中必定包含HTTP首部猴贰。首部內(nèi)容...
    廣州蘆葦科技web前端閱讀 1,094評論 0 0
  • API定義規(guī)范 本規(guī)范設(shè)計基于如下使用場景: 請求頻率不是非常高:如果產(chǎn)品的使用周期內(nèi)請求頻率非常高对雪,建議使用雙通...
    有涯逐無涯閱讀 2,540評論 0 6
  • 請求首部字段 請求首部字段是從客戶端往服務(wù)器端發(fā)送請求報文中所使用的字段, 用于補(bǔ)充請求的附加信息米绕、客戶端信息瑟捣、對...
    THINKA閱讀 290評論 0 0
  • 今日打卡2:共計40分鐘 “快速”這個概念根本就不應(yīng)該與“成功”產(chǎn)生關(guān)聯(lián)馋艺,而應(yīng)該與“入門”關(guān)聯(lián)起來,入門不僅要快迈套,...
    吟_f3da閱讀 240評論 0 0