Internationalisierung oder: wie stelle ich Übersetzungen in meinem Paket bereit?

Worum es geht

Als Paketautor kommt man je nach Art des Pakets immer wieder an die Stelle, dass man sprachabhängige Strings hat, für die man idealerweise eine Schnittstelle einrichtet, damit User die entsprechenden Strings an ihre Sprache anpassen können. Zum Beispiel bin ich beim Schreiben meines exsheets Pakets darauf gestoßen. Es bietet die [cce lang=”latex” inline=”true”]{question}[/cce]-Umgebung, die als Voreinstellung die Überschrift „Exercise“ hat, was im Deutschen beipielsweise aber natürlich „Übung“ heißen sollte.

Der naive Weg — oder sagen wir eher: Standardweg — ist in etwa folgender: das Paket verwendet an geeigneter Stelle ein Makro (eine einfache Tokenlist) [cce lang=”latex” inline=”true”]\questionname[/cce], das als

[cce lang=”latex”]\newcommand*\questionname{Exercise}[/cce]

definiert ist und vom User umdefiniert werden kann:

[cce lang=”latex”]\renewcommand*\questionname{\”Ubung}[/cce]

Schöner wäre es allerdings, der Anwender lädt wie gewohnt babel und die Übersetzung erfolgt automatisch.

babel und KOMA-Script

Dafür gibt es verschiedene Möglichkeiten. Am bekanntesten ist wohl der [cci]babel[/cci]-Weg

[cce lang=”latex”]\addto\captionsngerman{\def\questionname{\”Ubung}}[/cce]

Oder muss es zu [cce lang=”latex” inline=”true”]\extrasngerman[/cce]?

Das folgende Dokument gibt die richtige Übersetzung und zeigt, dass die Lösung — weil expandierbar — auch in Überschriften im Inhaltsverzeichnis und in hyperref‘s Bookmarks funktioniert, einen Umstand, den man eventuell beachten sollte.

[cce lang=”latex”]\documentclass{article}
\usepackage[ngerman]{babel}

\def\questionname{Exercise}
\addto\captionsngerman{\def\questionname{\”Ubung}}

\usepackage{hyperref}

\begin{document}

\tableofcontents
\section{\questionname}

\end{document}[/cce]

Leider verlässt sich dieser Weg darauf, dass babel (oder [cci]polyglossia[/cci]) geladen wurde, aber darauf kann man testen und vielleicht eine Kombination mit der manuellen Lösung anbieten.

KOMA-Script stellt ebenfalls eine Schnittstelle zur Verfügung: [cce lang=”latex” inline=”true”]\providecaptionname[/cce]. Es kann auch mit anderen Klassen verwendet werden, sofern man das Paket scrbase lädt.

[cce lang=”latex”]\documentclass{article}
\usepackage[ngerman]{babel}

\def\questionname{Exercise}
\usepackage{scrbase}
\providecaptionname{ngerman}\questionname{\”Ubung}

\usepackage{hyperref}

\begin{document}

\tableofcontents
\section{\questionname}

\end{document}[/cce]

Auch diese Version funktioniert mit hyperref und gibt das korrekte Bookmark.

Der einzige Nachteil, den diese beiden Lösungen haben, ist, dass man nicht nur für jede unterstütze Sprache eine Übersetzung liefern muss — das lässt sich offensichtlich nicht umgehen — , sondern auch für verschiedede Dialekte. Ersetzt in beiden Beispielen

[cce lang=”latex”]\usepackage[ngerman]{babel}[/cce]

durch

[cce lang=”latex”]\usepackage[german]{babel}[/cce]

und die Übersetzung wird nicht angezeigt. Nun kann man sagen: heute nimmt doch jeder [cci]ngerman[/cci], aber es ist nicht wirklich einzusehen, dass man Anwendern eine Option aufzwingt, wenn sie für eine andere möglicherweise gute Gründe haben, man denke etwa auch an andere Kombinationen wie [cci]british[/cci] versus [cci]english[/cci]. Natürlich kann man in beiden Fällen einfach nach [cce lang=”latex” inline=”true”]\begin{document}[/cce] die oben genannte manuelle Redefinition vornehmen. Nicht wirklich ein Problem, aber die schönste Lösung ist es nicht.

