Teil 3 – Qualitätssicherung
Texte gehören zu den Teilen einer Anwendung, die häufig geändert werden. Wenn dann noch externe Übersetzer im Spiel sind, kann es leicht zu fehlenden Übersetzungen kommen
Wir möchten deshalb automatisch testen, dass es zu allen Texten in Sprache A auch Übersetzungen in Sprache B vorhanden sind. Ein solcher Test allein hilft schon sehr, und sollte ja nicht so schwierig sein.
read more…
Die erste Version des folgenden Textes stammt noch aus dem Jahr 1996. Er enstand, weil ich bei den damaligen Arbeitgebern beobachtete, dass viele C-Entwickler nicht wussten, was es mit assert() auf sich hat. Hier kommt die Wiederveröffentlichung:
Selbstidentifizierende Fehler
Es gibt in ANSI-C einen Mechanismus, viele Fehler auch ohne Debugger aufzuspüren: Das Assert Macro. Ein Teil des Problems liegt in Deutschland wohl auch im Namen: Assert ist ein Wort, welches im allgemeinen im Englisch an der Schule nicht benutzt wird.
Erstes Treffen mit den Themen AppEngine, Mapplets und Gadgets.
[29dsnh4p5a] Am 23. Juni fand das erste Treffen der Google User Group Hamburg statt. Sie beschäftigt sich mit der Vielzahl der Technologien jenseits einer einfachen Suche, die Google inzwischen zur Nutzung auch für eigene Projekte anbietet.
Die Firma “eprofessional” stellte an diesem Abend den Raum und netterweise auch die Getränke. read more…
Teil 2 – Platzhalter, Validierungen, Modellklassen
Oft enthalten Webseiten Sätze, in denen sich ein einzelnes Wort sich dynamisch ändert. Beispielsweise “Sie sind als xxxx eingeloggt.” Zur Übersetzung können wir natürlich den Satz aus seinen Bestandteilen zusammenzubauen. Oft gibt es ein Problem: in verschiedenen Sprachen ist der Satzbau anders.
Besser ist deshalb die sogenannte Interpolation, wie man sie in Ruby ja kennt. Im Satz steht ein markierter Platzhalter, der zur Laufzeit ersetzt wird. Die yaml-Datei zur Spezifikation nutzt hierbei nicht die Ruby Syntax, sondern markiert die zu ersetzenden durch doppelte geschweifte Klammern.
# Definition logmsg: "Sie sind als {{name}} eingeloggt." # Aufruf I18n.translate(:logmsg, :name => 'Administrator') # oder in kurz t :logmsg, :name => 'Administrator'
Wir müssen dabei sicherstellen, das die Parameter von Definition und Aufruf übereinstimmen. Die translate()-Methode dabei relativ tolerant: Überflüssige Parameter werden ignoriert, fehlende Parameter werden mit einem “(???)” ersetzt.
Achtung: die übersetzende Person muss wissen, dass sie die Variablennamen in den Klammern nicht mit übersetzen soll!
Eine weitere kleine Falle lauert bei den Variablennamen: Sie dürfen nicht wie eine der anderen Parameter der translate()-Methode heißen. Verboten sind deshalb “default” und “scope”.
Ein kleiner Kniff für den Joomla Community Builder
Neulich erhielt ich eine kleine Auftragsanfrage. Ein bestehende Webanwendung wird stark erweitert und dabei auf das CMS “Joomla” umgestellt. Zur Mitgliederverwaltung wird die Erweiterung “Community Builder” eingesetzt.
Bisher hatten die Nutzer eine Nummer als Loginnamen. Diese Nummer soll jetzt für alle alten Nutzer in ein Feld “Mitgliedsnummer” überführt werden. So weit die Anforderung aus Kundensicht.
Analyse
Joomla verwaltet die Benutzer in einer Tabelle jos_user. read more…
Teil 1 – Übersicht
Software in mehreren Sprachen anzubieten ist eine immer wiederkehrende Aufgabenstellung. Um so erstaunlicher ist es, dass Ruby on Rails erst sehr spät hierfür ein standardisiertes Vorgehen eingeführt hat. Seit Version 2.2. ist eine “Internationalization API” Bestandteil von Ruby on Rails.
read more…