我正在建立一个西班牙语和意大利语版本的网站。
过去,在构建一个必须以不同语言提供的网站时,我创建了一个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#解决方案持开放态度,干杯!
答案 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语句,因为您只从查询中获得一种语言。