We are a software consultancy based in Berlin, Germany. We deliver
high quality web apps in short timespans.

Upstream Agile GmbH

TextMate Snippet Power für gettext

February 17, 2008 by alex

Es ist super wenn die Werkzeuge, die man verwendet mit einem wachsen. Deshalb bin ich von Ruby und TextMate begeistert.

Für die, die TextMate nicht kennen: TextMate ist ein TextEditor für OS X, der sich in meinen Augen durch zwei Besonderheiten als Entwicklungswerkzeug hervortut. Erstens die leistungsfähige Live-Suche, die alle Mausklicks zum Navigieren im Projekt überflüssig macht. Zweitens die wirklich mächtigen Skriptingmöglichkeiten, die ich wohl noch lange nicht erfasst habe.

Jedenfalls musste ich Rahmen der Internationalisierung eines Projekts alle Strings in eine Übersetzungsmethode von gettext wrappen. Also ggf. Texte in den Views in Inline tags und in doppelte Anführungszeichen zu packen. Das gewünschte Ergebnis sieht etwa so aus: <%= _("Zu übersetzender Text") %>. Die ganze Arbeit ist ziemlich stupide, ließ sich aber mit TextMate auf simples Markieren des entsprechenden Textes und das Drücken des Tastenkürzels ctrl+alt+t reduzieren.

Dazu hab ich im Rails Bundle ein neues Snippet erstellt, das den markierten Text entsprechend einfasst. Der Code dafür sieht so aus <%= _("${TM_SELECTED_TEXT}") %>. Die Variable TM_SELECTED_TEXT steht einfach für den markierten Text. So weit so trivial.

Da manchmal im Text bereits doppelte Anführungszeichen vorhanden waren, haben diese leider die Strings etwas zu früh beendet. Hier kommen die regulären Ausdrücke ins Spiel um diese Anführungszeichen zu escapen. Reguläre Ausdrücke lassen sich auf die Variable wie folgt anwenden ${Variable/regexp/format/option}. Mein Snippet Code sah dann so aus <%= _("${TM_SELECTED_TEXT/"/\\"/g}") %>. Damit war das Anführungszeichenproblem kurz und schmerzlos erledigt.

Blieb noch der Fall, dass der Sting bereits als Inline Code eingefaßt ist und nur _() um den String noch nötig ist. Dazu habe ich einfach ein weiteres Snippet angelegt, das so aussah: _("${TM_SELECTED_TEXT/"/\\"/g}"). Da ich mir aber nicht ein extra Tastenkürzel dafür merken wollte, habe ich mir die Scoping Eigenschaft von Snippets zu Nutze gemacht. Scoping in TextMate bedeutet, dass das Snippet nur in einem bestimmten Kontext angewendet wird. In welchem Kontext sich der Cursor gerade befindet, ist durch das Tastenkürzel shift+ctrl+p zu sehen. Der Kontext kann auch aus einer Hierarchie bestehen. Also dem ersten Snippet den Kontext text.html.ruby für rails html templates zugewiesen und dem zweiten den string.quoted.single.ruby|string.quoted.double.ruby (Verkettungen sind auch möglich) und schon stehen beide Snippets bequem per ctrl+alt+t zur Verfügung. Cool ;)