Sprachausswahl und Accept-Language
Für den Betreiber eines Webangebots ist es wichtig zu wissen, in welchen Sprachen er seine Inhalte anbieten sollte. Die Reihenfolge, in der fremdsprachliche Versionen der bestehenden Inhalte angeboten werden, ergibt sich oft 1:1 aus dem Umsatz in dem jeweiligen Sprachraum.
Neben dem Heimatmarkt ist meist Englisch die erste Wahl für eine Übersetzung. Die USA, England, Australien und Neuseeland stellen eine große Kaufkraft dar. Dazu ist Englisch noch die wichtigste Lingua Franca der Welt, nahezu jeder Schüler der Welt erlernt diese Sprache (mehr oder weniger gut).
Eine Karte der Welt nach gesprochener Sprache hilft bei der Auswahl.
Sprache | Mio. Sprecher |
---|---|
Mandarin | 867 |
Englisch | 690 |
Hindi | 525 |
Spanisch | 447 |
Französisch | 290 |
Arabisch | 290 |
Russisch | 240 |
Portugiesisch | 218 |
Deutsch | 155 |
Hinzu kommen natürlich strategische Überlegungen, z.B. in welchem Land ein Markteintritt erfolgen soll, oder wo die Marktanteile ausgebaut werden sollen.
Neben diesen web-externen Faktoren sollte man auch interne Messwerte der Website selbst hinzuziehen. Hierzu gibt es verschiedene Ansätze, die Besucher einer Site zu segmentieren.
- Geografische Bestimmung anhand der IP-Nummer
- Geografische Bestimmung anhand der Zeitzone
- Auswertung der bevorzugten Sprache
IP-Nummer
Die geografische Zuordnung der Besucher anhand der IP-Nummer
ist eine probate Methode, um die staatliche Zugehörigkeit
näherungsweise zu ermitteln.
Über die vom Besucher verwendete Sprache erhält man aber keine verlässliche Information.
Schwierig ist die Ermittlung der Sprachen für Länder,
in denen mehrere Sprachen gesprochen werden, wie die Schweiz, USA oder China.
Ebenso ergeben sich durch weltumspannende Firmennetze Verfälschungen.
Ein prominentes Beispiel ist hier der AOL-Internetzugang,
der immer zentral über einen Proxy in den USA läuft.
Ein AOL-Benutzer ist daher keinem Land zuordbar.
Zeitzone
Die geografische Ermittlung anhand der Zeitzone funktioniert über eine kleine JavaScript-Funktion, die die im Browser eingestellte Uhrzeit oder Zeitzone mit der des Servers vergleicht.
Die größte Schwäche ist hier, das nur der ungefähre Längengrad ermittelbar ist. Im Praxiseinsatz kann diese Methode nur verwendet werden, um den optimalen Zeitpunkt für einen Neustart des Servers zu planen, oder wann das ressourcenintensive Backup gefahren werden sollte. Die Information, zu welchen Zeiten besonders viel los ist auf dem Server, kann man aber auch über eine gewöhnliche Logfile-Analyse gewinnen.
Browser-Spracheinstellung
Bei der dritten Methode wird das vom Browser des Benutzers bei jeder Anfrage mitgesandte Feld Accept-Userlanguage ausgewertet. In diesem Header-Feld stehen ein oder mehrere Sprachen, die der Benutzer beherrscht. Bei einem deutschen Windows XP mit IE7 steht dort "de-DE" für "Deutsch-Deutschland" oder "de-AT" für "Deutsch-Österreich". Bei manchen Browsern hängt die Voreinstellung von der bei der Installation gewählten Sprache ab.
Neben der primären Sprache können weitere Sprachen angegeben werden. Zu jeder Sprache kann ein Prioritätswert angegeben werden im Bereich von 0 bis 1. Fehlt der Prioritätswert, ist von 1, der höchsten Priorität auszugehen. Falls man also nicht die bevorzugte Sprache bedienen kann, sollte man die weiteren Sprachen untersuchen, ob nicht dort etwas dabei ist, was man ausliefern kann.
Im IE7 kann man die eigenen Vorlieben angeben unter:
Internetoptionen / Allgemein / Sprachen
/ Hinzufügen
Im Firefox findet man es unter:
Extras / Einstellungen / Erweitert / Sprachen
/ Wählen
Opera:
Extras / Einstellungen / Allgemein
/ Sprache / Einzelheiten
Die in Deinem Browser konfigurierten Sprachen (ACCEPT-Language):
Code | ISO 639-1 | Name | Nativer Name | Prioritätswert |
---|---|---|---|---|
-none found- |
Beispielhafte Sprachauswahl
Anhand der Accept-Language kann man den Besucher sofort
eine möglichst passende Sprachversion anbieten, sofern
der Besucher von einer sprachneutralen Einstiegsseite wie
dem Wurzelverzeichnis /
her kommt.
Ein Besucher aus Deutschland würde automatisch in das Verzeichnis
/de/
weitergeleitet,
ein französisch-sprechender Besucher auf /fr/
.
Eigene Sites je Sprache sind zu vermeiden,
um den PageRank nicht auf zu viele Domains aufzuteilen.
Aber auch, nachdem man eine Sprache für den aktuellen Benutzer ermittelt hat, muss man dem Benutzer die Auswahl einer anderen Sprache ermöglichen. Eventuell sitzt der Besucher ja an einem Computer, wo er die Sprachvoreinstellung nicht ändern kann, oder er ist Gast an einem fremden Rechner in einem fremden Land.
Als Titel einer solchen Sprachauswahl sollte der Name der Sprache in der Landessprache selbst dienen. Für das Deutsche wäre es also deutsch, für Französisch français. Eine Grafik der Flagge des primären Staats ist zwar nett anzusehen, aber nicht optimal für internationale Besucher geeignet. Nicht jeder des Deutschen mächtige kennt die deutsche Flagge, oder kann als US-Amerikaner den Union-Jack richtig zuzuordnen. Außerdem muss sowieso ein Titel her, damit auch Farben- und Sehbehinderte keine Probleme bekommen.
Die Sprachauswahl sollte möglichst überall erscheinen, mindestens aber auf der Einstiegsseite. Ansonsten stellt sich das Problem, wie man einen der aktuellen Sprache nicht mächtigen Benutzer die Möglichkeit anzeigt, wo er die Sprache ändern kann.
<ul>
<li>
<a href="/de/" hreflang="de" lang="de"
class="langsel" id="lang_de" name="lang_de">
Deutsch</a>
</li><li>
<a href="/en/" hreflang="en" lang="en"
class="langsel" id="lang_en" name="lang_en">
English</a>
</li><li>
<a href="/fr/" hreflang="fr" lang="fr"
class="langsel" id="lang_fr" name="lang_fr">
Français</a>
</li>
</ul>
Ein noch selten nutzbare Variante setzt das link-Tag ein. Die Relation rel=alternate weist den Browser auf die fremdsprachlichen Alternativen hin. Diese Variante kann auf jeder Inhalts-Seite mitgeliefert werden, sie wird allerdings bisher in keinem der wichtigen Browser gut unterstützt.
<link rel="alternate" hreflang="de" lang="de" title="Deutsch" type="text/html" href="/de/" /> <link rel="alternate" hreflang="en" lang="en" title="English" type="text/html" href="/en/" /> <link rel="alternate" hreflang="fr" lang="fr" title="Français" type="text/html" href="/fr/" />
Keinesfalls aber darf man unter ein- und derselben URL verschiedene Sprachversionen ausliefern. Das mag für ein Intranet ja noch angehen, aber wer in Suchmaschinenen mit allen Sprachvarianten vertreten sein möchte, sollte von dieser Idee Abstand nehmen.
Request.UserLanguages in .NET / C# auflisten
Anzeige der im aktuellen Browser eingestellten Sprachen:
using System.Globalization; foreach (string lsLanguage in HttpContext.Current.Request.UserLanguages) { Response.Write(lsLanguage + "<br />\n"); }
Die erste Sprache benutzen, um ein CultureInfo-Objekt zu instanzieren. Dieses Objekt gibt einige Informationen über das Datums- und Zahlenformat.
if (Request.UserLanguages != null && Request.UserLanguages.Length > 0) { try { return new CultureInfo(Request.UserLanguages[0]); } } catch { return null; } return null; }
Auswertung
Als praktische Veranschaulichung hier eine Momentaufnahme der UserLanguages-Auflistungen der aktuellen Online-Sessions einer international genutzten Internetpräsenz.
Haupt-Sprachen
Die Haupt-Sprache wird ermittelt aus der UserLanguages-Auflistung. Hierbei wird ausschließlich das Element mit der höchsten Priorisierung benutzt. Zusätzlich wird die Angabe der Region entfernt, falls vorhanden. Aus en-US wird also en, aus de-DE und de-AT wird de.
# | iso | Kultur | Name | Anzahl | Prozent |
---|---|---|---|---|---|
∑ | 694 | ||||
1 | de | Deutsch | Deutsch | 360 | 51,9% |
2 | en | Englisch | English | 126 | 18,2% |
3 | es | Spanisch | español | 52 | 7,5% |
4 | it | Italienisch | italiano | 39 | 5,6% |
5 | nl | Niederländisch | Nederlands | 34 | 4,9% |
6 | ru | Russisch | русский | 21 | 3,0% |
7 | fr | Französisch | français | 21 | 3,0% |
8 | pl | Polnisch | polski | 9 | 1,3% |
9 | sv | Schwedisch | svenska | 8 | 1,2% |
10 | pt | Portugiesisch | Português | 6 | 0,9% |
11 | he | Hebräisch | עברית | 4 | 0,6% |
12 | tr | Türkisch | Türkçe | 3 | 0,4% |
13 | cs | Tschechisch | čeština | 3 | 0,4% |
14 | zh-CHS | Chinesisch (vereinfacht) | 中文(简体) | 2 | 0,3% |
15 | hr | Kroatisch | hrvatski | 1 | 0,1% |
16 | * | 1 | 0,1% | ||
17 | no | Norwegisch | norsk | 1 | 0,1% |
18 | bg | Bulgarisch | български | 1 | 0,1% |
19 | lt | Litauisch | lietuvių | 1 | 0,1% |
20 | nn | 1 | 0,1% |
Die Tortengrafik visualisiert die vorherige Tabelle der Haupt-Sprachen.
Sprachen én detail
Diese Tabelle unterscheidet sich von der vorherigen dadurch, das hier der komplette String der primären Sprache ausgewertet wird. Angaben zur Region sind hier also nicht weggekürzt. So wird ein erster Einblick in die regionale Herkunft der Besucher möglich. Seit dem IE7 liefert Microsoft nämlich immer auch die Region, die im Betriebssystem voreingestellt ist, als Angabe mit.
# | iso | Kultur | Name | Anzahl | Prozent |
---|---|---|---|---|---|
∑ | 694 | ||||
1 | de | Deutsch | Deutsch | 213 | 30,7% |
2 | de-de | Deutsch (Deutschland) | Deutsch (Deutschland) | 122 | 17,6% |
3 | en-us | Englisch (USA) | English (United States) | 70 | 10,1% |
4 | es | Spanisch | español | 52 | 7,5% |
5 | en-gb | Englisch (Großbritannien) | English (United Kingdom) | 46 | 6,6% |
6 | it | Italienisch | italiano | 31 | 4,5% |
7 | de-at | Deutsch (Österreich) | Deutsch (Österreich) | 22 | 3,2% |
8 | nl | Niederländisch | Nederlands | 21 | 3,0% |
9 | ru | Russisch | русский | 19 | 2,7% |
10 | fr | Französisch | français | 15 | 2,2% |
11 | pl | Polnisch | polski | 9 | 1,3% |
12 | nl-be | Holländisch (Belgien) | Nederlands (België) | 9 | 1,3% |
13 | sv | Schwedisch | svenska | 8 | 1,2% |
14 | it-it | Italienisch (Italien) | italiano (Italia) | 8 | 1,2% |
15 | en | Englisch | English | 7 | 1,0% |
16 | pt | Portugiesisch | Português | 6 | 0,9% |
17 | nl-nl | Holländisch (Niederlande) | Nederlands (Nederland) | 4 | 0,6% |
18 | he | Hebräisch | עברית | 4 | 0,6% |
19 | tr | Türkisch | Türkçe | 3 | 0,4% |
20 | de-ch | Deutsch (Schweiz) | Deutsch (Schweiz) | 3 | 0,4% |
21 | cs | Tschechisch | čeština | 3 | 0,4% |
22 | fr-be | Französisch (Belgien) | français (Belgique) | 3 | 0,4% |
23 | zh-cn | Chinesisch (VR China) | 中文(中华人民共和国) | 2 | 0,3% |
24 | en-ie | Englisch (Irland) | English (Eire) | 2 | 0,3% |
25 | ru-ru | Russisch (Russland) | русский (Россия) | 2 | 0,3% |
26 | en-au | Englisch (Australien) | English (Australia) | 1 | 0,1% |
27 | fr-lu | Französisch (Luxemburg) | français (Luxembourg) | 1 | 0,1% |
28 | hr | Kroatisch | hrvatski | 1 | 0,1% |
29 | * | * | * | 1 | 0,1% |
30 | lt | Litauisch | lietuvių | 1 | 0,1% |
31 | fr-fr | Französisch (Frankreich) | français (France) | 1 | 0,1% |
32 | nn-no | Norwegisch, Nynorsk (Norwegen) | norsk, nynorsk (Noreg) | 1 | 0,1% |
33 | no-no | no-no | no-no | 1 | 0,1% |
34 | bg | Bulgarisch | български | 1 | 0,1% |
35 | fr-ch | Französisch (Schweiz) | français (Suisse) | 1 | 0,1% |
Eine Gleichverteilung des IE7 über alle Länder vorausgesetzt, kann man hierüber auch schon eine geografische Zuordnung vornehmen. Mit der weiteren Verbreitung des IE7 wird man hierüber recht verlässlich und vor allem einfach eine Zuordnung zu Staaten vornehmen können.
Falsche Angaben
Im Laufe der Zeit finden sich einige merkwürdige Sprachangaben, die entweder durch eine Fehlprogrammierung/Fehlkonfiguration oder eine bewusste Falschangabe sind. Ungültige Werte sollten stillschweigend ignoriert werden, zumal auch einige Suchmaschinen merkwürdige Angaben machen könnten.
Einige defekte Angaben aus der Praxis:
- jp, cz
- Mit jp ist wahrscheinlich das Land Japan bgemeint. JP ist allerdings keine korrekte Sprachangabe, richtig wäre hier ja für Japanisch. Ebenso gibt es keine Sprache "cz", es ist wahrscheinlich "cs" für Tschechisch gemeint.
- zh
- Das Chinesisch gibt es nicht. Da eine Site aber meist sowieso nur eine Variante Chinesisch anbietet, sollte man es "naheliegend" interpretieren, z.B. als zh-Hans oder zh-Hant, die beides neutrale Kulturen darstellen.
- kr
- kr - ist in ISO 3166 das Land Südkorea, die Sprache Koreanisch hat aber das Kürzel ko
- Einige Angaben sind zwar korrekt,
funktionieren aber in der CultureInfo-Klasse von .NET bisher nicht:
- nn (norwegisch neu, Nynorsk)
- nb (norwegisch Buchsprache, Bokmål)
- no-NO (norwegisch aus Norwegen)
- es-US (spanisch USA)
- en-SG (englisch Singapur)
- en-IN (englisch Indien)
- so (somalisch)
- field blocked by paranoia-tool xyz
- Es gibt Tools, die den Sprach-Header durch einen ähnlichen Spruch ersetzen. Teilweise scheinen sogar Firmen solche Tools unternehmensweit einzusetzen, wahrscheinlich als Proxy. Allerdings schießt sich der Benutzer solcher Verfremdung damit primär selber ins Bein, kann doch die Website dadurch keine Zuordnung mehr zu einer Sprache vornehmen. Nutzen oder gar Gefahr sehe ich keine, hier ist kontraproduktive Paranoia am Werk, denn genau durch diesen Header lässt sich der Besucher jederzeit wiedererkennen, da fast kein anderer so etwas nutzt. Gut gemeint ist nicht immer gut gemacht.
- *
- Hiermit möchte eine recht unbekannte Suchmaschine wahrscheinlich andeuten, das sie jede lieferbare Sprache frisst. Weglassen wäre allerdings klarer und zudem ressourcensparender. Wenn man keine Präferenzen hat, braucht das nicht mitgeteilt werden.
Sicherheit
Die per Accept-Language übermittelten Daten
sind, wie jeder Input von außen, als potentiell gefährlich und Böse anzusehen.
Eine Zeitlang hatte ich folgende "Sprache" in meinem Browser eingestellt:
'<script>alert("html-injection")</script>
Viele Sites reagierten sofort beim Aufruf einer Webseite mit einer Fehlermeldung. Bei einigen Sites wurden detaillierte Fehlermeldungen zurückgeliefert. Diese Meldungen nährten den Verdacht, eine SQL-Injection-Möglichkeit gefunden zu haben. Offensichtlich wollte die Webanwendung den übergebenen UserLanguage-String mit einem unsicheren SQL-Statement in einer Datenbank abspeichern. Der einfache Apostroph am Anfang des Strings war der Auslöser.
Wie viele Abstürze von Logfile-Auswertprogrammen es gab, ist dagegen unbekannt. Ebenso, wie viele Personen beim Ansehen der Ergebnisse der internen webgestützten Logfile-Analyse eine unerwartete Alert-Box zu Gesicht bekamen.
Fazit
Mit der Beobachtung der UserLanguages hat man ein einfaches, aber sehr effektives Analysewerkzeug zur Hand. Man kann recht gut die tatsächlich gewünschten Sprachversionen ermitteln. Kostenlos dazu bekommt man einen ungefähren Anhaltspunkt, in welchen Ländern die angebotenen Seiten besonders gefragt sind.
In einer Online-Anzeige der aktuell am System offenen Sessions kann man sehr gut sehen, wie die Sonne rund um die Erde wandert: Bis 12 Uhr mittags Ortszeit dominieren europäische Staaten, erst später stellen die US-Amerikaner die Mehrheit.
Interessant sind Beobachtungen während der Markteinführung in einzelnen Ländern. Insgesamt kann eine solche Auswertung quasi kostenlos so manche Marktanalyse ersparen und helfen, Trends und Besonderheiten rechtzeitig zu erkennen.
Weiterführende Links / Quellen
- Mehrsprachigkeit bei Websites, Internationalisierung
- Unicode und HTML
- Selfhtml - Sprachen- und Länderkürzel
- ISO 639 - Kennungen für Namen von Sprachen (Sprachcodes)
- ISO 3166 - Kodierung von geografischen Einheiten wie Staaten
- RFC 1766 - Tags for the Identification of Languages
- RFC 2616 - Accept-Language - Hypertext Transfer Protocol HTTP/1.1
- RFC 4646 Validator - This service lets you validate language tags such as de-CH or en-US according to RFC4646 and the IANA Language Subtag Registry.
- IEBlog - Accept-Language Header for Internet Explorer 7
- Dan's Web Tips: Languages
- MSDN CultureInfo Class