2010-07-28 14 views
6

So verwenden Sie lokalisierte Nachrichten in Javascript-Datei in asp.net.So verwenden Sie lokalisierte Nachrichten in JavaScript-Datei in asp.net

Ich habe eine Javascript-Datei (global-Scripts.js), die alle meine Skripte enthält. Ich benutze eine andere Datei (messages.js), die alle statischen Fehlermeldungen enthält (zB: "Bist du sicher, dass du löschen willst?"), Damit diese lokalisiert werden kann.

Ist es möglich, diese Hauptskriptdatei zu lokalisieren, ohne eine andere Datei (messages.js) zu haben, so dass ich eine Skriptverweis entfernen kann?

Antwort

5

Das ASP.NET ScriptManager-Steuerelement bietet die Möglichkeit, localization für Ihre Skripts auf verschiedene Arten bereitzustellen.

Wenn Ihr Skript in die Assembly eingebettet istas a resource using the WebResourceAttribute dann you can use the ScriptResourceAttribute die Script wissen zu lassen, dass Sie einige lokalisierte Zeichenfolgen in einer RESX-Datei irgendwo gespeichert haben, dass Sie jederzeit Ihr Skript wird serviert serviert werden soll. Diese Strings werden als JSON-Objekt in die Seite eingefügt, und dann geben Sie in Ihrem Hauptskript Verweise auf das JSON-Objekt statt auf literale Strings aus.

Zum Beispiel würden Sie Ihr Skript wie folgt einbetten:

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

Die „ProjectNamespace.MyScript.js“ ist der vollständige Pfad zu der eingebetteten Ressource, die Ihr Skript. Im ScriptResourceAttribute ist der zweite Parameter der vollständige Pfad zur eingebetteten RESX-Datei (abzüglich der Erweiterung .RESX), die alle lokalisierten Nachrichten enthält. Sie behandeln das genau wie jede andere .resx-Datei, sodass Sie MyScriptResources.resx für die Standardkultur und dann MyScriptResources.es-MX.resx für mexikanische Spanisch-Überschreibungen usw. haben. Der letzte Parameter im ScriptResourceAttribute ist der Name des JSON Objekt, das generiert wird.

In Ihrem Skript, können Sie das JSON-Objekt verweisen:

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

In dem obigen Code-Schnipsel "Errormessage" ist der Name eines der String-Ressourcen in der RESX-Datei.

Wenn Sie das Skript einbetten, verweisen Sie es mithilfe eines Tags, das eine Assembly und einen Namen angibt, vom ScriptManager aus an.

Alternativ können Sie vollständig lokalisierte Kopien des Skripts, wie "MyScript.js" halten "MyScript.es-MX.js", "MyScript.en-UK.js" usw., wo die lokalisierte Logik und Nachrichten sind fest in das Skript geschrieben.

Wenn Sie diese Lokalisierungsmethode verwenden, referenzieren Sie sie über den ScriptManager mit einem, der einen Pfad angibt.

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

Beachten Sie, dass, wenn Sie ASP.NET MVC verwenden, die Scriptmanager-Steuerelement wirklich nicht mit ihm arbeiten. In diesem Fall sollten Sie sich eine andere Lösung wie die jQuery globalization plugin oder möglicherweise a custom ScriptManager replacement for use in MVC ansehen.

+0

Ich arbeitete mit dem gleichen Problem auch. Aber in meinem Fall erzeuge ich js-Datei als eine eingebettete Ressource und ich benutze ClientScriptManager. Und Ereignis das Ressourcenprojekt und das jscript eingeschlossene Projekt sind unterschiedlich. Also kann ich nicht das richtige "Nachrichten" -Objekt aus meiner js-Datei bekommen. Irgendeine Idee? –

1

Ich habe eine Lösung, die ich verwendet habe, um dies zu lösen. Es ermöglicht Ihnen, Ihre globalen Ressourcen in Ihrer asp.net-Webanwendung innerhalb Ihrer js-Dateien zu verwenden. Im Wesentlichen verwendet es eine Seite GetLocalisedScript.aspx, um Ihre js-Dateien zu bedienen.

Die Seite ist wie folgt:

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); 
    } 

Mark up

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

In Ihrer Seite die Standard-src mit so etwas wie die folgenden ersetzen:

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

Wo myJS Ist Name Ihrer js-Datei.

Dann ändern Sie Ihre js-Datei mit den Tags ## LOCALIZE() ##.

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

Die GetLocalisedScript.aspx Seite werden alle Tags mit dem Look-Ups Ressource ersetzen.

Ich hoffe, das hilft jemandem.

Verwandte Themen