translator

Das beamer-Bundle enthält das Paket translator, das einem solche Aufgaben einfacher machen soll, beziehungsweise eine konsistente Schnittstelle für Übersetzungen bereitstellen soll. Es hat allerdings zwei Nachteile: zum einen muss man ihm die ausgewählten Sprachen als Option mitgeben. Das bedeutet im Endeffekt letztlich, dass der Anwender die Sprachen als Klassenoption wählen sollte. Kein großes Problem, aber ein Punkt, auf den ein Anwender des Pakets dann achten muss. Das zweite Problem ist gravierender: das Makro, das die eigentliche Übersetzung aufruft, ist nicht expandierbar, was ihr seht, wenn ihr euch das Bookmark im folgenden Dokument anschaut:

[cce lang=”latex”]\documentclass[ngerman]{article}
\usepackage{babel}

\usepackage{translator}
\newtranslation[to=English]{question-name}{Exercise}
\newtranslation[to=German]{question-name}{\”Ubung}

\newcommand*\questionname{\translate{question-name}}

\usepackage{hyperref}

\begin{document}

\tableofcontents
\section{\questionname}

\end{document}[/cce]

Dafür funktioniert die Übersetzung auch, wenn man statt [cci]ngerman[/cci] [cci]german[/cci] wählt. Als Fallback, falls eine Sprache gewählt wird, für die man keine Übersetzung definiert hat, wird die englische Übersetzung gewählt.

translations

Mein exsheets-Bundle enthielt das inzwischen eigenständige Paket translations, das dem translator Paket in vielem sehr ähnlich ist. Es bietet jedoch zwei Vorteile: das übersetzende Makro ist expandierbar und man kann eine Fallback-Übersetzung explizit angeben. Vielleicht ist das gleichzeitig ein Nachteil, denn man sollte sie auch explizit angeben, da sonst keine Voreinstellung genommen wird. Dialekte werden korrekt erkannt. Ja, man kann für Dialekte sogar eigene Übersetzungen bieten. Nun gibt es meines Wissens kein language definition file für Swabian. Wenn es das aber gäbe, wäre es möglich, hierfür wahlweise eine extra Übersetzung zu bieten oder die deutsche zu verwenden.

Das folgende Beispiel liefert wieder ein korrektes Bookmark und funktioniert ebenfalls mit [cci]german[/cci] statt [cci]ngerman[/cci] wie gewünscht:

[cce lang=”latex”]\documentclass{article}
\usepackage[ngerman]{babel}

\usepackage{translations}
\DeclareTranslationFallback{question-name}{Exercise}
\DeclareTranslation{English}{question-name}{Exercise}
\DeclareTranslation{German}{question-name}{\”Ubung}

\newcommand*\questionname{\GetTranslation{question-name}}

\usepackage{hyperref}

\begin{document}

\tableofcontents
\section{\questionname}

\end{document}[/cce]

Fazit

Paketautoren haben einige Möglichkeiten, eine Internationalisierung ihres Pakets vorzunehmen. Welche man wählt, hängt letztlich von der persönlichen Vorliebe ab.

BTW: eine Frage auf TeX.sx hat mich zu diesem Post inspiriert. Auf der anderen Seite diente dieser Artikel als Grundlage für eine weitere Antwort auf derselben Seite, die inzwischen sogar ausführlicher als dieser Blog-Artikel wurde.

Über Clemens

Ich bin ein LaTeX-Enthusiast, der auch mit ein paar Paketen wie chemmacros oder fnpct einen bescheidenen Beitrag zur LaTeX-Vielfalt beitragen hat. Ich habe noch einen eigenen Blog: einzelMEINUNG und einen englischsprachigen Blog, der sich ausschließlich mit LaTeX beschäftigt mychemistry.eu.

30. Mai 2013 von Clemens
Kategorien: LaTeX | Schlagwörter: , , , , , | Schreibe einen Kommentar

Schreibe einen Kommentar