Wir benutzen Sprachen (Deutsch, Französisch, ..) und Lokalisierungen (Deutschland/Deutsch, Schweiz/Deutsch, ..), an letztere sind die Übersetzungen gekoppelt.
Folgende Tabellen:
LANG
id | code | name
1 | de | Deutsch
..
LOC
id | fk_lang | code | name | decimal_delim | thousand_delim | date_format | time_format
2| 1 | de | Deutschland | , | . | d.m.Y | H:i
..
CAT
id | name
3 | NEWS
..
LABEL
id | fk_cat | name
4 | 3 | TITLE
..
TEXT
id | fk_label | fk_loc | text
5 | 4 | 2 | Newsübersicht
..
Übersetzungen werden dann z.B. so abgefragt: translate("NEWS_TITLE")
Anhand des Kategorienamens (Label-
Präfix, hier NEWS) wird die gesamte Kategorie in der eingestellten Sprache aus der DB bezogen und in die Session geschrieben. So halten sich die Datenbankabfragen in Grenzen.
translate() ist bei uns ein ViewHelper
kannst auch
translate()->toDate(time()) oder // Mapping auf date(LOC.date_format, time())
translate()->multi("NEWS_DELETE", array("item" => "Köhler dankt ab")) // "Wollen Sie die News #item# wirklich löschen?"
translate()->toNumber(123456789.01); // 123.456.789,01
translate("<script>alert('1')</script>")->toHtml(); // htmlspecialchars("<script>alert('1')</script>")
translate("<script>alert('1')</script>")->toJs(); // <?php return "decodeURIComponent('" . rawurlencode("<script>alert('1')</script>") . "')" ?>
usw.
etc. benutzen, ist dann relativ billige Logik die das übernimmt.