国家识别规范与域名方式详解:BCP47协议与语言标签应用
2.1.1 规格

在介绍例子之前,我们先了解一下国家识别中已知的规范。
语言名称用于指示当前请求对应的语言版本,遵循BCP47协议规定的标签。 (在线验证:)
规范规定:Tag的第一部分代表语言,全部小写,第二部分代表地区,全部大写。中间用破折号分隔。
下面列出了几种常用的缩写规范标签:
2.1.2 Domain(域名)法
该方法使用客户端请求的域名。如果支持对应域名下的语言,则识别成功。
这里的域名是header中发送的主机请求,在PHP中通过$_SERVER['SERVER_NAME']获取。
例如,如果我们浏览网站:
首页,看浏览器发送的请求(以Windows下的Firefox浏览器为例),
上图可以看到,header中的host就是当前的域名,所以我们可以通过以下步骤来识别:
1、后端配置当前域名与国家版本的对应关系。
2、在服务器端的PHP程序中,通过$_SERVER['SERVER_NAME']获取header中的host。
3、根据第一步的对应关系找到匹配的国家版本(地区),通过locale对应关系找到语言。
2.1.3
URL & Cookie 方法
该方法的原理如下:
1) 网址法
该方法通过传递URL中的语言参数来确定国家版本。
应用场景就像访问埃及国家域名,你查看的默认语言是阿拉伯语。如果想使用其他语言浏览埃及域名下的页面(如英语),则需要使用URL方式。
例如我们浏览URL:。
url方法中传递的国家语言信息的优先级高于host方法等其他方法,为最高优先级。
2)COOKIE方法
版本由请求页面传递的 cookie 信息(区域设置)来标识。
这种方式是客户端第一次浏览页面后,服务器通过host方法确认国家语言版本后,会在客户端设置一个cookie。接下来的浏览请求发送的http header中将会包含cookie信息。
下面的例子介绍了cookie方法的流程:
首次访问时通过host方法识别出国家语言信息后,http Response header如下:
如上图所示,第一次请求后,客户端的cookie将被设置为ar-EG。
那么客户端发送的请求头就会包含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、判断获取到的国家语言信息当前是否支持。如果支持,请返回该语言的版本。如果不支持,请使用默认语言版本。
这种方法的一个缺点是它取决于用户使用的浏览器版本。
例如:如果浏览器使用的是中文版火狐,那么发送 header 请求时会自动添加。
接受语言 zh-cn。
下图为中文版Firefox的请求。如果用户拥有多个语言版本的浏览器,则不同版本的浏览器中会出现不同的语言。 (例如:在中文版Firefox中浏览显示中文界面,而在英文版Firefox中浏览则显示英文界面)
这种情况更有可能发生在双语国家。开发过程中,您可以根据自己的需要灵活设置,将该识别方法的优先级设置为较低(优先级详情见下文)。
2.1.6 优先级
也许你会问,我发送header请求的时候,同时有host、cookie、url、accept_language、ip地址。
那么最终通过什么方法来确认客户要求的国家语言呢?
然后你需要设置每个方法的优先级。国际化认可的一般顺序如下:
1) 网址法
2)COOKIE方法
3)域模式
4)Accept_language方法
5)IP方式
那么为什么要选择上述优先级呢?
url方法属于用户显式切换语言的情况,肯定需要最高优先级。作为第二个cookie,可以减少识别逻辑,让识别更容易。复杂的识别逻辑仅在客户端第一次请求时使用。
当然,您可以根据自己的需求确定优先顺序。
3 结论
这些方法可以在大型Web程序的开发中灵活运用,识别国家语言信息,进而开发支持多种语言的Web应用。