Hab ich vergessen, sorry.
Kommt nachher.
Hab ich vergessen, sorry.
Kommt nachher.
So, nu' aber... Sorry.
Um es so flach wie möglich zu halten, habe ich das mal nur so zusammengetippert, ohne Ansätze von OOP.
Damit sowohl die Sprachumstellung, als auch der Sinn von dynamischen Websites erkennbar sind, setze ich zu Beginn eine .htaccess in meinen Webroot:
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ index.php [QSA,L]
Kurze Erklärung: Hier werden alle Seitenaufrufe, die nicht physikalisch im Dateisystem existent sind auf die index.php umgeleitet!
Eine ausführliche Erklärung, wozu das z.B. gut ist, findest Du hier: https://www.php-rocks.de/thema…endly-url-s-umsetzen.html
Mit dieser Grundlage werfe ich einfach mal die index.php hier rein:
session_start();
// defining defaults
define ( '__BASEDIR__', __DIR__ . '/' );
define ( '__WEBROOT__', $_SERVER['REQUEST_SCHEME'] . '://' . $_SERVER['SERVER_NAME'] . '/' );
define ( '__DEFLANG__', 'de' );
include_once 'GetLanguage.php';
if ( !$bHasLanguageInUri ) header ( 'location: ' . __WEBROOT__ . $_SESSION['LanguageISO'] . '/' );
$_SESSION['CurrentPageUri'] = str_replace( '/' . $_SESSION['LanguageISO'] . '/', '', $_SERVER['REQUEST_URI'] );
include_once 'header.php';
include_once 'content/main_' . $_SESSION['LanguageISO'] . '.php';
include_once 'footer.php';
Alles anzeigen
Sieht bisher nicht sonderlich spannend, dafür aber verständlich aus, oder?
Um zu sehen, wie ich mir die Sprache nun explizit hole, müssen wir in die GetLanguage.php reinschauen:
// step 1: extracting all accepted language from browser with their priorities
$aLanguageFromBrowser = [];
array_map(
function( $lang ) use ( &$aLanguageFromBrowser ) {
$tmp = explode( ';', $lang );
$q = 10;
$l = $lang;
if ( count($tmp) > 1 ) {
$q = (integer)(substr($tmp[1], 2)*10);
$l = substr( $lang, 0, strpos($lang, ';') );
}
$aLanguageFromBrowser[$q] = $l;
}
, explode( ',', $_SERVER['HTTP_ACCEPT_LANGUAGE'] )
);
ksort ( $aLanguageFromBrowser );
// check if uri has a language iso within
$bHasLanguageInUri = preg_match( '/\/(?P<lang>[a-z]{2})\/.*/ius', $_SERVER['REQUEST_URI'], $aLangMatch );
// fiter all languages found ( only valid languages will be left )
$aLanguagesFound = array_filter([
// from uri
$bHasLanguageInUri ? $aLangMatch['lang'] : null,
// from session
$_SESSION['LanguageISO'] ?? null,
// from user agent
substr( end($aLanguageFromBrowser), 0, 2 ),
// default
__DEFLANG__
]);
// storing language iso with highest priority in session
$_SESSION['LanguageISO'] = array_values( $aLanguagesFound )[0];
Alles anzeigen
Das sieht jetzt ein bisschen wilder aus, macht aber Sinn
Am Ende habe ich in $_SESSION['LanguageISO'] die aktuelle Sprache und kann diese an jedem beliebigen Ort der Website verwenden.
Hier noch kurz, der Vollständigkeit halber die Dateien header.php und footer.php:
<!DOCTYPE html>
<html lang="<?php echo $_SESSION['LanguageISO']; ?>">
<head>
<title>Sprache: <?php echo strtoupper($_SESSION['LanguageISO']); ?></title>
<meta charset="utf-8">
</head>
<body>
<nav>
<a href="//example.com/de/<?php echo $_SESSION['CurrentPageUri']; ?>">Deutsch</a>
<a href="//example.com/fr/<?php echo $_SESSION['CurrentPageUri']; ?>">Französisch</a>
<a href="//example.com/en/<?php echo $_SESSION['CurrentPageUri']; ?>">Englisch</a>
</nav>
Alles anzeigen
Die Content-Dateien muss ich hier glaube ich nicht posten, die sollten sich, wenn man beim Beispiel bleibt, in dem Verzeichnis content befinden und entsprechend der Sprache main_de.php, main_fr.php und main_en.php heißen.
Um das nicht allzu lang werden zu lassen, lasse ich das mal so stehen.
Fühl Dich frei, es zu kopieren und zu testen, das Beispiel ist funktionsfähig ( Domain anpassen halt... ).
Bedenke aber: Das ist nur ein funktionsfähiges Beispiel für das Verständnis und noch keine Produktiv-Lösung!
Bei Fragen, einfach hier ranhängen.
Danke für Dein Beispiel! Ich habe es mir über die Festtage angeschaut, mir ist aus dem Beispiel noch viel unklar, dies ist wohl - im Moment - etwas ausserhalb von meinen Möglichkeiten.. Grundsätzlich möchte ich auch, weil es so wenig Text pro Seite ist, auch lieber nicht mehrere SeiteX_[Sprache].html haben.. Dies ist natürlich ohne JavaScript etwas schwierig umsetzbar..
Ich versuche mal noch ein JS-Beispiel als Vergleich zu finden
Zitatetwas ausserhalb von meinen Möglichkeiten..
Keine Sorge, es geht auch einfacher.
ZitatGrundsätzlich möchte ich auch, weil es so wenig Text pro Seite ist, auch lieber nicht mehrere SeiteX_[Sprache].html haben
Auch das ist kein Problem. Versuche diesen Code:
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<meta charset="UTF-8">
<title>Test Sprachumschaltung</title>
<meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport">
<?php
function prefered_language(array $available_languages, $http_accept_language) {
$available_languages = array_flip($available_languages);
$langs;
preg_match_all('~([\w-]+)(?:[^,\d]+([\d.]+))?~', strtolower($http_accept_language), $matches, PREG_SET_ORDER);
foreach($matches as $match) {
list($a, $b) = explode('-', $match[1]) + array('', '');
$value = isset($match[2]) ? (float) $match[2] : 1.0;
if(isset($available_languages[$match[1]])) {
$langs[$match[1]] = $value;
continue;
}
if(isset($available_languages[$a])) {
$langs[$a] = $value - 0.1;
}
}
arsort($langs);
return $langs;
}
// Die folgende Zeile aktivieren zum Test fuer Englisch
// $_SERVER["HTTP_ACCEPT_LANGUAGE"] = 'en-us,en;q=0.8,es-cl;q=0.5,zh-cn;q=0.3';
// Languages we support
$available_languages = array("en", "de");
$langs = prefered_language($available_languages, $_SERVER["HTTP_ACCEPT_LANGUAGE"]);
if (count($langs) > 0) {
reset($langs);
$thelang = key($langs);
} else $thelang = "de";
echo '<style>:not([class*=\'lang-' . $thelang . '\'])[class*=\'lang-\'] {display: none;}</style>';
?>
</head>
<body>
<p class="lang-de">Dies ist deutscher Text</p>
<p class="lang-en">This is english text</p>
<img src="images/sun.jpg">
</body>
</html>
Alles anzeigen
Du brauchst dann nur die Klasse lang-de oder lang-en usw. zu den HTML-Tags hinzufügen. Ist keine dieser Klassen vorhanden, wie in dem Beispiel beim img-Tag, wird das Element unabhängig von der Sprche angezeigt.
Das PHP ist im Wesentlichen von hier:
https://stackoverflow.com/ques…t-browser-language-in-php
Nächster Schritt: Das PHP auslagern, damit die Seiten übersichtlicher werden.
Übernächster Schritt: Umschaltung durch Benutzer hinzu fügen.
Grundsätzlich möchte ich auch, weil es so wenig Text pro Seite ist, auch lieber nicht mehrere SeiteX_[Sprache].html haben..
Das musst Du ja auch nicht, aber Du hast immer die gleiche Situation: Der Content ist ein anderer.
Ob Du den nun mit JS austauscht oder mit PHP gleich direkt auslieferst, spielt im ersten Moment keine Rolle.
Vorteil von JS:
Vorteil von PHP:
Bei JavaScript weißt Du nie, ob das beim Benutzer auch wirklich funktioniert, denn selbst bei aktiviertem JavaScript kann ein PlugIn/Scriptblocker dafür sorgen, dass Dein JS nicht ausgeführt wird. Dann wirkt Deine Seite unseriös, weil Du eine Funktion anbietest, die nicht funktioniert.
Das kannst Du nur umgehen, wenn Du Server seitig das Dokument bereits korrekt auslieferst.
JavaScript sollte nicht für Basis-Funktionalität, sondern als zusätzliche Usability verwendet werden.
Ich weiß, Dir schwebt vor, den Content aller Sprachen direkt in das Dokument zu schreiben und diese dann je nach Sprachauswahl ein- bzw. auszublenden.
Kann man machen, aber wie gesagt: JavaScript ist abhängig von der Browserkonfiguration des Benutzers, auf die Du keinerlei Einfluß hast!
Was die Dateibenennung angeht, das war ja nur ein Beispiel. Stell Dir mal vor, Du hättest URLs, wie diese:
https://www.example.com/de/startseite
https://www.example.com/en/home
https://www.example.com/fr/sursauter
Auch das wäre problemlos möglich, Du könntest dann direkt die Content-Dateien bspw. aus den entsprechenden Verzeichnissen einbinden:
Natürlich kann der Dateiname unabhängig von der URL auch für jede Sprache startseite.html lauten, der Flexibilität sind da keine Grenzen gesetzt.
Dies ist natürlich ohne JavaScript etwas schwierig umsetzbar..
Wenn Du den Umsetzungsaufwand in PHP mit dem Ein-/Ausblenden von Elementen in JavaScript vergleichst, mag das sicher richtig sein.
Aus Sicht einer sauberen Umsetzung und evtl. Berücksichtigung der Suchmaschinen, ist das aber leider nicht so.
EDIT:
Keine Sorge, es geht auch einfacher.
Stimmt, man kann das ganze auch noch einfacher gestalten, wenn man einfach noch weniger Aspekte berücksichtigt...
Nächster Schritt: Das PHP auslagern, damit die Seiten übersichtlicher werden.
Übernächster Schritt: Umschaltung durch Benutzer hinzu fügen.
Und nach den beiden Schritten möchte ich das ganze mal im Vergleich zu meinem Beispiel sehen.
Nur um der Definition "einfacher" Willen...
Keine Sorge, es geht auch einfacher.
Oh, das würde mich sehr freuen.
Ich habe den Code mal ausprobiert. Nicht, dass ich diesen Code komplett verstehen würde aber eine Anpassung der unterstützen Sprachen oder das Auslagern des PHP's traue ich mir zu
Im Moment kommt bei mir noch folgendes:
0) { reset($langs); $thelang = key($langs); } else $thelang = "de"; echo ''; ?>
Dies ist deutscher Text
This is english text
Alles anzeigenDas musst Du ja auch nicht, aber Du hast immer die gleiche Situation: Der Content ist ein anderer.
Ob Du den nun mit JS austauscht oder mit PHP gleich direkt auslieferst, spielt im ersten Moment keine Rolle.
Vorteil von JS:
- kein Seitenreload
Vorteil von PHP:
- Client unabhängig
Die Vorteile sind mir soweit klar und das wäre auf jeden Fall ein Pluspunkt. Die Architektur mit www.[website].xx/[sprache]/[seite].html ist für mich auf jeden Fall eine Option und ein Weg den ich, zumindest ohne automatische Erkennung der Sprache, problemlos umsetzen kann.
Für mich ist es jedoch ein Nachteil wenn ich meine 12 Seiten die ich aktuelle habe mit der Anzahl Sprachen multiplizieren muss und dann Anpassungen an 36 Seiten vornehmen muss. Natürlich kann ich auch dort viel mit include arbeiten aber einfacher wäre es wohl die zwei Sätze pro Seite in drei Sprachen zu haben und jeweils nur eine anzuzeigen.
Aus diesem Grund wäre es für mich, so wie ich es im Moment sehe, einfacher die 12 Seiten zu lassen und darin die drei Sprachen zu verpacken
Nuja, Mehrsprachigkeit zieht Mehraufwand mit sich, das sollte einem klar sein...
Nuja, Mehrsprachigkeit zieht Mehraufwand mit sich, das sollte einem klar sein...
Dies ist mir durchaus klar. Ich gehe davon aus, dass es verschiedene Wege gibt welche verschiedene Aufwände nach sich ziehen..
Zitat
Da offenbar der PHP-Code angezeigt statt interpretiert wird, vermute ich, dass Du deiner Seite noch nicht die Endung .php gegeben hast?
Den Code hatte ich getestet und bei mir hat er einwandfrei funktioniert.
Natürlich - nicht.
Jetzt geht es, prächtig, ich bin begeistert
Jetzt habe ich noch ein Weg gefunden um php in einem html-File unterzubringen ("AddType application/x-httpd-php .htm .html" im .htaccess file)
Ich werde mal versuchen das Ganze in meinem Code aufzubauen, danke soweit, ich melde mich gerne bei Fragen
EDIT: Ein erster Test läuft, mit meinem Source und dem PHP ausgelagert, unglaublich..
Dann können wir uns ja dem nächsten Schritt zuwenden: Manuelle Umschaltung durch den Benutzer.
Oh ja! Sehr gerne! Ich kam noch auf keine gute Idee wie ich es im UI unterbringen werde aber dies ist natürlich sekundär..
Wie würdest Du dies angehen?
Noch eine kurze Zwischenfrage, ich habe jetzt kurz mit "en", "de","fr" gespielt. Wenn ich bei meinem Browser jetzt 'Englisch' einstelle kommt nicht englisch, wenn ich 'Englisch (Vereinigte Staaten)' einstelle klappt es. Das gleiche auch mit Deutsch.
Dies ist natürlich soweit grossartig, am liebsten möchte ich jedoch alle en-xx abdecken, bei meinen Nachforschungen stiess ich auf zahlreiche Listen welche entsprechende Codes verbreiteten - gibt es eine Möglichkeit die dort zusammen zu fassen?
ZitatWenn ich bei meinem Browser jetzt 'Englisch' einstelle kommt nicht englisch, wenn ich 'Englisch (Vereinigte Staaten)' einstelle klappt es. Das gleiche auch mit Deutsch.
Daran habe ich auch schon gedacht und ich habe dieses Problem erwartet. Es liegt daran, dass es bei einigen Sprachen regionale Ausprägungen gibt, z. B. en-US. Du hast das ja schon gefunden. Ich werde es mir ansehen und eine Lösung ausarbeiten. Muss mich erst Mal schlau machen wie man das in Opera umstellt.
Bei der Benutzerumschaltung tendiere ich dahin, es clientseitig zu machen, damit die Seite beim Umschalten nicht neu geladen wird und nicht flackert. Erst dachte ich an Javascript, aber dann habe ich einen Blick auf das Codepen in deinem ersten Posting geworfen und gesehen, dass es ohne weiteres auch mit reinem CSS geht, wenn auch die Selektoren etwas kompliziert würden. Hast Du da eine bestimmte Präferenz?
Jetzt habe ich noch ein Weg gefunden um php in einem html-File unterzubringen ("AddType application/x-httpd-php .htm .html" im .htaccess file)
Warum? Dazu sind doch PHP-Dateien da... Du schmeißt damit alle HTML-Dateien in den Parser, der in meisten Fällen gar nix macht.
Arbeite lieber mit Rewrites, wenn Du .html in der URL stehen haben willst.
Bei der Benutzerumschaltung tendiere ich dahin, es clientseitig zu machen, damit die Seite beim Umschalten nicht neu geladen wird und nicht flackert.
Solange weiterhin alle Sprachen gleichzeitig im Dokument vorhanden sind und kein JS benötigt wird, kann man das so machen.
So, ich bin jetzt in das PHP von Stackoverflow eingestiegen und habe heraus gefunden, warum das automatische Umschalten nicht funktioniert:
Lautet das Kürzel z. B. en-gb, so werden beide Hälften getrennt ausgewertet. Das "gb" rechts vom Bindestrich bekommt eine höhere Priorität und wird deshalb als bevorzugte Sprache ausgewählt. Im HTML und CSS ist jedoch nur "en" vorhanden, so dass die Umschaltung nicht funktioniert.
Ich habe den Code so geändert, dass es funktionieren sollte. Die Funktion ist jetzt kürzer und das Array länger. Ich hoffe, aus meinen Kommentaren wird klar, wie es konfiguriert werden muss.
Bei der manuellen Umschaltung habe ich mich für die CSS-Lösung entschieden. Typisch dafür ist, dass es gewisse Einschränkungen gibt: Die Radiobuttons müssen ganz am Anfang des Body stehen und wenn man die Labels entspr. Zustand hervorheben will, muss man sie entspr. adressieren.
Allzu intensiv habe ich es nicht getestet. Wenn Du Fehler findest, melde dich wieder.
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<meta charset="UTF-8">
<title>Test Sprachumschaltung</title>
<meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport">
<?php
function get_prefered_language(array $available_languages, $http_accept_language) {
$langs;
preg_match_all('~([\w-]+)(?:[^,\d]+([\d.]+))?~', strtolower($http_accept_language), $matches, PREG_SET_ORDER);
foreach($matches as $match) {
list($a, $b) = explode('-', $match[1]) + array('', '');
$value = isset($match[2]) ? (float) $match[2] : 1.0;
if(isset($available_languages[$match[1]])) {
$langs[$match[1]] = $value;
continue;
}
}
arsort($langs);
return $langs;
}
// Die folgende Zeile aktivieren zum Test fuer Englisch
// $_SERVER["HTTP_ACCEPT_LANGUAGE"] = 'en-us,en;q=0.8,es-cl;q=0.5,zh-cn;q=0.3';
// Languages we support
// Key: language from browser
// Value: language used in HTML/CSS class
$available_languages = array(
"de" => "de", "de-de" => "de", "de-at" => "de", "de-ch" => "de",
"en" => "en", "en-us" => "en", "en-gb" => "en", "en-ca" => "en"
);
$displayed_languages = array_unique($available_languages);
$langs = get_prefered_language($available_languages, $_SERVER["HTTP_ACCEPT_LANGUAGE"]);
if (count($langs) > 0) {
reset($langs);
$thelang = $available_languages[key($langs)];
} else $thelang = "de";
?>
<style>
input[value='de']:checked ~ *:not([class*='lang-de'])[class*='lang-'] {display: none;}
input[value='de']:checked ~ * *:not([class*='lang-de'])[class*='lang-'] {display: none;}
input[value='en']:checked ~ *:not([class*='lang-en'])[class*='lang-'] {display: none;}
input[value='en']:checked ~ * *:not([class*='lang-en'])[class*='lang-'] {display: none;}
input { display: none; border: 2px solid transparent;}
input[id='rdlang-de']:checked ~ label[for='rdlang-de'] {border: 2px solid grey;}
input[id='rdlang-en']:checked ~ label[for='rdlang-en'] {border: 2px solid grey;}
</style>
</head>
<body>
<!-- Die Inputs, die im folgenden generiert werden, muessen ganz am Anfang des Body stehen.
Die Labels können an beliebiger Stelle stehen. -->
<?php
foreach($displayed_languages as $acc_lang => $disp_lang) {
if ($disp_lang == $thelang) $rq = ' checked'; else $rq = '';
echo '<input type="radio" id="rdlang-' . $disp_lang . '" name ="rdlang" value="' . $disp_lang . '"' . $rq . '>';
}
?>
<label for="rdlang-de">Deutsch</label>
<label for="rdlang-en">English</label>
<p class="lang-de">Dies ist deutscher Text</p>
<p class="lang-de">Dies ist noch ein deutscher Text</p>
<div>
<p class="lang-de">Dies ist eingebetteter deutscher text</p>
</div>
<p class="lang-en">This is english text</p>
<p class="lang-en">This is another english text</p>
<div>
<p class="lang-en">This is nested english text</p>
</div>
<img src="images/sun.jpg">
</body>
</html>
Alles anzeigen
Allzu intensiv habe ich es nicht getestet. Wenn Du Fehler findest, melde dich wieder.
Nur kurz weil es schon etwas spät ist und ich morgen früh los muss - funktioniert, prächtig. Ich habe den Code kurz nach dieser Liste erweitert um alle verschiedenen Werte abzudecken
<?php
function get_prefered_language(array $available_languages, $http_accept_language) {
$langs;
preg_match_all('~([\w-]+)(?:[^,\d]+([\d.]+))?~', strtolower($http_accept_language), $matches, PREG_SET_ORDER);
foreach($matches as $match) {
list($a, $b) = explode('-', $match[1]) + array('', '');
$value = isset($match[2]) ? (float) $match[2] : 1.0;
if(isset($available_languages[$match[1]])) {
$langs[$match[1]] = $value;
continue;
}
}
arsort($langs);
return $langs;
}
// Die folgende Zeile aktivieren zum Test fuer Englisch
// $_SERVER["HTTP_ACCEPT_LANGUAGE"] = 'en-us,en;q=0.8,es-cl;q=0.5,zh-cn;q=0.3';
// Languages we support
// Key: language from browser
// Value: language used in HTML/CSS class
$available_languages = array(
"de" => "de", "de-at" => "de", "de-de" => "de", "de-li" => "de", "de-lu" => "de", "de-ch" => "de",
"en" => "en", "en-au" => "en", "en-bz" => "en", "en-ca" => "en", "en-ie" => "en", "en-jm" => "en", "en-nz" => "en", "en-ph" => "en", "en-za" => "en", "en-tt" => "en", "en-gb" => "en", "en-us" => "en", "en-zw" => "en",
"fr" => "fr", "fr-be" => "fr", "fr-ca" => "fr", "fr-fr" => "fr", "fr-lu" => "fr", "fr-mc" => "fr", "fr-ch"
);
$displayed_languages = array_unique($available_languages);
$langs = get_prefered_language($available_languages, $_SERVER["HTTP_ACCEPT_LANGUAGE"]);
if (count($langs) > 0) {
reset($langs);
$thelang = $available_languages[key($langs)];
} else $thelang = "de";
?>
<style>
input[value='de']:checked ~ *:not([class*='lang-de'])[class*='lang-'] {display: none;}
input[value='de']:checked ~ * *:not([class*='lang-de'])[class*='lang-'] {display: none;}
input[value='en']:checked ~ *:not([class*='lang-en'])[class*='lang-'] {display: none;}
input[value='en']:checked ~ * *:not([class*='lang-en'])[class*='lang-'] {display: none;}
input[value='fr']:checked ~ *:not([class*='lang-fr'])[class*='lang-'] {display: none;}
input[value='fr']:checked ~ * *:not([class*='lang-fr'])[class*='lang-'] {display: none;}
input { display: none; border: 2px solid transparent;}
input[id='rdlang-de']:checked ~ label[for='rdlang-de'] {border: 2px solid grey;}
input[id='rdlang-en']:checked ~ label[for='rdlang-en'] {border: 2px solid grey;}
input[id='rdlang-fr']:checked ~ label[for='rdlang-fr'] {border: 2px solid grey;}
</style>
Alles anzeigen
So sieht es aktuell aus, mit DE/EN/FR in allen Variationen und auf die Schnelle läuft es - sowohl automatisch (noch nicht alles Sprach-Varianten geprüft) als auch manuell. Ich denke als nächstes werde ich mir überlegen wie ich die manuelle Umschaltung in das UI einbinden werde.
Bis hierhin schon mal - danke euch beiden! Ich teste mal ein Bisschen rum und komme sicherlich nochmals
Sorry, das ist quatsch. Wenn die Sprache einen Bindestrich hat, folgt die Angabe dem Schema <sprache>-<region>, wovon die Region für Dein Vorhaben überflüssig ist. Schränkt euch auf den Sprachcode ein und das Array kann deutlich kleiner gehalten werden. Ich behaupte mal, dass Du niemals regionsabhängige Sprachinhalte haben wirst, woraus folgt:
Die Funktion dann entsprechend anpassen und das ganze ist etwas sinnvoller, übersichtlicher und wartungsfreundlicher.
Sorry, das ist quatsch. Wenn die Sprache einen Bindestrich hat, folgt die Angabe dem Schema <sprache>-<region>, wovon die Region für Dein Vorhaben überflüssig ist. Schränkt euch auf den Sprachcode ein und das Array kann deutlich kleiner gehalten werden. Ich behaupte mal, dass Du niemals regionsabhängige Sprachinhalte haben wirst, woraus folgt:
Die Funktion dann entsprechend anpassen und das ganze ist etwas sinnvoller, übersichtlicher und wartungsfreundlicher.
Das wäre durchaus wartungsfreundlicher. Wenn ich das oben genannte $available_languages = array durch Deines ersetze schaltet die Sprache allerdings nicht mehr um - ich habe beide Englisch-Varianten versucht.
Bei der manuellen Umschaltung habe ich mich für die CSS-Lösung entschieden. Typisch dafür ist, dass es gewisse Einschränkungen gibt: Die Radiobuttons müssen ganz am Anfang des Body stehen und wenn man die Labels entspr. Zustand hervorheben will, muss man sie entspr. adressieren.
Die läuft soweit bestens. Die Umschaltung auf der Mobileseite will noch nicht richtig, dies ist aber eher ein CSS-Problem.. Da habe ich noch nicht rausgefunden wie das Template die Titelleiste zusammen schustert.
Gibt es eine Möglichkeit die Sprache zu (zwischen-)speichern? Im Moment kommt, natürlich, wieder die Browsersprache wenn die Seite gewechselt wird.
ZitatGibt es eine Möglichkeit die Sprache zu (zwischen-)speichern?
Selbstverständlich, dafür gibt es zwei Möglichkeiten:
Wenn ich das oben genannte $available_languages = array durch Deines ersetze schaltet die Sprache allerdings nicht mehr um - ich habe beide Englisch-Varianten versucht.
Naja, was erwartest Du? Man muss dann natürlich auch die Funktion daraufhin anpassen. Darauf wollte ich ja hinaus, die Erweiterung des Array is der falsche Ansatz für das Problem gewesen. Fang mal vorne an und beantworte Dir selber ein paar Fragen:
Was muss meine Funktion können?
Die Funktion soll die übermittelten verfügbaren Sprachen aus dem Browser auslesen, idealer Weise nach Priorität sortiert.
Diese Sprachen sollen mit den erlaubten Sprachen verglichen werden. Die erste verfügbare Sprache, die erlaubt ist, soll meine Sprache sein.
Wird keine verfügbare Sprache in den erlaubten gefunden, soll meine Standardsprache verwendet werden.
et voilà
function GetPreferedLanguage( $available ) {
$http_languages = [ 0 => 'de' ]; // Standardsprache: de
array_map(
function( $lang ) use ( &$http_languages ) {
$tmp = explode( ';', $lang );
$q = 10;
$l = $lang;
if ( count($tmp) > 1 ) {
$q = (integer)(substr($tmp[1], 2)*10);
$l = substr( $lang, 0, strpos($lang, ';') );
}
$http_languages[$q] = ( false !== strpos($l, '-') ) ? substr( $l, 0, strpos($l, '-') ) : $l;
}
, explode( ',', $_SERVER['HTTP_ACCEPT_LANGUAGE'] )
);
krsort ( $http_languages );
$langs_possible = array_intersect( array_unique($http_languages), $available );
return array_shift( $langs_possible );
}
Alles anzeigen
Weitergehende Erklärungen spare ich mir erstmal, weil Du es vermutlich eh nicht nutzen wirst.
Die Nutzung selber wäre allerdings relativ simpel:
Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!
HTML-Seminar.de - mit Videos zum schnellen Lernen, wie man eine Website selbst erstellt.