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中启用ECMAScript 6小结(windos以及Linux)
Jul 15 NodeJs
基于NodeJS的前后端分离的思考与实践(五)多终端适配
Sep 26 NodeJs
nodejs中简单实现Javascript Promise机制的实例
Dec 06 NodeJs
基于nodejs+express(4.x+)实现文件上传功能
Nov 23 NodeJs
Nodejs爬虫进阶教程之异步并发控制
Feb 15 NodeJs
快速掌握Node.js之Window下配置NodeJs环境
Mar 21 NodeJs
nodejs multer实现文件上传与下载
May 10 NodeJs
webpack打包nodejs项目的方法
Sep 26 NodeJs
基于nodejs的雪碧图制作工具的示例代码
Nov 05 NodeJs
M2实现Nodejs项目自动部署的方法步骤
May 05 NodeJs
nodeJS与MySQL实现分页数据以及倒序数据
Jun 05 NodeJs
Nodejs + sequelize 实现增删改查操作
Nov 07 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文本操作类
2006/11/25 PHP
php 的反射详解及示例代码
2016/08/25 PHP
PHP进程通信基础之信号量与共享内存通信
2017/02/19 PHP
PHP使用递归按层级查找数据的方法
2019/11/10 PHP
jQuery库与其他JS库冲突的解决办法
2010/02/07 Javascript
js遍历td tr等html元素
2012/12/13 Javascript
自己使用js/jquery写的一个定制对话框控件
2014/05/02 Javascript
jquery取子节点及当前节点属性值的方法
2014/09/09 Javascript
node.js中的http.response.removeHeader方法使用说明
2014/12/14 Javascript
JSON+Jquery省市区三级联动
2016/01/13 Javascript
JSON 对象未定义错误的解决方法
2016/09/29 Javascript
angular+webpack2实战例子
2017/05/23 Javascript
深入浅析Node.js 事件循环、定时器和process.nextTick()
2018/10/22 Javascript
JS根据Unix时间戳显示发布时间是多久前【项目实测】
2019/07/10 Javascript
VUE页面中通过双击实现复制表格中内容的示例代码
2020/06/11 Javascript
在Django的模板中使用认证数据的方法
2015/07/23 Python
python编程实现归并排序
2017/04/14 Python
Django 实现下载文件功能的示例
2018/03/06 Python
Python实现的将文件每一列写入列表功能示例【测试可用】
2018/03/19 Python
Python生成任意范围任意精度的随机数方法
2018/04/09 Python
详解python中的json和字典dict
2018/06/22 Python
python执行精确的小数计算方法
2019/01/21 Python
python实现对输入的密文加密
2019/03/20 Python
为什么从Python 3.6开始字典有序并效率更高
2019/07/15 Python
Python threading.local代码实例及原理解析
2020/03/16 Python
解决Keras 自定义层时遇到版本的问题
2020/06/16 Python
Python使用pycharm导入pymysql教程
2020/09/16 Python
Python LMDB库的使用示例
2021/02/14 Python
如何用JQuery进行表单验证
2013/05/29 面试题
领导干部保密承诺书
2014/08/30 职场文书
教师个人教学总结
2015/02/11 职场文书
2015年村党支部工作总结
2015/04/30 职场文书
安全生产会议制度
2015/08/06 职场文书
2016年小学生教师节广播稿
2015/12/18 职场文书
2019企业给员工的慰问信
2019/06/24 职场文书
idea以任意顺序debug多线程程序的具体用法
2021/08/30 Java/Android