Sprache umschalten language switch
Lowering the language barrier can be a good way to make content accessible to more readers. What is needed is a switch that can be used to change the language. It is even better if the switch directly uses the existing semantic possibilities offered by HTML and ARIA. Furthermore, the visual design should allow a clear assignment of the active state, i.e. the selected language.
A good solution for this is a pair of radio buttons that executes a short JavaScript code on each switch, which changes the lang
attribute of the page root according to the language. The actual switching of the language for each element is handled by CSS rules.
Die Senkung der Sprachbarriere kann ein guter Weg sein, um Inhalte für mehr Leser zugänglich zu machen. Nötig dafür: Ein Schalter, mit dem die Sprache umgeschaltet werden kann. Noch besser, wenn dabei der Schalter direkt die bereits vorhandenen semantischen Möglichkeiten ausnutzt, die HTML und ARIA einem bieten. Weiterhin sollte die visuelle Gestaltung eine eindeutige Zuordnung des aktiven Zustands, also der ausgewählten Sprache, ermöglichen.
Eine gute Lösung hierfür ist ein Paar von Radio-Buttons, der bei jedem Umschalten einen kurzen JavaScript-Code ausführt, der der Seitenwurzel das lang
-Attribut entsprechend der Sprache verändert. Der eigentliche Wechsel der Sprache für jedes Element wird von CSS-Regeln übernommen.
So far, so good. This solution is elegant in that much of the usability in the input elements is already provided by the browser. The use of the <fieldset>
element with the <legend>
element is semantic and solves all label accessibility needs.
However, if you want to design the fieldset differently and are dependent on a change to the display
property (e. g. to flex
or inline
) for this, you come up against limitations on the part of the browsers. For example, Daniel Holbert, a developer at Mozilla, writes about a feature request for support of additional display
values for buttons for Firefox:
„<button> is not implementable (by browsers) in pure CSS, so they are a bit of a black box, from the perspective of CSS. This means that they don't necessarily react in the same way that e.g. a <div> would. […] this isn't specific to <button>. Consider <fieldset> and <table> which also have special rendering behavior […]
In these cases, Chrome agrees with us and disregards the "flex" display mode.“
That was eight years ago and today, in 2021, nothing has changed in this respect at <fieldset>
and probably won't change for the foreseeable future.
So if you want to do without further nesting in the HTML and rely on your own display
values, then you have to replace these special elements with a more generic <div>
with role="radiogroup"
. The label logic, which was previously inherently integrated by the <legend>
element, must therefore be set with aria-labelledby
.
So weit so gut. Diese Lösung ist insofern elegant, dass ein Großteil der Bedienbarkeit in den Input-Elementen bereits vom Browser bereitgestellt wird. Die Nutzung des <fieldset>
-Elements mit <legend>
-Element ist semantisch und löst alle Label-Bedüfnisse der Barrierefreiheit.
Wenn man jedoch das Fieldset anders gestalten möchte und dafür auf eine Änderung der display
-Eigenschaft (z. B. auf flex
oder inline
) angewiesen ist, stößt man auf Grenzen seitens der Browser. Beispielsweise schreibt Daniel Holbert, Entwickler bei Mozilla, zu einem Featureantrag für die Unterstützung von weiteren display
-Werten bei Buttons für Firefox:
„<button> is not implementable (by browsers) in pure CSS, so they are a bit of a black box, from the perspective of CSS. This means that they don't necessarily react in the same way that e.g. a <div> would. […] this isn't specific to <button>. Consider <fieldset> and <table> which also have special rendering behavior […]
In these cases, Chrome agrees with us and disregards the "flex" display mode.“ (aus [1])„<button> kann (von den Browsern) nicht in reinem CSS implementiert werden, so dass sie aus der Sicht von CSS eine Art Blackbox sind. Das bedeutet, dass sie nicht unbedingt auf die gleiche Weise reagieren wie z. B. ein <div>. […] dies ist nicht spezifisch für <button>. Siehe <fieldset> und <table>, die ebenfalls ein spezielles Rendering-Verhalten haben […]
In diesen Fällen stimmt Chrome mit uns überein und ignoriert die Display-Eigenschaft ‚flex‘.“ (eigene Übersetzung)
Das ist acht Jahre her und heute, 2021, hat sich in dieser Hinsicht bei <fieldset>
noch nichts geändert und wird sich wahrscheinlich auf absehbarer Zeit nicht ändern.
Wenn man also auf weitere Verschachtelung im HTML verzichten möchte und auf eigene display
-Werte setzt, dann muss man diese speziellen Elemente durch ein generischeres <div>
mit role="radiogroup"
ersetzen. Die Label-Logik, die vorher durch das <legend>
-Element von Haus aus integriert war, muss daher mit aria-labelledby
gesetzt werden.
fieldset
.
HTML-Markup des neuen Switch-Elements ohne fieldset
.
So far, so good. This solution can be extended and optimized almost infinitely. The functions that seem to me to be important besides the mere language switching are
- activation of the element only with JavaScript support,
- saving the language selection between pages and
- loading the saved setting.
Diese Lösung kann fast endlos erweitert und optimiert werden. Die Funktionen, die mir neben der reinen Sprachumschaltung noch wichtig erscheinen umgesetzt zu werden, sind
- Einschalten des Elements erst bei JavaScript-Unterstützung,
- Speicherung der Sprachauswahl zwischen den Seiten und
- Laden der gespeicherten Einstellung.
The element is disabled by default with help of the CSS class js-only
. The JavaScript function enableJsOnly
adds a new style element to the head that shows the hidden class again.
The function setSwitch(name, callback)
can be used for the creation of other dual switches as well (see next snippet).
Das Element ist standardmäßig mithilfe der CSS-Klasse js-only
deaktiviert. Die JavaScript-Funktion enableJSOnly
fügt ein neues Style-Element dem Head hinzu, das die deaktivierte Klasse wieder aktiviert.
Die Funktion setSwitch(name, callback)
kann dabei auch für die Erstellung anderer dualer Schalter verwendet werden (siehe nächstes Snippet).
Quellen
- Daniel Holbert (2014): Kommentar zum Bug 984869 „Add support for display:flex/grid and columnset layout inside <button> elements“ externer Link in Bugzilla (Firefox) der Mozilla Corporation. Zurück zum Text