使用 Dojo 实现站点的跨浏览器本地化支持(2)
 
- UID
- 1066743
|

使用 Dojo 实现站点的跨浏览器本地化支持(2)
Dojo 本地化在跨浏览器支持上的问题上一节中我们提到了 Dojo 提供的两种设置本地语言环境的方法,出于便利性,很多人选择了借助浏览器的默认本地语言环境设置的方法。开发者通常会认为,在这种情况下,Dojo 会根据浏览器设置里面的"语言"设置来进行相应的本地化。然而,在实际编程中我们发现,在不同的浏览器下,采用此种方法会产生不同的效果。以 Firfox 和 IE 为例:
- 在 Firfox 浏览器下,Dojo 能够根据浏览器"语言"设置正确的加载相应的资源文件,正确的实现本地化。
- 在 IE 浏览器下,无论浏览器的"语言"设置怎样变化,Dojo 始终加载同一种资源文件,即浏览器的"语言"设置对 Dojo 的本地化没有起到作用。
这是什么原因引起的呢?让我们来查看一下 Dojo 的源代码,看一下在没有设置 dojoConfig 的 locale 属性时 Dojo 是如何处理的。
清单 5. dojo/_base/config.js1
2
3
4
5
6
| ...
if(!result.locale && typeof navigator != "undefined"){
// Default locale for browsers.
result.locale = (navigator.language || navigator.userLanguage).toLowerCase();
}
...
|
由 Dojo 的源代码可以看出,在 locale 属性未指定的情况下,Dojo 会去读 navigator 的 language 属性,如果没有此属性,则去读 userLanguage 属性,根据这两个属性的值去设置 locale 的值。navigator 对象的 language 和 userLanguage 属性在 Firfox 和 IE 下面分别有如下特点:
- language:此属性不支持 IE。在 Firfox 下,此属性的值与浏览器"语言"设置中的第一种语言对应。
- userLanguage:此属性支持 IE,在 IE 中,此属性值与操作系统的语言设置相关,与浏览器的语言设置无关。
由此我们便可以看出 Dojo 本地化在跨浏览器支持上问题的原因。
解决问题的两种思路事实上,不管是 IE 还是 Firfox,浏览器里面的"语言"设置真正影响的是 HTTP header 里面的 Accept-Language 属性。而 Firfox 又会根据 Accept-Language 的值去设置 navigator.language 的值,而 IE 不会。然而 HTTP header 里面的 Accept-Language 的值无法在浏览器端通过 JavaScript 获取到,只能有 Server 端的程序获取到。
因此,根据 Web 站点所用技术的不同,我们设计出两种不同的解决方案:
- 由 Server 端从 HTTP 头中的 Accept-Language 属性获取浏览器的语言设置,并动态生成 HTML,在 HTML 中相应地设置 Dojo 的 locale 属性。
- 对于采用静态页面的站点,可在 HTML 页面中提供语言选择的选项,并通过 url 或 cookie 记住选的语言,并在下次刷新加载时根据记住的语言设置由 JavaScript 在加载 Dojo 之前设置好 Dojo 的 locale 属性。
|
|
|
|
|
|