Übersetzung · 5 min read · Jan 20, 2026

Gettext für statische Websites

Gettext für statische Websites

Hier ist, wie ich ein Übersetzungsmanagementsystem für eine statische Website mit GNU gettext implementiert habe. Für die Ungeduldigen habe ich es am Ende auf 11 Anweisungen destilliert.

Ziel

Dieses System ermöglicht die Übersetzung blockweise (zeichenweise), was besser ist als seitenweise, weil:

  • Änderungen an nicht übersetzten Teilen automatisch auf alle Übersetzungen angewendet werden (Formatierung, Tags, Bilder, vielleicht Daten, Namen, Links usw.).
  • Durch die Speicherung der Textblöcke aller Seiten zusammen müssen wiederholte Blöcke nur einmal übersetzt werden (Menütexte, Urheberrechtshinweise, Überschriften usw.).
  • Sie verlieren sich nicht, wenn sich das Original ändert, während die Übersetzung noch in Arbeit ist.
  • Wenn Sie einen Absatz im Original ändern, ist es einfacher zu sehen, welche Teile der Übersetzungen aktualisiert werden müssen.

Für ein solches System sind die abstrakten Schritte:

  1. Markieren Sie irgendwie jeden übersetzbaren Textblock auf Ihrer Webseite. Die nicht übersetzbaren Teile werden zu einem gemeinsamen Rahmen.
  2. Extrahieren Sie die Blöcke in eine Datenbank. Übersetzen.
  3. Finden oder schreiben Sie eine Software, um die Blöcke zurück in den Rahmen zu integrieren, um die ursprüngliche Webseite neu zu erstellen - jedoch mit der Option, die Textblöcke entweder aus der englischen Datenbank oder einer der übersetzten Versionen der Datenbank zu nehmen.

Gettext schien eine offensichtliche Möglichkeit zu sein, und jetzt funktioniert alles perfekt, aber es hat mich acht Stunden gekostet. Die Schwierigkeit war, dass die vorhandene Dokumentation alle auf die Verwendung von gettext für Computerprogramme ausgerichtet ist, nicht für Websites oder Dokumente. Da wurde mir klar, dass ich dokumentieren muss, was ich getan habe:

Was ich getan habe

Ich habe damit begonnen, meine Webseite minimal in ein Computerprogramm zu verwandeln. Dies umfasste fünf Schritte:

  1. Schreiben Sie ein kleines Programm, das einen Text (eine Zeichenkette) in eine Datei druckt.
  2. Kopieren Sie die Webseite in das Programm anstelle der Zeichenkette.
  3. Fügen Sie einige Standardteile von Code hinzu, die von gettext benötigt werden.
  4. Zerlegen Sie die Zeichenkette in kleinere Zeichenketten, wobei Sie übersetzbare von nicht übersetzbaren trennen.
  5. Markieren Sie die übersetzbaren Zeichenfolgen mit dem Tag von gettext (das Format der Tags hängt von der verwendeten Programmiersprache ab, aber es ist normalerweise etwas, das einen Unterstrich _ beinhaltet).

Gettext funktioniert mit vielen Programmiersprachen, also wählen Sie aus den Beispielen, die mit dem Paket geliefert werden. Auf meinem Computer befinden sich diese in diesem Ordner:
/usr/share/doc/gettext-doc/examples/
Die Wahl der Sprache ist nicht wichtig. Der Code wird sehr einfach sein.

Hier ist mein ursprüngliches index.html:



Cow


See also: FSFE

Von den unterstützten Programmiersprachen wähle ich Scheme (einen Dialekt von Lisp). Auf den ersten Blick sieht der folgende Code komplex aus, aber Sie müssen nur die ersten und dritten Blöcke ändern. Der erste Block definiert drei Variablen, die selbsterklärend sein sollten. Der gesamte Text der Webseite befindet sich im dritten Block. Er ist in Blöcke unterteilt, und ich habe gettext-Tags für Scheme (_ ) um die übersetzbaren Blöcke gesetzt. Hier ist er, generate-index.scm:

