View previous topic :: View next topic |
Author |
Message |
Paykoman Smarty Rookie
Joined: 07 May 2011 Posts: 34
|
Posted: Sun Jun 16, 2013 8:08 pm Post subject: Anreiz für Languagesystem |
|
|
Hallo,
so nun habe ich das meiste meiner Grundstruktur fertig, jetzt wirds langsam Zeit das ich das Languagesystem einbaue.
Hier habe ich bereis ein sehr umfangreiches System im prozeduralem-Stil für mein altes Script geschrieben, es ist wirklich umfangreich und würde das gerne weiter verwenden.
Jedoch lief dies ohne eine Template-engine und die Übersetzungen wurden per array geladen wie zb. echo $lng['error_001'] mit smarty müsste ich dann jeden Sprachkey einzelnt in smarty einfügen nun kenn ich es von anderen System da wird es zbdirekt ins Template geschreiben {l s='dieser text wird übersetzt'}.
Nun würde ich mein sprachsystem dahingehend gerne erweitern so das ich wie vorher in den php dateien direkt per key zugreiffen kann aber das ichs auch direkt ins Template schreiben kann.
Leider habe ich noch überhauptkeine Ahnung womit ich anfangen muss damit smarty und das Sprachsystem dann zusammen arbeiten!
Hat da Jemand ein Tipp für mich? Wäre echt super!
MFG: Pay |
|
Back to top |
|
Paykoman Smarty Rookie
Joined: 07 May 2011 Posts: 34
|
Posted: Mon Jun 17, 2013 7:32 am Post subject: |
|
|
Oki doki,
habs geschaft hihi.
Code: | // neue Funktion definieren
function smarty_function_L($params, $template)
{
global $smarty;
global $lng;
$lng = array(
'001' => 'test1',
'002' => 'test2'
);
// $params['var'] = 'created';
// $result = $lng[$params['c']];
echo $lng[$params['c']];
# am Ende des Skripts wird an die var-Variable das Ergebnis übergeben
// $smarty->assign($params['var'], $result);
} |
Im Template dann:
L = Language
c = code
*gg*
Nun habe ich aber paar Zeilen auskommentiert weil das übergeben als var an smarty hat nicht funktioniert
Ich glaube mit dem echo ist es etwas unschön gelöst, aber vllt. hat ja Jemand nen tipp warum das so nicht geklappt hat dann würde ich das natürlich noch anpassen.
MFG: Pay |
|
Back to top |
|
Grizzly Smarty Pro
Joined: 15 Apr 2011 Posts: 172 Location: Germany
|
Posted: Mon Jun 17, 2013 9:24 am Post subject: |
|
|
Du kannst es schon als Array machen (als tipp vllt: coolere bezeichnungen als 001 und 002 usw. verwenden wie z. B. error.Text)
Ich gebe dir folgenden vorschlag. Mach z. B. einen Ordner für die Sprache z. B. für Englisch en und für Deutsch de. Dort fügst du das array $lang ein mit den Keys. Und je nach dem welche sprache gewählt ist, lädst du entweder die Datei aus dem "en" oder dem "de"-Ordner rein (kannst ja mittels sessions speichern). Somit hast du die $lang variable überall. Dann schreibst du dir ein Smarty-Plugin welches den Text anhand der (aktuellen) Sprache und keys ausgibt. Wenn es zum Beispiel den Key nicht gibt, wird halt der Key selbst ausgegeben.
Das ist nur ein Beispiel/Vorschlag. Ich persönlich finde es aber besser, als die "texte" in dem Smarty-Plugin ansich zu definieren. |
|
Back to top |
|
U.Tews Administrator
Joined: 22 Nov 2006 Posts: 5068 Location: Hamburg / Germany
|
Posted: Mon Jun 17, 2013 12:15 pm Post subject: |
|
|
Quote: | Nun habe ich aber paar Zeilen auskommentiert weil das übergeben als var an smarty hat nicht funktioniert
Ich glaube mit dem echo ist es etwas unschön gelöst, aber vllt. hat ja Jemand nen tipp warum das so nicht geklappt hat dann würde ich das natürlich noch anpassen. |
Wegen Laufzeitoptimierungen wird beim Laden eines Templates ein lokaler Varibalen-Scope erzeugt mit dem weitergearbeitet werden.
In Smarty Plugins daher nicht $smarty->assign() sondern $template->assign() verwenden.
In dem Fall das keine Variable assigned sondern das Ergebnis direkt ausgegeben werden soll nicht echo $lng[$params['c']]; sondern return $lng[$params['c']]; |
|
Back to top |
|
Paykoman Smarty Rookie
Joined: 07 May 2011 Posts: 34
|
Posted: Mon Jun 17, 2013 8:01 pm Post subject: |
|
|
Hallo,
dank euch zwei für die Antworten!
@Grizzly: Naja das war nur zur Demonstration und zumtesten da ich mich mit smarty noch nicht so auskenne musste ich erstmal die Funktionsweise simulieren.
Selbstverständlich habe ich die Sprachdateien in jeweilige ordner gespeichert und ich habe da wie schon erwähnt auch ein recht komplexes System geschreiben.
@U.Tews:
Vielen dank danach habe ich gesucht, ich werde es umgehend testen sobald ich die class fertig habe wo ich gerade den ganzen prozeduralen code in oop umsetze.
MFG: Pay |
|
Back to top |
|
Fahrstuhllicht Smarty Rookie
Joined: 10 Jun 2013 Posts: 15 Location: Berlin
|
Posted: Mon Jun 17, 2013 8:17 pm Post subject: |
|
|
Party funktioniert nicht auch return?
Ich habe es über eine DB umgesetzt. dort sind für die sprachen die wörter bzw. texte übersetzungen eingetragen. Bei Wunsch kann ich die Code´s hochladen. |
|
Back to top |
|
Grizzly Smarty Pro
Joined: 15 Apr 2011 Posts: 172 Location: Germany
|
Posted: Tue Jun 18, 2013 9:42 am Post subject: |
|
|
@Fahrstuhllicht: du gehst aber nicht bei jeder Sprachanfrage auf die DB oder?
@Paykoman: Ach so, okay! |
|
Back to top |
|
U.Tews Administrator
Joined: 22 Nov 2006 Posts: 5068 Location: Hamburg / Germany
|
|
Back to top |
|
Fahrstuhllicht Smarty Rookie
Joined: 10 Jun 2013 Posts: 15 Location: Berlin
|
Posted: Tue Jun 18, 2013 5:42 pm Post subject: |
|
|
Grizzly wrote: | @Fahrstuhllicht: du gehst aber nicht bei jeder Sprachanfrage auf die DB oder?
@Paykoman: Ach so, okay! |
Doch und es sind erst einmal keine spürbaren Probleme vorhanden.
Edit: Hier mein System:
Ich habe auf meiner Master.tpl 2 Flaggen eingefügt, die über die GET-Var die Sprache an die Sprache.php übermitteln.
In meiner Config-Datei habe ich die möglichen Sprachen deklariert und rufe diese ab. Meine Sprache.php hat folgenden Inhalt:
Code: | <?php
// Basic security check
if (!defined('baseDir')) die ('Direct access not allowed!');
$sprache = $_GET['language'];
//Sprachen aus der class.configuration
$langarray = config::get('LANGARRAY');
//zeichenerkennung
if(in_array($sprache, $langarray)){
session::set('sprache',$_GET['language']);
}
else{
headerRedirect("index.php?action=home");
}
headerRedirect("index.php?action=home");
?> |
Dann arbeitet eine translate.function.php mit den Wörtern:
Code: | <?php
// Basic security check
if (!defined('baseDir')) die ('Direct access not allowed!');
// Basic redirect function
function _translate($_language){
$_varsprache = session::get('sprache');
if(!empty($_varsprache)){
$_sprache = session::get('sprache');
}
else{
$_sprache = "DE_de";
}
$_key = $_language;
$query = "SELECT trans_langcode, trans_string, trans_word
FROM tt_sprache
WHERE trans_langcode = :trans_langcode
AND trans_word = (:trans_word)";
$db = db::getInstance();
$query = $db->prepare($query);
$query -> execute(array(':trans_langcode'=>$_sprache, ':trans_word'=>$_key));
$result = $query->fetch();
if(!empty($result['trans_string'])){ // Abfrage, ob in der Datenbank für das entsprechende Wort eine Übersetzung vorhanden ist
echo $result['trans_string'];
}
else{
echo $_key;
}
if(!empty($result['trans_word'])){ // Abfrage, ob das übergebene Wort in der DB vorhanden ist
}
else{
if(strpos($_key, "text_") !== false){ // Analysieren, ob das übergebene Wort ein Text ist
// Sobald das übergebene Wort ein Text ist, wird dieser ohne Übersetzung eingetragen
$insert = "INSERT INTO tt_sprache (trans_langcode, trans_word, trans_string)
VALUES (:trans_langcode,:trans_word,' ')";
$db = db::getInstance();
$insert = $db->prepare($insert);
$insert -> execute(array(':trans_langcode'=>$_sprache, ':trans_word'=>$_key,));
}
else{
if($_sprache == "DE_de"){ // Automatische Eintragung von der Übersetzung für die dt. Sprache
$insert = "INSERT INTO tt_sprache (trans_langcode, trans_word, trans_string)
VALUES (:trans_langcode,:trans_word, :trans_string)";
$db = db::getInstance();
$insert = $db->prepare($insert);
$insert -> execute(array(':trans_langcode'=>$_sprache, ':trans_word'=>$_key,':trans_string'=>$_key));
}
else{ // Außerhalb der dt. Sprache wird das Wort ohne Übersetzung eingetragen
$insert = "INSERT INTO tt_sprache (trans_langcode, trans_word, trans_string)
VALUES (:trans_langcode,:trans_word,' ')";
$db = db::getInstance();
$insert = $db->prepare($insert);
$insert -> execute(array(':trans_langcode'=>$_sprache, ':trans_word'=>$_key, ));
}
}
}
}
|
und zum Schluss wird für eine weitere function.translate.php, die als Plugin fungiert folgendes gemacht:
Code: | <?php
function smarty_function_translate($params, $smarty) {
// Some Basic configurations
// wir sind hier /libraries/Smarty/plugins wollen aber nach /
// dirname zeigt also zuviel an!
$path = dirname(__FILE__)."/../../../";
$path = realpath($path);
define('baseDir', $path);
// Include the Main file
require_once(baseDir.'/bootstrap.php');
return _translate($params['key']);
} |
So setze ich die Übersetzungen in die tpl´s ein:
Geht wahrscheinlich auch besser, aber ich bin auch nur blutiger Anfänger und habe das auch nur mit Hilfe so komplett hinbekommen.
Es funktioniert. Sofern ich mehr Sprachen benötige, muss ich die lediglich in meine Config nachtragen und ggf. die Übersetzungen eintragen. Code: | <h1>{translate key="Die Bewohner..."} </h1> |
und bei kompletten Texten: Code: | {translate key="text_rasse_absatz1"} |
Die Texte stehen komplett in der DB genauso wie einzelne Wörter. |
|
Back to top |
|
Fahrstuhllicht Smarty Rookie
Joined: 10 Jun 2013 Posts: 15 Location: Berlin
|
Posted: Sat Jun 22, 2013 5:24 pm Post subject: |
|
|
nicht gut ? |
|
Back to top |
|
Grizzly Smarty Pro
Joined: 15 Apr 2011 Posts: 172 Location: Germany
|
Posted: Mon Jun 24, 2013 6:40 am Post subject: |
|
|
Naja was heißt nicht gut? Solange es funktioniert ist es schon gut xD
Was passiert wenn du den Key "key1" 5 mal in der Seite brauchst? Es wird 5 mal auf die DB gegangen und der Wert geholt. Das ist natürlich nicht gut. Du müsstest das ganze iwie cachen oder für den Benutzer in einer Session speichern oder so. Oder du machst es mit Dateien (wie oben schon besprochen). Was du auch machen kannst eine art Kombination aus beidem. Die Werte werden in der DB gespeichert und alle X Tage werden dann alle Daten geholt und in eine Datei als Array gespeichert... (z. B.)
Weil so wie du es momentan hast ist es nicht performant |
|
Back to top |
|
|