本地化的scriptbundle解决方案

cle*_*ris 11 asp.net-mvc localization bundling-and-minification asp.net-optimization

嗨,我目前正在使用asp.net MVC 4 rc与System.Web.Optimization.由于我的网站需要根据用户偏好进行本地化,因此我正在使用jquery.globalize插件.

我非常希望继承ScriptBundle类,并根据需要确定要捆绑的文件System.Threading.Thread.CurrentThread.CurrentUICulture.这看起来像这样:

bundles.Add(new LocalizedScriptBundle("~/bundles/jqueryglobal")
                             .Include("~/Scripts/jquery.globalize/globalize.js")
                             .Include("~/Scripts/jquery.globalize/cultures/globalize.culture.{0}.js", 
                                       () => new object[] { Thread.CurrentThread.CurrentUICulture })
                    ));
Run Code Online (Sandbox Code Playgroud)

例如,如果ui文化是"en-GB",我希望拾取以下文件(当然缩小,如果可能的话,也会缓存,直到脚本文件或currentui文化发生变化).

  • "〜/脚本/ jquery.globalize/globalize.js"
  • "〜/ Scripts/jquery.globalize/globalize-en-GB.js"< - 如果此文件在服务器文件系统上不存在,则回退到globalize-en.js.

我尝试使用类似下面的内容重载Include方法,但这不会起作用,因为它不是根据请求进行评估,而是在应用程序启动时进行评估.

public class LocalizedScriptBundle : ScriptBundle
{
    public LocalizedScriptBundle(string virtualPath)
        : base(virtualPath) { 
    }

    public Bundle Include(string virtualPathMask, Func<object[]> getargs) {
        string virtualPath = string.Format(virtualPathMask, getargs());
        this.Include(virtualPath);
        return this;
    }

}
Run Code Online (Sandbox Code Playgroud)

谢谢

康斯坦丁

Hao*_*ung 9

这是正确的,捆绑应该只应在应用程序启动前配置.否则,在多服务器方案中,如果对捆绑包的请求路由到服务于该页面的服务器之外的其他服务器,则将找不到捆绑包资源的请求.

那有意义吗?基本上所有捆绑包都需要提前配置和定义,而不是基于每个请求动态注册.

  • 是的,当然这是事实.但是看起来,当js或css文件改变服务器端时,捆绑包会被重新评估以便更新(内部可能使用FileSystemWatcher).我没有看到为什么人们无法覆盖此行为以考虑应用程序生命周期中的其他事件(例如更改UI文化)的原因. (2认同)