MVC JavaScript 外部 .js 文件本地化





3.00/5 (4投票s)
一个允许你管理外部 JavaScript 文件并在其中使用服务器本地化的系统。
我花了一些天的时间寻找一种解决方案,用于翻译放置在外部文件中的 JavaScript 字符串,但没有找到任何简单的解决方案。我找到许多将资源存储在单独的文件中,或将翻译后的字符串存储在字典中的解决方案。这些解决方案在我的场景中并不完美,因为即使用户只需要一种语言,也会将所有翻译后的字符串存储在客户端浏览器中。
另一个原因是,在所有这些解决方案中,你需要通过引用一个特殊的变量来引用翻译后的字符串,例如 (progect.translation.testMessage['it-IT']
)。
我认为用户只需要客户端 js 文件中的他的语言字符串,我更喜欢在 JavaScript 代码中使用像 @Cult.Text("ID") 这样的字符串。
第一点:为什么不使用 MVC Razor 视图引擎来渲染 JavaScript 外部文件脚本?
我创建了一个 JsController.cs
public class JsController : Controller
{
// Remember to manage the cache here
public JavaScriptResult Index(string js, string lang, string ver)
{
Response.ContentType = "text/javascript";
var script = RenderRazorViewToString(js, null);
var jsRet = new JavaScriptResult();
script = script
.Replace("<script type=\"text/javascript\">", string.Empty)
.Replace("<script>", string.Empty)
.Replace("</script>", string.Empty);
var javaScriptMinifier = MinifierFactory.Get<JavaScriptBundle, JsMinMinifier>();
string minifiedJavaScript = javaScriptMinifier.Minify(script);
jsRet.Script = minifiedJavaScript;
return jsRet;
}
private string RenderRazorViewToString(string viewName, object model)
{
ViewData.Model = model;
using (var sw = new StringWriter())
{
var viewResult = ViewEngines.Engines.FindPartialView(ControllerContext, viewName);
var viewContext = new ViewContext(ControllerContext, viewResult.View, ViewData, TempData, sw);
viewResult.View.Render(viewContext, sw);
viewResult.ViewEngine.ReleaseView(ControllerContext, viewResult.View);
return sw.GetStringBuilder().ToString();
}
}
}
然后在 Views 文件夹中,我创建了一个 test.js.cshtml 视图。在这个视图中,你可以使用 Razor 引擎的全部功能来生成你的 JavaScript 库(为什么不呢?)。你还可以为不同的库创建一个单独的文件,并且可以通过添加 <script></script> 标签来使用智能感知,这些标签在渲染视图时会被删除。
该视图还使用 Squishit 进行压缩。
@{ Layout = ""; } <script type="text/javascript"> // Use this line to get Intellisense... function Test() { alert("@Cult.Text("TEST")"); return false; }; </script>
在 _Layout.cshtml 中,我引用了该脚本(调用控制器),只传递当前语言和版本以管理缓存的客户端文件。
你需要通过创建一个 Helper 来生成控制器路径来管理缓存(使用反射来生成程序集的版本)。
<script src="<a>/Js?js=test.js&lang=@Cult.CurrentCulture()&ver=1.4</a>" Type="text/javascript"></script>
我使用这个很棒的解决方案将当前用户文化信息存储到 cookie 中,并在服务器端获取它:使用 HttpModule 进行本地化是否安全?
我创建了一个 Cut 类来管理翻译系统,这是一个简单的实现,你可以使用资源或其他系统来翻译你的字符串。
public static class Cult
{
public static string CurrentCulture()
{
return System.Threading.Thread.CurrentThread.CurrentCulture.Name.Substring(0, 2).ToLower();
}
public static string Text(string messageID)
{
// This is a fake translation repository implementation but you can use a DB o resource...
var currentCulture = System.Threading.Thread.CurrentThread.CurrentCulture.Name.Substring(0, 2).ToLower();
var defaultMessage = string.Empty;
if (messageID == "TEST")
return currentCulture == "it" ? "Testo di prova in Italiano" : "Text message in English";
return currentCulture == "it" ? "Clicca qui per effettuare il test di localizzazione" : "Click here to test the localization";;
}
}
就是这样!!我创建了一个允许你管理外部 JavaScript 文件并在其中使用本地化的系统。
示例在附件文件中... 请使用 NuGet 更新所有引用的包。
评论 非常 受欢迎。