Undo Framework

Wenn man größere Anwendungen schreibt, so haben diese meist eine Undo & Redofunktion. Damit man das Rad nicht neu erfinden muss, gibt es sogenannte Undo Frameworks. Ein schönes Framework für .NET ist das Undo Framework welches unter http://undo.codeplex.com/ zu finden ist. Es basiert dabei auf dem Entwürfsmuster Kommando (http://de.wikipedia.org/wiki/Kommando_%28Entwurfsmuster%29) und ist relativ einfach zu benutzen.

Weitere Informationen gibt es unter:
http://blogs.msdn.com/b/kirillosenkov/archive/2009/06/29/new-codeplex-project-a-simple-undo-redo-framework.aspx
http://blogs.msdn.com/b/kirillosenkov/archive/2009/07/02/samples-for-the-undo-framework.aspx

Auf ein HashSet mittels eines Indicies zugreifen

Man nehme folgendes Stück C# Quelltext:

HashSet test=new HashSet();

Das Problem an einem solchen HashSet ist, das man nicht mittels eines Indicies auf dieses zugreifen können. Die Zeile:

string tmp=test[5];

würde also nicht funktionieren. Abhilfe schafft hier die Klasse SortedSet:

SortedSettest=new SortedSet();

Nun kann man mittels ElementAt über einen Indice selektiert werden:

string tmp=test.ElementAt(5);

Wichtig ist dabei das der Namesspace System.Linq eingebunden ist da diese Funktionalität über eine Extension implementiert wird.

gettext und PHP

Bei einer multilingualen Webapplikation welche in PHP geschrieben ist, kann man natürlich zur Übersetzung mit assoziativen Arrays arbeiten und dann je nach Sprache die richtige PHP Datei einbinden.

$lang['welcome'] = 'Willkommen auf dieser Webseite.';
$lang['maintenance'] = 'Die Webseite befindet sich in der Wartung.';

Das Problem an dieser Variante ist, das sie nicht wirklich gut zu pflegen ist. Schöner ist es das ganze mit gettext zu übersetzen, da man hier nur die po Dateien übersetzen muss, und man das nicht im Quelltext tun muss.

Das Problem an dieser Variante ist allerdings, das nicht auf jeden Webserver gettext vorhanden ist. Hier hilft das Paket php-gettext welches unter https://launchpad.net/php-gettext/ zu finden ist. Mit Hilfe dieses Paketes, kann man gettext nutzen ohne sich darum kümmern zu müssen ob es installiert ist. php-gettext wrappt das ganze und emuliert nicht vorhandene Funktionen.

Das ganze zu benutzen ist auch relativ einfach:

 //gettext initialisieren
 $locale = "de_DE"; //Sprache definieren
 $domain = 'default'; //Domäne definieren
 $encoding = 'UTF-8'; //Zeichenkodierung definieren

 //include gettext
 require_once('./ext/php-gettext/gettext.inc');

 //Sprache setzen
 T_setlocale(LC_MESSAGES, $locale);

 //Pfad zu den Übersetzungen definieren
 T_bindtextdomain($domain, './locale/');

 //Zeichenkodierung setzen
 T_bind_textdomain_codeset($domain, $encoding);

 //Domäne setzen
 T_textdomain($domain);

Nachdem dies getan ist, kann damit begonnen werden die Texte in der Anwendung zu übersetzen. Dabei wird aus einem:

echo 'Willkommen auf dieser Webseite.';

ein:

echo T_('Willkommen auf dieser Webseite.');

T_ ist dabei der Name der Übersetzungsfunktion welche von php-gettext bereitgestellt würden. Unter reinem gettext würde diese Funktion nur _ heißen. Nachdem man seinen Quelltext mit den entsprechenden Funktionen bestückt hat muss man diese Strings aus den PHP Dateien extrahieren. Da man das nicht von Hand machen möchte nutzen wir dazu folgendes kleines Skript:

 #!/bin/sh

 #Schreibe alle PHP Dateien in eine Textdatei
(find ./data -name "*.php" && find ./system -name "*.php") > update-translations.txt

 #Rufe xgettext auf um die pot Datei zu erzeugen
 xgettext -f update-translations.txt -kT_ngettext:1,2 -kT_ --language=PHP -o update-translations.pot

Mit dieser pot Datei kann mittels PoEdit (http://www.poedit.net/) eine po Datei erzeugt werden. Diese po Dateien können auch wieder mittels der pot Datei aktualisiert werden, falls später neue Strings dazu kommen oder verschwinden. Beim speichern generiert PoEdit aus der po Datei eine mo Datei, bei welcher es sich um die binäre Representation der po Datei handelt. Diese mo Datei wird von gettext letztendlich zur Übersetzung genutzt.

Weitere Informationen gibt es unter:
http://phpmagazin.de/itr/online_artikel/psecom,id,874,nodeid,62,_language,de.html
http://blog.medianetix.de/2008/12/ubersetzung-von-quelltexten-mit-gettext-und-poedit/

FullName Eigenschaft der .NET Typen

In .NET/Mono kann man ja eine Variable nach ihrem Typ fragen:

bool test=true;
test.GetType().FullName;

Die FullName Eigenschaft gibt dabei einen String mit der Bezeichnung des Datentypes zurück. Da ich ab und an eine Liste dieser „Fullnames“ benötigt, gibt es das ganze nun hier:

  • bool -> Boolean-> System.Boolean
  • byte -> Byte -> System.Byte
  • DateTime -> DateTime -> System.DateTime
  • double -> Double -> System.Double
  • int -> Int32 -> System.Int32
  • long -> Int64 -> System.Int64
  • short -> Int16 -> System.Int16
  • string -> String -> System.String
  • uint -> UInt32 -> System.UInt32
  • ulong -> UInt64 -> System.UInt64
  • ushort -> UInt16 -> System.UInt16

Es handelt sich dabei jeweils um den C# Alias, die .NET Bezeichnung und den Fullname.

innerHTML in jQuery

Gegeben sei folgender Quelltext:

<div class="divbox">Wert: 42</div>

In diesem Quelltext sollte der Wert je nach Position eines Sliders anpasst werden. Im ersten Moment versuchte ich es mit der jQuery Funktion replaceWith:

$(".divbox").replaceWith("Wert " + value);

Leider führt diese Methode dazu das der gesamte div Tag ersetzt wird was natürlich nicht erwünscht ist. Zum Glück gibt es in jQuery eine Entsprechung für das innerHTML, diese Funktion hört auf den Namen html:

$(".divbox").html("Wert " + value);

Damit wird nur der Text zwischen den div Tags geändert. Wichtig ist es dabei darauf zu achten das jQuery hier nur die innerHTML Eigenschaft des Browsers durchreicht und dies z.B. dazu führen kann das beim Internet Explorer Attribute in Anführungszeichen zurückgegeben werden.

Weitere Informationen gibt es unter:
http://api.jquery.com/html/
http://api.jquery.com/replaceWith/