为不同语言开发ASP.NET网站

时间:2011-10-07 15:36:06

标签: c# asp.net vb.net localization

我正在建立一个西班牙语和意大利语版本的网站。

过去,在构建一个必须以不同语言提供的网站时,我创建了一个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 个答案:

答案 0 :(得分:4)

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

ASP.NET Globalization and Localization

.NET和ASP.NET有许多功能可以帮助您本地化和全球化您的网站,而不需要像上面那样耗费时间和自制解决方案......

答案 1 :(得分:0)

从您的问题来看,您似乎更感兴趣的是展示不同的内容,而不是标签。

如果是这种情况,您可以随时查看子类模型,因此您的dbo.News表将有一个额外的列(Discriminator),并且只有一个标题和内容列

您的班级模型会将News作为父类,将EnglishNews,SpanishNews等作为子类。

如果您正在寻找新闻故事的意大利语版本,您将使用正确的新闻ID检索ItalianNews对象(对于具有相同故事的每种语言,newsId将是相同的。)

NHibernate允许轻松subclassing和对象检索,因此在添加另一种语言时需要进行一些编码,您不必重建数据库并大大改变代码。

希望这会有所帮助。

答案 2 :(得分: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.

从非数据库的角度来看,已有多个回复包含指向一些优质资源的链接。

答案 3 :(得分:0)

尝试更像这样的事情:

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

其中text_code是你需要哪一段文字的标识符,例如1 = title,2 = content等。或者你可以使用助记符代码,我认为这不会影响性能,只要它是短。

然后你需要文本的任何地方,你应该知道你需要的文本的代码,并且你知道语言。使用它们来选择记录。那你就不需要大案例陈述了。

即。你的代码就像:

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语句,因为您只从查询中获得一种语言。