ASP.. NET本地化:无需重新启动应用程序即可更改资源



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

更新以澄清场景:
我说的是在运行时改变本地化的资源。假设我在一页的德语翻译中有一个错别字。然后,某些管理员用户应该有可能在运行时更改该错别字。应该不需要重新部署或重新启动,以便在UI中反映此更改。

我正在使用ASP。净MVC3。

我有什么选择?

我一直在考虑编写一个自定义的ResourceProvider,从数据库加载资源。
这似乎不太费力,但是到目前为止,我指出了两个缺点:

  • 它不能与用于MVC3中方便验证的数据注释一起工作(数据注释与ErrorMessageResourceType参数一起工作,仅适用于编译资源)
  • 我们基本上必须提供自己的工具来管理资源(如翻译等),这很遗憾,因为有很多工具可以与resx文件一起工作。

还有其他选择吗?是否可以在运行时操作部署的resx文件?
但是我怀疑当应用程序检测到这些变化时,它会自动"重新启动"。NET意识到resx文件已经更改,然后它回收应用程序池并动态编译新的resx文件。
这是正确的吗?还有别的办法吗?

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

我对如何满足原始要求的经验很感兴趣。我希望大家对我上面提到的选项有任何意见

DataAnnotations接受一个ErrorMessageResourceType,它告诉validationattributes在哪里访问资源。你可以这样传递:

[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;
    }
}
如果资源不是静态属性那就再好不过了。

最新更新