我们如何“国际化”存储在SQL Server 2012表中的静态信息

时间:2013-06-13 04:53:51

标签: sql-server

我们的应用程序的一个功能是它为用户存储内容信息。这些信息是几种不同的信息之一 内容类型和可用类型存储在SQL Server的关系表中。这是使用的类:

public partial class ContentType
{
    public int ContentTypeId { get; set; }
    public string Name { get; set; }
    public System.DateTime ModifiedDate { get; set; }
    public virtual byte[] Version { get; set; }
}

备份此类的SQL Server表具有相同的字段:

CREATE TABLE ContentType (
    [ContentTypeId] INT IDENTITY (0, 1) NOT NULL,
    [Name] NVARCHAR (50) Not NULL,
    [Version] rowversion,
    [ModifiedDate] [datetime] NOT NULL,
    CONSTRAINT [PK_ContentType] PRIMARY KEY CLUSTERED ([ContentTypeId] ASC)
)";

我们希望将我们的申请“国际化”。这意味着其他事情 根据语言,“名称”字段的值将不同。

有人可以就如何做到这一点向我们提出任何建议吗?

2 个答案:

答案 0 :(得分:1)

这取决于你的“国际化”的含义。如果您只需要在近中期内支持第二种语言,则可以通过在表格中添加新列来解决此问题。类似于AlternateName

或者,如果name只需要一种关联语言,您可以通过添加LanguageId列(引用关联的Languages表)来解决此问题。

我猜你的意思更强烈,即能够用几种语言之一查看“内容”的“名称”。我还假设ModifiedDate是与用户内容无关的数据库字段。如果没有,那么你还需要处理日期格式的国际化。

目前,您的表格结构在ContentTypeIdname之间具有1-1关系。必须修改这种关系,因为你需要一对多的关系。从允许的语言表开始。如果您想使用缩写,请使用国际标准(例如here)。但是,您自己的表格允许您包含其他信息,例如首选日期格式和首选货币符号。

您需要另一张表格,例如ContentLanguages,例如:

create table ContentLanguages (
    ContentLanguageId int primary key,
    LanguageId int,  /* or a code for human readability */
    Name nvarchar(255),
    ModifiedDate datetime
);

然后您需要为多种语言维护它。

如果您使用的是标准语言,则可能需要确保显示所有名称,例如英文。您可以通过制定业务规则来实现此目的,该规则要求内容在添加任何其他版本之前具有英语版本(使用存储过程中的触发器或业务规则)。

答案 1 :(得分:0)

我理解这一点的方式是,您希望为不懂英语的人提供更友好的用户。

我会考虑按原样保留数据库,但只创建国际接口。

例如,您可以创建API,而不是直接访问数据库,并通过使用适当的国际名称命名方法,类和其他方法来使此API成为国际API。

你甚至可以使用国际名称空间,例如sa Main.Espana.MiCasa和Main.English.MyHouse 在后台,您将拥有一组方法来完成实际工作,然后只为不同语言创建包装器。

另一种方法可能是在数据库中创建不同的模式,并仅通过这些模式为人们提供访问权限。使用视图读取数据和存储过程以进行插入和更新。