联机公共检索目录(OPAC)是图书馆揭示馆藏文献资源的最重要途径。OPAC一般面向因特网,使用对象包括不同语言背景的读者。理想的OPAC应能够根据读者语言背景的不同,把菜单、提示语等界面信息转换为读者所熟悉的语言文字,以方便人机对话,增强OPAC友好性。目前,国内引进的图书馆集成系统(如Unicorn[1]、 Millennium[2]、Aleph[3])的OPAC已支持中、英文界面的转换,而国产系统(如汇文[4]、ILAS[5]、MELINETS[6])仅支持中文界面。深圳大学图书馆在研发新一代OPAC的过程中,力图解决多语言用户界面的难题,为用户提供更多的界面语言选择,提升用户检索体验。
早期的软件开发, 多语言用户界面需要通过“翻译”方式来实现,即根据语言需求翻译源代码中的界面信息,然后编译产生支持该语言的软件版本。由于这种办法绑定界面信息和源代码,后期维护开销极大,因此软件行业一直探索将用户界面信息从软件系统中分离出来,单独组织为资源项目并加以管理。在实践中,有的软件采用动态链接库技术,统一建立应用程序所支持的所有语言资源文件并以DLL形式一次性加载,或为每种语言生成独立的资源DLL文件并选择性加载[7];有的软件则采用数据库技术,以方便对界面信息的管理[8]。以上方法虽然打破了界面信息和系统之间的紧密耦合关系,但都是应用个例,缺乏技术标准的支撑和普遍推广的价值。
SULCMIS OPAC采用I18N技术,构造基于XML的多语言资源文件,灵活地解决了英语、日语界面的显示问题,并可方便地扩展到韩语、法语、西班牙语等更多语言,较好地实现了目录检索系统界面的“国际化”。
设计思路.
随着因特网的发展,计算机领域对软件进行“国际化”(Internationalization)的技术日趋成熟。国际化是指当软件被移植到不同的语言地区时,软件本身无需做内部工程上的改变或修正,即可实现软件与特定语言和地区脱钩的过程。国际化简称I18N,取自英文单词Internationalization的首字符I、尾字符N和中间的字符数18[9]。
I18N 由国际组织 Openi18n维护,非营利组织 Free Standards Group 赞助[10]。国际化包括语言、文化、书写习惯、产品和服务所要面向的法规等内容[9],通过国际化和更为细致的本地化(Localization,简称L10N)工作,以适应因特网环境下软件全球化的需要。
微软公司把I18N和L10N合称为G10N(Globalization),推出技术指南、解决方案和样例代码[11],全面支持相关标准,指导软件开发者采用微软的开发工具来实现I18N。
基于I18N的思想,SULCMIS OPAC采用构建不同语言资源文件并动态加载的方式来实现多语言界面的转换。
根据SULCMIS OPAC系统的实际需求,不同语言版本的网页之间在结构上一致,业务逻辑也保持一致,只是每个页面上展示信息的语言有所不同,即不同语言版本的网页之间的差异都集中在UI层,来自于不同语言版本的网页发出的请求,应该由统一的Web服务器及业务功能模块来处理,并使用统一的数据库系统管理业务数据。
UI层Web界面上一般包括5种类型的元素:
(1)页面模板:页面布局信息,主要是HTML元素,如表单、列表、链接、按钮等。
(2)格式化信息:样式表CSS等信息,用于对网页中各种对象的位置信息进行精确控制。
(3)媒体信息:图片、Flash、多媒体等固定内容信息。
(4)浏览器脚本:JavaScript脚本等,用于处理客户端的计算需求。
(5)交互信息:和用户交互的文字信息,如:提示信息、用户请求响应等。
经分析,前4类元素均与语言无关,不需要进行多语言化的处理。对交互信息进行多语言处理的思路是:为页面上的每个交互信息赋予一个Key值,在不同语言资源文件中,将Key值翻译为当前语言的内容,即Value值。运行时将所有语言文件读入系统缓存,在Web页面加载时使用该Key值加载相应的语言信息,当用户在Web页面切换语言时,使用Key值在缓存中读取相应语言文件内对应的Value值,即可方便地实现多语言切换。
将多语言界面化的需求放在UI层处理,并与业务逻辑层、数据服务层等其他系统核心模块分离,这种做法具有以下优点:业务逻辑及数据库使用同一套系统进行管理,可以有效降低多语言系统的更新维护成本;各个语言文件独立存放,可以方便地扩展新语言;各语言文件内容加载在系统内存中,在切换时不需读取文件及数据库,可以快捷地实现不同语言之间的切换。
系统流程如图1所示:
图1中,Web服务主程序和UI界面文件分离,多语言资源文件可单独建立和维护,系统仅在运行时选择调用和加载多语言资源文件,动态生成不同语言的页面。当应用程序需要支持一种新语言界面时,只需添加新语言资源文件即可,无需修改逻辑程序。
2.3 系统设计目标.
(1)交互友好:菜单、提示语等界面信息,应针对不同语言做恰当的表达。
(2)切换快捷:当用户在切换语言时,加载新语言和刷新屏幕的速度应小于1秒。
(3)扩展方便:支持新语言界面,杜绝紧密耦合,减少开发成本。
(4)有效同步:对界面信息进行修改时,应在所有语言版本上及时同步修改相应信息。
在软件体系结构设计中,最常见的一种设计结构是分层式结构。MVC框架模式是目前Web应用开发的首选模式,具有松耦合、高重用、可维护性高等优点。本文基于MVC框架模式,将系统自下而上分为数据访问层、业务逻辑层、页面表示层,在用户与页面表示层之间增加I18N的处理,整个系统的体系结构如图2所示:
.(1)数据访问层:负责数据库的访问,为业务逻辑层提供数据服务,如数据的检索、新增、修改、删除等。
(2)业务逻辑层:整合系统的各种业务,是整个系统的核心。如果涉及对数据库的访问,则调用数据访问层。
(3)页面表示层:即系统的UI部分,负责用户与系统的交互。当用户需要完成某项业务时,由该层调用业务逻辑层的相关业务逻辑。
(4)I18N:多语言处理层,当页面表示层要展示页面给用户时,根据用户当前选择的语言,调用相应的资源文件,将转换好的语言文字呈现给用户。
在图2的基础上,为了实现重用、可靠、可扩展的目的,引入工厂模式,采用面向接口编程的理念,并对数据库访问的API进行封装。工厂模式是软件工程中一种重要的设计模式,可以方便地实现面向接口编程,增强系统的灵活性和可扩展性,例如OPAC系统更新需要更换数据库,将Sybase ASE更换为MySQL,由于不同数据库之间的SQL编写方式各有不同,需要实现SybaseDataOperate、MysqlDataOperate,分别代表Sybase ASE和MySQL的数据库操作类,继承自DataOperate数据操作类的统一接口,在更换数据库时只需要更改DataOperate接口的实例化名称,即可实现切换。在业务逻辑层也存在同样的实例化更换的需求,所以使用工厂模式可以有效地满足系统维护期的类似需求。系统模块结构如图3所示:
.(1)DBHelper、Model、IDAL、DAL、DALFactory都是从数据访问层进一步分离出来的模块。其中DBHelper负责系统与数据库连接的配置以及基本的新增、修改、查找、删除操作调用;Model是实体类模块,存放各数据实体类,用于装载数据库中的数据,或者在各层间进行数据传输;IDAL模块存放的是对数据库中各个表操作的接口,包括新增、修改、查找、删除,抽象出来的IDAL模块,脱离了对具体数据库的依赖,有利于数据库迁移;DAL模块实现了IDAL模块中的各个接口;DALFactory模块则专门负责管理DAL对象的创建,便于业务逻辑层的访问。
(2)BLL是业务逻辑模块,是针对具体问题的操作,包括整个系统的核心业务逻辑。当需要操作数据库时,由BLL调用DALFactory创建相应的DAL对象,完成对数据库的访问。
(3)UI是负责系统与用户进行交互的模块,其他各个模块与用户之间并不进行直接交互。
(4)I18N模块负责根据用户选择的语言,调用相应的资源文件对UI中的相关部分进行转换,把转换好的HTML代码呈现给用户,以此达到界面多语言展示的目的。
借助上述架构设计,可以将多语言化的展示集中在UI层处理,UI在展示页面前调用I18N模块处理页面中的相关文字,可实现系统对多语言界面的支持。开发过程需要以下三个步骤:
(1)建立多个语言资源文件,采用XML规范并构建Key-Value值对来表达同一个Key值在不同语言环境下的具体内容表示,如Key“search.aspx.selectlib”,在中文资源文件中Value为“馆藏地点选择”,在日文资源文件中Value为“秘蔵の場所を選んでください”。
(2)对UI中的各个页面进行文字处理,即为需要进行多语言处理的页面信息(如菜单、提示等)设定相应的Key值,这些Key值在运行时呈现给用户的是所选择的语言文字。在Web服务器启动时,系统将XML语言资源文件中的Key-Value值对以HashMap的形式装载入缓存,提供Key的检索匹配方法供UI层页面控件调用,并提供语言切换方法供系统切换显示语言。这个过程需要调用I18N模块提供的方法。
(3)建立I18N模块,这是关键的一步。该模块的功能包括:多语言资源文件的读取、初始化,根据Key值检索语言资源文件的方法,获取系统当前使用的语言信息等。模块的核心方法为Initialize(),GetValueByKey(string key),GetValueByKey(string key, string[] param)。
在Web服务器启动时调用Initialize()扫描资源文件夹,读取所有的语言文件并将每个语言文件的内容以HashMap的方式存入系统的静态变量中,形成语言代码和语言文件内容的值对Key-Value(语言代码-语言文件内容HashMap对象,例如Key值:zh-cn,相应的Value:简体中文语言文件HaspMap)。关键代码如下:
(1)获取App_Data目录下所有语言文件。在Web服务器启动时,读取所有的语言文件。
string[] files = System.IO.Directory.GetFiles(HttpContext.Current.Server.MapPath("~/App_Data/I18N"), "I18N" + "*.*");
(2)加载语言文件至HashTable。解析每个语言文件,将其中的Key-Value值对转换成HashTable对象。
Hashtable ht = new Hashtable();
ht.Add(xnl[i].Attributes["value"].Value, xnl[i].InnerText);
(3)加载至I18N静态变量。将每个语言文件的HashTable存入系统静态变量,供切换语言时由Web页面读取。
string i18nName = F.Name.Replace(F.Extension, ""); //语言名称.
I18NHT.Remove(i18nName); //如果有则移除.
I18NHT.Add(i18nName, ht); //加载至I18N静态变量.
UI中的各个界面的文字已经采用Key值进行取代,之后利用I18N模块中的GetValueByKey(string key)与GetValueByKey(string key, string[] param)方法获取用户当前选择的语言,载入相应的HashMap,然后在HashMap中根据Key找到对应的展示内容,最后利用传入的param对展示内容进行格式化处理,关键代码如下:
(1)获取用户选择的语言.
Sulcmis_I18N = GetLangName();
(2)获取该语言所对应的HashMap.
Hashtable ht = (Hashtable)I18NHT[Sulcmis_I18N];
(3)获取Key所对应的语言信息.
if (ht[key] == null || ht[key].ToString() == null){.
Initialize(); //如果没有找到,则重新进行初始化.
ht = (Hashtable)I18NHT[Sulcmis_I18N];
}.
if (ht[key] != null){.
result = String.Format(ht[key].ToString(), param).Trim(); //利用传入的param对展示内容进行格式化处理.
}.
本文主要利用ASP.NET提供的Cookie技术使系统记住用户所选择的语言,在用户点击选择何种语言时,系统通过Cookie记录用户的选择,关键代码如下:
(1)获取语言参数,判断用户选择何种语言.
string lang = Request.QueryString["lang"];//获取语言参数,判断用户选择何种语言.
if (lang == null || lang == ""){//如果传入参数为空,则获取默认语言.
string configFilePath = HttpContext.Current.Server.MapPath("~/config/Language.config");
ExeConfigurationFileMap map = new ExeConfigurationFileMap();
map.ExeConfigFilename = configFilePath;
Configuration config = ConfigurationManager.OpenMappedExeConfiguration(map, ConfigurationUserLevel.None);
AppSettingsSection appsetting = config.GetSection("appSettings") as AppSettingsSection;
lang = appsetting.Settings["defaultlang"].Value;
}.
(2)加载语言名到用户Cookie.
HttpCookie userCookie = new HttpCookie(CookieName_I18N);
userCookie.Value = "I18N_" + lang;
Request.Cookies.Remove(CookieName_I18N);
Response.Cookies.Add(userCookie);
当I18N需要得知用户选择何种语言时,系统从Cookie中取得,关键代码如下:
string Sulcmis_I18N;
HttpCookie usercookie = HttpContext.Current.Request.Cookies[CookieName_I18N];
//如果客户端Cookies["Sulcmis_I18N"]为空,则取默认语言.
if (usercookie == null || usercookie.Value == null || usercookie.Value == ""){.
string configFilePath = HttpContext.Current.Server.MapPath("~/config/Language.config");
ExeConfigurationFileMap map = new ExeConfigurationFileMap();
map.ExeConfigFilename = configFilePath;
Configuration config = ConfigurationManager.OpenMappedExeConfiguration(map, ConfigurationUserLevel.None);
AppSettingsSection appsetting = config.GetSection("appSettings") as AppSettingsSection;
string deflangname = appsetting.Settings[I18N_ConfigDefLangParaName].Value;
Sulcmis_I18N = "I18N_" + deflangname;
}else{.
Sulcmis_I18N = usercookie.Value;
}.
对于UI层,首先要将与用户交互的信息进行分类,再对这些信息做多语言化的处理。UI层内与用户进行交互的信息主要有两种:动态页面.aspx文件的提示、描述信息;用于与.aspx文件联系的后台服务器代码.cs文件内需要用到的提示信息。
在.aspx文件中使用前端服务器代码调用资源文件,如下:
<%=I18N.I18N.GetValueByKey("fszl_book.aspx.tableno")%>
在.cs文件中直接调用I18N方法,如下:
I18N.I18N.GetValueByKey("fszl_book.aspx.cs.clc").
基于上述方式实现的I18N模块,不但实现了OPAC的多语言展示,还可以重用到其他项目中,按上述三个步骤调用该模块即可。
XML是一种用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言[12]。
UI层的多语言资源文件采用XML文件格式存放,并采用相同的文件命名规则:以“I18N_”为前缀,以语言名称为后缀,如I18N_zh-cn.xml为简体中文(中国)语言文件,I18N_en-us.xml为英语(美国)语言文件,I18N_ja-jp.xml为日语(日本)语言文件。
每个XML文件中除去根节点<locale>以外的内容信息只有<item value="key">value</item>一层,不同语言文件的结构完全一致,只是内容信息不同。<locale>节点为根节点,<item>节点为保存语言信息及Key值的节点,其中value="key"指明该节点对应的Key值,Value值为Key值所对应的显示给用户的信息。信息中如果包含HTML标签,则需使用<![CDATA[ ]]>标记,标记内的HTML符号不会被XML解析器转义。信息中如果需要设置参数,则使用{0}{1}的方式标记参数位置,并在UI层加载参数。以下是日文语言资源文件的示例:
<?xml version="1.0" encoding="utf-8" ?>
<locale>
….
<item value="search.aspx.selectlib">秘蔵の場所を選んでください:</item>
<item value="search.aspx.alllib">全部</item>
<item value="search.aspx.clcview">
<![CDATA[図書分類通覧をしたかったら、{0}図書分類通覧{1}をクリックしてください。]]>
</item>
<item value="search.aspx.searchdescript">検索の説明:</item>
….
</locale>
基于上述解决方案,SULCMIS OPAC成功实现了中、英、日三种语言的切换。系统共有282个Web页面,从中分析得到需要进行多语言化处理的元素共有1 755个,有104个带参数的元素,55个带HTML标签的元素,测试含有50-100个语言元素的页面在不同语言之间的切换速度均在1秒之内完成,用户体验良好。系统初期实现了中、英两种语言,在增加日语的过程中,没有对系统业务逻辑造成任何影响,只需增加相应的语言文件及语言导航条,语言扩展方便快捷。系统运行效果如图4所示:
随着全球化信息水平的不断提高,软件系统的多语言支持必不可少,在软件设计初期就需要考虑对多语言的支持[14],一个设计良好的多语言系统界面架构可以减少开发成本和后期的维护成本[15]。SULCMISOPAC在系统设计初期就提出支持多语言界面的目标,建立了一种基于业务、界面分离的多语言Web系统架构,并采用.NET开发工具予以实现。整个系统的优点是建立了相对独立、灵活配置、动态加载的松耦合运行机制,实现了多语言界面处理逻辑与业务逻辑完全分离,这样多语言信息资源通过独立XML文件统一管理,方便扩展与维护。系统上线以来,先后支持了英语界面和日语界面,并可扩展到韩语、法语、西班牙语等界面,系统运行稳定,完全达到了设计目标。该项技术的应用,对大型多语言Web门户网站的开发也具有重要的参考价值。
[1] |
|
[2] |
|
[3] |
|
[4] |
|
[5] |
|
[6] |
|
[7] |
|
[8] |
|
[9] |
|
[10] |
|
[11] |
|
[12] |
|
[13] |
|
[14] |
|
[15] |
|