Ich habe mir fuer diesen zweck eine Klasse geschrieben - jedoch basiert die uf datein und nich auf einer Datenbank aus den folgenden gruenden:
- Ueber die datenbank braucht as vieel laenger, da viele elemente pro seitenaufruf geladen werden muessen
- unnoetger stress fuer die datenbank.
Ich bin mom. nicht daheim, mal sehen ob ich an den Quellcode rankomme
<?php
class language {
private $lang=array();
private $langDef=array("en"=>1, "de"=>2, "fr"=>3);
private $lng="";
private $SES_enable=true;
private $GET_enable=true;
private $sesKey="lang";
private $getKey="lang";
function __construct(Array $lngs=null, $lang="") {
if (!empty($lang)) $this->lng=$lang;
if (!empty($lngs)) $this->langDef=$lngs;
}
private function getLng() {
if (!empty($this->lng)) return $this->lng;
if ($this->GET_enable) {
if (isset($_GET[$this->getKey])) {
return $_GET[$this->getKey];
}
}
if (isset($_SESSION[$this->sesKey]) && $this->SES_enable==true) return $_SESSION[$this->sesKey];
$l=explode(",", $_SERVER['HTTP_ACCEPT_LANGUAGE']);
if (empty($l)) return "de";
return $l[0][0].$l[0][1];
}
public function load($file) {
$lang=$this->getLng();
if (!in_array($lang, array_flip($this->langDef))) $lang="en";
$this->lng=$lang;
if ($this->SES_enable) $_SESSION[$this->sesKey]=$lang;
$csv=file($file);
foreach ($csv as $line) {
$line=explode("|", trim($line));
$key=$line[0];
$cur=$line[$this->langDef[$lang]];
$this->lang[$key]=str_replace("&hl;", "|", $cur);
}
}
public function disableGET() {
$this->GET_enable=false;
}
public function disableSES() {
$this->SES_enable=false;
}
public function setSESkey($key) {
$this->sesKey=$key;
}
public function setGETkey($key) {
$this->getKey=$key;
}
public function get() {
$vars=func_get_args();
$key=$this->lang[$vars[0]];
$vars=array_slice($vars, 1);
if (gettype(@$vars[0])=="array") {
$vars=$vars[0];
}
$i=1;
while ($i<=count($vars)) {
$key=str_replace("\$".$i, $vars[($i-1)], $key);
$i++;
}
return str_replace("%NL%", "\n", $key);
}
public function getLanguage() {
return $this->lng;
}
}
Alles anzeigen
Sry, dass der jetzt ein wenig unformatiert ist, bin anders nicht drangekommen...
Die Dateien, aus denen diese Klasse liest sind wie folgt aufgebaut:
Der "schluessel' ist die Zeichenkette, ueber die du den entsprechenden text in der entsprechenden sprache abfraegst. Die beschriftungen sind die tete in verschiedenen sprachen. z.B.
wellcome_text|Willkommen|Wellcome
Der Konstruktor kann ohne argumente aufgerufen werden, dann sollten die dateien wie folgt aufgebaut sein:
Oder mit einem Argument, ein Array, dass die Reihenfolde der "Sprachen" in den Dateien beschreibt, also z.B.
Oder mit 2 Argumenten, das erste wieder das Array, das zweite ein String (sollte im Array sein), dass den Standard darstellt.
Nach dem Konstruktor kannst du noch
$l->enableGET();
// und
$l->enableSES();
// aufrufen, um die Sprache nicht aus dem $_SERVER['HTTP_ACCEPT_LANGUAGE'] sondern
// aus $_GET bzw $_SESSION auszulesen. Dazu benutzt die klasse standardmaesig den key
// "lang", also $_GET['lang'] / $_SESSION['lang'], das laesst sich aber durch
$l->setSESkey{"foobar");
// und
$l->setGETkey("foobar");
// aendern
Um nun eine Datei zu laden benutzt du $l->load("pfad/zur/datei.txt");
Wenn die fehler hat, wird die entsprechende zeile einfach ignoriert.
Im PHP-Code benutzt du dann
$l->get("wellcome_text");
Und entsprechend gibt die Funktion "Willkommen" oder "Wellcome" zurueck.
Ich hoffe das hilft dir
EDIT:
Ich hab den quelltext jetzt mit leerzeilen und im anhang ist noch eine java-anwendung, mit der du die dateien bequemer editieren kannst als mit nem normalen notepad.LanguageFileEditor.jar.zip