本地化动态,用户生成的内容。关于这两个选择的意见?

时间:2012-06-30 21:10:08

标签: c# asp.net-mvc-3 localization user-generated-content

我正在建立一个网站,允许人们创建内容并对内容发表评论。

对于表单标签,按钮和其他静态内容,我可以使用.resx文件。我之前已经完成了它并且运行正常。

现在我处在一个十字路口,我不知道要走哪条路。两者对我来说同样好,但由于这将是我第一次进入这样的领域,我宁愿问一些我可能没有考虑的陷阱。

以下是我想实施的两个选项。两者都可以解决我向用户本地化和呈现用户生成内容的问题。

选项A:


我会创建整个MVC3应用程序的多个副本,并将每个本地化放入它自己的IIS应用程序中。

foobar.com
es.foobar.com
ru.foobar.com

我只需要更改web.config文件,为每个本地化使用不同的数据库。

我看到了一些问题,例如:

  • 如果用户登录foobar.com并且他要访问他本地化版本的网站,他就不会登录,因为他们是两个完全独立的应用程序。

  • 没有统一的审核工具。我必须进入每个应用程序,登录,访问管理面板并从那里进行调整。

  • 很难将更改/更新推送到所有版本的页面。我必须手动进入每个IIS应用程序文件夹并复制每个本地化版本的已发布文件。

选项B:


我会创建一个MVC3应用程序,并在后端数据库中为每个本地化创建多个字段。

例如:

Car
------
CarID
Name
esName
ruName
Make
esMake
ruMake
..and so on..

然后我会以某种方式根据选择的本地化动态选择要显示的字段。虽然我甚至不确定这是否可行,因为访问子域会将我带到一个完全不同的IIS应用程序,除非我可以绑定子域以指向我的IIS上的实际域。

foobar.com
es.foobar.com
ru.foobar.com

我用这种方法看到的问题是每个表的大小都很庞大,不仅在字段数量上,而且在记录数量上也是如此。我不确定这是不是一个问题。


对于如何在MVC3应用程序中实现用户生成内容的本地化,我将不胜感激。

意思是,访问西班牙语版本(es.foobar.com)的用户会看到其他西班牙语内容和用户发表的评论,而不是其他版本。我意味着翻译他们的内容并将其呈现给最终用户。

3 个答案:

答案 0 :(得分:1)

另一种选择是拥有一个MVC应用程序,以正常方式进行本地化,并使用语言切换(您可以通过URL路由触发,例如es.foobar.com将语言设置为“es”,或通过accept-languages标题,或通过UI选择器。)

您可以在包含用户生成内容的表格中添加语言ID列,而不是每种语言都有一列。并对用户生成的内容实施过滤器,以便只显示与活动语言匹配的行。

例如:

Car
----------
CarID
LanguageID
Name
Make

答案 1 :(得分:0)

一种方法是存储指向数据表中字段的指针。例如,您的Car表可以包含

CarId | Name | Make
123   | 0099 | 0100

然后有一个包含本地化字符串的表。

TextId | Lang | String
0099   | en   | "Escape"
0099   | ru   | "Russian Name"
0100   | en   | "Ford"
0100   | ru   | "Russian Ford"

在本地化字符串表上,在TextId和Lang上创建复合主键。这样,您的域/数据表保持简单,在选择数据时,您只需加入本地化的字符串表即可。合理?我可以编写一个快速SQL查询,以便在需要时为您提供建议。

这种方法确实需要对数据库进行额外的工作,但命中率并不算太差。我在适度加载的网站上使用过这种方法。如果它确实变成了问题,您可以为不同的语言创建物化视图。我也是这样做的,只要你的大多数查询都是读取,它就会非常快。

埃里克

答案 2 :(得分:0)

我认为你可以这样做:

  • 只创建一个MVC3站点(一个IIS站点)
  • 使用.rsx进行静态内容照常更改语言
  • 本地化数据库:每种语言一个。
  • 如果你需要一个非本地化的其他东西的数据库,那应该是一个单独的数据库(不是每种语言一个)
  • 用户进入本地化站点后,使用相应的连接字符串

<强> CONS:

  • 您需要在所有数据库中触发数据库更新