von Patrick Gundlach |

Mehrsprachigkeit

Der speedata Publisher kann seit jeher mit mehrsprachigen Texten umgehen. Für sehr viele (westliche) Sprachen gibt es Trennmuster. Einfache Texte in Chinesisch waren schon immer möglich. Mit der Version 4.1 hat sich sehr viel im Bereich der Sprachfähigkeit getan. Nun können auch komplexe Sprachen wie Arabisch und gemischte rechts-nach-links (RTL) und links-nach-rechts (LTR) Texte korrekt dargestellt werden.

Der speedata Publisher integriert zwei wichtige Funktionen bzw. Bibliotheken, um das zu können. Das sind

  • harfbuzz Bibliothek
  • Bidi-Algorithmus

Harfbuzz

Über die Harfbuzz-Bibliothek hatte ich schon geschrieben. Das ist eine Bibliothek, die OpenType Fonts lädt und aus einem UTF8-String für eine Sprache die richtigen Zeichen in der richtigen Reihenfolge heraus sucht und positioniert (bzw. Positionsangaben liefert). Dabei beachtet die Bibliothek alle eingestellten OpenType Features als auch die Sprachbesonderheiten.

Auf macOS kann man ganz nett mit der App Font Goggles herum spielen, diese hat Harfbuzz eingebaut.

Mit fontgoggles kann man harfbuzz »per Hand« ausprobieren.

Harfbuzz ist eine sehr stabile und leistungsfähige Bibliothek, die in sehr vielen Anwendungen (z.B. Adobe Indesign) enthalten ist.

Mit Harfbuzz sind auch komplexe Ligaturen kein Problem:

<Layout xmlns="urn:speedata.de:2009/publisher/en"
    xmlns:sd="urn:speedata:2009/publisher/functions/en">
    <LoadFontfile name="Zapfino" filename="Zapfino.ttf"
        mode="harfbuzz"/>
    <DefineFontfamily fontsize="10" leading="12"
        name="text">
        <Regular fontface="Zapfino" />
    </DefineFontfamily>
    <Record element="data">
        <PlaceObject>
            <Textblock>
                <Paragraph>
                    <Value>Zapfino</Value>
                </Paragraph>
            </Textblock>
        </PlaceObject>
    </Record>
</Layout>

Die Eingabe in Harfbuzz besteht aus den Unicode-Werten:

Z	U+005A	LATIN CAPITAL LETTER Z
a	U+0061	LATIN SMALL LETTER A
p	U+0070	LATIN SMALL LETTER P
f	U+0066	LATIN SMALL LETTER F
i	U+0069	LATIN SMALL LETTER I
n	U+006E	LATIN SMALL LETTER N
o	U+006F	LATIN SMALL LETTER O

Harfbuzz ersetzt diese durch die Angaben im Font durch ein Zeichen mit der Glyph-ID 1059 und dem internen Namen Z_a_p_f_i_n_o. Die Ausgabe ist:

Mit Ligaturen siehts gut aus.

Ohne Harfbuzz bzw. einem äquivalenten Ligaturmechanismus sieht es nicht so gut aus:

Ohne Ligaturen ist das eher ein Buchstabensalat.

Unicode Bidirectional Algorithm (UBA)

Die zweite große Änderung ist die Einbettung eines Algorithmus zum Mischen von RTL und LTR Texten.

Die Zeichenkette »العاشر ليونيكود (Unicode Conference)، الذي سيعقد في 10-12 آذار 1997 مبدينة« beispielsweise besteht aus mehreren Abschnitten, die jeweils ihre eigene Schreibrichtung haben. Damit der Text im PDF korrekt dargestellt wird, muss die Schreibrichtung erkannt werden und mit Markierungen für die Ausgabe versehen werden. Die einzelnen Segmente der Zeichenkette sind

  • العاشر ليونيكود (
  • Unicode Conference
  • )، الذي سيعقد في
  • 10
  • -
  • 12
  • آذار
  • 1997
  • مبدينة

Die ungeraden Einträge haben die Schreibrichtung rechts nach links.

Im speedata Publisher sieht das dann so aus:

<Layout xmlns="urn:speedata.de:2009/publisher/en"
    xmlns:sd="urn:speedata:2009/publisher/functions/en">
    <LoadFontfile name="Amiri-Regular" filename="amiri-regular.ttf"
        mode="harfbuzz"/>
    <DefineFontfamily fontsize="10" leading="12" name="text">
        <Regular fontface="Amiri-Regular" />
    </DefineFontfamily>
    <Record element="data">
        <PlaceObject>
            <Textblock width="5">
                <Paragraph direction="rtl" bidi="yes">
                    <Value>العاشر ليونيكود (Unicode Conference)، الذي سيعقد في 10-12 آذار 1997 مبدينة</Value>
                </Paragraph>
            </Textblock>
        </PlaceObject>
    </Record>
</Layout>

Korrekt! Text mit unterschiedlichen Schreibrichtungen.

Ohne bidi sieht es ein wenig komisch aus.

Die Verfahren, um die Schreibrichtung einzelner Texte zu erkennen, sind im Unicode-Standard definiert, damit alle Programme sich gleich verhalten. Der speedata Publisher nimmt für die Implementierung die Logik aus der Go-Bibliothek text/unicode/bidi genommen (zu der ich auch die API implementiert habe).

Beispiele im Netz

Die Mehrsprachigkeit von speedata wurde sehr intensiv getestet. Die Webseite www.aionianbible.org bietet eine besondere Bibelübersetzung in vielen Sprachen. Die PDF-Dateien werden alle mit dem speedata Publisher erzeugt.

Diese Bibel ist in vielen Sprachen erschienen.

Die arabische Ausgabe läuft von rechts nach links. Die Initialen werden automatisch an den Anfang der Spalte (also rechts) gesetzt. Die Spalten laufen auch von rechts nach links.

Ein weiteres Beispiel: assamesische Sprache. Ohne Harfbuzz wären hier viele subtile Fehler aufgetreten.