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应用程序文件夹,并为每个本地化版本复制已发布的文件
我将创建一个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作为静态内容,像往常一样更改语言
- 本地化数据库:每种语言一个
- 如果您需要一个数据库来处理其他非本地化的事情,那么应该是一个单独的数据库(不是每种语言一个)
- 一旦用户进入本地化站点,您就可以使用相应的连接字符串
- 您需要在所有数据库中触发数据库更新