我正在使用SQL Server 2008在ASP.NET 3.5中开发Web应用程序。我需要多语言,如英语,荷兰语,芬兰语等。我可以使用System.Resources和System.Globalization来完成。但我无法转换数据来自数据库的语言。 我该怎么解决?
答案 0 :(得分:3)
我建议您在桌子上使用两张表来进行本地化 例如:
Product
-------------------------------
ProductID | Price | Stock
-------------------------------
10 | 10 | 15
ProductLoc
-----------------------------------------------
ProductID | Lang | Name | Description
-----------------------------------------------
10 | EN | Bike | Excellent Bike
10 | ES | Bicicleta | Excelente bici
这样你可以使用:
SELECT * FROM
Product LEFT JOIN ProductLoc ON Product.ProductID = ProductLoc.ProductID
AND ProductLoc.Lang = @CurrentLang
(左连接以防万一ProductLoc表中没有当前lang的记录)
免责声明:摘自another answer of mine
的文字答案 1 :(得分:1)
最常用的大型解决方案,我的意思是大型应用程序是使用具有唯一ID的Languages表,然后将LanguageId引用到数据表中。
CREATE TABLE Languages (
LanguageId int IDENTITY(1, 1) PRIMARY KEY
LanguageCode nvarchar(5)
LanguageName nvarchar(25)
)
GO
INSERT INTO Languages (LanguageCode, LanguageName)
VALUES (N'en-CA', N'English Canada')
GO
INSERT INTO Languages (LanguageCode, LanguageName)
VALUES (N'fr-CA', N'French Canada')
GO
INSERT INTO Languages (LanguageCode, LanguageName)
VALUES (N'de-GE', N'German Germany')
GO
CREATE TABLE LabelTexts (
LabelTextId int IDENTITY(1, 1) PRIMARY KEY
FormName nvarchar(50) NOT NULL
LabelName nvarchar(50) NOT NULL
LanguageId int NOT NULL
LabelText nvarchar(2000) NOT NULL
)
GO
ALTER TABLE LabelTexts
ADD CONSTRAINT FK_Language FOREIGN KEY REFERENCING Languages(LanguageId)
GO
INSERT INTO LabelTexts (FormName, LabelName, LanguageId, LabelText)
VALUES (N'frmMain', N'label1', 1, N'Enter the information for customer here:')
GO
INSERT INTO LabelTexts (FormName, LabelName, LanguageId, LabelText)
VALUES (N'frmMain', N'label1', 2, N'Saisir les informations du client ici :')
GO
-- etc.
因此,当您的应用程序部署到另一种语言时,您只需要将这种新语言插入支持的语言表中,并将文本字符串插入引用正确LanguageId的语言,配置您的应用程序以获得此LanguageId查询数据库,你就定了!您的应用程序很容易多语言!
您甚至可以编写自己的参数化标量函数,它们将为您执行正确的查询,因此代替:
select LabelText
from LabelTexts
where LanguageId = 1
and FormName LIKE N'frmMain'
and LabelName LIKE N'label1'
你只需要创建一个函数并像这样调用它:
select dbo.GetLabelText(N'frmMain', N'label1', 1)
并且函数体编码如上所述的SELECT语句。不要忘记在适当的字段上创建索引以提高查询性能。