Zusammenspiel Sprachdateien und Templates???

Fragen zu allen Themen rund ums Programmieren außerhalb von phpBB können hier gestellt werden - auch zu anderen Programmiersprachen oder Software wie Webservern und Editoren.
Sgt. Absolom
Mitglied
Beiträge: 103
Registriert: 27.07.2004 22:24
Wohnort: Eppelheim
Kontaktdaten:

Zusammenspiel Sprachdateien und Templates???

Beitrag von Sgt. Absolom »

Hallo.

Ich habe gerade versucht zu verstehen, wie in den Template Dateien die Ausdrücke
{YYYYY}
durch Einträge aus einer Sprachdatei im lang_yyy Ordner ersetzt werden. Leider bin ich dabei kläglich gescheitert.

Kann mir das einer mal erklären wie das funktioniert bei phpBB?


Ich habe mal ein Beispiel vorbereitet:

index.php

Code: Alles auswählen

<?php

include('lang_test.php');


/* Datei als String einlesen */
function get_file_as_string($filename)
{
	$tmprslt = file($filename);
	$tmprslt = implode('',$tmprslt);
	return $tmprslt;
}

$ausgabe = get_file_as_string('template.tpl');
echo stripslashes($ausgabe);

echo "Test";

?>
Templatedatei:

Code: Alles auswählen

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Unbenanntes Dokument</title>
</head>

<body>
<b>{Text}</b>
</body>
</html>

Sprachdatei:

Code: Alles auswählen

<?php

$lang = array();
$lang['Text'] = "Das ist ein deutscher Text";

?>
Leider bekomme ich halt als Ausgabe nicht "Das ist ein deutscher Text" sondern {Text}.

Bitte um Hilfe.

Gruß
Thorsten
Zuletzt geändert von Sgt. Absolom am 02.11.2006 17:56, insgesamt 1-mal geändert.
Benutzeravatar
Ambience
Mitglied
Beiträge: 628
Registriert: 02.09.2006 11:28
Wohnort: daheim
Kontaktdaten:

Beitrag von Ambience »

vllt auch mal ersetzen?

das {YYYY} muss mit dem inhalt deiner variable ersetzt werden.
Sgt. Absolom
Mitglied
Beiträge: 103
Registriert: 27.07.2004 22:24
Wohnort: Eppelheim
Kontaktdaten:

Beitrag von Sgt. Absolom »

Das {YYYY} war nur ein Beispiel. Wenn du dir die 3 Dateien anschaust siehst du dass, das {Text} heißt in der Template Datei und $lang['Text'] in der Sprachdatei. Nur wird das {Text} nicht durch "das ist ein deutscher Text" ersetzt.
Benutzeravatar
gn#36
Ehrenadmin
Beiträge: 9313
Registriert: 01.10.2006 16:20
Wohnort: Ganz in der Nähe...
Kontaktdaten:

Beitrag von gn#36 »

Schau dir doch an wie das in der template.php gelöst wurde. Ein einfacher Ansatz wäre an dieser Stelle z.B.

Code: Alles auswählen

$tmprslt = str_replace('{Text}',$lang['Text'],$tmprslt);
Begegnungen mit dem Chaos sind fast unvermeidlich, Aber nicht katastrophal, solange man den Durchblick behält.
Übertreiben sollte man's im Forum aber nicht mit dem Chaos, denn da sollen ja andere durchblicken und nicht nur man selbst.
Sgt. Absolom
Mitglied
Beiträge: 103
Registriert: 27.07.2004 22:24
Wohnort: Eppelheim
Kontaktdaten:

Beitrag von Sgt. Absolom »

$tmprslt = str_replace('{Text}',$lang['Text'],$tmprslt);
Das ist nur eine Lösung, wenn man nur einen Sprachschlüssel hat. Das was zwischen den geschweiften Klammern ist ändert sich ja jedes mal.

Ich bin leider kein sonderlich guter Coder.

Ich brauche, wenn ich das richtig verstanden habe einen Mechanismus der folgendes tut:

