如何国际化来自数据库的数据?

时间:2011-10-02 19:25:53

标签: .net asp.net-mvc-3 c#-4.0 internationalization

我有一个ASP.NET MVC网站,它依赖于资源文件进行UI国际化。 数据库中的某些数据将由useres(使用其语言)生成,但某些数据由我生成,用户不应编辑它。对于那个系统数据,我需要在数据库中只存储一个“令牌”,并在用他的语言将其显示给用户时进行翻译。

我真的不喜欢在数据库中进行翻译,并将每个文本列与翻译表连接。

我有什么办法可以做到这一点? 可能是数据库和资源的混合体?

编辑:语言数量不确定,目前我们正在使用3种语言,但我希望我们还需要其他语言。

编辑2:这主要是针对目录数据...某些目录在同一个表中有系统和用户数据。系统数据需要转换,因为用户无法编辑。

2 个答案:

答案 0 :(得分:1)

您实际上只能在数据库中存储标识符,并在运行时将它们从资源文件(常规* .resx)解析为语言内容。
虽然在这种情况下根本没有意义将它存储在数据库中(仅使用资源文件就足够了)。当然,维护这将是一场噩梦(你需要实际上将数据库的内容与资源文件同步)。

除此之外,您实际上可以创建自己的资源管理器来读取数据库中的内容,并将翻译与标识符一起放置 - 在这种情况下,您的主键需要在资源标识符和语言上定义(I认为它被称为复合键,不是吗?):

---------------------------------------------------------
| Id | Locale | Translation                             |
---------------------------------------------------------
| 1  | en-US  | Something happened on the way to heaven |
| 1  | pl     | Coś się stało na drodze do nieba        |
---------------------------------------------------------

但它需要修改数据库架构......

答案 1 :(得分:0)

我不清楚您是否在同一个数据库表中维护用户生成的内容以及您自己的可本地化内容。如果是这种情况,听起来你应该考虑将它们分开。

如果您自己的内容稳定(即您不会在应用更新的部署之间添加新内容或更改内容),那么它应该存在于可本地化的资源中而不是数据库中,您应该只将其视为就像你的本地化用户界面一样。

如果另一方面它是动态内容,那么似乎没有其他选择将其存储在数据库中。您需要在单独的本地化表中存储内容ID以及每个(复合键PawełDyda引用的)的语言ID,该表提供每个内容的翻译版本。或者您可以依靠多语言CMS来管理这种多语言内容(例如,参见WordPress的WPML插件)