通过未映射到区域性的自定义字符串加载.resx文件

时间:2013-12-10 16:44:57

标签: c# asp.net asp.net-mvc resx

我正在建立一个供多个客户使用的网站,我需要提供在各个地方更改标签的灵活性。例如,如果一个客户想要调用登录“电子邮件”而另一个想要将其称为“员工ID”。虽然我从未使用它们,但我认为用于本地化的resx资源文件是个好主意,但我在设置它时遇到了问题,因为我所做的并不是真正的本地化,它映射到任何文化。 / p>

我的测试包含以下资源文件:

Global.resx
    Hello   "Hello!"
Global.Casual.resx
    Hello   "Sup!"
Global.Formal.resx
    Hello   "Greetings!"

然后在我的cshtml视图中,我可以说@Resources.Global.Hello并且按预期工作。我的问题是,如何将其设置为默认显示休闲?如果我将Casual和Formal重命名为es和ru,我可以这样做:

Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture("es");

这很好用。但如果我尝试使用“休闲”,我会发现它“是一个无效的文化标识符”。我可以通过在视图中说@Resources.Global_Casual.Hello来明确地显示它,但这显然不是我所追求的。

我是否在这里采取了完全错误的方向,试图将某些东西用于与其设计相反的目的?我只想用任意字符串值加载资源文件。我需要推出自己的数据库驱动方法吗?

这看起来非常类似于这个问题,从来没有得到答案:How to specify a custom culture?

1 个答案:

答案 0 :(得分:1)

我个人认为这种自定义属于数据库 - 尤其是因为您可以允许客户端在需要时自行定制。如果您关注性能,那么您可以将这些术语缓存到字典中,甚至可以创建一个类,该类将从字典中公开字符串(如果客户端已自定义它们),或者从资源文件中公开字符串(如果不是)。这允许您提供可以按需更改的合理默认值。或者,您可以在数据库中提供许多备选方案,并在UI中显示允许选择单词的标记。

我遇到了类似的问题,即在SO问题Localization vs Customization中允许在应用程序中进行自定义,您可能会发现它很有用。