网站如何知道浏览器的用户在使用什么语言?

我们会看到很多支持多语言的网站,有些早期的网站在首页会有一个链接,让用户自己来选希望看到中文,还是英文,现在的网站则不需要了,这些网站可以根据用户使用的语言来显示不同语言的版本。比如,你在使用简体中文,打开网页,会看到一个简体中文的网页,你在使用英文,输入同一个地址,就会看到一个英文的页面。

服务器是如何知道用户希望看到何种语言版本的页面呢?

浏览器端

对于网站来说,一个网站要服务海量的用户,使用服务器来记住用户的语言是很麻烦的,这个工作还是从浏览器开始,如果浏览器自己告诉服务器希望使用的语言,服务器不就简单了吗?

各种浏览器都可以设置希望使用的语言,在 IE 中,选择设置,弹出对话框之后,可以设置语言首选项。

点击语言,弹出语言首选项对话框。

在控制面板中进行设置。

对于 Chrome 来说,在高级设置中。

点击语言和输入设置。

当浏览器向服务器发出请求的时候,浏览器会在请求头中添加一个特殊的请求头 Accept-Language 来说明浏览器端设置的语言类型,如果你刚才注意的话,会发现我们可以设置多个语言,而且可以调整顺序,在 Accept-Language 头中,它们按着你设置的顺序依次出现。每种语言使用逗号 (,) 进行分隔。

各种浏览器的 Accept-Language 如下所示。

IE 的语言

Accept-Language en-US,en;q=0.8,zh-Hans-CN;q=0.5,zh-Hans;q=0.3

Chrome 的语言

Accept-Language:zh-CN,zh;q=0.8,en-US;q=0.6,en;q=0.4

FireFox 的语言

Accept-Language: en-us,zh-cn;q=0.8,en;q=0.5,zh;q=0.3

慢着,q 又是什么呢?在 HTTP 协议中有一个详细的说明,点击这里的链接可以查看详细说明: http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html。简单来说,语言可以携带一个“q”值,来表示用户对该语言的喜好程度,这个值在 0 - 1 之间,默认为 1。

服务器端

在我们服务器端代码中,可以直接获取到浏览器在请求中携带的语言设置,在 .NET 中,HttpRequest 表示浏览器发出的请求,属性 UserLanguages就表示 Accept-Language 中传递的语言,已经根据优先级进行了排序,而且已经根据逗号 (,) 进行了拆分。这个属性是一个字符串数组。

代码中

string[] languages = Request.UserLanguages;

比如,我们希望取出第一个语言,就可以通过 Request.UserLanguages[0] 来获取到了。

获取的语言从程序的角度来说仅仅是一个表示语言的字符串,从面向对象的角度来说,我们需要一个对象来表示语言,这个类就是 CurtureInfo 类,它定义在命名空间 System.Globalization 中。可以通过 MSDN 来查看它的定义

通常,我们将表示语言的字符串通过构造函数传递给 CultureInfo。

CultureInfo info = new CultureInfo(culture);

中文问题

如果你刚才仔细查看的话,会发现 IE 发送的语言代码与 Chrome 是不一样的。你会发现表示简体中文实际上有四种写法:

  • zh
  • zh-cn
  • zh-Hans
  • zh-Hans-CN

这些写法是从哪里来的呢,在 MSDN 中有详细的说明

CultureInfo    类将根据 RFC 4646为每个区域性指定一个唯一的名称。  名称是语言关联的 ISO 639小写双字母区域性代码和国家/地区关联的 ISO 3166大写双字母子区域性代码的组合。

比如 zh 就表示中文,Han: 汉字 ,S: Simplified 简体字,T: Tranditional 繁体字,而 cn 表示中国地区代码。

区域性名称的格式为 两个小写字符的语言代码>-两个大写字符的国家地区码。 例如 “zh-CN” 代表“中文(简体中文)”,“en-US”代表“英语(美国)”。 在双字母语言代码不可用的情况中,将使用从 ISO 639-2 派生的三字母代码。

请注意,某些区域性名称还指定 ISO 15924书写符号。 例如,中文有简体和繁体之分,这种名称可以使用 两字符的语言码-书写标记-两字符的国家地区码形式。 例如“zh-Hans-CN”代表“简体中文(中国)”。 对于 Windows Vista 之前的操作系统,包含书写符号的区域性名称使用languagecode2-country/regioncode2-scripttag 的模式,例如“uz-UZ-Cyrl”代表“乌兹别克语(乌兹别克斯坦,西里尔语)”。

非特定区域性只能由双字母小写语言代码指定。 例如,fr指定“法语”的非特定区域性,de指定“德语”的非特定区域性。

那么,zh 就表示非特定区域的中文,en 就表示非特定区域的英文。

但是,需要注意的是,CultureInfo 不支持 zh-Hans-CN 写法,如果你使用了,会收到这样一个异常。

zh-Hans-CN 是无效的区域性标识符。

你可以使用 zh,  zh-cn, zh-Hans, 但是,不能使用 zh-Hans-CN 来构建 CultureInfo 对象。

网站如何知道浏览器的用户在使用什么语言?

时间: 2024-11-07 05:37:15

网站如何知道浏览器的用户在使用什么语言?的相关文章

