欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

NodeJS 實(shí)現(xiàn)多語(yǔ)言的示例代碼

 更新時(shí)間:2018年09月11日 11:25:07   作者:pandashen  
這篇文章主要介紹了NodeJS 實(shí)現(xiàn)多語(yǔ)言的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

什么是多語(yǔ)言?

我們平時(shí)訪問(wèn)一些文檔類型的網(wǎng)站時(shí),經(jīng)??梢钥吹巾?yè)面右上角有一個(gè)下拉框用來(lái)選擇當(dāng)前頁(yè)面支持的語(yǔ)言,并在選中后將整個(gè)網(wǎng)頁(yè)的內(nèi)容切換為選中的語(yǔ)言,這就是項(xiàng)目中的多語(yǔ)言,多語(yǔ)言可以根據(jù)瀏覽器請(qǐng)求發(fā)送的語(yǔ)言類型在服務(wù)器進(jìn)行設(shè)置,也可以在請(qǐng)求服務(wù)器時(shí)返回多種語(yǔ)言,并根據(jù)權(quán)重和瀏覽器的支持情況進(jìn)行選擇和渲染。

功能描述

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

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

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

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

文件:server.js

const http = require("http");
const querystring = require("querystring");

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

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

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

  // 如果客戶端設(shè)置了語(yǔ)言
  if (languages) {
    // 解析語(yǔ)言為 [{ 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)檢測(cè) languagesPackage 是否存在客戶端的語(yǔ)言
    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);
      }
    }
  }

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

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

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

驗(yàn)證多語(yǔ)言

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

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

復(fù)制代碼 代碼如下:
curl -v --header “Accept-Language: zh-CN, zh;q=0.7, en;q=0.8, fr;q=0.1” http://localhost:3000

總結(jié)

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

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Node.js、Socket.IO和GPT-4構(gòu)建AI聊天機(jī)器人的項(xiàng)目實(shí)踐

    Node.js、Socket.IO和GPT-4構(gòu)建AI聊天機(jī)器人的項(xiàng)目實(shí)踐

    本文主要介紹了Node.js、Socket.IO和GPT-4構(gòu)建AI聊天機(jī)器人的項(xiàng)目實(shí)踐,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • 命令行批量截圖Node腳本示例代碼

    命令行批量截圖Node腳本示例代碼

    這篇文章主要給大家介紹了關(guān)于命令行批量截圖Node腳本的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-01-01
  • 新入門node.js必須要知道的概念(必看篇)

    新入門node.js必須要知道的概念(必看篇)

    下面小編就為大家?guī)?lái)一篇新入門node.js必須要知道的概念(必看篇)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-08-08
  • NestJS系列核心概念之Module模塊示例詳解

    NestJS系列核心概念之Module模塊示例詳解

    這篇文章主要為大家介紹了NestJS系列核心概念之Module模塊示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • 詳解用node.js實(shí)現(xiàn)簡(jiǎn)單的反向代理

    詳解用node.js實(shí)現(xiàn)簡(jiǎn)單的反向代理

    本篇文章主要介紹了詳解用node.js實(shí)現(xiàn)簡(jiǎn)單的反向代理,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-06-06
  • node.js去水印方法實(shí)例分析

    node.js去水印方法實(shí)例分析

    這篇文章主要介紹了node.js去水印方法,結(jié)合實(shí)例形式分析了node.js基于第三方平臺(tái)實(shí)現(xiàn)去水印的相關(guān)交互與操作技巧,需要的朋友可以參考下
    2023-04-04
  • nodejs實(shí)現(xiàn)UDP組播示例方法

    nodejs實(shí)現(xiàn)UDP組播示例方法

    這篇文章主要介紹了nodejs實(shí)現(xiàn)UDP組播示例方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • 淺談node.js中間件有哪些類型

    淺談node.js中間件有哪些類型

    這篇文章主要介紹了node.js中間件有哪些類型,對(duì)中間件感興趣的同學(xué),可以參考下
    2021-04-04
  • Node.JS獲取GET,POST數(shù)據(jù)之queryString模塊使用方法詳解

    Node.JS獲取GET,POST數(shù)據(jù)之queryString模塊使用方法詳解

    本文將詳細(xì)介紹nodeJS中的queryString模塊使用方法,包括Node.JS獲取GET,POST數(shù)據(jù)的方法,需要的朋友可以參考下
    2020-02-02
  • 純異步nodejs文件夾(目錄)復(fù)制功能

    純異步nodejs文件夾(目錄)復(fù)制功能

    這篇文章主要介紹了純異步nodejs文件夾(目錄)復(fù)制功能,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-09-09

最新評(píng)論