开发ASP.NET网站以支持多语言

4
我正在构建一个网站,将有西班牙语和意大利语版本。
过去,在构建必须提供不同语言的网站时,我创建了一个类似以下的 SQL 表:
dbo.News
--------
ID int
EnglishTitle nvarchar(200)
SpanishTitle nvarchar(200)
ItalianTitle nvarchar(200)
EnglishContent nvarchar(max)
SpanishContent nvarchar(max)
ItalianContent nvarchar(max)

然后,根据查询字符串(domain.com/NewsArticle.aspx?id=123&l=es),我会做如下操作:

Select Case Request.QueryString("l")
   Case "en"
      TitleLtl.Text = "SELECT EnglishTitle..."
   Case "es"
      TitleLtl.Text = "SELECT SpanishTitle..."
   Case "it"
      TitleLtl.Text = "SELECT ItalianTitle..."
End Select

然而,我发现这非常耗时(特别是如果客户在第二阶段后要求添加另一种语言选项)。

在做类似的事情时,什么是最佳实践,以便留有余地增加其他语言?

我可以接受VB.NET和C#的解决方案,谢谢!

4个回答

4

请阅读一些文章,从这里开始:

ASP.NET 全球化和本地化

.NET 和 ASP.NET 有许多功能可以帮助您在不使用像上面那样耗时和自制的解决方案的情况下本地化和全球化您的网站...


1
+1 我花了一些时间来研究全球化/本地化,但这太棒了!从长远来看,这将为我节省大量时间! - Curtis

0

这样怎么样?

dbo.News
--------
ID int
Label varchar(200)
DateAdded smalldatetime

(以及其他常见字段)

dbo.NewsCultures
----------------
ID int -- FK to the dbo.News PK
LocaleID smallint
Title nvarchar(200)
Content nvarchar(MAX)

LocaleID指的是.net LCID,例如1033代表美式英语。

从非数据库的角度来看,已经有几个回答包含了一些好的资源链接。


0

尝试使用类似这样的代码:

text_code int    
language char(2)
text varchar(max)

其中text_code是文本片段的标识符,例如1=标题、2=内容等。或者您可以使用助记符代码,只要它很短,我认为不会对性能造成太大影响。

那么,您需要文本的任何地方,都应该知道所需文本的代码和语言。使用它们来选择记录。然后您就不需要一个大的case语句了。

例如,您的代码可能如下所示:

command.query="select text from local_text where text_code=@text_code and language=@language"
command.Parameters.AddWithValue("@text_code", 17) ' Probably use symbols there
command.Parameters.AddWithValue("@language", language)
dim text as string=command.executeScalar()

由于查询只返回一种语言,因此没有CASE语句可用。


0
从您的问题看来,您似乎更感兴趣的是以不同方式显示内容而不是像标签一样的东西。
如果是这种情况,您可以始终查看一个子类模型,因此您的dbo.News表将有一个额外的列(Discriminator),并且只有一个标题和内容列。
您的类模型将具有News作为父类和EnglishNews,SpanishNews等作为子类。
如果您正在寻找新闻故事的意大利版本,则会使用正确的新闻ID检索ItalianNews对象(每个具有相同故事的语言的newsId将相同)。
NHibernate允许轻松地subclassing和对象检索,因此虽然添加另一种语言将需要一些编码,但您不必重建DB并大大改变代码。
希望这可以帮助到您。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接