11

こんにちは私は現在、System.Web.Optimizationでasp.net MVC4rcを使用しています。私のサイトはユーザーの好みに応じてローカライズする必要があるため、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 })
                    ));

たとえば、UIカルチャが「en-GB」の場合、次のファイルを取得します(もちろん、縮小し、可能であれば、スクリプトファイルまたはcurrentuiカルチャが変更されるまでキャッシュします)。

  • "〜/ Scripts / 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;
    }

}

ありがとう

コンスタンチノス

4

2 に答える 2

9

正解です。バンドルは、アプリの開始前にのみ構成する必要があります。そうしないと、複数サーバーのシナリオで、バンドルのリクエストがページを提供したサーバー以外の別のサーバーにルーティングされた場合、バンドル リソースのリクエストが見つかりません。

それは理にかなっていますか?基本的に、すべてのバンドルは事前に構成および定義する必要があり、リクエストごとに動的に登録する必要はありません。

于 2012-06-15T22:47:04.807 に答える
1

見てみましょう: https://stackoverflow.com/questions/18509506/search-and-replace-in-javascript-before-bundling

私は自分のニーズに合わせてこのようにコーディングしました:

public class MultiLanguageBundler : IBundleTransform
{
    public void Process(BundleContext context, BundleResponse bundle)
    {
        var content = new StringBuilder();
        var uicult = Thread.CurrentThread.CurrentUICulture.ToString();

        var localizedstrings = GetFileFullPath(uicult);
        if (!File.Exists(localizedstrings))
        {
            localizedstrings = GetFileFullPath(string.Empty);
        }

        using (var fs = new FileStream(localizedstrings, FileMode.Open, FileAccess.Read))
        {
            var m_streamReader = new StreamReader(fs);
            var str = m_streamReader.ReadToEnd();

            content.Append(str);
            content.AppendLine();
        }

        foreach (var file in bundle.Files)
        {
            var f = file.VirtualFile.Name ?? "";

            if (!f.Contains("localizedstrings"))
            {
                using (var reader = new StreamReader(VirtualPathProvider.OpenFile(file.VirtualFile.VirtualPath)))
                {
                    content.Append(reader.ReadToEnd());
                    content.AppendLine();
                }
            }
        }

        bundle.ContentType = "text/javascript";
        bundle.Content = content.ToString();
    }

    private string GetFileFullPath(string uicult)
    {
        if (uicult.StartsWith("en"))
            uicult = string.Empty;
        else if (!string.IsNullOrEmpty(uicult))
            uicult = ("." + uicult);

        return Kit.ToAbsolutePath(string.Format("~/Scripts/locale/localizedstrings{0}.js", uicult));
    }
}
于 2014-05-05T15:10:37.390 に答える