gpt4 book ai didi

ASP.NET 本地化 : Changing resources without restarting the application?

转载 作者:行者123 更新时间:2023-12-02 10:18:29 24 4
gpt4 key购买 nike

我要求最终用户可以更改本地化资源,并且更改应该在应用程序中可见,而无需重新启动应用程序。

更新以澄清场景:
我说的是在运行时更改本地化资源。假设我在某个页面的德语翻译中存在拼写错误。然后一些管理员用户应该有可能在运行时更改该拼写错误。无需重新部署或重新启动即可使此更改反射(reflect)在 UI 中。

我正在使用 ASP.NET MVC3。

我有什么选择?

我一直在考虑写一个custom ResourceProvider从数据库加载资源。
这看起来并不太费力,但到目前为止我指出了两个缺点:

  • 它无法与 MVC3 中用于方便验证的 DataAnnotations 配合使用(DataAnnotations 使用 ErrorMessageResourceType 参数,该参数仅适用于已编译的资源)
  • 我们基本上必须提供自己的工具来管理资源(例如翻译等),这很遗憾,因为有很多工具可以与 resx 文件一起使用。

还有哪些其他选择?在运行时操作已部署的 resx 文件是否是一种选择?
但我怀疑应用程序在检测到这些更改时会自动“重新启动”:我怀疑 ASP.NET 意识到 resx 文件已更改,然后它回收应用程序池并即时编译新的 resx 文件。
它是否正确?有什么办法可以解决这个问题吗?

我还没有考虑在部署之前将资源编译到卫星程序集中。这是否是 Web 应用程序的推荐场景?
但即使使用已编译的附属程序集,我怀疑当这些程序集动态更改时,ASP.NET 也会重新启动应用程序。这是正确的吗?

我对如何满足原始要求的任何经验感兴趣?我会对有关我上面提到的选项的任何评论感兴趣。

最佳答案

DataAnnotations 接受一个 ErrorMessageResourceType,它告诉 ValidationAttrributes 在哪里访问资源。您可以按如下方式传递:

[Required(
ErrorMessageResourceType = typeof(DynamicResources),
ErrorMessageResourceName = "ResourceKey")]
public string Username { get; set; }

通过为每个键创建具有静态属性的参数类型,您可以创建一个从数据库或其他实现加载资源的实现。然后,您可以将其与 DRY 的动态对象结合起来,并将实现移至 TryGetMember 中。然后可能会使用 T4 模板在编译时从数据库生成静态数据,最终结果如下:

public class DynamicResources : DynamicObject
{
// move these into partial and generate using T4
public static string MyResource
{
get { return Singleton.MyResource; }
}

public static string MyOtherResource
{
get { return Singleton.MyOtherResource; }
}

// base implementation to retrieve resources
private static dynamic singleton;

private static dynamic Singleton
{
get { return singleton ?? (singleton = new DynamicResources()); }
}

public override bool TryGetMember(GetMemberBinder binder, out object result)
{
// some logic here to look up resources
result = GetResourceKeyFromDatabase(binder.Name);
return true;
}
}

当然,如果资源不是静态属性那就完美了。

关于ASP.NET 本地化 : Changing resources without restarting the application?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7207608/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com