[英]ASP.NET MVC bundle scripts with translation
根据Nadeem Afana的博客 ,我使用了类似于Mads Kristensen博客的脚本翻译器对MVC进行了本地化。 问题在于捆绑包是在Application_Start方法中注册的。 这会导致脚本以一种(默认)语言进行翻译,并存储在浏览器/服务器缓存中。 改变语言/文化不会产生它们的语言等同性。 是否可以类似于视图那样实现缓存配置文件VaryByCustom =“ culture”? 有没有更好的做法/解决方案? 是否可以将HTML5应用程序缓存与已翻译的脚本一起使用?
脚本翻译器类:
public class ScriptTranslator : IBundleTransform {
public ScriptTranslator(ResourceManager manager) {
RM = manager;
}
public void Process(BundleContext context, BundleResponse response) {
response.Content = TranslateScript(response.Content);
}
private static ResourceManager RM;
private static Regex REGEXP = new Regex( @"translate\(""([^\))]*)""\)", RegexOptions.Singleline | RegexOptions.Compiled);
private string TranslateScript(string text) {
MatchCollection matches = REGEXP.Matches(text);
foreach (Match key in matches) {
object obj = RM.GetObject(kay.Groups[1].Value);
if (obj != null) {
text = text.Replace(kay.Value, CleanText(obj.ToString()));
}
}
return text;
}
private static string CleanText(string text) {
return string.Format("\"{0}\"", text.Replace("\\", "\\\\"));
}
}
使用自定义工具名称空间Resources.Javascript的资源文件; 我的捆绑包配置是:
public class BundleConfig {
public static void RegisterBundles(BundleCollection bundles) {
var DEFAULT_SCRIPT_PATH = "~/Scripts/Modules/";
var DEFAULT_SCRIPT_BOUNDLE_PATH = "~/ScriptBundles/";
var mainBoundle = new ScriptBundle(DEFAULT_SCRIPT_BOUNDLE_PATH + "main")
.Include(DEFAULT_SCRIPT_PATH + "test.js");
mainBoundle.Transforms.Clear();
mainBoundle.Transforms.Add(new ScriptTranslator(Resources.JavaScript.test.ResourceManager));
mainBoundle.Transforms.Add(new JsMinify());
bundles.Add(mainBoundle);
}
}
我们针对此问题的解决方案不仅是通过控制器/动作组合来存储不同的捆绑软件,而且还是通过CurrentUICulture来存储。
string.Format("scriptsDependency{0}{1}_{2}", controler, action, Thread.CurrentThread.CurrentUICulture.Name);
我还建议存储静态库,例如JQuery或Bootstrap。 但是对于动态内容,我建议使用NoCache策略。
public class NonCacheableTransformer : IBundleTransform
{
public void Process(BundleContext context, BundleResponse response)
{
context.UseServerCache = false;
response.Cacheability = HttpCacheability.NoCache;
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.