当前位置: 首页 > news >正文

Accept-Language与多语言网站应用

Accept-Language

我们能从请求头中获取到浏览器愿意接收的语言类型

let http = require('http');
http.createServer(function(req,res){
	res.end(req.headers['accept-language']);
}).listen(8080);

<<< 输出
zh-CN,zh;q=0.9
复制代码

其中多种语言之间用,隔开,而每种语言又可用;分隔,分隔的前面为该种语言的简称,后面为其权重(优先级)。

langPackage/语言包

一般支持多语言的网站,其服务器都存储了多种语言包。当客户端向其请求时,服务器会查看请求头看一看客户端所愿意支持的语言,然后在自己的语言包中进行查找。客户端给的接收清单中包含每一种语言的权重,服务器会返回客户端它有的且客户端相对更喜欢的那一种。如果服务器所存储的语言包和客户端给的清单匹配不上,那么一般来说会使用服务器所预置的默认语言包。

语言包示例

let langPack = {
	"zh":{
    	title:'哈啰 世界!'
    }
    ,"en":{
    	title:"hello world!"
    }
}
复制代码

封装 getLang

该方法能自动识别客户端愿意接收的语言类型,然后从服务器所储存的多种语言包中选择一种最合适的来返回数据。

最终使用效果像这样

getLang(req,'title')
复制代码

设计思路

将accept-language解析成一个数组,并按照权重进行排序

首先需要对accept-language进行解析,将其解析成一个个对象。每个对象代表一种语言,它有两个属性:

  • langType:语言的类型

  • q:语言的权重 帮助我们筛选出客户端相对较喜欢的那一种语言

接着将每个对象放在一个数组中,按照权重从大到小排列。

选择语言类型

然后依次将数组成员的langType和服务器中所储存的语言包进行匹配,直到匹配成功或遍历结束,如果遍历结束时仍没有匹配成功则按照服务器的默认的语言类型来返回数据。

返回索要的数据

最后我们选择了一种语言,我们可以通过getLang方法的第二个参数来决定从这个语言包中拿什么数据。

源码

function getLang(req,dataKey){
  let langPack = {
    'zh':{
      data:'哈啰 世界!'
    }
    ,'en':{
      data:'hello world!'
    }
  };
  //-------------------------------------------------
  let acceptLanguage = req.headers['accept-language']
    ,langs = acceptLanguage.split(',')
    ,langType = 'en';

  // 将accept-language解析成一个数组,并按照权重进行排序
  langs = langs.map(function(lang){
    let [langType,langQ] = lang.split(';');
    let q = langQ?parseFloat(langQ.split('=')[1]):1;
    lang = {
      langType
      ,q
    };
    return lang;
  }).sort((a,b)=>b.q-a.q);

  // 选择语言类型
  for(let i=0;i<langs.length;++i){
    let curType = langs[i].langType;
    if(langPack[curType]){
      langType = curType;
      break;
    }
  }

// 返回索要的数据
  return langPack[langType][dataKey];
}
复制代码

相关文章:

  • [邻接表DFS]最长链和最大环
  • 使用for循环对 golang 中结构体数组取值进行修改时,需要注意的问题
  • C#基础 [07] 方法[上]
  • Window7下SourceInsight加载需要字体方法
  • 阿里云高性能AI服务 -- 基于Docker和EGS一键创建高性能Tensorflow分布式训练
  • CBitMap的用法 from http://www.cnblogs.com/toconnection/archive/2012/08/04/mfc.html
  • ES6指北【2】—— 箭头函数
  • MyBatis + winform 配置
  • VS2015 中统计整个项目的代码行数
  • EI收录中国大陆期刊名录(2012年)
  • 2018/02/28
  • 路由反射器(Route Reflector)简介
  • 最优化原理,凸优化
  • Windows7+vs2008进行wince开发的环境配置
  • 太难、太贵、太耗时......这些都是你对CRM工具的误解!
  • 网络传输文件的问题
  • (三)从jvm层面了解线程的启动和停止
  • [译]如何构建服务器端web组件,为何要构建?
  • “寒冬”下的金三银四跳槽季来了,帮你客观分析一下局面
  • 【跃迁之路】【585天】程序员高效学习方法论探索系列(实验阶段342-2018.09.13)...
  • 002-读书笔记-JavaScript高级程序设计 在HTML中使用JavaScript
  • js操作时间(持续更新)
  • leetcode386. Lexicographical Numbers
  • Lucene解析 - 基本概念
  • MobX
  • oschina
  • PHP 小技巧
  • vue学习系列(二)vue-cli
  • 回流、重绘及其优化
  • 开源中国专访:Chameleon原理首发,其它跨多端统一框架都是假的?
  • 聊聊flink的TableFactory
  • 树莓派 - 使用须知
  • Prometheus VS InfluxDB
  • 策略 : 一文教你成为人工智能(AI)领域专家
  • 教程:使用iPhone相机和openCV来完成3D重建(第一部分) ...
  • 组复制官方翻译九、Group Replication Technical Details
  • ​io --- 处理流的核心工具​
  • ​一、什么是射频识别?二、射频识别系统组成及工作原理三、射频识别系统分类四、RFID与物联网​
  • #pragam once 和 #ifndef 预编译头
  • (16)Reactor的测试——响应式Spring的道法术器
  • (39)STM32——FLASH闪存
  • (C语言)编写程序将一个4×4的数组进行顺时针旋转90度后输出。
  • (pytorch进阶之路)扩散概率模型
  • (十二)python网络爬虫(理论+实战)——实战:使用BeautfulSoup解析baidu热搜新闻数据
  • (一一四)第九章编程练习
  • (原創) 如何刪除Windows Live Writer留在本機的文章? (Web) (Windows Live Writer)
  • ****** 二十三 ******、软设笔记【数据库】-数据操作-常用关系操作、关系运算
  • .NET 8.0 中有哪些新的变化?
  • .NET gRPC 和RESTful简单对比
  • .Net MVC + EF搭建学生管理系统
  • .net 程序 换成 java,NET程序员如何转行为J2EE之java基础上(9)
  • .net 设置默认首页
  • .Net(C#)常用转换byte转uint32、byte转float等
  • .NET/ASP.NETMVC 大型站点架构设计—迁移Model元数据设置项(自定义元数据提供程序)...
  • .NET/C# 使用 ConditionalWeakTable 附加字段(CLR 版本的附加属性,也可用用来当作弱引用字典 WeakDictionary)