NodeJS 实现多语言的示例代码


Posted in NodeJs onSeptember 11, 2018

什么是多语言?

我们平时访问一些文档类型的网站时,经常可以看到页面右上角有一个下拉框用来选择当前页面支持的语言,并在选中后将整个网页的内容切换为选中的语言,这就是项目中的多语言,多语言可以根据浏览器请求发送的语言类型在服务器进行设置,也可以在请求服务器时返回多种语言,并根据权重和浏览器的支持情况进行选择和渲染。

功能描述

在本文中我们通过客户端向服务器发送请求告诉服务器客户端所支持的语言及权重,服务器检索语言包并根据客户端发送的语言类型和权重返回对应语言的内容。

在这个过程中客户端向服务器发送请求需要使用请求头 Accept-Language,值中设置语言类型和权重,语言与语言之间使用 , 隔开,语言与权重之间使用 ; 隔开,权重用 q 表示,与值用 = 隔开,如果权重值为 1 则可省略(最大值),值的格式为 zh-CN, zh;q=0.7, en;q=0.8, fr;q=0.1。

服务器响应时,应通过响应头告诉浏览器返回的内容为何种语言,响应头为 Content-Language, 值的格式为 zh-CN, en,多个语言之间使用 , 隔开。

服务器的实现

文件:server.js

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

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

// 默认语言为英语
languagesPackage.defaultLanguage = "en";

// 创建服务器
let server = http.createServer((req, res) => {
  // 获取请求头中的语言和权重
  let languages = req.headers["accept-language"];

  // 如果客户端设置了语言
  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); // 并按照权重逆序排序

    // 循环检测 languagesPackage 是否存在客户端的语言
    for (let i = 0; i < lans.length; i++) {
      let { name } = lans[i];
      let content = languagesPackage[name];

      // 如果存在直接设置响应头并返回内容
      if (content) {
        res.setHeader("Content-Type", name);
        return res.end(content);
      }
    }
  }

  // 如果客户端没设置语言活语言找不到时返回服务器设置的默认语言
  res.setHeader("Content-Type", languagesPackage.defaultLanguage);
  res.end(languagesPackage[languagesPackage.defaultLanguage]);
});

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

其实上面服务器和客户端配合实现多语言的思路就是客户端向服务器发送 Accept-Language 告诉服务器需要的语言和权重,服务器解析后根据权重从大到小排序,然后循环判断语言包中是否含有客户端需要的语言,如果有,则中断循环直接设置响应头和返回对应内容,如果不存在客户端的需要的语言或者客户端没有向后台发送 Accept-Language 则返回服务器默认设置的语言类型和内容。

验证多语言

为了方便我们使用 curl 模拟客户端向服务器发送请求查看返回内容是否正确,之所以使用 curl 是因为只发送验证的请求,方便设置 Accept-Language 请求头,更灵活的控制多语言的类型和权重。

启动服务器 server.js,打开命令行窗口,输入下面的命令执行,查看返回命令行响应体中的内容和设置的语言是否对应。

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

总结

这样我们就实现了一个简单的多语言,其实真正的多语言在服务器是需要做繁琐的解析和性能优化的(只解析界面有的单词返回,保证响应体中的内容最小),在前端可以通过 JavaScript 的库 il8n(国际化语言包)来实现。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

NodeJs 相关文章推荐
nodejs调用cmd命令实现复制目录
May 04 NodeJs
nodejs基础知识
Feb 03 NodeJs
搭建简单的nodejs http服务器详解
Mar 09 NodeJs
NodeJs实现定时任务的示例代码
Dec 05 NodeJs
Nodejs模块载入运行原理
Feb 23 NodeJs
nodejs简单读写excel内容的方法示例
Mar 16 NodeJs
nodejs搭建本地服务器轻松解决跨域问题
Mar 21 NodeJs
详解webpack打包nodejs项目(前端代码)
Sep 19 NodeJs
nodejs中函数的调用实例详解
Oct 31 NodeJs
nodejs中request库使用HTTPS代理的方法
Apr 30 NodeJs
nodejs如何在package.json中设置多条启动命令
Mar 16 NodeJs
NodeJS多种创建WebSocket监听的方式(三种)
Jun 04 NodeJs
nodejs高大上的部署方式(PM2)
Sep 11 #NodeJs
Nodejs使用Mongodb存储与提供后端CRD服务详解
Sep 04 #NodeJs
Nodejs Express 通过log4js写日志到Logstash(ELK)
Aug 30 #NodeJs
NodeJS如何实现同步的方法示例
Aug 24 #NodeJs
Nodejs中的JWT和Session的使用
Aug 21 #NodeJs
nodejs 如何手动实现服务器
Aug 20 #NodeJs
nodejs实现一个word文档解析器思路详解
Aug 14 #NodeJs
You might like
php获取当前页面完整URL地址
2015/12/30 PHP
浅谈laravel框架sql中groupBy之后排序的问题
2019/10/17 PHP
javascript web页面刷新的方法收集
2009/07/02 Javascript
javascript 当前日期加(天、周、月、年)
2009/08/09 Javascript
javascript拓展DOM操作 prependChild insertAfert
2010/11/17 Javascript
基于jquery插件制作左右按钮与标题文字图片切换效果
2013/11/07 Javascript
在JS中如何调用JSP中的变量
2014/01/22 Javascript
jQuery中 attr() 方法使用小结
2015/05/03 Javascript
jQuery实现的类似淘宝网站搜索框样式代码分享
2015/08/24 Javascript
微信小程序 http请求详细介绍
2016/10/09 Javascript
jQuery  ready方法实现原理详解
2016/10/19 Javascript
文件上传的几个示例分享【推荐】
2016/12/16 Javascript
一个Vue视频媒体多段裁剪组件的实现示例
2018/08/09 Javascript
非常实用的jQuery代码段集锦【检测浏览器、滚动、复制、淡入淡出等】
2019/08/08 jQuery
vue在路由中验证token是否存在的简单实现
2019/11/11 Javascript
微信小程序scroll-view锚点链接滚动跳转功能
2019/12/12 Javascript
JavaScript面试中常考的字符串操作方法大全(包含ES6)
2020/05/10 Javascript
jQuery实现开关灯效果
2020/08/02 jQuery
python中numpy.zeros(np.zeros)的使用方法
2017/11/07 Python
python、java等哪一门编程语言适合人工智能?
2017/11/13 Python
初探TensorFLow从文件读取图片的四种方式
2018/02/06 Python
python中setuptools的作用是什么
2020/06/19 Python
python ssh 执行shell命令的示例
2020/09/29 Python
Python Process创建进程的2种方法详解
2021/01/25 Python
英国最大的独立家具零售商:Furniture Village
2016/09/06 全球购物
如何实现一个自定义类的序列化
2012/05/22 面试题
Does C# support multiple inheritance? (C#支持多重继承吗)
2012/01/04 面试题
Python的两道面试题
2013/06/29 面试题
工程业务员工作职责
2013/12/07 职场文书
培训专员岗位职责
2014/02/26 职场文书
学雷锋宣传标语
2014/06/25 职场文书
社区活动策划方案
2014/08/21 职场文书
就业协议书怎么填
2014/09/15 职场文书
森马旗舰店双十一营销方案
2014/09/29 职场文书
python爬取网页版QQ空间,生成各类图表
2021/06/02 Python
logback如何自定义日志存储
2021/08/30 Java/Android