externe austauschbare Sprachdateien und Smarty

topf

Mitglied
Hallo, viele von euch kennen sicher die template-engine Smarty.
Ich muss sagen, für meine letzten größeren Projekte war es eine sehr hilfreich und voranbringendes Erleichterung.

Nur:
Ich brauch für mein neuestes Projekt eine gewisse Multilingualität und will diese mit Sprachkonstanten, ausgelagert in einzelnen Dateien ( german.php, english.php, spa... ) ,
bequem einladen und dann nurnoch per Konstanten im Template die entsprechenden Felder setzen.

Allerdings macht smarty Variablen ja nur per assign() verfügbar.

Gibt es eine Möglichkeit dies zu umgehen? Was kann ich tun?

Habe mal von SmartyML gehört, welches sowas kann?
Allerdings weiss ich nicht, ob ich meine smarty-Version mit der ML ersetzen kann etc.


Bitte um Hilfe...
 
Wo ist das Problem?

PHP:
// Check auf die Sprache [In Session?]
// Hat bei mir die Values: de, en, etc.
$lang = loadLanguageFile($_SESSION['active_language']);

// Danach hat $lang alle festen Sprachwerte, die in der jeweiligen Datei sind.
// Die Funktion (grob)

function loadLanguageFile($lang) {
  include("./languages/".$lang."/lang-main.php");
  return $lang;
}

// Die lang-main.php sieht ungefähr so aus:
$lang['general_error'] = "General Error";
$lang['new_message'] = "You have a new message.";
// usw.

Und die Anbindung ist immer die gleiche danach:
PHP:
$smarty->assign('general_error', $lang['general_error']);

Das System ist grob dem phpBB nachempfunden.
 
Dann muss ich ja tausende assigns machen? Das wäre mir ein wenig zu bescheuert.

Oder ich hab das jetzt falsch nachempfunden.
 
Nein, denn du kannst ja auch ein Array verfügbar machen.

PHP:
$language = array("Test1", "Test2", "Test3");

$smarty->assign("lang", $language);

Und schon kannst du in den Templates auf folgende Weise darauf zugreifen:

PHP:
{$lang.1}
Würde in diesem Fall durch "Test1" ersetzt werden.
 
Wo ist das Problem?
PHP:
// Check auf die Sprache [In Session?]
// Hat bei mir die Values: de, en, etc.
$lang = loadLanguageFile($_SESSION['active_language']);
Hoffentlich nicht direkt aus der Session.
Sowas prüft man vorher und stellt dann eine entsprechende eigene Variable/Konstante bereit.
PHP:
// Danach hat $lang alle festen Sprachwerte, die in der jeweiligen Datei sind.
// Die Funktion (grob)

function loadLanguageFile($lang) {
  include("./languages/".$lang."/lang-main.php");
  return $lang;
}
Urghs fieses Typecasting. Einigen wir uns darauf, dass eine Funktion oder auch eher Methode einer Language-Klasse (in der auch vorher genannte Variable bereit steht) eine Datei öffnet und daraus die Sprachvariablen ausliest und diese gegebenenfalls als Array zurück gibt. Aber keinesfalls eine vorherige String-Variable aus dem Kontext nimmt und die überschreibt und zurückgibt. Ugly!

PHP:
// Die lang-main.php sieht ungefähr so aus:
$lang['general_error'] = "General Error";
$lang['new_message'] = "You have a new message.";
// usw.
Gut denkbar wäre auch eine Ini-Konfig oder XML.

Und die Anbindung ist immer die gleiche danach:
PHP:
$smarty->assign('general_error', $lang['general_error']);
Das System ist grob dem phpBB nachempfunden.
Dann lieber einmal den ganzen Array assignen und per assoziativem Key (und nicht per numerischen) darauf zugreifen.

Orientier dich dabei lieber an Wordpress, die Lösung dort finde ich schöner (basiert auf gettext).
 
Was ich hier in ein paar Minuten an Code zusammenschreibe dient nicht als fertiges Script, sondern soll einen Ansatzpunkt zur Eigenarbeit darstellen, nichts weiter.
 
Zurück