xt:Commerce liefert von Haus aus diverse kleine Text-Stücke in den Sprachdateien mit, die im Template an unterschiedlichen Stellen eingesetzt werden. Die Verwaltung ist aber ein bisschen kompliziert - wenn man hier und da “eigene Texte” einbringen möchte, muss man bisweilen länger herumsuchen, bis man die richtigen Dateien im “lang”-Ordner und dort die entsprechenden Zeilen gefunden hat.

Außerdem ist es ärgerlich, dass nicht alle Textstücke in allen Template-Dateien zur Verfügung stehen. So funktioniert zum Beispiel {#title_viewed_products#} nur in der account.html, nicht aber in der index.html des Templates - man wird beim Template-Basteln oftmals dazu verführt, einige Textstücke einfach “hart” reinzuschreiben. Weil’s eben schneller geht.

Sollte man nicht tun - Richtig unbequem kann das bei mehrsprachigen Shops werden, vor allem wenn zusätzliche Module installiert sind.

 

Konstanten mit Smarty ausgeben

Wenn man eigene Textstücke für sein Template braucht, kann man diese auch zusammen mit seinem Template verwalten. So hat man alles im Überblick, in Dateien, die man selbst angelegt hat - und durch die man selbst auch noch durchsteigt.

Angenommen, ins neue Template müsste unbedingt das Wort “Käsebrot” mit rein. Wenn “Käsebrot” angezeigt werden soll, muss lediglich irgendwo eine Konstante KAESEBROT definiert werden … define('KAESEBROT','Käsebrot'); … und dann kann man dieses schöne Wort (übrigens in allen Template-Dateien) via {$smarty.const.KAESEBROT} anzeigen. Das funktioniert auch mit jeder anderen bekannten Konstanten.

Mein erster Tipp ist also, einfach eine eigene Datei mit den gewünschten Definitionen anzulegen und diese (am besten in der “boxes.php”) mit include(); oder require(); ins Template einzubinden. Das Mehrsprachigkeits-Problem besteht jedoch weiterhin. Daher brauchen wir noch einen “Umschalter”, damit die englischen Besucher auch ein “Cheese Sandwich” und kein “Käsebrot” sehen.

 

Sprachen umschalten - “langxtra”

Ich lege meine “Template spezifischen Sprach-Schnippsel” immer in einem Ordner namens “langxtra” direkt im Template ab.

In diesem Ordner kann man dann seine zusätzlichen Schnippsel in passend benannten Dateien abspeichern, Benennung à la “german.php”, “english.php”, “spanish.php” - Dabei müssen die Namen benutzt werden, die xt:Commerce für die jeweiligen Sprachen hat.

Die Ordner-Struktur sieht in etwa so aus:
Ordner-Struktur Sprachdateien

Damit je nach eingestellter Sprache auch die richtige Dateie ausgewählt wird, reichen drei Zeilen in der “boxes.php” des Templates aus:


define('DIR_FS_LANGXTRA',DIR_FS_CATALOG .'templates/'.CURRENT_TEMPLATE. '/langxtra/');
define('LANGXTRA',DIR_FS_LANGXTRA . $_SESSION['language'] . '.php');
if(file_exists(LANGXTRA)) require(LANGXTRA);
	

 

… und jetzt können mit {$smarty.const.KAESEBROT} die Deutschen ihr “Käsebrot”, die Engländer ihr “Cheese-Sandwich” und die Spanier ihr “Sándwich de queso” sehen. Zumindest dann, wenn eine german-, spanish- bzw. english.php mit den entsprechenden Definitionen hinterlegt wurde.

 

Smarty-Funktion {show}

Um weitere Möglichkeiten bei der Anzeige von Textstücken zu haben, habe ich eine Smarty-Funktion geschrieben, der man auch eigene Parameter übergeben kann. Damit sind u.a. auch verlinkte Hinweise wie “Klicken Sie hier, um weitere Informationen zu erhalten” kein Problem mehr.

Voraussetzung ist, dass man seinem xt:Commerce-Shop beigebracht hat, Smarty-PlugIns, Modifier oder Functions auch innerhalb des Templates zu suchen. Wie das geht, habe ich » hier beschrieben.

Der Rest ist easy: Einfach » downloaden und im zusätzlichen Smarty-Ordner ablegen.

Danach steht die neue Funktion zur Verfügung und man kann {show text=KAESEBROT} im Template einsetzen.

 

Platzhalter im Text nutzen

Man kann in seinen Text-Schnippseln beliebig viele (fast) beliebig benannte “Platzhalter-Bereiche” einbauen, die im Template dynamisch gefüllt werden können.


Beispiel: Dynamische Überschrift bei den Bestsellers

Angenommen, die Bestsellers-Box soll eine Headline à la “Unsere Top 10″ haben. Wenn man nur noch fünf Bestsellers anzeigen möchte, wäre es ja ganz schick, wenn sich die Headline automatisch von “Unsere Top 10″ auf “Unsere Top 5″ umstellen würde.

Dazu definiert man in der “german.php” …

define('OUR_TOPS','Unsere Top %num%');

… und in der “english.php” entsprechend …

define('OUR_TOPS','Our Top %num%');

… Spanisch kann ich leider nicht, also beschränken wir uns hier einfach mal auf zwei Sprachen :-) Jedenfalls kann man nun im Template mit …