{YYY} wird zu $lang['YYY'].

Ich habe eben mal versucht das so umzuformulieren, dass in der Template Datei direkt $lang['Text'] steht und dass das dann auch als Variable interpretiert wird. Hat aber nicht geklappt. Das wird als Text ausgegeben.

Wie gesagt wenn ich den Mechanismus verstehen würde, dann wäre das kein Problem. Vielleicht kann ja jemand mal die phpBB Funktionalität in mein Beispiel einbauen.

Sorry für den Umstand aber bin halt noch nicht so bewandert in der Materie und in den Büchern die ich gelesen habe ist so ein Beispiel nicht drin. Gibts vielleicht ein schön dokumentiertes Beispiel wo das erklärt ist, bzw. gibt es noch andere Möglichkeiten sowas zu realisieren?

Mir geht es halt darum das auch zu verstehen, weil ich das lernen möchte.

Gruß
Thorsten
Benutzeravatar
gn#36
Ehrenadmin
Beiträge: 9313
Registriert: 01.10.2006 16:20
Wohnort: Ganz in der Nähe...
Kontaktdaten:

Beitrag von gn#36 »

Schau dir die Funktion compile in der includes/template.php Datei genauer an, da wird das wichtigste im Prinzip gemacht.

Effektiv erledigt die Suche nach den Variablen diese Zeile:

Code: Alles auswählen

preg_match_all('#\{(([a-z0-9\-_]+?\.)+?)([a-z0-9\-_]+?)\}#is', $code, $varrefs);
EDIT: Sorry für den untersten Level ist das dieser Bereich:

Code: Alles auswählen

// This will handle the remaining root-level varrefs
		$code = preg_replace('#\{([a-z0-9\-_]*?)\}#is', '\' . ( ( isset($this->_tpldata[\'.\'][0][\'\1\']) ) ? $this->_tpldata[\'.\'][0][\'\1\'] : \'\' ) . \'', $code);
siehe auch http://de.php.net/preg_match_all.

Einfacher nachvollziehen kannst du das vielleicht, wenn du dir nach jedem Schritt den Code in der Funktion ausgeben lässt (nicht in einem laufenden Forum machen!) Also echos in die Funktion einbauen nach jedem Verarbeitungsschritt der den Code ändert, danach vielleicht sogar mit einem die(); beenden, damit nichts anderes als der Code mehr ausgegeben wird, dann nach und nach langsam vorarbeiten und ein kurzes Template verwenden (also vielleicht einfach eines erstellen, genauso eine kurze php Datei die das Templatesystem verwendet und das Template ausgibt, vielleicht 2 Zeilen Text mit einer Variable fürs erste). Ich denke dann wird das ganze schnell klar. Konzentrier dich erst mal auf die eine Funktion.
Begegnungen mit dem Chaos sind fast unvermeidlich, Aber nicht katastrophal, solange man den Durchblick behält.
Übertreiben sollte man's im Forum aber nicht mit dem Chaos, denn da sollen ja andere durchblicken und nicht nur man selbst.
Benutzeravatar
Dr.Death
Moderator
Moderator
Beiträge: 17399
Registriert: 23.04.2003 08:22
Wohnort: Xanten
Kontaktdaten:

Beitrag von Dr.Death »

Oder man schaut sich "Smarty" an:

http://smarty.php.net
Benutzeravatar
Ambience
Mitglied
Beiträge: 628
Registriert: 02.09.2006 11:28
Wohnort: daheim
Kontaktdaten:

Beitrag von Ambience »

schau dir mal mein (anfänger) template system an:

Code: Alles auswählen

<?php
class template
{
  //
  // You can change the settings here
  //
  var $left_delimeter = '{';
  var $right_delimeter = '}';
  
  var $left_comment = '\{\*';
  var $right_comment = '\*\}';
  
  var $templates_dir = 'templates/';
  var $template_ex = '.tpl';
  
  //
  // Please, do not change the following code
  //
  var $assigns = array();
  
