C# 本地化动态、用户生成的内容。对这两种选择有何看法?

C# 本地化动态、用户生成的内容。对这两种选择有何看法?,c#,asp.net-mvc-3,localization,user-generated-content,C#,Asp.net Mvc 3,Localization,User Generated Content,我正在建立一个网站,允许人们创建内容并对内容发表评论 对于表单标签、按钮和其他静态内容,我可以使用.resx文件。我以前做过,效果不错 现在我正处在一个十字路口,我不知道该走哪条路。对我来说,这两种方法听起来都很好,但由于这将是我第一次进入这样的领域,我宁愿询问我可能没有考虑到的任何陷阱 下面是我考虑实施的两个选项。两者都可以解决我的本地化问题,并将用户生成的内容呈现给我的用户 选项A: 我将创建整个MVC3应用程序的多个副本,并将每个本地化放在它自己的IIS应用程序中 foobar.com

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

对于表单标签、按钮和其他静态内容,我可以使用
.resx
文件。我以前做过,效果不错

现在我正处在一个十字路口,我不知道该走哪条路。对我来说,这两种方法听起来都很好,但由于这将是我第一次进入这样的领域,我宁愿询问我可能没有考虑到的任何陷阱

下面是我考虑实施的两个选项。两者都可以解决我的本地化问题,并将用户生成的内容呈现给我的用户

选项A:


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

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

我发现这方面存在一些问题,例如:

Car
------
CarID
Name
esName
ruName
Make
esMake
ruMake
..and so on..
Car
----------
CarID
LanguageID
Name
Make
  • 如果用户登录到
    foobar.com
    并访问其本地化版本的站点,则不会登录,因为这两个应用程序是完全独立的

  • 没有统一的调节工具。我将不得不进入每个应用程序,登录,访问管理面板和温和从那里

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

选项B:


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

例如:

Car
------
CarID
Name
esName
ruName
Make
esMake
ruMake
..and so on..
Car
----------
CarID
LanguageID
Name
Make
然后,我会根据选择的本地化动态地选择要显示的字段。尽管我甚至不确定这是否可行,因为访问子域会将我带到完全不同的IIS应用程序,除非我可以绑定子域以指向IIS上的实际域

foobar.com
es.foobar.com
ru.foobar.com
我看到这种方法的问题是,每个表的大小都非常庞大,不仅字段的数量如此,记录的数量也是如此。我不确定这是否是个问题


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

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

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

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

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查询来告诉您

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


Erick

另一种选择是使用单个MVC应用程序,以正常方式本地化,并带有语言开关(您可以通过URL路由触发该开关,例如es.foobar.com将语言设置为“es”,或通过
接受语言
标题,或通过UI选择器)

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

例如:

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

我认为你可以这样做:

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

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

为什么不让yoursite.com/en/customer/1并让en的route参数允许您设置区域性并从资源文件或数据库中提取,等等?