如何在asp.net的javascript文件中使用本地化的消息

时间:2010-07-28 09:51:42

标签: javascript asp.net localization

如何在asp.net中的javascript文件中使用本地化消息。

我有一个Javascript文件(global-Scripts.js),其中包含我的所有脚本。我使用另一个文件(messages.js),其中包含所有静态错误消息(例如:“你确定要删除吗?”),这样就可以进行本地化。

是否可以在没有其他文件(messages.js)的情况下本地化此主脚本文件,以便我可以删除一个脚本引用?

2 个答案:

答案 0 :(得分:5)

ASP.NET ScriptManager控件能够以两种方式为脚本提供localization

如果您的脚本嵌入在程序集中 as a resource using the WebResourceAttribute,那么you can use the ScriptResourceAttribute让ScriptManager知道您在.resx文件中存储了一些您想要的本地化字符串在您的脚本服务的任何时候提供服务。这些字符串作为JSON对象注入页面,然后在主脚本中输出对JSON对象的引用,而不是文字字符串。

例如,您可以像这样嵌入脚本:

[assembly: System.Web.UI.WebResource("ProjectNamespace.MyScript.js", "application/x-javascript")]
[assembly: System.Web.UI.ScriptResource("ProjectNamespace.MyScript.js", "ProjectNamespace.MyScriptResources", "Messages")]

“ProjectNamespace.MyScript.js”是作为脚本的嵌入式资源的完整路径。在ScriptResourceAttribute中,第二个参数是包含所有本地化消息的嵌入式.resx文件(减去.resx扩展名)的完整路径。您可以像处理任何其他.resx一样对待它,因此您可以使用MyScriptResources.resx作为默认文化,然后使用MyScriptResources.es-MX.resx进行墨西哥语西班牙语覆盖,等等.ScriptResourceAttribute中的最后一个参数是JSON的名称将要生成的对象。

在脚本中,引用JSON对象:

function DoSomething()
{
  alert(Messages.ErrorMessage);
}

在上面的代码片段中,“ErrorMessage”是.resx文件中某个字符串资源的名称。

如果您嵌入了脚本,请使用指定程序集和名称的标记从ScriptManager引用它。

或者,您可以保留脚本的完全本地化副本,例如“MyScript.js”,“MyScript.es-MX.js”,“MyScript.en-UK.js”等。本地化的逻辑和消息被硬编码到脚本中。

如果您执行此本地化方法,请使用指定路径的脚本从ScriptManager引用它。

There is a really nice overview and links to detailed walkthroughs on this with code examples on MSDN.

请注意,如果您使用的是ASP.NET MVC,则ScriptManager控件无法正常使用它。在这种情况下,您需要查看其他解决方案,例如jQuery globalization plugin或可能a custom ScriptManager replacement for use in MVC

答案 1 :(得分:1)

我有一个解决方案,我已经用它来解决这个问题。它允许您在js文件中使用您的asp.net Web应用程序中的全局资源。基本上它使用页面GetLocalisedScript.aspx来为你的js文件提供服务。

页面如下:

protected void Page_Load(object sender, EventArgs e)
    {
        string retval = "";

        string file = Request["js"].ToString();

        using(StreamReader sr = new StreamReader(Server.MapPath(string.Format("~\\scripts\\{0}.js",file))))
        {
            retval = sr.ReadToEnd();
            sr.Close();
        }

        Regex rx = new Regex("##LOCALISE(.+?)##",RegexOptions.Singleline);
        MatchCollection mc =  rx.Matches(retval,0);
        foreach (Match m in mc)
        {
            string strResxKey = m.Value.Replace("##LOCALISE(", "").Replace(")##", "");
            string val = GetGlobalResourceObject("myResource", strResxKey).ToString();
            retval = retval.Replace(m.Value, val); 
        }
        //Just write out the XML data
        Response.ContentType = "text/xml";
        //NOTE THAT THIS PAGE DOESN'T CONTAIN ANY HTML TAG, WHATSOEVER
        Response.Output.Write(retval);
    }

标记

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="GetLocalisedScript.aspx.cs" Inherits="TestMulti.GetLocalisedScript" %>

在您的页面中将标准src替换为以下内容:

<script src="GetLocalisedScript.aspx?js=myJS" type="text/jscript" ></script>

myJS是你的js文件的名称。

然后修改您的js文件以包含## LOCALIZE()##标记。

function alert2(val) {
alert("##LOCALISE(Yes)##");
}

GetLocalisedScript.aspx页面将用资源查找替换所有标记。

希望这有助于某人。