现在的位置: 首页 > 综合 > 正文

javascript XML 网站 多语言

2013年09月12日 ⁄ 综合 ⁄ 共 2978字 ⁄ 字号 评论关闭

这个文章是转载的:P

------------------------------------------------------------------------------------------------------------------------------------------- 

<序>
 
这几天在做www.eGameTimes.COM的新版,其实还处于准备工作期间,这两天着手解决的问题是多语言支持。没想到遇到了大麻烦。
 
 
<章一 庙算>
 
其实多语言支持已经有一些定式了,像ASP.NET就基本是用resource文件来做。但是我似乎有时候不太守规矩,那阵子看到了Javascript的XML读取,便想像了一个使用Javascript + XML进行多语言支持的结构。
1) 用Javascript读取包括各语言的XML文件;
2) 对页面内的特定标记的标签进行内容替换,将对应的语言内容加载进去。
简单的步骤,简单的想法,计议停当,便开始做了。
顺便提一句,这样做的原因是考虑到减少服务器的负载,而且一旦下载完成,本地的运算速度可是很快的--何况,XML文件也不大吧?
 
 
<章二 首战告捷>
 
昨天中午的时候很兴奋,因为完成了多语言支持的技术实现!
 
把其他的虽然但是的去掉,还是先来说说这个多语言实现的几个核心点吧:
  1. 使用Javascript读取XML。
    其实这个还是比较简单的,重要的代码在这里:

        var xmlDoc;
        xmlDoc = new ActiveXObject("MSXML2.DOMDocument");
        xmlDoc.async = false;
        xmlDoc.load(xmlFile);

    需要注意的是:这里第一行的声明和第二行的赋值要分开写! 因为我在调试的时候便遇到了这样的问题--虽然MSDN上声明和赋值连着写都没有问题,虽然以前我试的时候也没有问题。这个问题实在还有些困扰我,到现在还没有查出答案,有人告诉我么?

  2. XML文件中定义结点(node)像这样:

        <TagName zh-cn="中文" en-us="英文" otherLangCode="其他什么语言">

    那么要获取某个特定语言的文本的时候,可以用:

        document.all(TagName).innerHTML
          = xmlDoc.documentElement.selectSingleNode(TagName).getAttribute(langCode);

    这里你需要明白些什么呢?
    zh-cn、cn-us这样的东西,叫语言代码(language code,直接在MSDN里面可以搜索这个词)。
    document.all 的使用方法也去MSDN查吧,呵呵。其实我的代码中不是这么写的,因为这个TagName应该使用一个方法自动得到,对吧?看看document.all的用法吧,提示一下,在HTML里面,每个标签可以有id和name两个属性,并且可以不一样。
    至于documentElement、selectSingleNode、getAttribute这些东西,在MSDN上查一下DOMDocument项。

 其实核心的东西就这么些,看看是不是很简单?但是在实际操作的时候却往往会遇到意外的麻烦。嗯,饿了,先去饱肚子。
书接上回,我们说到这多语言支持“完成”了。调试的时候试了一下,感觉相当不错脚本和XML文件都加载到本地然后进行处理,解放了服务器,并且因为是在本地运行,语言间切换相当流畅--甚至不用刷新页面。当时看着是很有成就感啊!
 
另外要补充说明的一点,网站的多语言支持是指网站的界面多语言化,至于内容......就看各网站自己的了。就好比Bloglines,界面可以是N种语言,但是你要blog,他总不能也给你多语言化了吧?所以,我这里讨论的只是界面的多语言支持而已。嗯,明白人们跳过这段好了,忽略之。
 
 
<章三 急转直下>
 
成功了! 美美地吃了个午饭之后,下午继续修改各个细节。
但是问题却在这个时候出现了:当从其他机器访问我的网站的时候,出现了错误提示! 并且无法加载多语言支持的内容! 仔细检查了一遍之后,确定问题就出在xmlDoc.load()一句中--无法加载远程的XML文件。还真应了丫头那句“该不会只能在你机器上运行吧”。
 
Google了半个下午,几乎没有找到任何相关的说明。这事情便只能这样了?一天多的辛苦就白费了?
 
情势真是急转直下啊。
 
 
<章四 新的希望>
 
现在想起来,真是够愣的,也没有参考一下其他什么,直接性地考虑到“既然不能加载远程XML文件,那么找个可以加载的办法”。
 
先看了Javascript的FSO,似乎在这种网页上行不通。然后漫天搜索下,居然找到了这个可以Reading a File的东西。于是,异想天开地,要用这个ReadURL类来获得fileContent,然后用xmlDoc.loadXML()方法加载XML内容。
 
结果竟然成了! 如果没有那几个缺点的话.....
 
第一,这个是通过Applet来读取文件,需要用户有jre支持;
第二,XML文件是UTF-8编码存储,这个ReadURL类是以纯文本方式读入文件,之后......你不是真的打算自己转换着玩吧?
第三,不稳定,时灵时不灵...-__-b
 
这个版本我也完成了,看着这奇怪的东西,莫名地想到一个词:DIY。似乎这是我的长项,用自己会用的、找得到的东西,组合起来完成一些奇怪的事情......

<终章 解铃还需系铃人>
 
在两个失败的版本之后,终于需要静下心来想想了--那么便从头开始吧。
 
最早是为什么想到Javascript + XML的多语言支持呢?其实是当时分析MSDN网站的树状图时,从各个角落里搜出来的几个代码片断--包括一个htc文件,几个css文件以及几个XML文件。其中最有用的当然是封装了脚本的htc文件,读取XML文件的代码当初也是在这里看到过。之后,便在网上搜索出来一些相关的文章,结合MSDN,试验成功之后便开始了。
这次到了这个瓶颈,又想起来在htc文件中似乎脚本也加载了远程的XML文件,便回头来仔细看这个htc文件。
 
然后问题就这样解决了。
 
关键的关键就在这对象上:

    var xmlDoc;
    xmlDoc = new ActiveXObject("MSXML2.DOMDocument");

 
而那个htc文件中使用的对象是:

    var xmlDoc;
    xmlDoc = new ActiveXObject("Microsoft.XMLDOM");

这个MSXML2.DOMDocument和Microsoft.XMLDOM对象在使用上几乎相同,但是为什么在范围限制上有这样的区别,到现在我也还没有找到一个能详细说明的文件。有高人指教么?
 
 
<尾声>
 
至此,这个网站的多语言支持方安就算是解决了。因为是懒人,又有对细节的完美要求,就不贴更多的代码了--因为不整理不好看,哈哈。
 
基本上,按这几篇提供的信息,应该是把我的大体思路都说出来了。还有问题,可以等过一阵www.eGameTimes.COM新版完成之后直接去看看吧! =D

[Updating 2006-04-13]
新版eGameTimes决定取消这样的多语言实现方式,这篇研究便放在这里权当一个玩具吧。

抱歉!评论已关闭.