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极简入门教程(一):模块机制
Oct 25 NodeJs
Nodejs Stream 数据流使用手册
Apr 17 NodeJs
浅析Nodejs npm常用命令
Jun 14 NodeJs
解析NodeJs的调试方法
Dec 11 NodeJs
NodeJS仿WebApi路由示例
Feb 28 NodeJs
nodejs中全局变量的实例解析
Mar 07 NodeJs
NodeJS 实现手机短信验证模块阿里大于功能
Jun 19 NodeJs
nodejs body-parser 解析post数据实例
Jul 26 NodeJs
nodejs判断文件、文件夹是否存在及删除的方法
Nov 10 NodeJs
详解NodeJs开发微信公众号
May 25 NodeJs
nodejs提示:cross-device link not permitted, rename错误的解决方法
Jun 10 NodeJs
nodejs中使用worker_threads来创建新的线程的方法
Jan 22 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
无线电波是什么?它是怎样传输的?
2021/03/01 无线电
PHP初学者最感迷茫的问题小结
2010/03/27 PHP
drupal 代码实现URL重写
2011/05/04 PHP
shopex中集成的站长统计功能的代码简单分析
2011/08/11 PHP
php汉字转拼音的示例
2014/02/27 PHP
ThinkPHP调用百度翻译类实现在线翻译
2014/06/26 PHP
getJSON跨域SyntaxError问题分析
2014/08/07 PHP
php实现随机显示图片方法汇总
2015/05/21 PHP
基于PHP实现假装商品限时抢购繁忙的效果
2015/10/16 PHP
Laravel框架自定义公共函数的引入操作示例
2019/04/16 PHP
Yii 框架控制器创建使用及控制器响应操作示例
2019/10/14 PHP
引用外部js乱码问题分析及解决方案
2013/04/12 Javascript
JS中setInterval、setTimeout不能传递带参数的函数的解决方案
2013/04/28 Javascript
Jquery读取URL参数小例子
2013/08/30 Javascript
jquery实现类似EasyUI的页面布局可改变左右的宽度
2020/09/12 Javascript
JavaScript声明变量时为什么要加var关键字
2014/09/29 Javascript
jquery trigger实现联动的方法
2016/02/29 Javascript
JavaScript 节流函数 Throttle 详解
2016/07/04 Javascript
深入理解选择框脚本[推荐]
2016/12/13 Javascript
详解angularJs中自定义directive的数据交互
2017/01/13 Javascript
从零开始学习Node.js系列教程三:图片上传和显示方法示例
2017/04/13 Javascript
详解vue引入子组件方法
2019/02/12 Javascript
详解微信小程序网络请求接口封装实例
2019/05/02 Javascript
小程序分享链接onShareAppMessage的具体用法
2020/05/22 Javascript
H5 js点击按钮复制文本到粘贴板
2020/11/19 Javascript
Python实现的字典值比较功能示例
2018/01/08 Python
使用matplotlib动态刷新指定曲线实例
2020/04/23 Python
python中翻译功能translate模块实现方法
2020/12/17 Python
养牛场项目建议书
2014/05/13 职场文书
省委召开党的群众路线教育实践活动总结大会报告
2014/10/21 职场文书
教师学习群众路线心得体会
2014/11/04 职场文书
教师考核表个人总结
2015/02/12 职场文书
廉政承诺书2015
2015/04/28 职场文书
公司借款担保书
2015/09/22 职场文书
mysql对于模糊查询like的一些汇总
2021/05/09 MySQL
python使用torch随机初始化参数
2022/03/22 Python