能否将web.config文件中的appSettings信息本地化?

4
我有一个类似这样的想法:
<appSettings>
 <add key="ConfigName" value="configuration" culture="1033" />
 <add key="ConfigName" value="konfiguracja" culture="1045" />
</appSettings>

但是 add元素只有两个属性-keyvalue,所以我猜它不受支持。

接下来我想到的是:

<appSettings>
 <add key="ConfigName-1033" value="configuration" />
 <add key="ConfigName-1045" value="konfiguracja" />
</appSettings>

有人能提供更好的解决方案吗?


更新 - 我实施的解决方案:

将这些信息移动到资源文件中 (Oded's answer) 的缺点是它不能再轻易地在开发人员和测试人员的机器上进行修改。

然而,这是我的做法 - 我将设置保留在 web.config 文件中 (它们无法本地化,但可以在不需要重新编译代码的情况下进行修改) 并且 将它们添加到资源文件中 (它们可以本地化;只在生产环境中使用,在那里 web.config 设置为空字符串)。

4个回答

5
不应将本地化数据存储在config文件中。
使用卫星程序集和资源文件进行本地化。
如果只有少量项目,将其保存在config中可能还可以,但经验表明,项目数量会增加,最终导致维护困难。
有关更多详细信息,请参见此指南(ASP.NET 2.0中的全球化和本地化揭秘)。

1
@klausbyskov:我这么做是因为这个答案并没有回答问题(当然不是冒犯@Oded)。虽然这里提供的信息非常准确,但它相当不贴切;问题是如何本地化appSettings,而不是“存储本地化数据的最佳方法”。 - Ben Collins
我也很好奇。这是唯一正确的答案。而且,那些从未暴露给用户的东西本来就不应该本地化。"ConnectionString" 应该始终是 "ConnectionString"。我最讨厌的事情之一就是开发人员本地化代码。代码应该是英文,没有其他的。 - mare
1
@Ben Collins - 当你的经验告诉你,其他程序员试图做某件事是明显错误的时候,你有责任向他们指出。Stack Overflow也是关于相互教育最佳实践,而不是坚持错误的做法。 - Oded
1
@mare:我这里不是在本地化代码 - 我简化了示例,所以不太明显,但我需要本地化的设置存储了一个URL。它存储在web.config文件中,因为测试和生产环境中不同。 - Marek Grzenkowicz
@Oded - 虽然我并不完全不同意,但有时候有理由去做一些通常看起来“完全错误”的事情。我尽可能慷慨地回答SO的问题。 @Marek想以这种方式做事情可能有很多原因(尽管他在之前的评论中已经解释了)。 - Ben Collins

2
如果只涉及到几个设置,你上面的建议就可以很好地解决问题。我认为ASP.NET本身并没有支持本地化配置设置的功能。

0
为什么不创建一个appsettings.culture文件并将其复制到应用程序文件夹中。根据应用程序的文化,您可以使用正确的本地化应用程序设置文件覆盖appconfig。

我可以自动访问这个文件吗?即,为appSettings设置当前文化,并使用WebConfigurationManager.AppSettings - Marek Grzenkowicz
我认为你可以使用WebConfigurationManager.OpenWebConfiguration(configPath)来实现这一点。 - Ikaso

-1
请将以下内容添加到您的web.config文件的configSections部分中:
<section name="ConfigNames" type="System.Configuration.NameValueSectionHandler" />

将以下代码添加到您的Web配置文件中<system.web>...</system.web>部分之外:
<ConfigNames>
  <add key="configuration" value="1033"/>
  <add key="konfiguracja" value="1045"/>
</ConfigNames>

然后你可以像这样访问你的设置:

var configNames = (NameValueCollection)ConfigurationManager.GetSection("emailLists");
//and get at them however you like:
var culture = configNames["konfiguracja"];

这在语义上是错误的。如果有什么需要做的话,应该像这样完成:<add key="Configuration_1033" value="Configuration"/> <add key="Configuration_1045" value="Konfiguracja"/>。你不会本地化键(??),你会本地化值 - 这是正确的模式,你也可以在 web.config 之外的资源文件中看到它。 - mare
我不知道他想要它做什么 - 我以为这个数字就是值。我举了一个能够运行的例子。与其在您的appSettings中有一百万行代码,将不同的设置分开保存更好 - 如果您不想这样做也没关系,这只是一个建议,但这种方法确实可行,因此不可能是“错误”的。 - BritishDeveloper
configurationkonfiguracja 是针对两种不同文化(1033 和 1045)的 ConfigName 设置的值。 - Marek Grzenkowicz
很酷。在这种情况下,您想要 <add key="1033" value="configuration"/> 和 <add key="1045" value="konfiguracja"/>。您可以使用 configNames["1033"] 访问值。无论如何,我使用的方法仍然适用-我更喜欢以这种方式逻辑上分离类似配置的批次,而不是将它们与每个其他设置放在同一位置。 - BritishDeveloper

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接