我们公司想做一个自己的网站,目前基本决定至少要有中、英、法三各版本的,当然内容完全相同,数据库是access2000的电子商务网站,但不知该如何处理每种版本,是每种单独做一套呢,还是只做一套,再通过某种语言转换机制转换成相应的文字,数据库又该用一个还是三个,请有过多语言开发经验的大虾、中虾们赐教^_^.
看过一篇相关的文章,但就是看不懂,如下:
ASP实现多语言支持
纲要:
让我们设想你使用ActiveServerPages设计了一个成功的站点,而你的客户纷纷要求将此站点国际化以提供多种语言版本。这时候你该怎么办?请看本文。
正文:
一、介绍
让我们设想你使用ActiveServerPages设计了一个成功的站点,而你的客户纷纷要求将此站点国际化以提供多种语言版本。该问题的关键在于,你必须使用某种方法实现快速的页面内容转换。可以将此问题看成是从数据库提取适当数据并用ASP动态显示。在本文中我们将讨论如何使用ActiveServerPages的字典对象以及一个后台数据库实现国际化支持。
具体实现过程分以下三个步骤:
◇设计数据库并存储文本和文件路径。
◇从数据库读取数据到字典对象。
◇在ASP页面引用文本和文件路径。
二、步骤1-设计数据库并存储文本和文件路径
我们需要在数据库设计上花些时间。使用此数据库,我们希望能够把所有要用到的文本和图片适当编目,并且这些文本和图片不能重复;如果要在应用中把“是”改成“确定”,希望只在一个地方作改动;Web维护者在更改内容时应能够快速找到目标文本。基于以上要求,让我们开始设计数据库。
首先创建两个表来放置文本。其中一个表为CommonStrings,用于存放在整个站点重复使用的单词和短语。另外一个表为SpecializedStrings,用于存放只在特定页面使用的单词和短语。把公用和限于特定页面使用的文本分别存放有利于简化站点维护。
两个表都使用StringKey字段来标记纪录,使用StringLanguage来说明所用语言,联合StringKey和StringLanguage创建一个主键。字段StringHolder用来保存单词、短语或语句。这个字段必须创建唯一索引以保证不会输入重复的单词、短语或语句。
对于SpecializedStrings表,还需要一个额外的字段ASPPage来标记文本所在的ASP页面。
对于图片文件,我们可以使用相同的步骤创建表来存储指向这些文件的路径。只需要在CommonImage表和SpecializedImage表中用FileName字段替换对应的StringHolder就可以了。
在新创建的表中装入数据时,StringKey的内容应该给站点维护者尽可能多的提示以表明页面上将显示的文本。例如,对于一个在线销售站点来说有关拒绝承诺的声明语句使用OrderDisclaimer是一个不错的选择,站点维护者由此可以非常清楚地了解使用该记录将在Web页面上显示的内容。
把那些公用的单词和短语放在CommonStrings表。这样,维护者就知道如果他们修改CommonStrings表中的一个记录,将影响到站点内的许多页面。
对于大的站点,可以设计一个易于使用的界面来输入和修改数据库中的文本。准备这些资料是一项冗长乏味的任务,越简单就越少出错。
三、步骤2-从数据库读取数据到字典对象
字典对象(DictionaryObject)是一个多用途的服务器端对象,它相当于二维数组,保存了键以及与键相关联的数据。提取数据的唯一途径在于取得键值或索引。可以把字典对象的作用范围配置为整个应用范围或对话范围,而不必担心损失性能。赋予应用层作用范围意味着对象只被实例化一次,且所有会话均使用同一个字典对象。以下代码创建两个字典对象实例,分别和两个文本表关联。记住,我们希望对象只被初始化一次,所以把这些代码放在Application_OnStart事件中:
<ScriptRUNAT=SERVERLanguage=VBScript>
SubApplication_OnStart()
DimDictCommonStrings
DimDictSpecializedStrings
DimConn
DimrsCommonStrings
DimrsSpecializedStrings
SetDictCommonStrings=Server.CreateObject("Scripting.Dictionary")
SetDictSpecializedStrings=Server.CreateObject("Scripting.Dictionary")
接下来的任务是把数据装入字典对象。我们将遍历表,连接StringKey和StringLanguage,并把连接后的值作为字典的键值,把StringHolder放在对应的字典数据区。由此我们获得了使用数据库存储数据的弹性,并避免了持久的数据库连接而导致的性能影响。事实上,数据库只在应用启动时被访问一次,其后ASP页面将从速度更快的字典对象读取所需数据。
'建立数据库连接
SetConn=Server.CreateObject("ADODB.Connection")<BR>
Conn.ConnectionString="SomeConnectionString"<BR>
Conn.open
'打开CommonStrings表,遍历所有记录并装入数据
SetrsCommonStrings=Conn.Execute("SelectStringKey,StringHolderfromCommonStrings")
DountilrsCommonStrings.EOF
DictCommonStrings.AddrsCommonStrings("StringLanguage")&rsCommonStrings("StringKey")_
,rsCommonStrings("StringHolder")
rsCommonStrings.MoveNext
Loop
'打开SpecializedStrings表,遍历所有记录并装入数据
SetrsSpecializedStrings=Conn.Execute("SelectStringKey,StringHolderfromSpecializedStrings")
DountilrsSpecializedStrings.EOF
DictSpecializedStrings.AddrsSpecializedStrings("StringLanguage")&_
rsSpecializedStrings("StringKey"),rsSpecializedStrings("StringHolder")
rsSpecializedStrings.MoveNext
Loop
rsSpecializedStrings.Close
rsCommonStrings.Close
Conn.Close
SetrsSpecializedStrings=Nothing
SetrsCommonStrings=Nothing
SetConn=Nothing
EndSub
</Script>
四、步骤3-在ASP页面引用文本和文件路径
接下来的工作是在ASP页面引用已经实例化的字典对象中的文本(以及文件路径)。首先我们需要知道当前用户所使用的语言,其中一个办法是从Request.Server.Variables取得该值。请把下列代码放入Session_Onstart事件处理过程:
<ScriptLanguage=VBScript>
SubSession_OnStart()
Session("Lang")=Request.Server.Variables("HTTP_ACCEPT_LANGUAGE")
EndSub
</Script>
通过键值可以从字典对象取得对应的文本(或图片文件路径),键值由语言前缀加名字组成。以下为示例代码:
<HTML>
<PAlign=center>
<h1><%=DictSpecializedStrings.Item(Session("Lang")&"Confirmation")%></h1>
</P><BR>
<PAlign=center>
<h5><%=DictSpecializedStrings.Item(Session("Lang")&"OrderDisclaimer")%></h5>
</P>
</HTML>
对于中文浏览器,该页面的提示类如:
感谢您的购买。请进入下一页付款。
而对于一个缺省语言为英文的的浏览器,则提示为:
Thankyouforyourorder.ContinuetotheNextPagetomakeyourpayment.
根据我的经验,从字典对象引用文本(以及图片路径)和直接在ASP代码中输入数据相比,没有性能上的不利影响。这是由于文本(和图片路径)字典被放在内存中,因而可以快速地提取。
五、讨论
当然,实现多语言支持还有其它的因素需要考虑。使站点内容的变化和应用开发者隔离是本文试图说明的实质内容。本方案不仅对于实现站点内容国际
================================================================
一般的做法,是每个语言版本放各自的目录下,然后针对性在首页做一个链接判断
各语言版本的文件头有各种写法,一般如下:
简体中文:
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
繁体中文:
<meta http-equiv="Content-Type" content="text/html; charset=BIG5">
以上两种目前可以统一用:
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
英文(English)
<META http-equiv="Content-Type" content="text/html"; charset="iso-8859-1">
日文
<meta http-equiv="Content-Type" content="text/html; charset=x-sjis">
俄文(russian)
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
你可以参考以下网站,其都有多语言版本:
http://www.people.com.cn/
http://www.ibm.com/
http://www.intel.com/
http://www.microsoft.com/
等等
=====================================================
多语言的版本,是个蛮头疼的问题~这个问题已经说过蛮多次了,原理简单,编码麻烦^_^
简->繁的转换是比较容易的事情,但多国化的问题一般的方法如下
语言包肯定要有,数据库的内容肯定也要有几份,
语言包可以用xml,编码用utf-8,当然也可以动态的包含inc文件,但是逻辑上没有xml清淅
本地化时间,货币等,可以用vbs里提供的一个函数SetLocale(lcid)
获取http的头部得到browser的语言,从而调用不同的语言包。
==================================================================
正好今天下午有空,呵呵,这里示例的是用xml做为语言包
其实还是蛮简单的,但是实际编码里会有很多节点,这里只是提供一个思路,示例代码如下
lang.xml(存储此文件时需要把保存类型设置为utf-8)
--------------------
<?xml version="1.0" encoding="utf-8" ?>
<lang>
<ch>
<username>用户名</username>
<password>密码</password>
<btnSubmit>提交</btnSubmit>
<btnReset>重置</btnReset>
</ch>
<en>
<username>username</username>
<password>password</password>
<btnSubmit>submit</btnSubmit>
<btnReset>reset</btnReset>
</en>
</lang>
-----------------------------
test.asp
-----------------------------
<%
function lang(langType,nodeName)
set xmlDoc=Server.CreateObject("microsoft.xmldom")
xmlDoc.load(server.mappath("lang.xml"))
lang=xmlDoc.documentElement.selectSingleNode("//" & langType & "/" & nodeName).text
end function
if request("lang")="ch" then langType="ch" else langType="en"
%>
<a href='javascript:location.href="?lang=<%if langType="ch" then response.Write "en" else response.Write "ch"%>"'>切换语言</a>
<table width="50%" border="0" cellspacing="0" cellpadding="0" align='center'>
<tr>
<td><%=lang(langType,"username")%></td>
<td><input type="text" name="textfield" /></td>
</tr>
<tr>
<td><%=lang(langType,"password")%></td>
<td><input type="text" name="textfield" /></td>
</tr>
<tr align="center" valign="middle">
<td><input type="submit" name="Submit" value="<%=lang(langType,"btnSubmit")%>" /></td>
<td><input type="reset" name="Submit" value="<%=lang(langType,"btnReset")%>" /></td>
</tr>
</table>