大型应用程序最常用的解决方案是拥有一个具有唯一 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 语句。不要忘记在适当的字段上创建索引以提高查询性能。