Bash internationalisieren, i18n

Icon LangIrgendwann steht man vor der Aufgabe: Ein Bashscript, mit Xdialog GUI, soll internationalisiert (i18n) werden. Im Grunde ist die Sache mit der Mehrsprachigkeit ganz einfach. Wer zu diesem Thema google konsultiert wird Einiges finden. Nur, bei fast allen Manuals und HowTow's zu diesem Thema fehlt das entscheidende Etwas. Deswegen kommt man bei der Arbeit an seinem Bashscript, die bei google gefundenen Ergebnisse mit den dort geschilderten Vorgehensweisen beachtend, nicht zum geplanten Ergebnis. Die Sache mit der Internationalisierung will einfach nicht funktionieren.

Zu übersetzende Texte markieren

Im Bashscript wird jeder zu übersetzende Text mit dem Dollarzeichen markiert. Z. Bsp. so:

$"zu übersetzender Text"

Es ist zu empfehlen, alle Ausgangstexte in englischer Sprache zu verfassen. Zum Einen weil potentielle Ãœbersetzer anderer Sprachen eher Englisch beherrschen als Deutsch und zum Anderen weil bei bestimmten weiteren Arbeiten Fehler vermieden werden.

Hat man alle Texte markiert wird das Bashscript mit "bash --dump-po-strings" bearbeitet. Dadurch werden die markierten Texte in eine separate .pot Datei geschrieben. Diese .pot Datei ist die Ausgangsbasis für die Übersetzung in alle gewünschten Sprachen. Der vollständige Befehl für ein fiktives Beispielscript lautet:

bash --dump-po-strings testscript.sh | xgettext -L PO -o po/testscript.pot -

Das Verzeichnis po wird nicht vom Befehl erzeugt sondern es muss vorher selbst angelegt werden.

Eine Sprache hinzufügen

Um eine neue Sprache hinzuzufügen wird "msginit" verwendet. Das Programm sucht im Verzeichnis po nach einer Datei mit der Endung pot. Um beispielsweise Deutsch als Übersetzung hinzuzufügen wird dieser Befehl ausgeführt:

msginit -l de_DE

Damit wird die Datei de.po erzeugt. Sie enthält alle markierten englischen Texte und als Leerstrings die in Deutsch zu übersetzenden Strings. Nun kann der Übersetzer mit seiner Arbeit beginnen. Nachdem alle Texte übersetzt sind muss die Datei de.po noch in eine Binärformat-Datei mit der Endung mo umgewandelt werden.

Diese .mo Datei ist die eigentliche für die internationalisierte Anzeige benötigte Datei. Sie muss sich in einem bestimmten Verzeichnis befinden. Im Scriptverzeichnis wird angelegt:

mkdir -p po locale/de/LC_MESSAGES

In diesem Beispiel mit dem Verzeichnis de für die deutsche Übersetzung. Entsprechend ist für andere Sprachen zu verfahren. Nun wird für die deutsche Übersetzung die .mo Datei erzeugt:

msgfmt -o locale/de/LC_MESSAGES/testscript-de.mo po/de.po

Eine Sprache erweitern

Wenn es im Bashscript Änderungen gegeben hat in dessen Folge neue zu übersetzende Texte entstanden sind oder Texte geändert wurden so muss die .pot Datei neu erstellt werden. Um die existierende .po Datei (einer bereits übersetzten Sprache) mit den Änderungen anzupassen kann "msgmerge" verwendet werden. Im Beispiel von "testscript.sh" sieht das so aus:

msgmerge --output-file=po/de.po po/de.po po/testscript.pot

Die mit der Option --output-file benannte .po Datei kann die bereits existierende .po Date der zu korrigierenden Sprache sein. Ohne die Verwendung dieser Option erfolgt die Ausgabe von"msgmerge" in die Konsole.

Nachdem die .po Datei aktualisiert wurde muss die dazu gehörende .mo Datei mit "msgfmt" ebenfalls aktualisiert werden. Wer sich entschieden hat die .mo Dateien seines Bashscriptes in "/usr/share/locale/xx/LC_MESSAGES" zu platzieren (siehe weiter unten Abschnitt "Andere .mo Verzeichnisse") kann dies gleich direkt erledigen.

Eine Sprache verwenden

Um die erstellten Sprachen verwenden zu können muss im Bashscript noch etwas erledigt werden. Hier ein Quellcodetail um zeigen was noch zu tun ist:

#!/bin/bash
#
# testscript.sh
#
export TEXTDOMAIN=testscript
export TEXTDOMAINDIR="${0%/*}/locale"

Wichtig: Die beiden Einträge TEXTDOMAIN und TEXTDOMANDIR müssen als erste Einträge im Script stehen.

Andere .mo Verzeichnisse

Typischer Weise gibt es das Verzeichnis "/usr/share/locale". Dort befinden sich standardmäßig bereits von vielen Sprachen die Verzeichnisse "xx/LC_MESSAGES". Somit kann man die .mo Dateien der einzelnen Übersetzungen auch ensprechend innerhalb dieser Verzeichnisse ablegen. In diesem Fall muss der Eintrag TEXTDOMAINDIR geändert werden.

export TEXTDOMAINDIR="/usr/share/locale"

Wenn im Verzeichniss "/usr/share/locale/xx/LC_MESSAGES" eine mit dem Script "testscript.sh" zusammenhängende .mo Datei abgelegt wird sollte man bedenken, das auch andere Anwendungen ihre .mo Dateien in diesem Verzeichnis ablegen können. Man sollte also einen uniquen Namen für diese .mo Datei verwenden. Am besten einen Namen der mit dem eigenen Bashscript zusammenhängt und auf die Sprache hinweist. Beispielsweise: "testscript-de.mo".

Probleme mit verschiedenen deutschen Lokalisierungen

Im Falle einer nicht englischsprachigen Linuxinstallation, deutschsprachige Oberfläche, wird in der Regel bei der Installation die bevorzugte Sprache gewählt. Bei Deutsch können das mehrere verschiedene Versionen sein.

# locale -a | grep de_
de_AT
de_AT.utf8
de_AT@euro
de_BE
de_BE.utf8
de_BE@euro
de_CH
de_CH.utf8
de_DE
de_DE.utf8
de_DE@euro
de_LU
de_LU.utf8
de_LU@euro

Die im System mit der Variable $LANG konfigurierte Sprache ermittelt man in der Konsole mit

echo $LANG

und alle verfügbaren Sprachen mit

locale -a

Im Falle der Verwendung von Xdialog kommt es bei den deutschen Sprachvarianten mit "utf8" und "@euro" zu fehlerhaften Darstellungen der Umlaute und Sonderzeichen.

Um diesen Fehler zu korrigieren kann man im Bashscript die Variable $LANG prüfen und auf "de_DE" stutzen und mit

export LANG=$GestutzteLANG

die standardmäßige, im System konfigurierte, Sprachvariante überschreiben.

Bei "de_DE" gibt es in Xdialog keine Probleme bei der Anzeige deutscher Umlaute und Sonderzeichen.

Links

Babylonische Schriften

Powered by Drupal. Created with ZenWalk.