Frage
Sollte man CSS oder Markup verwenden, um unicode-basierten, bidirektionalen Text (Bidi) in Markup-Sprachen, die auf HTML und XML basieren, korrekt darzustellen?
Hintergrund
In arabischer oder hebräischer Schrift geschriebener Text fließt überwiegend von rechts nach links (RTL), während Text in anderen Schriften von links nach rechts verläuft (LTR). In der Regel kümmert sich der Unicode-Bidi-Algorithmus um die Laufrichtung und Ausrichtung des Textes, basierend auf den Eigenschaften der verwendeten Zeichen. Es muss jedoch Möglichkeiten geben, anzuzeigen,
-
dass die Gesamtorientierung von Inhalt und Layout (wie die Ausrichtung von Tabellenzellen) RTL sein soll (LTR ist Standard), wenn ein Dokument hauptsächlich in einer Schrift wie Arabisch oder Hebräisch verfasst wurde;
-
dass ein Teil eines LTR-Dokuments als RTL behandelt werden soll und umgekehrt;
-
was der erwartete Textfluss ist, wenn der bidirektionale Unicode-Algorithmus nicht ausreicht, um nebeneinanderliegende Passagen gemischt-direktionalen Textes richtig darzustellen;
-
dass die inhärente Ausrichtung, die vom Unicode-Bidi-Algorithmus geboten wird, überschrieben werden soll.
Wir zeigen Beispiele, die Text in von rechts nach links laufenden Schriften sowie unmittelbar folgende, visuell entsprechend hervorgehobene Nur-ASCII-Inhalte beinhalten, mit deutschem Text in Klein- sowie Hebräisch und Arabisch in Großbuchstaben. Die Reihenfolge und Position der Zeichen entsprechen denen des Originals.
Beispiel:
Um den dritten Punkt zu verdeutlichen, bietet der folgende Satz ein Beispiel dessen, was das Ergebnis sein kann, wenn Sie sich einzig auf den bidirektionalen Algorithmus verlassen, und dieses Ergebnis ist nicht korrekt. Da das ganze Zitat auf Hebräisch ist und damit von rechts nach links läuft, sollten der Text »W3C« und das Komma links vom (also nach dem) hebräischen Text erscheinen.
Auf Hebräisch lautet der Titel »פעילות הבינאום, W3C«.
ASCII-Version: Auf Hebräisch lautet der Titel »YTIVITCA NOITAZILANOITANRETNI, w3c«.
Das richtig dargestellte Ergebnis ist jedoch:
Auf Hebräisch lautet der Titel »פעילות הבינאום, W3C«.
ASCII-Version: Auf Hebräisch lautet der Titel »w3c ,YTIVITCA NOITAZILANOITANRETNI«.
HTML/XHTML bietet für diese Zwecke bestimmtes Markup. Es beinhaltet:
Markup | Effekt |
---|---|
dir -Attribut
| Bestimmt die Ausrichtung des Elements, auf dem es gesetzt wird. Mögliche Werte sind rtl und ltr .
|
bdo -Element
| Überschreibt die Ausrichtung von Text wie vom Unicode-Bidi-Algorithmus definiert. |
CSS bietet ebenfalls Unterstützung für die Textausrichtung:
Eigenschaft | Werte | Effekt |
---|---|---|
unicode-bidi
| embed
| Der Text, auf den dies angewandt wird, wird von der Ausrichtung ausgehen, die von der direction -Eigenschaft angegeben wird.
|
bidi-override
| Der Text, auf den dies angewandt wird, wird den Unicode-Bidi-Algorithmus gemäß der Ausrichtung überschreiben, die von der direction -Eigenschaft angegeben wird.
| |
direction
| ltr
| Bestimmt »von links nach rechts« als Basisausrichtung des Textes, für den die unicode-bidi -Eigenschaft gilt.
|
rtl
| Bestimmt »von rechts nach links« als Basisausrichtung des Textes, für den die unicode-bidi -Eigenschaft gilt.
|
Die Frage ist, ob Sie Markup oder CSS verwenden sollten, um die Textausrichtung in HTML sowie auf XML basierenden Markup-Sprachen anzugeben.
Antwort
Wenn möglich, sollten Sie immer entsprechendes Bidi-Markup einsetzen, um Ihre Inhalte zu beschreiben. CSS kann, muss aber nicht nötig sein, um die Bedeutung dieses Markups zu bestimmen. Dies hängt davon ab, ob Sie mit Inhalten zu tun haben, die vom User-Agent als HTML oder XML behandelt werden. (Beachten Sie, dass XHTML in beiden Formen ausgegeben werden kann.)
Behalten Sie immer im Hinterkopf, dass sowohl Markup als auch CSS nur eingesetzt werden sollten, wenn dies notwendig ist. Unsere Frage bezieht sich auf Situationen, in denen der Unicode-Bidi-Algorithmus allein nicht ausreicht oder ‎
und ‏
nicht verwendet werden können, um die Textausrichtung zu bestimmen.
Schauen wir uns dies nochmal im Detail an.
Verwenden Sie dediziertes Markup
Da die Textausrichtung einen integralen Bestandteil der Dokumentstruktur darstellt, sollte Markup verwendet werden, um die Ausrichtung eines Dokuments oder Dokumentbestandteils zu bestimmen, bzw. um Stellen im Text zu identifizieren, in denen der bidirektionale Unicode-Algorithmus allein nicht ausreicht, um die gewünschte Direktionalität zu erreichen.
Um den gewünschten, von rechts nach links laufenden oder bidirektionalen Effekt zu erzielen, wenden manche Leute einfach CSS auf die Elemente an, die den relevanten Text gerade umgeben. Von CSS vorgegebene Formatierung ist jedoch nicht andauernd. Sie kann deaktiviert oder überschrieben werden, unerkannt bleiben oder über den Kontext geändert oder ersetzt werden. Obwohl Bidi-Markup nur zum visuellen Rendering eines Textes benötigt wird, ist es von der Funktion her nicht rein dekorativ. Markup bleibt in das jeweilige Dokument anhaltend integriert. Es gibt Inhalten dazu deutlich mehr Klarheit, wenn dediziertes Bidi-Markup verwendet wird.
Wenn möglich, sollten Sie also spezielles Bidi-Markup verwenden. Wenden Sie nicht einfach CSS-Styling auf allgemeine Elemente an, um den gewünschten Effekt zu erzielen.
Beachten Sie, dass dies voraussetzt, dass in Markup-Sprachen geschriebene Dokumente immer die Möglichkeit haben, auf speziell zur Unterstützung von Texten unterschiedlicher Ausrichtung gewidmetes Markup zurückzugreifen. Diejenigen, die eine DTD oder Schema entwerfen, sollten zu diesem Zweck entsprechende Elemente oder Attribute vorsehen.
HTML oder XHTML, das als text/html
ausgegeben wird
Verwenden Sie ausschließlich Markup. Die CSS-2-Spezifikation empfiehlt den Gebrauch von Markup für bidirektionalen Text in HTML. Sie geht sogar so weit, zu sagen, dass konforme HTML-User-Agents CSS-Bidi-Eigenschaften ignorieren dürfen. Dies liegt daran, dass die HTML-Spezifikation das erwartete Verhalten von User-Agents hinsichtlich Bidi-Markups klar definiert.
XHTML, das als application/xhtml+xml
ausgegeben wird
XHTML 1.0, das als application/xhtml+xml
ausgegeben wird, bedeutet die gleiche Semantik wie HTML. Deshalb ist es sinnvoll, für bidirektionale Inhalte nur Markup und kein CSS zu verwenden.
XML-Markup im Allgemeinen und XHTML, das als application/xml
oder text/xml
ausgegeben wird
Normalerweise wird ein User-Agent nicht automatisch erkennen oder wissen, was er mit irgendwelchem Bidi-Markup in XML-Dokumenten machen soll. In diesem Fall sollten deshalb CSS-Eigenschaften verwendet werden, um das erwartete visuelle Verhalten des Textes in Ihren Dokumenten anzugeben.
Die CSS-Zuweisungen sollten jedoch immer mit dediziertem Bidi-Markup im Text verknüpft werden.
XHTML, das als application/xml
oder text/xml
ausgegeben wird, wird von User-Agents als XML behandelt, nicht als HTML.
Das folgende zeigt CSS, das für das in XHTML verfügbare Markup angemessen wäre:
*[dir='ltr'] { direction: ltr; unicode-bidi: embed }
*[dir='rtl'] { direction: rtl; unicode-bidi: embed }
bdo[dir='ltr'] { direction: ltr; unicode-bidi: bidi-override }
bdo[dir='rtl'] { direction: rtl; unicode-bidi: bidi-override }
Übrigens
Es gibt Situationen in HTML/XHTML und möglicherweise anderen, auf XML basierenden Markup-Sprachen, in denen Text innerhalb eines Attributs erscheint oder in einem Element, das nur Zeichendaten unterstützt. Weder Markup noch CSS kann verwendet werden, um die Ausrichtung von Attributstexten oder Teilen des Inhalts von Elementen zu ändern, die nur Zeichendaten unterstützen. In diesen Fällen müssen Sie auf direktionale Unicode-Formatierungszeichen zurückgreifen. (Beachten Sie die FAQ (X)HTML- & Bidi-Formatierungszeichen vs. Markup für weitere Details.)
Bei XML-basierten Markup-Sprachen sollte Bidi-Styling in einem separaten Stylesheet definiert und dieses in anderen Stylesheets oder im jeweiligen Dokument einbezogen werden. Dies vereinfacht die Entwicklung von Stylesheets und bekräftigt den Unterschied zwischen Bidi- und anderem Styling. Betrachten Sie ein Bidi-Stylesheet eher als Teil der Schema-Information, die die Bedeutung besonderen Bidi-Markups definiert, denn als dekorative Formatierung, die in verschiedenen Formen existieren kann.