Open Source im professionellen Einsatz
Linux-Magazin 01/2001
751

Satzbau

Mit der Benutzung dieser Funktionen ist es aber noch nicht ganz getan, es gibt noch ein paar weitere Dinge zu beachten, die es ansonsten schwer machen, die Programmtexte gut zu übersetzen. Womit wir bei der Klasse QString der Qt-Bibliothek gelandet wären. Der +-Operator verleitet leicht dazu, sich Sätze aus Textbausteinen zusammenzubauen.

Das ist jedoch Gift für eine gelungene Übersetzung. Erstens sieht der Übersetzer in der po-Datei immer nur die einzelnen Bausteine und muss sich dann zusammenreimen, dass diese mit anderen kombiniert werden. Zweitens sieht der Satz in einer anderen Sprache nicht unbedingt genauso aus wie im Englischen. Der Übersetzer muss also versuchen, seine Übersetzung irgendwie um den künstlich vorgegebenen Satzaufbau herum zu konstruieren. Dass das nicht immer möglich ist, sollte einleuchtend sein. Beispiel:

QString msg=i18n("Do you really want to delete file ")+filename


Eigentlich würde man das übersetzen mit: Wollen Sie die Datei " + filename + " wirklich löschen? Das ist aber leider nicht möglich. Der Übersetzer könnte sich dann zwar eine Notlösung zusammenbasteln, aber das ist natürlich nicht ideal und wahrscheinlich nicht in allen Sprachen machbar.

Ein ähnliches Problem entsteht, wenn man die Funktion sprintf mit mehr als einem Argument verwendet, da es dem Übersetzer nicht möglich ist, die Reihenfolge der Argumente zu verändern und somit der Satzaufbau wieder weitgehend festgelegt ist.

Die Lösung dieser beiden Probleme bringt die Funktion QString::arg, die dem Übersetzer bei der Reihenfolge der eingesetzten Argumente völlig freie Wahl lässt. Das wird dadurch bewerkstelligt, dass an den üblichen Formatangaben von sprintf wie %s oder %d Platzhalter der Art %i benutzt werden, wobei i eine positive ganze Zahl ist. Das Format des eingesetzten Textes wird dabei durch die Funktion arg bestimmt, die für alle möglichen Argumente überladen ist. Eine typische Anwendung wäre:

msg=i18n("Overwrite %1 with %2?" ).arg(oldName).arg(newName);


Dabei wird immer der Platzhalter mit der niedrigsten Zahl durch das nächste Argument ersetzt, auch wenn dieser Platzhalter nicht an nächster Stelle steht. Der Übersetzer könnte nun also den Text übersetzen mit: Soll %2 %1 überschreiben? oder mit Soll %1 mit %2 überschrieben werden?

Trotzdem sollte man jetzt nicht auf die Idee kommen, mit diesem Mechanismus etwas anderes als Zahlen, Dateinamen oder Ähnliches in Texte einzufügen, da es dadurch sehr leicht zu Problemen, etwa mit der Deklination, kommen kann.

Funktionsweise von
gettext

Grob gesagt ist gettext nichts weiter als eine Hash-Tabelle ([3]). Bei Umwandlung der po-Dateien (siehe [1]) in so genannte (g)mo-Dateien wird nichts anderes gemacht, als die Originaltexte und die Übersetzungen in ein maschinenlesbares Format zu bringen, das aus Geschwindigkeitsgründen optional eine Hash-Tabelle enthalten kann. Wenn man nun in einem Programm die Übersetzung eines Textes anfordert, schaut gettext in der vorher angegebenen Datei nach, ob es entweder den Hash-Wert oder den Text selbst dort findet, liest dann die dem Text oder dem Hash-Wert zugeordnete Übersetzung und gibt sie dem Programm zurück.

Das Problem liegt nun darin, dass es für den gleichen Text nur eine Übersetzung geben kann. Das ist zwar einerseits gewollt und sinnvoll, aber andererseits kann es durchaus passieren, dass ein und derselbe Text mehrmals vorkommt, aber in jeweils unterschiedlicher Bedeutung. Beispielsweise bedeutet "View" in der Menüleiste "Ansicht", während es in einem Kontextmenü "ansehen" heißen kann. Um diese Einschränkung zu umgehen, benutzt KDE eine gepatchte Version von GNU gettext, die aber nur bei der Extraktion der Texte aus dem Quelltext benötigt wird. Sie ist im Paket kdesdk enthalten, das man von [4] herunterladen kann.

Listing 3: Auszug
aus dem Makefile.am zur Extraktion der Texte

messages: rc.cpp
      $(XGETTEXT) -C -ki18n -kI18N_NOOP -ktranslate 
      -x $(includedir)/kde.pot *.cpp -o $(top_srcdir)/po/$(PACKAGE).pot
                   
rc.cpp:
      extractrc *.rc *.ui > rc.cpp

Layout-Manager

Wie man an den bisherigen Beispielen schnell sieht, stimmt die Länge des übersetzten Textes meist nicht mit der Länge des Originaltextes überein. Aufgrund der Kompaktheit der englischen Sprache ist die Übersetzung häufig länger als das Original, bei Übersetzungen ins Deutsche ist das die Regel. Daher ist es ratsam, nirgends in seinem Programm festgelegte Größen, sondern überall die in Qt vorhandenen Layout-Klassen zu verwenden. Damit werden nicht nur die Minimum-Größen der Widgets automatisch an den Text angepasst, sondern die Layout-Manager kümmern sich auch um viele andere Dinge, wie beispielsweise die Anpassung an Größenveränderung des Fensters.

Abb.3: KBabel ist ein po-Datei-Editor mit vielen nützlichen Features.

Linux-Magazin kaufen

Einzelne Ausgabe
 
Abonnements
 
TABLET & SMARTPHONE APPS
Bald erhältlich
Get it on Google Play

Deutschland

Ähnliche Artikel

  • Programme von Welt

    Ein Programm nachträglich für mehrere Landessprachen umzubauen erfordert hohen Aufwand. Besser ist es, von Anfang an im Sourcecode die nötigen Vorkehrungen für mehrsprachige Strings zu schaffen. Das Gettext-System bietet dafür die passende Infrastruktur.

  • Bash Bashing

    Völker hört die Signale: Internationalisierung ist für Desktop-Programme üblich, bei von Menschen bedienten Skripten nicht. Dabei erfordert die Völkerverständigung nur wenig Mehrarbeit.

  • Aufgeblasen

    Wie nennt sich eine plattformübergreifende Widget-Bibliothek, die Datenbankklassen, GUI-Builder, Code-Editor, Übersetzungswerkzeug, Build-Tool und mehr enthält? "Multi-platform C++ Graphical User Interface Development Framework" oder kurz Qt 3.0.

  • Weblate: Webbasiertes Übersetzungstool

    Der Debian-Entwickler Michal Čihař hat eine neue webbasierte Übersetzungsanwendung namens Weblate veröffentlicht.

  • Bitparade

    CAT-Programme erleichtern und beschleunigen die Arbeit von Übersetzern, übersetzen aber nicht selbst. Sie helfen beim Einhalten terminologischer und stilistischer Konsistenz sowie bei der Qualitätskontrolle. Vier Testkandidaten bringen Struktur in kleine und große Übersetzungsprojekte.

comments powered by Disqus

Ausgabe 01/2017

Digitale Ausgabe: Preis € 6,40
(inkl. 19% MwSt.)

Artikelserien und interessante Workshops aus dem Magazin können Sie hier als Bundle erwerben.