#!/usr/bin/guile -s
!#
(define output-filename "index.html")
(define project-name "ciarans-website")
(define build-directory "/home/ciaran/website-build/")
(use-modules (ice-9 format))
(catch #t (lambda () (setlocale LC_ALL "")) (lambda args #f))
(textdomain project-name)
(bindtextdomain project-name build-directory)
(define _ gettext)
(define page-text (string-append
   "\n"
(_ "Cow")
   "\n\n\n

" (_ "See also: ") "" (_ "FSFE") "

\n" "\n\n")) (define the-file (open-file output-filename "w")) (display page-text the-file)

Drei der acht Zeichenfolgen sind als übersetzbar markiert. Die anderen fünf sind Teil des gemeinsamen Rahmens, der unabhängig von der Sprachversion der Seite gleich sein wird.

Denken Sie daran, alle Anführungszeichen in Ihrem HTML durch Backslash-Anführungszeichen ( “) zu ersetzen und ein paar Zeilenumbrüche ( ) hinzuzufügen, um die Ausgabe lesbar zu machen. Das sind die Anführungszeichen- und Zeilenumbruchssequenzen für Scheme. Sie sind in einigen anderen Sprachen gleich, aber in anderen unterschiedlich.

Bevor Sie fortfahren, müssen Sie die Variable “build-directory” auf das Verzeichnis setzen, in dem sich generate-index.scm befindet. Wenn Sie das nicht tun, wird alles funktionieren, aber Ihr Programm wird niemals auf die übersetzten Zeichenfolgen zugreifen.

Das erledigt, extrahieren Sie die übersetzbaren Zeichenfolgen mit diesen beiden Befehlen:

  • $ xgettext --language=scheme -d ciarans-website -k_ generate-index.scm
  • $ mv ciarans-website.po ciarans-website.pot

Und dann können Sie mit diesem Befehl eine Datei (eine “po”-Datei) für französische Übersetzungen erstellen:

  • $ msginit --locale=fr

Ein Teil des gettext-Handbuchs besagt, dass “msginit” optional ist - dass Sie es stattdessen manuell tun können, aber das hat bei mir überhaupt nicht funktioniert. Ich habe zwei Stunden damit verbracht, dieses Problem zu diagnostizieren. Verwenden Sie msginit.

Dies erstellt fr.po, die Sie mit jedem Texteditor bearbeiten können. Es wird eine Zeile oben wie folgt geben:

"Content-Type: text/plain; charset=UTF-8\n"

Wenn Ihr Zeichensatz “ASCII” ist, sollten Sie ihn wahrscheinlich in UTF-8 ändern. Wenn Ihr Zeichensatz etwas anderes ist und Sie Fehlermeldungen von anderen gettext-Tools (wie msgmerge) über ungültige Zeichen erhalten, könnte das Ändern des Zeichensatzes in UTF-8 ebenfalls die Lösung sein. Es wird auch ein Feld für content-transfer-encoding geben. Das Handbuch besagt, dass dies immer “8bit” sein sollte.

Emacs ist besonders gut zum Bearbeiten von po-Dateien geeignet, da es einen speziellen Bearbeitungsmodus dafür hat.

Und dann müssen Sie Ihre po-Datei in das spezielle mo-Format konvertieren und in das Unterverzeichnis legen, wo gettext erwartet, dass es sich befindet, mit diesen beiden Befehlen:

  • $ mkdir -p fr/LC_MESSAGES
  • $ msgfmt --output-file=fr/LC_MESSAGES/ciarans-website.mo fr.po

Machen Sie die Scheme-Datei ausführbar, und das war’s!

ciaran@hide:~/tests/simple-page$ LANGUAGE=fr ./generate-index.scm; cat index.html

Vache


Voir aussi : La FSFE

ciaran@hide:~/tests/simple-page$ LANGUAGE=en ./generate-index.scm; cat index.html Cow

See also: FSFE

ciaran@hide:~/tests/simple-page$

Ok, das ist Ihr Proof-of-Concept. Als Nächstes muss ich meine Seite auf dieses System umstellen und es pflegen (mit msgmerge). Ich werde versuchen, Notizen zu machen, um sie hier zu veröffentlichen.

Die Anweisungen

  1. Erstellen Sie eine leere Datei generate-index.scm
  2. Kopieren Sie mein generate-index.scm (oben) in Ihre Datei
  3. Passen Sie das build-directory (3. definierte Variable) in generate-index.scm an, um auf das Verzeichnis zu verweisen, in dem sich Ihr generate-index.scm befindet
  4. $ xgettext --language=scheme -d ciarans-website -k_ generate-index.scm
  5. $ mv ciarans-website.po ciarans-website.pot
  6. $ msginit --locale=fr
  7. Bearbeiten Sie fr.po, um Übersetzungen der drei Textzeichenfolgen hinzuzufügen
  8. $ mkdir -p fr/LC_MESSAGES
  9. $ msgfmt --output-file=fr/LC_MESSAGES/ciarans-website.mo fr.po
  10. $ chmod +x generate-index.scm
  11. $ LANGUAGE=fr ./generate-index.scm; cat index.html


Ciaran O’Riordan, ( RSS)
Unterstützen Sie freie Software: Treten Sie der Fellowship der FSFE bei

Share: X/Twitter LinkedIn

Erhalte neue Beiträge in deinem Posteingang.

Kein Spam. Jederzeit abmelden.