这个文章是转载的:P
-------------------------------------------------------------------------------------------------------------------------------------------
<序> 这几天在做 www.eGameTimes.COM的新版,其实还处于准备工作期间,这两天着手解决的问题是多语言支持。没想到遇到了大麻烦。 <章一 庙算> 其实多语言支持已经有一些定式了,像ASP.NET就基本是用resource文件来做。但是我似乎有时候不太守规矩,那阵子看到了Javascript的XML读取,便想像了一个使用Javascript + XML进行多语言支持的结构。 1) 用Javascript读取包括各语言的XML文件; 2) 对页面内的特定标记的标签进行内容替换,将对应的语言内容加载进去。 简单的步骤,简单的想法,计议停当,便开始做了。 顺便提一句,这样做的原因是考虑到减少服务器的负载,而且一旦下载完成,本地的运算速度可是很快的--何况,XML文件也不大吧? <章二 首战告捷> 昨天中午的时候很兴奋,因为完成了多语言支持的技术实现! 把其他的虽然但是的去掉,还是先来说说这个多语言实现的几个核心点吧: 使用Javascript读取XML。其实这个还是比较简单的,重要的代码在这里: var xmlDoc; xmlDoc = new ActiveXObject("MSXML2.DOMDocument"); xmlDoc.async = false; xmlDoc.load(xmlFile); 需要注意的是:这里第一行的声明和第二行的赋值要分开写! 因为我在调试的时候便遇到了这样的问题--虽然MSDN上声明和赋值连着写都没有问题,虽然以前我试的时候也没有问题。这个问题实在还有些困扰我,到现在还没有查出答案,有人告诉我么?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决定取消这样的多语言实现方式,这篇研究便放在这里权当一个玩具吧。