Webseite zweisprachig gestalten
bearbeitet von Gunnar Bittersmann@@Treziman
> ~~~php,bad
> $grundspr = $_SERVER["HTTP_ACCEPT_LANGUAGE"];
> ~~~
Was soll *grundspr* bedeuten?
Variablen mal deutsch, mal englisch zu benennen ist auch keine gute Idee.
Und warum kopierst du `$_SERVER["HTTP_ACCEPT_LANGUAGE"]`{:.language-php} überhaupt in eine Variable um?
---
> ~~~php,bad
> $languag="en"; // Sprache erstmal grundsätzlich auf englisch
> ~~~
`$language`{:.language-php.good} mit e.
---
> ~~~php,bad
> if(strpos($grundspr,"de",0) !== false){
> $languag = "de";
> }
> ~~~
Die Abfrage ist falsch. In mehrfacher Hinsicht.
**1\.** Wenn der gesendete *Accept-Language*{:@en}-Header bspw. `en-US,en;q=0.7,de;q=0.3` ist, dann will der Nutzer bevorzugt Englisch haben, nicht Deutsch.
[![Spracheinstellung im Firefox: hier 1. Englisch \[en-us\], 2. Englisch \[en\], 3. Deutsch \[de\]](/images/418d97be-907e-11ed-8bb1-b42e9947ef30.png?size=medium)](/images/418d97be-907e-11ed-8bb1-b42e9947ef30.png)
Du darfst nicht nur nach dem Vorkommen von `de` suchen, sondern musst auch die Reihenfolge der Sprachen im *Accept-Language*{:@en}-Header beachten.
**2\.** Das Vorkommen von `de` heißt nicht unbedingt Deutsch. Es gibt eine Vielzahl anderer Sprachen, deren dreibuchstabiges Kürzel `de` enthält. [[IANA Language Subtag Registry](https://www.iana.org/assignments/language-subtag-registry/language-subtag-registry)]
(Fun fact: Auch Google hatte das mal [falsch gemacht](https://forum.selfhtml.org/self/2008/apr/7/language-negotiation-deutsche-w3c-uebersetzung/1232285#m1232285).)
Du müsstest also nach `\bde\b` suchen. Aber auch das ist nicht ganz sicher.
Für `de` fällt mit kein sinnvolles Beispiel ein, aber für `it`. Ein Südtiroler könnte `de-it` (in Italien gesprochenes Deutsch) in seinem *Accept-Language*{:@en}-Header stehen haben. Wenn man diesen nach `\bit\b` durchsucht, ergibt es einen Treffer. Es wäre aber falsch, daraus zu folgern, dass die italienische Sprachvariante ausgeliefert werden soll.
Man müsste also auch prüfen, ob das gefundene `it` (bzw. `de`) auch wirklich ein Sprachkürzel ist und kein anderer Bestandteil des Sprachcodes; also ob kein `-` (oder `_`) unmittelbar davor steht.
**3\.** Dass Sprachcodes **case-insensitive**{:@en} verarbeitet werden müssen, sagte ich schon. `DE` muss gleichbehandelt werden wie `de`.
🖖 Живіть довго і процвітайте
{:@uk}
--
*„Im Vergleich mit Elon Musk bei Twitter ist ein Elefant im Porzellanladen eine Ballerina.“*
— @Grantscheam auf Twitter
Webseite zweisprachig gestalten
bearbeitet von Gunnar Bittersmann@@Treziman
> ~~~php,bad
> $grundspr = $_SERVER["HTTP_ACCEPT_LANGUAGE"];
> ~~~
Was soll *grundspr* bedeuten?
Variablen mal deutsch, mal englisch zu benennen ist auch keine gute Idee.
Und warum kopierst du `$_SERVER["HTTP_ACCEPT_LANGUAGE"]`{:.language-php} überhaupt in eine Variable um?
---
> ~~~php,bad
> $languag="en"; // Sprache erstmal grundsätzlich auf englisch
> ~~~
`$language`{:.language-php.good} mit e.
---
> ~~~php,bad
> if(strpos($grundspr,"de",0) !== false){
> $languag = "de";
> }
> ~~~
Die Abfrage ist falsch. In mehrfacher Hinsicht.
**1\.** Wenn der gesendete *Accept-Language*{:@en}-Header bspw. `en-US,en;q=0.7,de;q=0.3` ist, dann will der Nutzer bevorzugt Englisch haben, nicht Deutsch.
[![Spracheinstellung im Firefox: hier 1. Englisch \[en-us\], 2. Englisch \[en\], 3. Deutsch \[de\]](/images/418d97be-907e-11ed-8bb1-b42e9947ef30.png?size=medium)](/images/418d97be-907e-11ed-8bb1-b42e9947ef30.png)
Du darfst nicht nur nach dem Vorkommen von `de` suchen, sondern musst auch die Reihenfolge der Sprachen im *Accept-Language*{:@en}-Header beachten.
**2\.** Das Vorkommen von `de` heißt nicht unbedingt Deutsch. Es gibt eine Vielzahl anderen Sprachen, deren dreibuchstabiges Kürzel `de` enthält. [[IANA Language Subtag Registry](https://www.iana.org/assignments/language-subtag-registry/language-subtag-registry)]
(Fun fact: Auch Google hatte das mal [falsch gemacht](https://forum.selfhtml.org/self/2008/apr/7/language-negotiation-deutsche-w3c-uebersetzung/1232285#m1232285).)
Du müsstest also nach `\bde\b` suchen. Aber auch das ist nicht ganz sicher.
Für `de` fällt mit kein sinnvolles Beispiel ein, aber für `it`. Ein Südtiroler könnte `de-it` (in Italien gesprochenes Deutsch) in seinem *Accept-Language*{:@en}-Header stehen haben. Wenn man diesen nach `\bit\b` durchsucht, ergibt es einen Treffer. Es wäre aber falsch, daraus zu folgern, dass die italienische Sprachvariante ausgeliefert werden soll.
Man müsste also auch prüfen, ob das gefundene `it` (bzw. `de`) auch wirklich ein Sprachkürzel ist und kein anderer Bestandteil des Sprachcodes; also ob kein `-` (oder `_`) unmittelbar davor steht.
**3\.** Dass Sprachcodes **case-insensitive**{:@en} verarbeitet werden müssen, sagte ich schon. `DE` muss gleichbehandelt werden wie `de`.
🖖 Живіть довго і процвітайте
{:@uk}
--
*„Im Vergleich mit Elon Musk bei Twitter ist ein Elefant im Porzellanladen eine Ballerina.“*
— @Grantscheam auf Twitter
Webseite zweisprachig gestalten
bearbeitet von Gunnar Bittersmann@@Treziman
> ~~~php,bad
> $grundspr = $_SERVER["HTTP_ACCEPT_LANGUAGE"];
> ~~~
Was soll *grundspr* bedeuten?
Variablen mal deutsch, mal englisch zu benennen ist auch keine gute Idee.
Und warum kopierst du `$_SERVER["HTTP_ACCEPT_LANGUAGE"]`{:.language-php} überhaupt in eine Variable um?
---
> ~~~php,bad
> $languag="en"; // Sprache erstmal grundsätzlich auf englisch
> ~~~
`$language`{:.language-php.good} mit e.
---
> ~~~php,bad
> if(strpos($grundspr,"de",0) !== false){
> $languag = "de";
> }
> ~~~
Die Abfrage ist falsch. In mehrfacher Hinsicht.
**1\.** Wenn der gesendete *Accept-Language*{:@en}-Header bspw. `en-US,en;q=0.7,de;q=0.3` ist, dann will der Nutzer bevorzugt Englisch haben, nicht Deutsch.
[![Spracheinstellung im Firefox: hier 1. Englisch \[en-us\], 2. Englisch \[en\], 3. Deutsch \[de\]](/images/418d97be-907e-11ed-8bb1-b42e9947ef30.png?size=medium)](/images/418d97be-907e-11ed-8bb1-b42e9947ef30.png)
Du darfst nicht nur nach dem Vorkommen von `de` suchen, sondern musst auch die Reihenfolge der Sprachen im *Accept-Language*{:@en}-Header beachten.
**2\.** Das Vorkommen von `de` heißt nicht unbedingt Deutsch. Es gibt eine Vielzahl anderen Sprachen, deren dreibuchstabiges Kürzel `de` enthält. [[IANA Language Subtag Registry](https://www.iana.org/assignments/language-subtag-registry/language-subtag-registry)]
(Fun fact: Auch Google hatte das mal [falsch gemacht](https://forum.selfhtml.org/self/2008/apr/7/language-negotiation-deutsche-w3c-uebersetzung/1232285#m1232285).)
Du müsstest also nach `\bde\b` suchen. Aber auch das ist nicht ganz sicher.
Für `de` fällt mit kein sinnvolles Beispiel ein, aber für `it`. Ein Südtiroler könnte `de-it` (in Italien gesprochenes deutsch) in seinem *Accept-Language*{:@en}-Header stehen haben. Wenn man diesen nach `\bit\b` durchsucht, ergibt es einen Treffer. Es wäre aber falsch, daraus zu folgern, dass die italienische Sprachvariante ausgeliefert werden soll.
Man müsste also auch prüfen, ob das gefundene `it` (bzw. `de`) auch wirklich ein Sprachkürzel ist und kein anderer Bestandteil des Sprachcodes; also ob kein `-` (oder `_`) unmittelbar davor steht.
**3\.** Dass Sprachcodes **case-insensitive**{:@en} verarbeitet werden müssen, sagte ich schon. `DE` muss gleichbehandelt werden wie `de`.
🖖 Живіть довго і процвітайте
{:@uk}
--
*„Im Vergleich mit Elon Musk bei Twitter ist ein Elefant im Porzellanladen eine Ballerina.“*
— @Grantscheam auf Twitter
Webseite zweisprachig gestalten
bearbeitet von Gunnar Bittersmann@@Treziman
> ~~~php,bad
> $grundspr = $_SERVER["HTTP_ACCEPT_LANGUAGE"];
> ~~~
Was soll *grundspr* bedeuten?
Variablen mal deutsch, mal englisch zu benennen ist auch keine gute Idee.
Und warum kopierst du `$_SERVER["HTTP_ACCEPT_LANGUAGE"]`{:.language-php} überhaupt in eine Variable um?
---
> ~~~php,bad
> $languag="en"; // Sprache erstmal grundsätzlich auf englisch
> ~~~
`$language`{:.language-php.good} mit e.
---
> ~~~php,bad
> if(strpos($grundspr,"de",0) !== false){
> $languag = "de";
> }
> ~~~
Die Abfrage ist falsch. In mehrfacher Hinsicht.
**1\.** Wenn der gesendete *Accept-Language*{:@en}-Header `en-US,en;q=0.7,de;q=0.3`, dann will der Nutzer bevorzugt Englisch haben, nicht Deutsch.
[![Spracheinstellung im Firefox: hier 1. Englisch \[en-us\], 2. Englisch \[en\], 3. Deutsch \[de\]](/images/418d97be-907e-11ed-8bb1-b42e9947ef30.png?size=medium)](/images/418d97be-907e-11ed-8bb1-b42e9947ef30.png)
Du darfst nicht nur nach dem Vorkommen von `de` suchen, sondern musst auch die Reihenfolge der Sprachen im *Accept-Language*{:@en}-Header beachten.
**2\.** Das Vorkommen von `de` heißt nicht unbedingt Deutsch. Es gibt eine Vielzahl anderen Sprachen, deren dreibuchstabiges Kürzel `de` enthält. [[IANA Language Subtag Registry](https://www.iana.org/assignments/language-subtag-registry/language-subtag-registry)]
(Fun fact: Auch Google hatte das mal [falsch gemacht](https://forum.selfhtml.org/self/2008/apr/7/language-negotiation-deutsche-w3c-uebersetzung/1232285#m1232285).)
Du müsstest also nach `\bde\b` suchen. Aber auch das ist nicht ganz sicher.
Für `de` fällt mit kein sinnvolles Beispiel ein, aber für `it`. Ein Südtiroler könnte `de-it` (in Italien gesprochenes deutsch) in seinem *Accept-Language*{:@en}-Header stehen haben. Wenn man diesen nach `\bit\b` durchsucht, ergibt es einen Treffer. Es wäre aber falsch, daraus zu folgern, dass die italienische Sprachvariante ausgeliefert werden soll.
Man müsste also auch prüfen, ob das gefundene `it` (bzw. `de`) auch wirklich ein Sprachkürzel ist und kein anderer Bestandteil des Sprachcodes; also ob kein `-` (oder `_`) unmittelbar davor steht.
**3\.** Dass Sprachcodes **case-insensitive**{:@en} verarbeitet werden müssen, sagte ich schon. `DE` muss gleichbehandelt werden wie `de`.
🖖 Живіть довго і процвітайте
{:@uk}
--
*„Im Vergleich mit Elon Musk bei Twitter ist ein Elefant im Porzellanladen eine Ballerina.“*
— @Grantscheam auf Twitter