1 考虑多语言的问题
对于多语言,需要考虑两个方面,一个是界面,一个是数据库信息,对于界面的多语言问题比较简单,只要建立相应的资源文件就可以了,这里不再多说;比较复杂的是数据库信息的多语言化,这里说说 Freight.net 的解决方案。
Freight.net 将使用 Storm.MultiLanguage 构件来处理多语言。
该构件可对数据库中的字符串数据表及 XML 格式的字符串数据表进行操作。默认的数据库表名为 DisplayString, 默认的 XML 文件名为 DisplayStringData.XML
对数据库中的字符串数据表支持多数据库及同一数据下多数据表的操作。数据库连接字符串在 Storm.AppSetting 的配置文件中指定。
对 XML 格式的字符串数据表,默认存放路径由 Storm.AppSetting 的配置文件中“ XMLPath ”的设置决定,否则,会直接置于应用程序目录下,对于 Web 应用程序,会保存在相对于应用程序启动目录下, IIS5 为 Windows\System32 , IIS6Windows\System32\INetSrv
非默认的 XML 格式文件的存放路径由 Storm.AppSetting 的配置文件中“ *XMLPath ”的设置决定,其中星号代表指定的 XML 文件集名称,否则,会直接置于应用程序目录下 , 对于 Web 应用程序,会保存在相对于应用程序启动目录下, IIS5 为 Windows\System32 , IIS6Windows\System32\INetSrv
LanguageData 数据集用于记录应用程序中可用的语言,存放路径由应用程序配置文件配置节中“ XMLPath ”的设置决定,否则,会直接置于应用程序目录下 , 对于 Web 应用程序,会保存在相对于应用程序启动目录下, IIS5 为 Windows\System32 , IIS6Windows\System32\INetSrv
支持绝对和相对路径,对于 Web 应用程序,相对路径表示相对于应用程序启动路径, IIS5 为 Windows\System32 , IIS6Windows\System32\INetSrv
应用程序的默认语言在 Storm.AppSetting 的配置文件中“ DefaultLanguage ”来设置。
以上是构件的简单描述,现在看一下数据结构:
LanguageData :
可以看到这张表很简单,它定义了应用程序将支持哪些语言,当需要支持新的语言是也很简单。
DisplayString :
可以看出,这张数据表也很简单,而且他的使用也会非常灵活,它可以以多个不同的名称同时存在于多个数据库中、多个文件夹下……
构件提供了一些方法来访问数据:
** GetDisplay ** ** 方法用来获得需要的语言下的显示字符; ** ** **
** SaveDisplay ** ** 方法用来保存指定语言的显示字符; ** ** **
** GetDisplayDS ** ** 方法则将相关对象的所有语言的显示数据都取出来; ** ** **
** DelDisplay ** ** 方法将指定对象的所有语言的显示数据都清除掉。 ** ** **
在使用时,只要将目标数据的 RefGuid 保存起来即可,如国家 Country 的名字( Name )需要保存多语言,那么在数据库中之需要保存 NameGuid 字段即可,在获取资料的时候数据集添加上 Name 字段并调用 GetDisplay 方法将获得的值填充进去就可以了。
通过在中间层编写适当的方法还可以使用户任意修改 Name 字段的值,而系统会自动保存回当前语言的记录中。
举个例子:系统的默认语言是“ en-us ”,某用户在 zh-chs 的语言下添加了一条 Country 记录,那么这个国家的 Name 字段值(假设是“美国”)会保存到 zh-chs 语言的记录下,因为这条记录是新添加的,很明显,这条记录的 en-us 语言的记录是没有的,那么系统会自动地为默认语言 en-us 也添加一条记录,值为“美国”;然后,另一个用户访问这条记录,他的语言是 zh-cht ,而这时这条记录是没有的,系统会显示默认语言( en-us )的值“美国”,这当然就不对了,他只需要直接修改这个值为“ 美國 ”,保存,系统就会自动再添加一条 cn-cht 的记录值为“ 美國 ”,同样使用 en-us 语言的用户,只要直接修改 Name 为“ USA ”,系统就会自动修改 en-us 语言的显示字符串,其他语言不会有任何影响。而用户却不会感觉到这一点,在他看来就只是修改了这条 Country 记录而已。这样做的好处就是,每个用户都只需要维护自己用的这种语言的记录信息就可以了,而不用考虑其他语言的问题,也可以非常方便的即使系统运行了一段时间后再次添加支持的语言,不需要在添加记录的时候就需要添加所有语言的版本,只在需要的时候才添加相应语言的版本,从而使数据库记录数尽量的少。
当然,不要指望什么事情都由这个构件一手包办,为了实现以上这些功能,还是需要在中间层写一些比以前稍多的代码。具体我会在后面给出例子。
(未完待续)