是不是见到google,facebook等大型专业网站的拥有不同的语言站群,可以不同语言间切换很给力?而我们只能羡慕嫉妒恨呢?
今天要介绍的就是如何识别不同国家,只需要简单几步,就能识别出来自不同国家的请求,使你的web应用更有国际范。
国家识别主要用到的是http header中的host,Accept-Language,cookie以及请求的url,ip等。
下面先温习下http header的基础知识。
1 HTTP Header头格式
在WEB开发中,无论是前端或后端都会发送请求,来浏览网页。而我们在开发中经常需要识别出客户端的信息,比如,国家,地区,浏览器信息等等。而这些信息都是由http header发送的。
下面首先介绍下公司在扩展国际化业务中,识别客户端国家版本,使用了哪些http header。
1.1.1 HTTP Headers
HTTP Headers是HTTP请求和相应的核心,它承载了关于客户端浏览器,请求页面,服务器等相关的信息。
1.1.2 Host
请求的web服务器域名地址。
例如web请求URL:http://test. baidu.com /test/
Host就为test.baidu.com。
在PHP中,可以通过$_SERVER['HTTP_HOST'] 或 $_SERVER['SERVER_NAME']来查看。
1.1.3 Accept-Language
Accept-Language: en-us,en;q=0.5
这个信息可以说明用户的默认语言设置。如果网站有不同的语言版本,那么就可以通过这个信息来重定向用户的浏览器。
它可以通过逗号分割来携带多国语言。第一个会是首选的语言,其它语言会携带一个“q”值,来表示用户对该语言的喜好程度(0~1)。
在PHP中用 $_SERVER["HTTP_ACCEPT_LANGUAGE"] 来获取这一信息。
1.1.4 Cookie
会发送你浏览器中存储的Cookie信息给服务器。
Cookie: PHPSESSID=r2t5uvjq435r4q7ib3vtdjq120; foo=bar
它是用分号分割的一组名值对。Cookie也可以包含session id。
在PHP中,单一的Cookie可以访问$_COOKIE数组获得。你可以直接用$_SESSION array获取session变量。如果你需要session id,那么你可以使用session_id()函数代替cookie。
2 国家版本识别
上面介绍了几个常用的http header,现在您已经确信可以尝试下,来识别下这些国家版本了。
2.1.1 规范
在介绍例子前,先了解下国家识别中的已知的规范。
语言名称用于标明当前请求对应的语言版本,遵照BCP47协议规定的tag。(在线校验:http://schneegans.de/lv/?tags=zh-CN&format=text)
规范规定:Tag 以第一部分表示语言,都为小写,第二部分为地区,大写。中间通过中划线分隔。
以下列出几个常见使用到的缩写规范tag:
2.1.2 Domain (域名)方式
这种方式是通过客户端请求的域名,如果有支持对应域名下的语言,则成功识别。
这里的域名是发送header中的host请求,在php中通过$_SERVER['SERVER_NAME']获取。
比如我们浏览网址:http://www.xxx.com.eg
首页,看看浏览器发送的请求(以windows下,firefox浏览器为例),
如上图看到的,header中host 为当前的域名,那我们可以按照以下步骤识别:
1. 后端配置好当前域名和国家版本的对应关系
2. Server端的php程序中通过$_SERVER['SERVER_NAME'] 获取header中的host。
3. 根据第一步中的对应关系找到匹配的国家版本(region),并通过locale的对应关系找到语言。
2.1.3
Url & Cookie 方式
该方式的原理如下表:
1) URL 方式
这种方式是通过在url中传入语言的参数来确定国家版本。
应用场景就如访问了埃及国家域名,那你查看的默认是阿拉伯语。假如想使用其他语言浏览埃及域名下的页面(如英文),这时就需要使用URL方式。
比如我们浏览网址:http://www.xxx.com.eg?locale=en-EG。
url方式传入的国家语言信息优先级要高于host方式等其他方式,为最高优先级。
2) COOKIE 方式
通过请求页面传递的cookie信息(locale)来识别版本。
这种方式是客户端首次浏览完页面后,服务端通过host方式确认了国家语言版本后,就会在客户端设置cookie。下面的浏览请求发送的http header都会带有该cookie信息。
下面举例介绍下cookie方式的流程:
首次访问通过host方式识别出国家语言信息后的,http Response header如下:
如上图所示,第一次请求后,客户端的cookie会被设置为ar-EG。
那接下来客户端发送的请求header中都会带有该cookie。
服务端的识别流程就如下:
1. 获取请求中的cookie,如果有国家语言信息,则进行下面
2. 判断获取的国家语言信息当前是否支持,如果支持则返回该语言下的版本,不支持在使用默认语言版本。
2.1.4 IP方式
我们知道IP可以用来识别网络中的主机。而且IP地址段的划分是有规律的,每个国家有不同的地址段。
那我们就可以获取客户端的ip地址,通过IP地址库,来识别国家地区,并根据国家来设置语言。
该方式的识别流程就如下:
1. 获取请求客户端的ip
2. 根据ip,确定国家,使用国家的默认语言(和其他方式一起还能识别特定语言,如accept_lanuage明确表明请求语言,可以优先展示该语言)回显给客户端
2.1.5 Accept_language方式
“Accept_language”是为RFC2616的HTTP/1.1中14.4段定义的一个可选HTTP报头,通常被用来声明代表用户接收语言偏好。
当客户端请求的时候,会发送默认的accept_language,服务端获取该值,如果支持,就返回该语言的版本。
该方式的识别流程就如下:
1. 获取请求客户端的Accept_language
2. 判断获取的国家语言信息当前是否支持,如果支持则返回该语言下的版本,不支持在使用默认语言版本。
这种方式有个缺点是:和用户使用的浏览器是版本有关。
如:浏览器是使用中文版的firefox,那发送header请求的时候,会自动加入。
Accept-Language zh-cn.
下图所示为中文版firefox的请求,那么如果用户有多个语言版本的浏览器,就会在不同版本的浏览器,出现不同的语言。(如:在中文版firefox中浏览显示中文界面,而在英文版firefox中浏览显示英文界面)
这种场景在双语国家出现的概率比较大,开发中可以根据自己的需求,灵活设置,把此种识别方式的优先级设置的低点(下面有优先级的详细介绍)。
2.1.6 优先级
也许你可能问,我发送header请求的时候同时有host , cookie, url, accept_language, ip地址。
那最终按那个方式来确认客户端请求的国家语言呢?
那就需要设置各个方式的优先级,国际化识别的一般的顺序,可以如下:
1) URL方式
2) COOKIE 方式
3) Domain方式
4) Accept_language方式
5) IP方式
那为什么按上面的优先级呢?
url方式属于用户明确切换语言的情况,肯定需要最高的优先级。而cookie做为第二个可以减少识别的逻辑,使识别更加容易,复杂的识别逻辑只在客户端第一次请求时。
当然,可以根据自己的需求安排优先级。
3 结束语
本文中,您了解了识别国家语言的几种方式。那么在开发大型web程序中可以灵活使用这些方式,就可以识别出国家语言的信息,进而开发出支持多种语言的web应用。
by wangtao