  function assign($key, $value)
  {
    $this->assigns[$key] = $value;
  }
  
  function display($template_name)
  {
    // fetch file 
    $file = $this->templates_dir . $template_name . $this->template_ex;
    
    $file = file_get_contents($file);
    
    // replace comments
    $file = preg_replace('/(' . $this->left_comment . ')(.*?)(' . $this->right_comment . ')/is', '', $file);
    
    // replace code
    while(list($key, $value) = each($this->assigns))
    {
      $file = preg_replace('/(' . $this->left_delimeter . ')(' . $key . ')(' . $this->right_delimeter . ')/i', $value, $file);
    }
    
    // output
    echo $file;
  }
  
} //... end class
 
?>
und so wirds gemacht:

Code: Alles auswählen

<?php

include('template.class.php');

$tpl = new template();

$tpl->assign('YYYY', 'Das ist ein testtext');

$tpl->display('index');

?>
in deiner index.tpl musst du jetzt nurnoch {YYYY} machen und schon kommt testtext.

Gegebenfalls noch Ordner und endung in der classe anpassen
Sgt. Absolom
Mitglied
Beiträge: 103
Registriert: 27.07.2004 22:24
Wohnort: Eppelheim
Kontaktdaten:

Beitrag von Sgt. Absolom »

Ok danke. Da muss ich erstmal probieren. Bin aber jetzt erstmal bis Sonntag weg und kann nichts machen. Werde mal nächste Woche versuchen und mich dann nochmal melden. Weil jetzt so auf die schnelle hab ich das noch nicht verstanden.


EDIT:
@Ambience:

Also das obere ist die template.class.php und das untere ist dann die index.php?
In der Zeile:

Code: Alles auswählen

$tpl->assign('YYYY', 'Das ist ein testtext'); 
wird dann die Zuweisung gemacht. Allerdings wären dann die Sprachinformationen in der index.php und nicht in einem separaten Sprachverzeichnis oder?


EDIT2:
Also das Beispiel von Ambience habe ich jetzt glaube ich doch soweit verstanden. Nur wie gesagt würde ich gerne die Sprache nicht in die index.php mit reinmachen sondern die in ein extra Sprachverzeichnis auslagern.

Also:
index.php -> nur Funktionalität
index.tpl -> Design
lang_deutsch/lang_index.php -> Sprachausgaben.
Diese Trennung ist nötig, weil die Seite mehrsprachig werden soll. Und Smarty unterstützt das nicht, weil da eben die Sprache direkt in der php-Datei mit drin ist.


Gruß
Thorsten
Benutzeravatar
gn#36
Ehrenadmin
Beiträge: 9313
Registriert: 01.10.2006 16:20
Wohnort: Ganz in der Nähe...
Kontaktdaten:

Beitrag von gn#36 »

das ist kein Problem, schließlich kannst du mehr als nur eine Datei includieren.
Das ginge z.B. so:

Code: Alles auswählen

include('./lang_' . $aktuelle_sprache . '.php');
Setzt vorraus, dass du in $aktuelle_sprache den Namen der Sprache speicherst und die Datei im aktuellen Verzeichnis liegt und lang_name_der_sprache.php heißt, lässt sich aber dem Pfad entsprechend anpassen, wenn es also ein Verzeichnis pro Sprache geben soll, dann eben

Code: Alles auswählen

include('./lang_' . $aktuelle_sprache . '/lang_index.php');
Das könntest du natürlich auch so machen wie bei phpBB:

Code: Alles auswählen

include($phpbb_root_path . 'language/lang_' . $userdata['user_lang'] . ".$phpEx");
Wenn das für was anderes ist als phpBB macht das aber wohl keinen Sinn.
Begegnungen mit dem Chaos sind fast unvermeidlich, Aber nicht katastrophal, solange man den Durchblick behält.
Übertreiben sollte man's im Forum aber nicht mit dem Chaos, denn da sollen ja andere durchblicken und nicht nur man selbst.
Antworten

Zurück zu „Coding & Technik“