2011-10-02 137 views
3

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

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

有什么替代品可以实现这个目标? 可能是数据库和资源的混合?

编辑:语言的数量是不确定的,现在我们正在使用3种语言,但我希望我们可能需要许多其他语言。

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

回答

1

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

除此之外,您实际上可以创建自己的资源管理器来读取数据库中的内容,并将翻译与标识符一起使用 - 在这种情况下,您的主键需要在资源标识符和语言我认为这是所谓的复合键,是不是):

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

但是,如果需要修改数据库模式...

+0

我不太想修改我的查询来加入语言表。你如何看待混合方法:来自数据库的数据和从资源进行翻译的代码? – Romias

+0

@Romias:我认为这就是我上面提到的。您从数据库中提取数据并基于该数据从资源文件中提取适当的翻译。这是最典型的情况,实际上这是建议(通过IEEE)解决方案的DB本地化。 –

0

我不清楚阅读您的文章无论您是维护用户将生成的内容与您自己的可本地化内容一起放入同一个数据库表中。如果是这样,这听起来像你应该考虑分离它们。

如果你自己的内容是稳定的(即你不会添加新的内容或改变你的应用程序的更新部署之间的变化),那么它应该生活在你的本地化资源而不是数据库中,你应该对待它就像您的本地化用户界面。

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

+0

主要用于目录数据。他们中的一些人有一个标志“系统”的项目,不允许用户更改它...但用户可以将更多的项目添加到该目录。在这种情况下,应该翻译系统数据。 – Romias