Open Source im professionellen Einsatz

Internationalisierung von KDE-Anwendungen

Verständigungsprobleme

Nachdem es in Heft 11/2000 um die Übersetzung von GNOME-Programmen ging, soll nun natürlich auch KDE nicht zu kurz kommen. Dieser Artikel gibt einen Überblick über die vorhandenen Mechanismen zur Internationalisierung von KDE-Anwendungen und über die Arbeit der Übersetzungsteams.

Mit der Veröffentlichung der Version 2.0 unterstützt KDE bereits mehr als 30 Sprachen, weitere werden nach der Veröffentlichung hinzukommen. Das ist nicht nur auf die aktiven Übersetzerteams von KDE zurückzuführen, sondern auch auf die sehr gute Unterstützung für die Lokalisierung seitens der KDE- und Qt-Bibliotheken. Abbildung 2 gibt einen Überblick über die verschiedenen Optionen, die alle im KDE-Kontrollzentrum konfigurierbar sind.

Abb.1: Die deutsche Arbeitfläche von KDE

Abb.1: Die deutsche Arbeitfläche von KDE

KLocale

Wie schon in [1] erklärt, gehört nicht nur die Übersetzung der Texte (Menüs, Meldungen und Ähnliches) eines Programms zur Lokalisierung, sondern es sind auch Dinge wie Zahlenformatierungen sowie Formate von Datums- und Zeitangaben oder Währungen zu beachten. Darüber hinaus sind weitere regionale Besonderheiten zu berücksichtigen, ob etwa die Woche am Sonntag oder am Montag beginnt. Das wird aber wahrscheinlich nur bei speziellen Anwendungen wie einem Terminplaner notwendig sein.

Zur Bewältigung der komplexen Aufgabe stellt KDE die Klasse KLocale bereit. Sie enthält die benötigten Funktionen, der Entwickler muss sich nicht um Initialisierungen oder Einstellungen kümmern. Die vom Benutzer im Kontrollzentrum eingestellten Optionen werden automatisch von KLocale benutzt. Man braucht sich nicht mal um das Erzeugen oder Freigeben einer Instanz dieser Klasse zu sorgen. Die global für die Anwendung verfügbare Instanz von KLocale erhält man jederzeit durch:

KLocale *locale =  KGlobal:£ocale();


Dabei wird, falls noch nicht vorhanden, ein Objekt von KLocale erzeugt und beim Beenden der Anwendung automatisch freigegeben.

Was stellt nun KLocale genau zur Verfügung? Zuerst natürlich Funktionen für die Übersetzung von Texten. Funktionen deshalb, da KDE die Funktionalität von gettext etwas erweitert, um einige Einschränkungen zu umgehen. Außerdem gibt es Funktionen für die Ein- und Ausgabe von Zahlen, Datums- und Zeitangaben sowie Währungen: QString KLocale::formatNumber (double num) zur Ausgabe oder double readNumber (const QString&) zur Eingabe von Zahlen nach den lokalen Gepflogenheiten. Also beispielsweise in Deutschland 2,5 statt 2.5.

Listing1: Mit
Kontextinformation versehene Texte in der po-Datei

#: src/program.cpp:10
msgid ""
"_: the viewn"
"View"
msgstr "Ansicht"

#: src/program.cpp:11
msgid ""
"_: to view somethingn"
"View"
msgstr "Ansehen"

Abb.2: Länder- und sprachspezifische Einstellungen im KDE-Kontrollzentrum.

Abb.2: Länder- und sprachspezifische Einstellungen im KDE-Kontrollzentrum.

Übersetzungen

Wie man diese Formatierungsfunktionen in seinem Programm einsetzt, hängt von den Umständen ab und soll deshalb hier nicht weiter erörtert werden. Im Sinne gut internationalisierter Software sollte jedoch jede Ein- und Ausgabe durch diese Funktionen geschleust werden. Weitere Informationen zu den Formatierungsfunktionen und zu KLocale allgemein sind in der Dokumentation zur Bibliothek kdecore zu finden [2] .

Wie oben schon erwähnt, benutzt KDE für die Übersetzung der Programmtexte ebenso wie GNOME und viele andere Projekte gettext. Dies hat zwar durchaus seine Stärken, aber leider auch seine Schwächen (siehe Kasten "Funktionsweise von gettext"). Daher stellt KLocale neben der Funktion QString KLocale:ªranslate(const char *text) noch eine weitere Funktion QString KLocale:ªranslate(const char* index, const char* text) zur Verfügung.

Dabei wird das erste Argument einerseits dazu benutzt, dem Übersetzer mehr Informationen über die Verwendung des gegebenen Textes zu geben, und andererseits, um die Einschränkung von gettext zu umgehen, dass es für denselben Text nur eine Übersetzung geben kann. Es wird nämlich dann der aus beiden gegebenen Texten zusammengesetzte Text benutzt, um die Übersetzung zu erhalten. Man könnte also beispielsweise einmal translate("the view","View") und einmal translate("to view something","View") verwenden. Diese Texte erscheinen dann in der po-Datei, wie in Listing 1 gezeigt. Der Übersetzer darf dabei die jeweils erste Zeile nicht mit übersetzen, sondern nur den eigentlichen Text.

Als Entwickler sollte man darauf achten, überall dort die erweiterte Funktionalität zu nutzen, wo Text - aus dem Kontext gerissen - nicht eindeutig ist. Weitere Beispiele dafür sind Wörter wie "open", "new" und allgemein kurze Begriffe oder Sätze, bei denen die Bedeutung unklar ist, sobald sie isoliert erscheinen. Man erspart damit den Übersetzern viel Arbeit und Missverständnisse.

Natürlich will man als Programmierer nicht andauernd solche Ungetüme wie KGlobal:£ocale()->translate(...) schreiben. Um das etwas abzukürzen, gibt es die zwei globalen Funktionen i18n(const char* text) und i18n(const char* index, const char* text), die einem genau das abnehmen und sonst die gleiche Funktionsweise wie die translate-Funktionen haben. Damit wäre die wichtigste Funktionalität von KLocale auch schon erklärt.

Listing 2:
Makefile.am im po-Verzeichnis

POFILES = AUTO

merge:
        @catalogs='$(POFILES)'; 
        for cat in $$catalogs; do 
        echo $$cat $$name; 
        msgmerge -o $$cat.new $$cat $(PACKAGE).pot ; 
        if test -s $$cat.new; then 
          grep -v ""POT-Creation" $$cat.new > $$cat.new.2 ; 
          grep -v ""POT-Creation" $$cat > $$cat.new.1; 
          if diff $$cat.new.1 $$cat.new.2; then 
                rm $$cat.new;  
          else  
                mv $$cat.new $$cat ; 
        fi; 
        rm -f $$cat.new.1 $$cat.new.2 ;
        fi ;
        done

Diesen Artikel als PDF kaufen

Als digitales Abo

Als PDF im Abo bestellen

comments powered by Disqus

Ausgabe 07/2013

Preis € 6,40

Insecurity Bulletin

Insecurity Bulletin

Im Insecurity Bulletin widmet sich Mark Vogelsberger aktuellen Sicherheitslücken sowie Hintergründen und Security-Grundlagen. mehr...

Linux-Magazin auf Facebook