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教程 安装express及配置app.js文件的详细步骤
May 11 NodeJs
nodejs实现获取当前url地址及url各种参数值
Jun 25 NodeJs
nodejs爬虫抓取数据乱码问题总结
Jul 03 NodeJs
nodejs 实现钉钉ISV接入的加密解密方法
Jan 16 NodeJs
nodejs获取微信小程序带参数二维码实现代码
Apr 12 NodeJs
详解使用nodeJs安装Vue-cli
May 17 NodeJs
nodejs后台集成ueditor富文本编辑器的实例
Jul 11 NodeJs
webstorm中配置nodejs环境及npm的实例
May 15 NodeJs
NodeJS服务器实现gzip压缩的示例代码
Oct 12 NodeJs
手把手教你如何使用nodejs编写cli命令行
Nov 05 NodeJs
nodejs搭建本地服务器并访问文件操作示例
May 11 NodeJs
nodejs各种姿势断点调试的方法
Jun 18 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积分兑换接口实例
2015/02/09 PHP
smarty学习笔记之常见代码段用法总结
2016/03/19 PHP
PHPCMS2008广告模板SQL注入漏洞修复
2016/10/11 PHP
PHP后台微信支付和支付宝支付开发
2017/04/28 PHP
Laravel 5.5基于内置的Auth模块实现前后台登陆详解
2017/12/21 PHP
php如何获取Http请求
2020/04/30 PHP
window.onload 加载完毕的问题及解决方案(上)
2009/07/09 Javascript
JQuery 图片延迟加载并等比缩放插件
2009/11/09 Javascript
Jquery Validate 正则表达式实用验证代码大全
2013/08/23 Javascript
一个字符串反转函数可实现字符串倒序
2014/09/15 Javascript
jQuery计算文本框字数及限制文本框字数的方法
2016/03/01 Javascript
js实现的下拉框二级联动效果
2016/04/30 Javascript
详解AngularJS中ng-src指令的使用
2016/09/07 Javascript
jQuery webuploader分片上传大文件
2016/11/07 Javascript
Bootstrap基本样式学习笔记之按钮(4)
2016/12/07 Javascript
微信小程序 Template详解及简单实例
2017/01/05 Javascript
Angular中ng-repeat与ul li的多层嵌套重复问题
2017/07/24 Javascript
vue2.5.2使用http请求获取静态json数据的实例代码
2018/02/27 Javascript
Node.js readline 逐行读取、写入文件内容的示例
2018/03/01 Javascript
JS中的事件委托实例浅析
2018/03/22 Javascript
vue监听键盘事件的快捷方法【推荐】
2018/07/11 Javascript
layUI实现三级导航菜单效果
2019/07/26 Javascript
Python 逐行分割大txt文件的方法
2017/10/10 Python
Tornado Web Server框架编写简易Python服务器
2018/07/28 Python
使用Python的toolz库开始函数式编程的方法
2018/11/15 Python
详解python中的Turtle函数库
2018/11/19 Python
Python 支持向量机分类器的实现
2020/01/15 Python
python图形开发GUI库pyqt5的详细使用方法及各控件的属性与方法
2020/02/14 Python
pycharm设置python文件模板信息过程图解
2020/03/10 Python
python读取图像矩阵文件并转换为向量实例
2020/06/18 Python
详解python变量与数据类型
2020/08/25 Python
澳大利亚最大的护发和护肤品购物网站:RY
2019/12/26 全球购物
改革共识倡议书
2014/08/29 职场文书
合作合同协议书
2016/03/21 职场文书
SpringBoot读取Resource下文件的4种方法
2021/07/02 Java/Android
详解Nginx 被动检查服务器的存活状态
2021/10/16 Servers