CSS & i18n – dos and don’ts when styling multilingual websites

A presentation at W3C Workshop: A Local Focus for the Multilingual Web in September 2011 in Limerick, Ireland by Gunnar Bittersmann

Slide 1

Slide 1

CSS & i18n dos and don’ts when styling multilingual websites Gunnar Bittersmann brands4friends

Slide 2

Slide 2

Road ahead 1. pitfalls when styling multilingual websites 2. what’s new in CSS 3 3. what’s not in CSS (yet?)

Slide 3

Slide 3

Problem: word length nur eine geringe Breite zur Verfügung steht, bspw. neben einem Formulareingabefeld, in einer Reihe von Tabs oder Buttons, in schmalen Spalten. Der deutsche Text hingegen wird nicht Aus „Input processing features“ im Englischen wird automatisch umbrochen, „Eingabeverarbeitungsfunktionen“ was eine Herausforderung für das Layout darstellen im Deutschen. Der englische kann. Text kann einfach auf zwei Zeilen verteilt werden, wenn Einige Sprachen, wie z.B. Deutsch, Finnisch und Niederländisch, verwenden einzelne lange Wörter dafür, was mehrere kürzere Wörter in anderen Sprachen sind.

Slide 4

Slide 4

Solution: soft hyphens Einige Sprachen, wie z.B. Deutsch, Finnisch und Nieder-ländisch, verwenden einzelne lange Wörter dafür, was mehrere kürzere Wörter in anderen Sprachen sind. Aus „Input processing features“ im Englischen wird „Eingabe-verarbeitungsfunktionen“ im Deutschen. Der englische Text kann einfach auf zwei Zeilen verteilt werden, wenn nur eine geringe Breite zur Verfügung steht, bspw. neben einem Formulareingabe-feld, in einer Reihe von Tabs oder Buttons, in schmalen Spalten. Der deutsche Text hingegen wird nicht automatisch umbrochen, was eine Heraus-forderung für das Layout darstellen kann. Setting break points is only feasible for own content, but often content is provided by other departments of the company (CMS) or is user-generated content .

Slide 5

Slide 5

Solution: hyphenation Einige Sprachen, wie z.B. Deutsch, Finnisch und Niederländisch, verwenden einzelne lange Wörter dafür, was mehrere kürzere Wörter in anderen Sprachen sind. Aus „Input processing features“ im Englischen wird „Eingabeverarbeitungsfunktionen“ im Deutschen. Der englische Text kann einfach auf zwei Zeilen verteilt werden, wenn nur eine geringe Breite zur Verfügung steht, bspw. neben einem Formulareingabefeld, in einer Reihe von Tabs oder Buttons, in schmalen Spalten. Der deutsche Text hingegen wird nicht automatisch umbrochen, was eine Herausforderung für das Layout darstellen kann. Text language must be labeled correctly, also of text fragments in different languages

Slide 6

Slide 6

German version Nouns are spelled with a capital letter in German language; transformation to lowercase should not be applied to German text.

Slide 7

Slide 7

Corrected German version Additional German language-specific rule overwrites transformation.

Slide 8

Slide 8

German version Long words may cause short lines or large spaces. Note that there’s enough space between the menu and the sidenote on the right…

Slide 9

Slide 9

Ukrainian version …as the menu needs more height the space between the menu and the sidenote shrinks…

Slide 10

Slide 10

Russian version …as the menu needs even more height the contents overlap.

Slide 11

Slide 11

Arabic version A horizontal scrollbar appears because of content for screenreaders that should be moved to the right out of the viewport on RTL pages.

Slide 12

Slide 12

Arabic version border-bottom-right-radius should be resetted on RTL pages, box-shadow should be a mirrored version of that on LTR pages.

Slide 13

Slide 13

Corrected Arabic version No horizontal scrollbar, border-radius and box-shadow properly set.

Slide 14

Slide 14

Separate stylesheets? default.css: rtl.css: #wai-start { position: absolute; left: -999px; width: 990px; display: block; } #wai-start { left: auto; right: -999px; } Don’t rely on the order of stylesheets being included in HTML files; use more specific selectors

Slide 15

Slide 15

Separate stylesheets? default.css: rtl.css: #wai-start { position: absolute; left: -999px; width: 990px; display: block; } [dir=”rtl”] #wai-start { left: auto; right: -999px; } [dir=”rtl”] #wai-start { left: auto; right: -999px; } Having all rules in one stylesheet allows to overview corresponding rules at one sight and makes it less likely to forget something on later changes.

Slide 16

Slide 16

Dos and don’ts • Do not assume text to fit into a box, neither of certain width nor of certain height • Set soft hyphens in long compound words or use hyphenation • Use text effects that are appropriate for given language • Make sure you flip everything needed for websites in RTL scripts • Do not use multiple stylesheets for different languages/scripts/text directions, use one stylesheet (easier to maintain)

Slide 17

Slide 17

New in CSS 3 text module • hyphens: auto • text-emphasis-style: sesame • text-justify: inter-ideograph || kashida • text-align: end might replace: #foo { text-align: right } [dir=”rtl”] #foo { text-align: left }

Slide 18

Slide 18

Styling by language body { font-family: Palatino, serif; } :script(Arab) :lang(ar), :lang(fa), :lang(ps), :lang(ur), :lang(az-Arab), :lang(uz-Arab), :lang(bal), :lang(bqi), :lang(cja), :lang(glk), :lang(ug) { font-family: “Traditional Arabic”, serif; } When content in another language written in Arabic script would later be added to a multilingual website, the stylesheet also needs to be changed. That’s not desired, hence it would be useful if there was a :script pseudoclass.

Slide 19

Slide 19

Styling by script <html lang=”ar” script=”Arab” dir=”rtl”> Type: language Subtag: ar Description: Arabic Added: 2005-10-16 Suppress-Script: Arab Scope: macrolanguage

<html lang=”az-Arab” script=”Arab ” dir=”rtl “> The information about the script is already in the language tag: either in the script subtag or in the language subtag.

Slide 20

Slide 20

Implementation get language tag is undefined?  y n y has script subtag? n look up script for language subtag y use this value found? n use default (Latn)

Slide 21

Slide 21

Go raibh maith agat gunnar@bittersmann.de http://bittersmann.de