Ich entwickle eine Windows-Anwendung und möchte den gesamten Text für Beschriftungen, Optionsfelder, Schaltflächen, Kontrollkästchen und Spaltenüberschriften von Rastern an einer Stelle speichern. Ich habe versucht, eine Klassendatei, eine XML-Datei, eine Datenbanktabelle und eine Ressourcendatei zu verwenden.
Ich habe festgestellt, dass eine Klassendatei der beste Weg ist, um all diese Texte zu speichern, aber ich möchte wissen, ob es einen alternativen Weg gibt. Wenn ich eine Klassendatei verwende, muss ich das Projekt neu kompilieren, wenn sich Text ändert.
Funktioniert eine Ressourcendatei für große Datenmengen ordnungsgemäß? Was ist mit einem Wörterbuch oder dem Speichern von Daten in Variablen?
Antworten:
Kurz gesagt: Es klingt für mich nach einer Lokalisierung von Ressourcen (verschiedene Typen wie statische Beschriftungen, Text usw.). Im Allgemeinen sollten Änderungen am Inhalt der Ressourcendatei keine Neuerstellung der Anwendung erfordern.
Der Nachteil beim Speichern von Ressourcen in Klassen besteht darin , dass für jede Änderung / Modifikation eine Neuerstellung der Win-Form-Anwendung erforderlich ist.
Ich denke, die Einschränkung ist die Dateigrößenbeschränkung des Betriebssystems und das sind 4 GB auf 32-Bit-Systemen, wenn ich mich richtig erinnere. Für 64 Bit sollte es noch größer sein. Zum Speichern des statischen Textes sollte er jedoch mehr als ausreichend sein.
Daher sollte dies meiner Meinung nach nirgendwo anders gemacht werden, wenn der Text statisch ist.
Ein alternativer Ansatz wäre das Erstellen einer Klasse, um den Zugriff auf Ihre Ressourcendateien zu steuern. Diese Klasse kann verwendet werden, um die Schlüssel für den Zugriff auf Ihre Ressourcendateien zu speichern und eine stark typisierte Methode zum Abrufen verfügbarer Ressourcen des Projekts zu verwenden.
Einige Referenzen zu SE-Antworten zu Lokalisierung und Ressourcen:
Referenzen von MSDN :
quelle
Ich denke, Sie haben so ziemlich alles erwähnt.
Wenn Sie etwas Flexibles wünschen, bei dem Sie nicht neu kompilieren müssen, ist die Datenbank möglicherweise die beste Option.
Aber sonst würde ich mit .resx gehen, da dies der Standard ist.
Das Speichern von Text in Klassendateien ist eine ziemlich schlechte Idee.
quelle
Neben dem .resx-Format können Sie auch .txt- oder .restext-Dateien verwenden, die in einem einfacheren (und leichter zu lesenden und zu bearbeitenden) Format vorliegen.
Erstellen von Ressourcendateien für Desktop-Apps (siehe Abschnitt "Ressourcen in Textdateien")
Das Format ist im Wesentlichen
name = value
mit der Fähigkeit, Kommentare und bedingte Kompilierung zu haben.Eine andere Möglichkeit besteht darin, die gewünschte Quell- oder Textdatei zu verwenden und die binäre .resources-Datei entweder manuell oder als Teil eines Erstellungsschritts zu erstellen. (Siehe "Ressourcen in .resrouces-Dateien" über den obigen Link).
In beiden Fällen ist etwas mehr Arbeit erforderlich, um diese in Ihr Projekt zu integrieren und zu kompilieren. Beide haben jedoch den Vorteil, dass sie mehrere Sprachen unterstützen, genau wie die .resx-Datei.
quelle
In C # ist es mit ziemlicher Sicherheit besser, eine Ressourcendatei (eine XML-Datei) zu verwenden. Dies bietet Ihnen folgende Vorteile:
quelle
Ich hatte zuvor eine ähnliche Anforderung und habe Ressourcen in einer .resx-Datei gespeichert, aber ich habe mich entschieden, Klassen zum Speichern der Schlüssel zu verwenden.
Angenommen, ich habe Ressourcen für den Bildschirm für Bankabhebungen.
Ich habe eine einfache Klasse nach dem Vorbild von erstellt
Ich habe dann eine Klasse zum Abrufen von Ressourcen implementiert. Mein Ziel war eine stark typisierte Art, Ressourcen herauszuholen. Ich wollte auch die Ressourcenabrufeinheit testbar machen. Ich habe eine Schnittstelle zum Abrufen von Ressourcen extrahiert :
IResource
.Jedes Mal, wenn ich Ressourcen verwenden wollte, erhielt ich eine Implementierung über den IoC-Container.
Wenn es darum ging, die Ressource zu nutzen, hätte ich Folgendes:
In der obigen Zeile habe ich einen Lambda-Ausdruck verwendet, mit dem ich alle verfügbaren Ressourcen über Intellisense anzeigen konnte.
Wenn es um Unit-Tests ging, verspottete ich
IResource
und stellte Erwartungen daran.Zum Beispiel:
Beachten Sie auch, dass wir eine Schnittstelle zum Abrufen von Ressourcen extrahiert haben. Aus diesem Grund können wir Ressourcen jetzt überall speichern, wo wir wollen. Zum Beispiel:
Ich habe oben von oben in den Notizblock geschrieben. Wenn Sie also Probleme haben, lassen Sie es mich wissen und ich werde die Implementierung später hinzufügen.
quelle
Ich habe gerade etwas Ähnliches nach dieser CodeProject-exemplarischen Vorgehensweise getan: Link
Es dient dazu, mehrere leicht aktualisierbare Textdateien in Ressourcendateien zu verwandeln, die Sie Ihrem Projekt hinzufügen können, um verschiedene Sprachen zu erhalten (in meinem Fall kann ich in einem Kombinationsfeld zwischen so vielen Sprachen wechseln, für die ich Ressourcendateien erstelle).
Dies hat gegenüber .resx-Dateien den Vorteil, dass Sie nur 1 pro Sprache und Projekt haben können, anstatt 1 pro Sprache und Formular
Nur etwas anderes zum Nachdenken
quelle
Portable Object (.po) ist sehr beliebt und außerhalb der .NET-Welt ein Standard. Ich habe gesehen, dass es in einigen C # -Projekten verwendet wurde (z . B. https://github.com/OrchardCMS/OrchardCore/tree/d729a2048a4390380d99e7be9f7968ff8f8e9271/src/OrchardCore/OrchardCore.Localization.Core ). Es gibt keine offizielle Unterstützung dafür, aber das Format ist nicht so komplex und es gibt einige Bibliotheken dafür: https://github.com/neris/NGettext
Das Format ist definitiv einfacher als .resx, da es nicht auf XML basiert. Sie haben auch viele Werkzeuge dafür, z. B. Pootle, Poedit und mehr ...
Eine andere Möglichkeit besteht darin, ein einfaches (oder benutzerdefiniertes) Format wie JSON / YAML / TOML oder sogar etwas so Einfaches wie
Key=Value
im Klartext mit einer Dateinamenskonvention wie zu verwendenLocale.{languagecode2-country/regioncode2}
. Sie könnten es dann als Ressource in Ihre Baugruppe einbetten :) Aber dann müssen Sie sich ein eigenes Übersetzungswerkzeug oder einen Konverter für / von po / resx einfallen lassen, um mit dem vorhandenen Werkzeug arbeiten zu können.Abgesehen davon ist .resx der offizielle Weg und die erste Wahl. Die Werkzeuge sind auch anständig: https://github.com/tom-englert/ResXResourceManager
quelle