4 Stimmen

ASP.NET *.resx Serialisierung

Ich arbeite an einem I18N-Projekt mit und es gibt einen Aufruf, unsere *.resx-Dateien als JSON-Objekte zu serialisieren (aus welchem Grund auch immer).

Was ich mich frage, ist:

  • Gibt es eine Möglichkeit, eine Liste aller gültigen Schlüssel für eine bestimmte *.resx-Datei zu erhalten, damit wir HttpContext.GetGlobalResourceObject verwenden können, um die Tokens abzurufen?
  • Falls das nicht funktioniert, hat jemand eine clevere Lösung gefunden?

0 Stimmen

Ein Grund, wenn Sie eine App erstellen, die auf JSON-Daten und AJAX-Aufrufen basiert, müssen Sie möglicherweise lokalisierte HTML-Schnipsel in Javascript generieren, ohne die Hilfe Ihrer C#-Ansichtsdateien. In diesem Fall ist das JSON-Objekt mit den resx-Daten unschätzbar.

7voto

Stefan Steiger Punkte 72861
  Sub ReadRessourceFile()
       ''#Requires Assembly System.Windows.Forms 
        Dim rsxr As System.Resources.ResXResourceReader = New System.Resources.ResXResourceReader("items.resx")

        ''# Iteriere durch die Ressourcen und zeige den Inhalt in der Konsole an.    
        Dim d As System.Collections.DictionaryEntry
        For Each d In rsxr
            Console.WriteLine(d.Key.ToString() + ":" + ControlChars.Tab + d.Value.ToString())
        Next d

        ''#Schließe den Reader. 
        rsxr.Close()
    End Sub

Dann musst du dies zu einem Serializable Dictionary hinzufügen, das du dann mit System.Web.Extensions.dll in JSON serialisieren kannst.

Public Class JSONHelper

Public Shared Function Serialize(Of T)(ByVal obj As T) As String
    Dim JSONserializer As System.Web.Script.Serialization.JavaScriptSerializer = New System.Web.Script.Serialization.JavaScriptSerializer()  
    Return JSONserializer.Serialize(obj)
End Function

Public Shared Function Deserialize(Of T)(ByVal json As String) As T
    Dim obj As T = Activator.CreateInstance(Of T)()
    Dim JSONserializer As System.Web.Script.Serialization.JavaScriptSerializer = New System.Web.Script.Serialization.JavaScriptSerializer()
    obj = JSONserializer.Deserialize(Of T)(json)
    Return obj
End Function

End Class

Bearbeiten: C# :

public void ReadRessourceFile()
{
    //Requires Assembly System.Windows.Forms '
    System.Resources.ResXResourceReader rsxr = new System.Resources.ResXResourceReader("items.resx");

    // Iteriere durch die Ressourcen und zeige den Inhalt in der Konsole an. '    
    System.Collections.DictionaryEntry d = default(System.Collections.DictionaryEntry);
    foreach (DictionaryEntry d_loopVariable in rsxr) {
        d = d_loopVariable;
        Console.WriteLine(d.Key.ToString() + ":" + ControlChars.Tab + d.Value.ToString());
    }

    //Schließe den Reader. '
    rsxr.Close();
}

Und der JSON-Helper:

public class JSONHelper
{

    public static string Serialize(T obj)
    {
        System.Web.Script.Serialization.JavaScriptSerializer JSONserializer = new System.Web.Script.Serialization.JavaScriptSerializer();
        return JSONserializer.Serialize(obj);
    }

    public static T Deserialize(string json)
    {
        T obj = Activator.CreateInstance();
        System.Web.Script.Serialization.JavaScriptSerializer JSONserializer = new System.Web.Script.Serialization.JavaScriptSerializer();
        obj = JSONserializer.Deserialize(json);
        return obj;
    }

}

Außerdem, wenn du den Kommentar ebenfalls erhalten möchtest, kannst du UseResXDataNodes auf true setzen.
Beispiel:

public static string ReadRessourceFile()
{
    string[] languages = new string[] { "de", "fr", "it", "en" };
    string pathPattern = System.AppDomain.CurrentDomain.BaseDirectory;
    pathPattern = System.IO.Path.Combine(pathPattern, "..", "..", "..", "libQrCodeGenerator", "Resources", "QRBillText-{0}.resx");
    pathPattern = System.IO.Path.GetFullPath(pathPattern);

    System.Collections.Generic.Dictionary> dict = new System.Collections.Generic.Dictionary>(System.StringComparer.InvariantCultureIgnoreCase);

    foreach (string lang in languages)
    {
        dict[lang] = new System.Collections.Generic.Dictionary(System.StringComparer.InvariantCultureIgnoreCase);

        string file = string.Format(pathPattern, lang);
        System.Resources.ResXResourceReader rr = new System.Resources.ResXResourceReader(file);
        rr.UseResXDataNodes = true;

        // '# Iteriere durch die Ressourcen und zeige den Inhalt in der Konsole an. 
        foreach (System.Collections.DictionaryEntry d in rr)
        {
            System.Resources.ResXDataNode node = (System.Resources.ResXDataNode)d.Value;
            string value = (string) node.GetValue((System.ComponentModel.Design.ITypeResolutionService)null);
            string comment = node.Comment;

            if(!string.IsNullOrEmpty(comment))
            {
                System.Console.WriteLine(comment);
            }

            // dict[lang][d.Key.ToString()] = d.Value.ToString(); // wenn UseResXDataNodes = true nicht verwendet wird
            dict[lang][d.Key.ToString()] = value;
        }

        // '#Schließe den Reader. 
        rr.Close();
    }

    string json = Newtonsoft.Json.JsonConvert.SerializeObject(dict, Newtonsoft.Json.Formatting.Indented);
    return json;
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X