Hat nix mit printf zu tun, die übersetzung liegt in _() welches einfach
ein Makro ist:
define _(String) gettext(String)
Die Funktion gettext sucht dann im Übersetzungsfile nach dem String und
gibt stattdessen den übersetzten String (in der gewählten Sprache) aus.
Die Sprache legt fest im welchen File er sucht.
D.h. man kann dann jeden Knopf statt mit "Beenden" mit _("Quit")
beschriften und hat dann automatisch die ganze Oberfläche in der
richtigen Sprache. Die Strings schreibt man in Englisch, dann hat man
eine englische Beschriftung, falls es für die Zielsprache keine
Übersetzung gibt.
Vielleicht gibts ja eine gettext Portierung für C#, ich denke für Mono#
gibt es die sicher, die könnte man ja dann verwenden. Selberschreiben
ist auch kein grossen Problem.
In den Übersetzungsfiles steht z.B:
msgid "Error in line "
msgstr "Fehler in Zeile "
In den msgstr kommt dann einfach die Übersetzung mit den richtig
platzierten %s, %d, \n usw. rein.
Allerdings sind die Installierten Übersetzungsfiles in ein Binärformat
konvertiert, ich nehme an, dass da dann Index drin sind, um die
Übersetzung schnell zu finden.
Dadurch braucht man die Programme für andere Sprachen nicht neu zu
compilieren, sondern hat nur eine Programmversion, die dann zur
Laufzeit das richtige Sprachfile öffnet.
Ausserdem kann man das Übersetzungsfile Leuten zum Übersetzen geben,
die dann nicht im Programmcode herumpfuschen müssen.