<?php
/**
* Sprachspezifische Bereiche auswählen
* ==================================
* - per Outputbuffering wird die Ausgabe gesammelt
* - als Sprachvariante markierte Bereiche werden entsprechend der aktuell verlangten Sprachversion ausgefiltert
* - das Resultat wird ausgegeben
*
* Syntax zur Markierung der Sprachversionen:
* ----------------------------------------------------------
* Bsp. 1:
* [en] Hello [/en] [fr] Salut[/fr]
*
* Bei Ersetzungen wird bis zur nächsten Taggrenze (< oder >) alles ersetzt.
* Dies damit man die Standard-Sprache nicht zwingend auszeichnen muss.
* Es reicht also (hier ist "de" die Standard-Sprache) zu schreiben:
* Bsp.2:
* <h1>Beispiel[en]Example[/en]</h1>
*
* statt
*
* <h1>[de]Beispiel[/de][en]Example[/en]</h1>
*
*
* Integration in Webseite
* -------------------------------
* Am einfachtsten laesst sich das uber die php.ini erreichen:
* Bsp. 3:
* auto_prepend_file=langpick.inc.php
*
* Man kann es natürlich auch per include in alle Seiten einbinden:
* Bsp. 4:
* require_once('langpick.inc.php');
*
*/
ob_start('langpick');
function langpick()
{
// alle verwendeten Sprachkuerzel auflisten ...
$AvailableLanguage = array (
'de',
'en',
'fr',
);
// Standardsprache ...
$DefaultLanguage = $AvailableLanguage[0];
// in der Auszeichnung verwendete Klammern definieren ...
$OpeningBracket = '[';
$ClosingBracket = ']';
// Standardsprache als aktuelle Sprache setzen ...
$CurrentLanguage = $DefaultLanguage;
// hier geforderte Sprachversion ermittlen, z.B. anhand der URL ...
// Hier im Beispiel wird ein GET-Parameter genutzt in der Praxis bieten sich eher
// Subdomains oder Unterverzeichnisse im Webrrot an.
if (isset($_GET['lang']) && in_array($_GET['lang'], $AvailableLanguage)){
$CurrentLanguage = $_GET['lang'];
}
// bisherige Ausgabe ...
$Content = ob_get_contents();
// Alle Sprachversionen außer der geforderten entfernen ...
foreach ($AvailableLanguage as $Language){
if ( strtolower($Language) == strtolower($CurrentLanguage) ) {
continue;
}
$StartTag = preg_quote($OpeningBracket.$Language.$ClosingBracket);
$StopTag = preg_quote($OpeningBracket.'/'.$Language.$ClosingBracket);
$Content = preg_replace ('#'.$StartTag.'(.*)'.$StopTag.'#iUs', '', $Content);
}
// Die gewaehlte Sprachversion ersetzt alles bis zu den umliegenden Taggrenzen ...
$StartTag = preg_quote($OpeningBracket.$CurrentLanguage.$ClosingBracket);
$StopTag = preg_quote($OpeningBracket.'/'.$CurrentLanguage.$ClosingBracket);
$Content = preg_replace ('#([^>"]*)'.$StartTag.'(.*)'.$StopTag.'([^<"]*)(?=<|$|")#iUs','\2', $Content);
return $Content;
}
// HINWEIS!
// ========
// Der folgende Teil ist nur zu Demonstrationszwecken erforderlich.
// Bevor man das Skript also richtig einsetzt ist er also zu entfernen.
echo <<< EOT
<h1>Hallo [en]Hello[/en][fr]Salut[/fr]</h1>
[de]Dieser Text erscheint nur in der deutschsprachigen Version[/de]
[en]Dieser Text erscheint nur in der englischsprachigen Version[/en]
[fr]Dieser Text erscheint nur in der französichsprachigen Version[/fr]
<ul>
<li><a href="?lang=de">Deutsch</a></li>
<li><a href="?lang=en">Englisch</a></li>
<li><a href="?lang=fr">Französisch</a></li>
</ul>
EOT;
// hier explizit "flushen", da hier output buffering auf mehreren Level zum Einsatz kommt
ob_end_flush();
?>
Dieses PHP Snippet soll in erster Linie als Beispiel und Anregung für eigene Bemühungen dienen.
Gerne darf man es für Projekte aller Art benutzen.
Möchte jemand das Snippet also solches in ähnlicher oder anderer Form veröffentlichen ist ein kleiner Hinweis auf simplecontent.net nicht zuviel verlangt oder Herr Koch?
Für die Abwesenheit von Fehlern kann natürlich keine Gewähr gegeben werden.