Python模拟浏览器实现用户响应

最近工作中遇到一个问题,在集群上运行的任务有时候无法正常结束,或者无法正常启动.这会造成这批运行的任务无法正常结束运行,处于pending的状态,导致后面的任务无法正常启动. 该问题困扰我们项目已经有半年左右了,一直没有想到很好的解决办法.主要原因就是任务的状态只能在浏览器中看出,无法通过后台的日志或者数据库查询得到.在浏览器中,如果我们看到某个任务长时间没有运行时间和状态的变化,就可以把这个任务当做是“僵尸”任务,从而可以将该任务手动结束掉(kill). 春节之后在网上看到一些有关爬虫的文章,

UserAgent:通过浏览器获取用户浏览器等信息

User Agent的含义      User Agent中文名为用户代理,简称 UA,它是一个特殊字符串头,使得服务器能够识别客户使用的操作系统及版本.CPU 类型.浏览器及版本.浏览器渲染引擎.浏览器语言.浏览器插件等.        一些网站常常通过判断 UA 来给不同的操作系统.不同的浏览器发送不同的页面,因此可能造成某些页面无法在某个浏览器中正常显示,但通过伪装 UA 可以绕过检测.浏览器 的 UA 字串       标准格式为: 浏览器标识 (操作系统标识; 加密等级标识; 浏览器语

一步使你的asp.net网站在手机浏览器上全屏显示

一步使你的asp.net网站在手机浏览器上全屏显示 1.问题 公司的asp.net网页在手机浏览器上初始化时显示的是缩放的页面,用户必须手动放大才能看清页面的字体,这样体验不好 2.解决 前段时间学习JQuery mobile 看到所有的demo页面都能全屏显示在手机上,页面上面都有这样一段代码: ? 1 <meta name="viewport" content="width=device-width, initial-scale=1"> 参数说明:

【荐】如何规划 Nginx 网站目录的权限(用户,用户组,ssh,sftp)

从上一篇文章:PHP网站(nginx.php-fpm.mysql) 用户权限解析,可以学习了解到,nginx 和 php-fpm 的用户是如何运作的. 有个工作场景: 1.公司的一台 CentOS 服务器上运行了好几个网站,每个网站又是由不同的团队在维护,如果确保 ftp 更新文件的时候,不更新错,不乱窜.如何避免 本来给A网站更新文件,结果上传到B网站了等等乱象: 2.只用 CentOS 自带的 sftp,不打算安装 vsftpd 等第三方 ftp 软件: 3.网站目录参考如下: /usr/l

基于NopCommerce的开发框架——缓存、网站设置、系统日志、用户操作日志

最近忙于学车,抽时间将Nop的一些公用模块添加进来,反应的一些小问题也做了修复.另外有园友指出Nop内存消耗大,作为一个开源电商项目,性能方面不是该团队首要考虑的,开发容易,稳定,代码结构清晰简洁也是很重要的一个方面,另外性能的优化也不仅仅是在框架层面.笔者在使用其开发一些中小型的项目,性能还在可以接受范围.前篇——基于nopCommerce的开发框架(附源码):http://www.cnblogs.com/dreling/p/6906688.html. 最新的代码已经同布到GitHub:htt

给网站加ico浏览器小图标

魅力网络最近在给客户做网站的时候,发现客户主动要求给网站加个浏览器小ico图标,其实加这个非常的简单,弄一个logo的图标,网上有在线转换ico的,转换一下,32*32的就行 例如: 生产的文件名是favicon.ico 支持上传到服务器或者空间的跟目录就可以了,魅力网络很多都是这样做的,但有的客户还是反映不显示,为此我们加一段代码能够更好的显示. 在首页的网站head区域加入 <link rel="shortcut icon" href="/favicon.ico&q

IIS8.0配置网站,错误提示:用户 &#39;IIS APPPOOL\你的网站名称&#39;登录失败

项目在vs2013中能正常运行,配置到服务器(windows2012+IIS8.0),运行提示用户 'IIS APPPOOL\DefaultAppPool' 登录失败. 解决方案: 比如我的网站取名myweb,就会默认给你建立一个myweb应用程序池 一开始报http 404.17错误 1. 右键myweb应用程序池,基本设置,选择.net framework 版本,看到有两个,2.0和4.0. 啊,根据自己的开发环境设置. 接着就报了你的那个错误  'IIS APPPOOL\DefaultAp

JS获取IE浏览器信息类型、版本、语言等

分享下JS获取IE浏览器信息包括类型.版本.语言等的实例. 代码: <html> <head> <title>JS完整获取IE浏览器信息--www.jbxue.com</title> </head> <body leftmargin="0" topmargin="0" marginwidth="0" marginheight="0"> <table

VS2010 Chart控件(一)Chart控件在ASP.NET网站中的应用示例详解(C#语言)

步骤如下: 1. Chart控件(一)Chart控件在ASP.NET网站中的应用示例详解(C#语言)" title="VS2010 Chart控件(一)Chart控件在ASP.NET网站中的应用示例详解(C#语言)" action-data="http%3A%2F%2Fs8.sinaimg.cn%2Fmw690%2F6988593etx6DhZWSOATc7%26690" action-type="show-slide" style=&