这包括:
我正在考虑使用一个表来存储多语言查找列表(使用不同语言使用相同的id)并使用一个函数来返回查找列表的值 - 通过接收ID和语言。
其中一个缺陷是我必须为使用查找列表的每个查询手动添加语言参数。
我正在研究一种解决方案,它允许我将参数作为“会话/全局变量”发送,或者通过sql查询自动发送参数,以及自行检索它的函数(要么附加)参数自动,或者能够读取参数)。
解决方案可能看起来像这样,但我不介意它是否不同,只要它没有明确地将参数提供给Query(伪代码):
1. Send the language using "the method" 2. Execute Query 3. Get the localized results
澄清:
通常查询看起来像这样(请记住使用查找功能):
SELECT .., GetLookupList1(lookup_ID, language), .. FROM TABLE
GetLookupList1是一个用户定义的函数,用于检索查找表的查找值。通过使用此函数,SQL代码更易于阅读和维护。
该函数的主体将类似于:
SELECT @result = LookupValue FROM LookupTable1 WHERE ID=@Lookup_ID and Language=@lang
RETURN @result
我想要的是能够将语言参数从函数中删除到某种静态变量,仅适用于当前的连接/语句/命令,因此查询看起来像
SELECT .., GetLookupList1(lookup_ID), .. FROM TABLE
答案 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中没有用户定义的全局变量,因此您必须使用以下两种方法之一:
示例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)
在详细研究问题之后,我发现了以下内容:
我可以使用SET CONTEXT_INFO
,但我必须注入一些SQL来解决问题。
最佳选择是不在查找表中存储本地化数据。相反,存储一些标识字符串,并在应用程序中使用自定义本地化逻辑以将字符串与本地化数据相匹配。对于.NET框架,如果我想从数据库中检索本地化信息,则可以使用资源和自定义资源提供程序来实现。
感谢您的回答。