nodejs 國際化 ,多語言

在這里插入圖片描述

什么是多語言?

我們平時訪問一些文檔類型的網(wǎng)站時,經(jīng)??梢钥吹巾撁嬗疑辖怯幸粋€下拉框用來選擇當前頁面支持的語言,并在選中后將整個網(wǎng)頁的內(nèi)容切換為選中的語言,這就是項目中的多語言,多語言可以根據(jù)瀏覽器請求發(fā)送的語言類型在服務(wù)器進行設(shè)置,也可以在請求服務(wù)器時返回多種語言,并根據(jù)權(quá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"
};

// 默認語言為英語
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è)置的默認語言
    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ù)器默認設(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)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,362評論 6 544
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,577評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 178,486評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,852評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,600評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,944評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,944評論 3 447
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 43,108評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,652評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 41,385評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,616評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,111評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,798評論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,205評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,537評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,334評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,570評論 2 379

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

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