myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
» Regeln
» Wie poste ich richtig?
» Forum-FAQ

Mitglieder
» Liste / Suche
» Wer ist wo online?

Ressourcen
» openbook: Visual C#
» openbook: OO
» Microsoft Docs

Team
» Kontakt
» Übersicht
» Wir über uns

» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Gemeinschaft » .NET-Komponenten und C#-Snippets » T4-Skript zur Code-Generierung für übersetzbare Texte
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

T4-Skript zur Code-Generierung für übersetzbare Texte

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
Sarc
myCSharp.de-Mitglied

Dabei seit: 29.09.2008
Beiträge: 417
Entwicklungsumgebung: VS 2012


Sarc ist offline

T4-Skript zur Code-Generierung für übersetzbare Texte

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Das beigefügte T4-Skript ist als Ersatz für den ResXFileCodeGenerator gedacht (nur für Strings, keine anderen Resourcen wie Bilder etc.), welcher anhand von Resx-Dateien Quellcode erzeugt. Das T4-Skript lässt sich im Gegensatz zum ResXFileCodeGenerator leicht anpassen.

Hintergrund:
Der bevorzugte Weg um eine .NET Anwendung übersetzbar zu gestalten führt über Resourcen / Resx-Dateien. Anhand der Daten einer Resx-Dateien, erzeugt das standardmäßige Custom Tool ResXFileCodeGenerator eine Resourcen-Klasse, über die der Zugriff auf die übersetzbaren Texte möglich ist.

Schwachstelle des ResXFileCodeGenerator:
Leider bietet der ResXFileCodeGenerator keine Eingriffsmöglichkeiten in den generierten Quelltext und ist somit nicht erweiterbar. An manchen Stellen (z.B. in Attributen) muss man manchmal den Namen eines zu übersetzenden Wertes angeben, wie beispielsweise hier (Name = "Password"):

C#-Code:
[Display(ResourceType=typeof(Strings), Name = "Password")]
public string Password { get; set; }

Das ist fehleranfällig, da eine Änderung des Namens in der Resourcendatei nicht festgestellt werden kann und zur Laufzeit einen Fehler erzeugt.

Ok, jetzt zum T4-Skript:
Wer (noch) nicht weiss, was T4 ist, der kann sich hier ein wenig informieren:  T4 (Text Template Transformation Toolkit) Code Generation - Best Kept Visual Studio Secret

Allen T4-Dateien (*.tt) ist standardmäßig das Custom Tool TextTemplatingFileGenerator zugewiesen. Normalerweise
können diese Dateien über den Contextmenüpunkt "Run Custom Tool" ausgeführt werden. Da wir jedoch nicht immer manuell
die Generierung anstossen möchten, verwenden wir das Custom Tool T4ScriptFileGenerator.
Hierfür wird zusätzlich das T4-Toolbox benötigt, welches hier runtergeladen werden kann:  http://t4toolbox.codeplex.com/

Das Custom tool T4ScriptFileGenerator wird dann der *.resx-Datei als Custom Tool zugewiesen, d.h. es ersetzt das standardmäßige custom tool ResXFileCodeGenerator. Dadurch wird nach jeder Speicherung der *.resx-Datei die Code Generierung des T4-Skripts angestossen.

Das ganze sieht dann im Solution Explorer etwa wie folgt aus, wobei Strings.tt hier das eigentliche T4-Skript ist (wichtig ist das die Namen identisch sind, also Strings.tt/Strings.resx):
-> siehe nächster Post

Ein Beispielprojekt, inklusive des T4-Skripts (Strings.tt) ist unten angefügt.
Wie dort zu erkennen ist, erstellt das Skript zusätzlich eine Klasse (Name ist konfigurierbar), welche die Namen der Resourcen enthält:

C#-Code:
public static partial class ResourceNames
{
           public const string FileNotFound = "FileNotFound";
           public const string Title = "Title";
           public const string Today = "Today";
}

Auf diese Werte kann im Anwendungscode verwiesen werden. Da diese bei jeder Änderung neu erzeugt werden, sind Änderungen sofort zu Compilezeit feststellbar.

Ein weiteres Feature ist die Unterstützung von Formatierungsparametern in der Resourcendatei. Normalerweise lassen sich übersetzbare Parameter im Text etwa wie folgt schreiben:

Code:
1:
Die Datei '{0}' wurde nicht gefunden.

Der Anwendungscode ruft dann meist string.Format mit den entsprechenden Parametern auf.
Das T4-Skript nimmt einen gewissen Teil dieser Arbeit ab. Und zwar können spezielle Parameter im Text definiert werden,
welche vom T4-Skript entsprechend interpretiert werden. Das Format ist: {t:n} wobei t für den Typ des Parameters und n für den Namen steht. t ist optional, d.h. wenn t nicht angegeben wird ({:n}), dann wird als Typ des Parameters object gesetzt. Obiger Text könnte also so geschrieben werden:

Code:
1:
Die Datei '{s:filename}' wurde nicht gefunden.

Das 's' steht für den Typ string. Das T4-Skript erzeugt dann daraus keine Eigenschaft, sondern eine Methode mit den entsprechenden Parametern. In diesem Fall eine Methode mit dem Parameter 'filename' vom Typen string:

C#-Code:
/// <summary>
/// Die Datei '{s:filename}' wurde nicht gefunden.
/// </summary>
public static string FileNotFound(string filename, IFormatProvider formatProvider = null)
{
    ...
}

Die generierte Klasse heisst in dem Beispiel Strings, daher könnte die obige Methode wie folgt aufgerufen werden:

C#-Code:
Strings.FileNotFound("test.txt")

Ich hoffe jemand kann damit was anfangen :)

Schlagwörter: T4, Resx, Resourcen, Übersetzung, Generator


Dateianhang:
unknown T4Resx.zip (10 KB, 228 mal heruntergeladen)

Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von Sarc am 16.08.2011 23:06.

16.08.2011 23:02 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Sarc
myCSharp.de-Mitglied

Dabei seit: 29.09.2008
Beiträge: 417
Entwicklungsumgebung: VS 2012

Themenstarter Thema begonnen von Sarc

Sarc ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hier das Bild.

Sarc hat dieses Bild (verkleinerte Version) angehängt:
t4.png
Volle Bildgröße

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Sarc am 16.08.2011 23:03.

16.08.2011 23:03 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum Der Startbeitrag ist älter als 8 Jahre.
Der letzte Beitrag ist älter als 8 Jahre.
Antwort erstellen


© Copyright 2003-2020 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 27.05.2020 08:13