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的前后端分离的思考与实践(二)模版探索
Sep 26 NodeJs
nodejs实现bigpipe异步加载页面方案
Jan 26 NodeJs
Nodejs从有门道无门菜鸟起飞必看教程
Jul 20 NodeJs
详解nodejs express下使用redis管理session
Apr 24 NodeJs
NodeJs模拟登陆正方教务
Apr 28 NodeJs
nodejs async异步常用函数总结(推荐)
Nov 17 NodeJs
nodejs实现爬取网站图片功能
Dec 14 NodeJs
nodeJS服务器的创建和重新启动的实现方法
May 12 NodeJs
Nodejs把接收图片base64格式保存为文件存储到服务器上
Sep 26 NodeJs
nodejs 使用http进行post或get请求的实例(携带cookie)
Jan 03 NodeJs
纯异步nodejs文件夹(目录)复制功能
Sep 03 NodeJs
浅谈Node的内存泄露问题
May 06 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 mkdir()定义和用法
2009/01/14 PHP
php下清空字符串中的HTML标签的代码
2010/09/06 PHP
php字符编码转换之gb2312转为utf8
2013/10/28 PHP
php实现与erlang的二进制通讯实例解析
2014/07/23 PHP
php ajax confirm 删除实例详解
2019/03/06 PHP
浏览器无法运行JAVA脚本的解决方法
2008/01/09 Javascript
onsubmit阻止form表单提交与onclick的相关操作
2010/09/03 Javascript
javascript 事件处理程序介绍
2012/06/27 Javascript
JS/FLASH实现复制代码到剪贴板(兼容所有浏览器)
2013/05/27 Javascript
js判断浏览器类型的方法
2013/08/07 Javascript
jQuery lazyLoad图片延迟加载插件的优化改造方法分享
2013/08/13 Javascript
node.js中的console.dir方法使用说明
2014/12/10 Javascript
JavaScript数据类型详解
2015/04/01 Javascript
javascript另类方法实现htmlencode()与htmldecode()函数实例分析
2016/11/17 Javascript
Javascript同时声明一连串(多个)变量的方法
2017/01/23 Javascript
JS按条件 serialize() 对应标签的使用方法
2017/07/24 Javascript
Express使用html模板的详细代码
2017/09/18 Javascript
angularjs 缓存的使用详解
2018/03/19 Javascript
8 个有用的JS技巧(推荐)
2019/07/03 Javascript
es6函数name属性功能与用法实例分析
2020/04/18 Javascript
Vue实现鼠标经过文字显示悬浮框效果的示例代码
2020/10/14 Javascript
Python对象体系深入分析
2014/10/28 Python
Python创建xml文件示例
2017/03/22 Python
Python图像处理之直线和曲线的拟合与绘制【curve_fit()应用】
2018/12/26 Python
HTML5实现表单自动验证功能实例代码
2017/01/11 HTML / CSS
Daisy London官网:英国最大的首饰集团IBB旗下
2019/02/28 全球购物
爱尔兰旅游网站:ebookers.ie
2020/01/24 全球购物
远程学习的教学用品和家庭学习资源:Really Good Stuff
2020/04/27 全球购物
物理研修随笔感言
2014/02/14 职场文书
2015年大学生村官工作总结
2015/04/21 职场文书
简历中的自我评价怎么写呢?
2019/04/30 职场文书
演讲稿之感恩老师(三篇范文)
2019/09/06 职场文书
详解Java实践之抽象工厂模式
2021/06/18 Java/Android
vue route新窗口跳转页面并且携带与接收参数
2022/04/10 Vue.js
在 Python 中利用 Pool 进行多线程
2022/04/24 Python
Python matplotlib安装以及实现简单曲线的绘制
2022/04/26 Python