{show text=OUR_TOPS num=$smarty.const.MAX_DISPLAY_BESTSELLERS}

… eine Überschrift erzeugen, die sich von alleine der aktuellen Konfiguration und der eingestellten Sprache des Shops anpasst.

Wichtig: Die Platzhalter müssen immer durch Prozent-Zeichen eingegrenzt werden. Und Platzhalter namens %text% funktionieren nicht.


Beispiel: Verlinkter Text

In der “german.php” definiert man dazu …

define('CLICK_HERE_FOR_INFO',
'Klicken Sie <a href="%link%">hier</a> f&uuml;r weitere Informationen');

… in der “english.php” entsprechend …

define('CLICK_HERE_FOR_INFO',
'Click <a href="%link%">here</a> for more information');

… und im Template dann … naja, wo auch immer in dem Fall der Link hinführen soll, vielleicht zum Produkt …?

{show text=CLICK_HERE_FOR_INFO link=$module_data.PRODUCTS_LINK}


Beispiel: “Zählen”

Manchmal müssen unterschiedliche Anzahlen (Singular, Plural) in den Textstücken berücksichtigt werden. Dafür gibt’s einen Umschalter mit drei Zuständen für “keins”, “eins” und “mehrere”. Das kann dann in etwa so aussehen …

define('ADRESSEN','Sie haben %num% %num:no=Adressen%
%num:one=Adresse% %num:more=Adressen% in Ihrem Adressbuch');

… und in der “address_book.html” hat man dann zwei Möglichkeiten - Entweder man übergibt dem Zähler-Platzhalter eine “echte Zahl”. Diese muss man jedoch manchmal erst ermitteln und der Smarty-Engine zuweisen …

{php}
$this->assign('zahl',count($this->_tpl_vars[addresses_data]));
{/php}
{show text=ADRESSEN num=$zahl}

… oder (sehr viel praktischer) man überlässt das Zählen der Funktion “show” - und übergibt (wie hier) gleich den gesamten Adressbuch-Inhalt - dessen Einträge werden dann automatisch gezählt …

{show text=ADRESSEN num=$addresses_data}

… und spart sich so Einiges an Schreib-Arbeit und Fummelkram.

Richtig, der Fall “0 Adressen” taucht in der Praxis nicht auf. Eine Adresse hat man immer. Ich hab’s nur der Vollständigkeit halber erwähnt. Ähnliches könnte man beispielsweise aber auch in den Suchergebnissen “x Produkt(e) gefunden” einbauen.

Übrigens: Im Gegensatz zu der üblichen Smarty-Textanzeige gibt’s keine leeren Textstellen, wenn eine Konstante in irgendeiner Sprache nicht gefunden wurde. Bei {#DOES_NOT_EXIST#} gibt es gar keine Ausgabe, während bei {show text=DOES_NOT_EXIST} immerhin “DOES_NOT_EXIST” angezeigt wird. So bleibt man als Besucher bei unvollständigen Übersetzungen nicht komplett im Regen stehen.

 

Kostenloser Download:

Installation: Die entpackte Datei im Smarty-PlugIn-Ordner ablegen. Nähere Infos zu “eigenen Smarty-PlugIns” finden Sie » in diesem Beitrag