Smarty Forum Index Smarty
The discussions here are for Smarty, a template engine for the PHP programming language.
Anreiz für Languagesystem

 
Post new topic   Reply to topic    Smarty Forum Index -> Language: German
View previous topic :: View next topic  
Author Message
Paykoman
Smarty Rookie


Joined: 07 May 2011
Posts: 34

PostPosted: Sun Jun 16, 2013 8:08 pm    Post subject: Anreiz für Languagesystem Reply with quote

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
View user's profile Send private message
Paykoman
Smarty Rookie


Joined: 07 May 2011
Posts: 34

PostPosted: Mon Jun 17, 2013 7:32 am    Post subject: Reply with quote

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:
Code:
{L c="002"}


L = Language
c = code

*gg*


Nun habe ich aber paar Zeilen auskommentiert weil das übergeben als var an smarty hat nicht funktioniert Sad

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
View user's profile Send private message
Grizzly
Smarty Regular


Joined: 15 Apr 2011
Posts: 95
Location: Germany

PostPosted: Mon Jun 17, 2013 9:24 am    Post subject: Reply with quote

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.
_________________
BASE4U - Deine Meinung ist Wichtig!
Back to top
View user's profile Send private message Visit poster's website
U.Tews
Administrator


Joined: 22 Nov 2006
Posts: 4507
Location: Hamburg / Germany

PostPosted: Mon Jun 17, 2013 12:15 pm    Post subject: Reply with quote

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
View user's profile Send private message
Paykoman
Smarty Rookie


Joined: 07 May 2011
Posts: 34

PostPosted: Mon Jun 17, 2013 8:01 pm    Post subject: Reply with quote

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
View user's profile Send private message
Fahrstuhllicht
Smarty Rookie


Joined: 10 Jun 2013
Posts: 15
Location: Berlin

PostPosted: Mon Jun 17, 2013 8:17 pm    Post subject: Reply with quote

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
View user's profile Send private message Send e-mail
Grizzly
Smarty Regular


Joined: 15 Apr 2011
Posts: 95
Location: Germany

PostPosted: Tue Jun 18, 2013 9:42 am    Post subject: Reply with quote

@Fahrstuhllicht: du gehst aber nicht bei jeder Sprachanfrage auf die DB oder?

@Paykoman: Ach so, okay!
_________________
BASE4U - Deine Meinung ist Wichtig!
Back to top
View user's profile Send private message Visit poster's website
U.Tews
Administrator


Joined: 22 Nov 2006
Posts: 4507
Location: Hamburg / Germany

PostPosted: Tue Jun 18, 2013 11:07 am    Post subject: Reply with quote

Eine andere Möglichkeit ist die Verwendung von Config Files.

Für jede Sprache ein Config File erzeugen und dann je nach Sprache laden.

Siehe http://www.smarty.net/docs/en/config.files.tpl
http://www.smarty.net/docs/en/language.config.variables.tpl
http://www.smarty.net/docs/en/api.config.load.tpl
Back to top
View user's profile Send private message
Fahrstuhllicht
Smarty Rookie


Joined: 10 Jun 2013
Posts: 15
Location: Berlin

PostPosted: Tue Jun 18, 2013 5:42 pm    Post subject: Reply with quote

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
View user's profile Send private message Send e-mail
Fahrstuhllicht
Smarty Rookie


Joined: 10 Jun 2013
Posts: 15
Location: Berlin

PostPosted: Sat Jun 22, 2013 5:24 pm    Post subject: Reply with quote

nicht gut ?
Back to top
View user's profile Send private message Send e-mail
Grizzly
Smarty Regular


Joined: 15 Apr 2011
Posts: 95
Location: Germany

PostPosted: Mon Jun 24, 2013 6:40 am    Post subject: Reply with quote

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
_________________
BASE4U - Deine Meinung ist Wichtig!
Back to top
View user's profile Send private message Visit poster's website
Display posts from previous:   
Post new topic   Reply to topic    Smarty Forum Index -> Language: German All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group
Protected by Anti-Spam ACP