数据库本地化 - 查找列表 - 更智能的方式

时间:2008-10-20 20:32:03

标签: .net database tsql ado.net

我想在数据库中添加一些查找列表,但我希望它们易于本地化(SQL 2005,ADO.NET)

这包括:

  • 同时轻松管理多种语言
  • 轻松检索数据库中的值
  • 后备语言(如果缺少所选语言)

我正在考虑使用一个表来存储多语言查找列表(使用不同语言使用相同的id)并使用一个函数来返回查找列表的值 - 通过接收ID和语言。

其中一个缺陷是我必须为使用查找列表的每个查询手动添加语言参数。

我正在研究一种解决方案,它允许我将参数作为“会话/全局变量”发送,或者通过sql查询自动发送参数,以及自行检索它的函数(要么附加)参数自动,或者能够读取参数)。

解决方案可能看起来像这样,但我不介意它是否不同,只要它没有明确地将参数提供给Query(伪代码):

1. Send the language using "the method"
2. Execute Query
3. Get the localized results

澄清:

  1. 通常查询看起来像这样(请记住使用查找功能):

    SELECT .., GetLookupList1(lookup_ID, language), .. FROM TABLE

  2. GetLookupList1是一个用户定义的函数,用于检索查找表的查找值。通过使用此函数,SQL代码更易于阅读和维护。

    该函数的主体将类似于:

    SELECT @result = LookupValue FROM LookupTable1 WHERE ID=@Lookup_ID and Language=@lang
    RETURN @result
    
    1. 我想要的是能够将语言参数从函数中删除到某种静态变量,仅适用于当前的连接/语句/命令,因此查询看起来像

      SELECT .., GetLookupList1(lookup_ID), .. FROM TABLE

3 个答案:

答案 0 :(得分:2)

如果您按照以下方式构建数据:

MessageToken    DisplayText       LangCode
firewood        Fire wood         en
firewood        Bois de chauffage fr

进行查询时,只提供默认的languageId(如果为空)或提供的languageId。使用标准的令牌列表进行消息。

Select DisplayText from (some table) where MessageToken = 'firewood' and LangId = 'en'

答案 1 :(得分:2)

由于SQL Server中没有用户定义的全局变量,因此您必须使用以下两种方法之一:

  1. 表格 - 临时或永久。永久表的示例:http://weblogs.sqlteam.com/mladenp/archive/2007/04/23/60185.aspx
  2. SET CONTEXT_INFO:http://msdn.microsoft.com/en-us/library/ms187768.aspx。 Context_info允许您将128个二进制字节关联到会话/连接。它有效,但要小心。如果你习惯使用它,你就有可能在另一个环境中意外覆盖它。每个会话/连接只有一个。
  3. 示例context_info t-sql:

    declare @languagein varchar(30), @contextin varbinary(128),
        @languageout varchar(30), @contextout varbinary(128)
    
    select @languagein = 'ro-RO'
    select @contextin = cast(@languagein as varbinary(128))
    set context_info @contextin
    
    --do whatever you like here: queries, stored procs. 
    --context_info stays 'ro-RO' for the duration of the session/connection
    
    select @contextout = context_info()
    set @languageout = replace(cast(@contextout as varchar(30)),0x00, '')
    print @languageout
    

    我在本地化中使用的另一种技术是三部分合并以确保结果。首先检查语言区域,然后检查语言,然后检查默认值。根据您的查询:

    SELECT COALESCE(langregion.LookupValue, lang.LookupValue, fallback.LookupValue) LookupVal
    FROM LookupTable1 fallback
    LEFT OUTER JOIN LookupTable1 lang 
        ON lang.ID = fallback.ID AND lang.Lang = @language
    LEFT OUTER JOIN LookupTable1 langregion 
        ON langregion.ID = fallback.ID AND langregion.Lang = @languagewithregion
    WHERE fallback.ID = @Lookup_ID
    AND fallback.Lang = @defaultlanguage
    

答案 2 :(得分:0)

在详细研究问题之后,我发现了以下内容:

  1. 我可以使用SET CONTEXT_INFO,但我必须注入一些SQL来解决问题。

  2. 最佳选择是不在查找表中存储本地化数据。相反,存储一些标识字符串,并在应用程序中使用自定义本地化逻辑以将字符串与本地化数据相匹配。对于.NET框架,如果我想从数据库中检索本地化信息,则可以使用资源和自定义资源提供程序来实现。

  3. 感谢您的回答。