Dieser Beitrag ist Teil meiner Sourecode a Day-Aktion.
Heute möchte ich eine Klasse vorstellen, mit der man sehr einfach Mehrsprachigkeit in sein PHP-Projekt bringen kann:
section = $section; $this->lang = $language; if (!empty($path)) { $this->path = $path; } $this->parse(); } /** * parse the language file * */ function parse() { $filename = $this->path.$this->lang.".ini"; $cachedata = $this->path.$this->lang.".cachedata"; $cachearray = $this->path.$this->lang.".cachearray"; if (!file_exists($filename)) { die("aLang Error: Language File for $this->lang doesn't exist!"); } // caching system $ini_size = filesize($filename); if (file_exists($cachedata) && file_exists($cachearray)) { $cachesize = implode ('', file ($cachedata)); if ($ini_size != $cachesize) { // reparse $this->reparse($filename); } else { // load from cache $serialized = base64_decode(implode('', file($cachearray))); $this->parsed = unserialize($serialized); } } else { // reparse $this->reparse($filename); } } /** * parse ini file and write cache * * @param string $fname */ function reparse($fname) { $this->parsed = parse_ini_file($fname, true); $ini_size = filesize($fname); $fp = @fopen($this->path.$this->lang.".cachedata", "w+"); @fwrite($fp, $ini_size); @fclose($fp); $fp = @fopen($this->path.$this->lang.".cachearray", "w+"); @fwrite($fp, base64_encode(serialize($this->parsed))); @fclose($fp); } /** * grab translation * * @param string $varname * @return string */ function get($varname) { if (!isset($this->parsed[$this->section][$varname])) { die("aLang Error: $this->section[$varname] not found!"); } return $this->parsed[$this->section][$varname]; } /** * grab translation out of specified section * * @param string $section * @param string $varname * @return string */ function grab($section, $varname) { if (!isset($this->parsed[$section][$varname])) { die("aLang Error: $section[$varname] not found!"); } return $this->parsed[$section][$varname]; } } ?>
In dieser Konfiguration müssten die Sprachdateien nun in den Ornder lang/. Beispiel für eine de.ini:
[main] hello=Hallo test=Das ist ein kleiner Test
Verwendung:
$lang = new aLang("main", "de"); echo $lang->get("hello"); // prints Hello echo "
"; echo $lang->get("test"); // prints Das ist ein kleiner Test
Die Klasse wird übrigens in abgewandelter Form in der aktuellen TWLan-Version verwendet 😉
Hallo!
Blöde Frage, ist das caching wirklich sinnvoll? Was erspart man sich dadurch das man statt der echten Daten den cache hat?
LG
Hi,
man spart sich das ini-Parsen, das ist nämlich langsamer als das native PHP-Serialisieren.
Viele Grüße,
agrafix