我们如何本地化数据库驱动的网站
我一直在使用内置的本地化功能的.NET,它们似乎都依赖于将数据放入resx文件中。
但是大多数系统不能依靠它,因为它们是数据库驱动的。那么,我们如何解决这个问题呢?是否有内置的.NET方式,还是我们用SQL创建转换表并手动完成所有操作?而且,如果我们必须在大多数站点上执行此操作,那么是否有任何理由甚至使用resx本地化方式?
例如,我在我的网站上有一个FAQ列表,将该列表保存在数据库中,这样我就可以轻松添加/删除更多内容,但是通过将其放入数据库中,我无法将这些信息翻译成多种语言。
解决方案
我认为,本地化动态内容(例如FAQ)应该由我们在数据库中完成。根据问题的存储方式,我可能会创建一个"区域设置"列,并在从数据库中选择常见问题时使用它。我不确定当我们开始本地化很多表时这是否可以很好地扩展。
对于静态内容(例如表单字段标签,静态文本,图标等),使用基于文件的资源可能就可以了。但是,如果我们确实想要,创建一个可以处理此问题的自定义资源提供程序实现似乎并不难。
以下是一些相关链接:
- http://channel9.msdn.com/forums/Coffeehouse/250892-Localizing-with-a-database-or-resx-files/
- http://weblogs.asp.net/scottgu/archive/2006/05/30/ASP.NET-2.0-Localization-2800_Video_2C00-Whitepaper_2C00_-and-Database-Provider-Support_2900_.aspx
- http://www.arcencus.nl/Blogs/tabid/105/EntryID/20/Default.aspx
- http://msdn.microsoft.com/en-us/library/aa905797.aspx
- http://www.codeproject.com/KB/aspnet/customsqlserverprovider.aspx
当前,翻译不是可以自动完成的事情。最好的方法是让一个人翻译并使用尼克的方法来显示正确的语言。
对于数据模型中的给定项目,将描述部分拆分为带有语言环境ID列(LCID)的本地化表。
因此,"产品"表实际上将不包含产品描述或者名称,而仅包含其固定值和快速值(ProductId,EAN,NumberInStock,NextStockData,IsActive,IsPublished)等。
然后,ProductDescription包含
产品编号,名称,说明,LCID
我住在加拿大,因此使用多种语言非常重要。我看过两种方法。第一种选择是将特定记录的所有本地化数据存储在不同的表中,该表通过主键和语言环境链接到原始表。第二个选项与第一个选项相似,不同之处在于每个语言环境都有一个不同的表,而该语言环境是表名的后缀。
选项A
Item (ItemID, ...) ItemLocal (ItemID,LocaleID,....)
选项B
Item (ItemID, ...) Item_ENUS (ItemID,....) Item_ENGB (ItemID,....) Item_FR (ItemID,....)
我最近想到的第三个选择是,如果数据库本身支持它,那将是一个很好的选择,那就是将所有本地人的值存储在同一字段中。而且,如果将该字段设置为varchar-multilocal,则必须通过传递参数来指定语言来访问它。据我所知,不存在像这样的东西,但是我认为这确实会使事情变得更加轻松和流畅。
我们混合使用RESX文件和Kibbee响应的选项A。我们创建了一个简单的工具来在线管理RESX文件:
http://blog.lavablast.com/post/2008/02/RESX-file-Web-Editor.aspx