开发者

Using global resource in JavaScript

I want to use global resource in my javascript code. Normally, when the code is inside the ASP code, I use <%=GetGlobalResourceObject("Resource", "MONTHS_SHORT1") %> and it works. But, when the javascript code is not inside the ASP code, for example in a folder as calendar.js, it does not work. How can I use 开发者_StackOverflow中文版the global resource in this case? Note: The resource file is inside my App_GlobalResources folder.


Look at the following post I created describing how you can serialise global and local resources and retrieve them from javascript using jQuery and JSON.

http://bloggingdotnet.blogspot.com/2010_02_01_archive.html

Firstly, create a new handler (.ashx) file. This one was written quite some time ago, so uses vb.net and custom JSON serialisation:

Imports System.Web
Imports System.Web.Services
Imports System.Xml
Imports System.Resources
Imports System.Reflection

Public Class Localisation
  Implements System.Web.IHttpHandler

  Public Sub ProcessRequest(ByVal context As HttpContext) Implements IHttpHandler.ProcessRequest
    Dim files As String = context.Request.QueryString("files")
    Dim local As String = context.Request.QueryString("local")
    Dim isLocal As Boolean
    Dim folder As String = "App_GlobalResources"

    context.Response.ContentType = "text/javascript"

    'Write out file as object
    context.Response.Write("{")

    'Determine if local resource file
    If local IsNot Nothing Then
      isLocal = CBool(local)
      If isLocal Then folder = "App_LocalResources"
    End If
    If files Is Nothing OrElse files.Length = 0 Then Throw New ArgumentException("Parameter 'files' was not provided in querystring.")

    Dim flag As Boolean = False
    For Each file As String In files.Split(",")
      If flag Then context.Response.Write(",")

      Dim className As String = file.Split(".")(0)

      'Write the class (name of the without any extensions) as the object
      context.Response.Write(className)
      context.Response.Write(":{")

      'Open the resx xml file
      Dim filePath As String = context.Server.MapPath("~\" & folder & "\" & file)
      Dim document As New XmlDocument()
      Dim flag2 As Boolean = False
      document.Load(filePath)

      Dim nodes As XmlNodeList = document.SelectNodes("//data")

      For Each node As XmlNode In nodes

        'Write out the comma seperator
        If flag2 Then context.Response.Write(",")

        Dim attr As XmlAttribute = node.Attributes("name")
        Dim resourceKey As String = attr.Value
        context.Response.Write(resourceKey)
        context.Response.Write(":""")

        'Write either the local or global value
        If isLocal Then
        context.Response.Write(HttpContext.GetLocalResourceObject(String.Format("~/{0}",    file.Replace(".resx", "")), resourceKey)) 'Has to be full path to the .aspx page
        Else
          context.Response.Write(HttpContext.GetGlobalResourceObject(className, resourceKey))
        End If
        context.Response.Write("""")

        'Flag that we need a comma seperator
        flag2 = True
      Next

      context.Response.Write("}")
      flag = True
    Next

    'End file
    context.Response.Write("}")
  End Sub

  Public ReadOnly Property IsReusable() As Boolean Implements IHttpHandler.IsReusable
    Get
      Return True
    End Get
  End Property
End Class

When that is working, use the following jQuery code to make an ajax call to the http handler and return the contents of the resource file as an object literal.

// -- Localisation --
var localResources;
var globalResources;

//Sample JSON for javascript resource values eg {TrackDetail:{HideHelp:"Hide Help", ShowHelp:"Show Help"}}
//Usage e.g: alert(localResources.TrackDetail.HideHelp);

//Load Localisation values into variables so that they can be available on the client
//Note that these values are loaded asynchronously, the code in the function will not run until the call has completed.
$.getJSON('Localisation.ashx?files=TrackDetail.aspx.resx&local=true', function(data) { localResources = data});
$.getJSON('Localisation.ashx?files=Errors.resx,Strings.resx', function(data) { globalResources = data});


You would have to generate JavaScript code that mimics the resources you need, as ASP.NET runs server-side, and JavaScript runs client-side.

<script language="javascript" type="text/javascript">
var MONTHS_SHORT1 = <%=GetGlobalResourceObject("Resource", "MONTHS_SHORT1") %>;
</script>


I often use a hidden literal to hold the resource text then grab the localised text using javascript and jquery:

  <asp:Literal runat="server" ID="Literal1" visible="false" Text="<%$ Resources:String, MyResourceText%>" />
  <input type="button" id="Button1"  value=""  />
  <script type="text/javascript">
            $(document).ready(function () {
                // Update the buton text with the correct localised lookup
                var ButtonText = '<%=Literal1.Text%>';
                $("#Button1").attr('value', ButtonText );
            });
  </script>


This will register resource key.

ClientScriptManager cs = Page.ClientScript;

String scriptRegVariables = string.Format("var resourcetext = '{0}'", Resources.Resource.keyText);
if (!cs.IsClientScriptBlockRegistered("RegVariablesScript"))
{
    cs.RegisterClientScriptBlock(typeof(_Default), "RegVariablesScript", scriptRegVariables, true);
}

Now inside .js file you can directly use it. e.g. Alert(resourcetext);

Add the code above on Page_Load of control or aspx page

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