0

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

对于表单标签、按钮和其他静态内容,我可以使用.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) 的用户会看到其他西班牙语内容和用户发表的评论,而不是其他版本。我并不是指翻译他们的内容并将其呈现给最终用户。

4

3 回答 3

1

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

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

例如:

Car
----------
CarID
LanguageID
Name
Make
于 2012-07-02T13:37:18.800 回答
0

我认为你可以这样做:

  • 只制作一个 MVC3 站点(一个 IIS 站点)
  • 将 .rsx 用于静态内容,像往常一样更改语言
  • 本地化数据库:每种语言一个。
  • 如果您需要一个用于其他非本地化内容的数据库,那应该是一个单独的数据库(不是每种语言一个)
  • 一旦用户进入一个本地化站点,您就可以使用相应的连接字符串

缺点:

  • 您将需要在所有数据库中触发数据库更新
于 2012-07-02T13:59:56.070 回答
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 查询给你这个想法。

这种方法确实需要对数据库进行额外的工作,但效果还不错。我在一个中等负载的网站上使用了这种方法。如果它确实变成了问题,您可以为不同的语言创建物化视图。我也这样做了,只要您的大多数查询都是读取的,它就非常快。

埃里克

于 2012-06-30T22:21:30.620 回答