Benutzer-Werkzeuge

Webseiten-Werkzeuge


dev:284:translate

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen RevisionVorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
dev:284:translate [19.07.2018 11:16] – [Allgemein] Manuela v.d.Deckendev:284:translate [31.08.2023 08:22] (aktuell) – [Wie wird Translate benutzt?] Manuela v.d.Decken
Zeile 6: Zeile 6:
 Der Einfachheit halber rede ich hier immer nur von 'Sprachdateien'. Real müssen die Übersetzungen jedoch längst nicht mehr zwingend in PHP-Dateien als Arrays definiert werden. Es ist jetzt jedes denkbare, geeignete Dateiformat möglich. Die Daten müssen nicht einmal auf dem selben Server liegen. Auch könnten die Daten durch einen WebService zur Verfügung gestellt oder in einer Datenbank abgelegt werden. Dazu ist einzig und allein jeweils ein kleiner, spezialisierter Treiber nötig, der jederzeit, auch temporär sogar für ein einzelnes Addon oder Template, eingebunden werden kann. Der Einfachheit halber rede ich hier immer nur von 'Sprachdateien'. Real müssen die Übersetzungen jedoch längst nicht mehr zwingend in PHP-Dateien als Arrays definiert werden. Es ist jetzt jedes denkbare, geeignete Dateiformat möglich. Die Daten müssen nicht einmal auf dem selben Server liegen. Auch könnten die Daten durch einen WebService zur Verfügung gestellt oder in einer Datenbank abgelegt werden. Dazu ist einzig und allein jeweils ein kleiner, spezialisierter Treiber nötig, der jederzeit, auch temporär sogar für ein einzelnes Addon oder Template, eingebunden werden kann.
  
-===== Historisches ===== +==== Aufbau der Sprachdateien (EN.php) ====
- +
-Die Zeiten, als in Addons die Übersetzungen noch mit solchen und ähnlichen, abenteuerlichen Konstrukten 'eingebaut' werden mussten, sind damit eindeutig Vergangenheit.<PHP> +
-// Load Language file +
-if(is_readable(WB_PATH.'/modules/MyModule/languages/EN.php')) { +
-    require_once(WB_PATH.'/modules/MyModule/languages/EN.php'); +
-}     +
-if(is_readable(WB_PATH.'/modules/MyModule/languages/'.DEFAULT_LANGUAGE.'.php')) { +
-    require_once(WB_PATH.'/modules/MyModule/languages/'.DEFAULT_LANGUAGE.'.php'); +
-}     +
-if(is_readable(WB_PATH.'/modules/MyModule/languages/'.USER_LANGUAGE.'.php')) { +
-    require_once(WB_PATH.'/modules/MyModule/languages/'.USER_LANGUAGE.'.php'); +
-}     +
-if(is_readable(WB_PATH.'/modules/MyModule/languages/'.LANGUAGE.'.php')) { +
-    require_once(WB_PATH.'/modules/MyModule/languages/'.LANGUAGE.'.php'); +
-}     +
-</PHP>Ab jetzt genügt ein einfaches: <php>$oTrans->enableAddon('modules\\MyModule');</php>  +
-und schon ist alles erledigt. +
- +
-Wenn jetzt die berechtigte Frage kommt: 'was ist dann alles erledigt?', dann einfach weiterlesen. +
-===== Allgemeiner Aufbau der Übersetzungs-Struktur ===== +
- +
- +
-==== Übersetzungen vor 2.10.0 ==== +
-Fangen wir beim Stand vor der 2.10.0. Im zentralen Sprachverzeichnis des Core existieren eine große Anzahl von Sprachdateien (DE.php | EN.php | usw.). Jede dieser Dateien enthält eine schier unüberschaubare Anzahl von Sprachvariablen (genauer gesagt, derzeit etwas über 600!!). Das benutzte System erfordert, dass in jeder Sprachdatei jeder Eintrag vorhanden ist. Fehlt einer, löst das im Benutzungsfall häufig einen Laufzeitfehler aus. Sobald WebsiteBaker startet, wird zwangsweise eine dieser Sprachdateien mit ihren vollen 600 Einträgen geladen. völlig unabhängig davon, ob auch nur ein einziger davon benötigt wird! Selbstverständlich laden dann verschiedene Addons ihre eigenen Sprachdateien noch zusätzlich dazu. Bei mehreren verschiedenen Addons auf einer Seite kann da zusätzlich noch eine ganz erkleckliche Anzahl zusammenkommen.\\ //(Aus historischen Zeiten sind da auch die längst veralteten Übersetzungen von sehr vielen uralten Modulen enthalten und eine wirkliche Pflege der Dateien ist, mit vernünftigem Zeit-/Arbeitsaufwand praktisch unmöglich. Wer was anderes behauptet, darf gerne ab sofort die Pflege dieser fossilen Dateien übernehmen.;-))//\\ +
-Ab 2.10.0 beginnt die schrittweise Umstellung auf **Translate**. Bis diese komplett abgeschlossen ist, bleiben parallel dazu die 'alten' Sprachvariablen funktionsfähig. +
-<div important>Die Benutzung der alten Sprachvariablen ist deprecatet!\\ Die alten Sprachvariablen werden mit Abschluss der Umstellung ohne extra Ankündigung aus dem System entfernt!</div> +
-=== Aufbau der Sprachdateien (EN.php) ===+
 Dies ist die bevorzugte und auch dringend empfohlene Art:\\ Dies ist die bevorzugte und auch dringend empfohlene Art:\\
 //(übersichtlich und schon im Texteditor einfach zu sortieren)// //(übersichtlich und schon im Texteditor einfach zu sortieren)//
-<PHP>+<code php>
 //Modul Description //Modul Description
 $module_description = 'Enter here a really short description of your module. About 200-250 characters should suffice.'; $module_description = 'Enter here a really short description of your module. About 200-250 characters should suffice.';
Zeile 46: Zeile 19:
 $MOD_MyModule['MESSAGE_ARCHIVE_DELETED'    = 'Zip(s) deleted successfully.'; $MOD_MyModule['MESSAGE_ARCHIVE_DELETED'    = 'Zip(s) deleted successfully.';
 $MOD_MyModule['MESSAGE_ARCHIVE_NOT_DELETED'] = 'Cannot delete the selected Zip(s).'; $MOD_MyModule['MESSAGE_ARCHIVE_NOT_DELETED'] = 'Cannot delete the selected Zip(s).';
-</PHP>+</code>
 manche schreiben die Einträge auch auf diese Art:\\ manche schreiben die Einträge auch auf diese Art:\\
 //(deutlich schwieriger zu lesen und nicht exakt sortierbar)// //(deutlich schwieriger zu lesen und nicht exakt sortierbar)//
-<PHP>+<code php>
 $MOD_MyModule['PRINT'                      = 'Please print this page, if a copy is desired for your records.'; $MOD_MyModule['PRINT'                      = 'Please print this page, if a copy is desired for your records.';
 $MOD_MyModule['LOAD_LAYOUT'                = 'Load Default Layout'; $MOD_MyModule['LOAD_LAYOUT'                = 'Load Default Layout';
Zeile 56: Zeile 29:
 $MOD_MyModule_MESSAGE['ARCHIVE_DELETED'    = 'Zip(s) deleted successfully.'; $MOD_MyModule_MESSAGE['ARCHIVE_DELETED'    = 'Zip(s) deleted successfully.';
 $MOD_MyModule_MESSAGE['ARCHIVE_NOT_DELETED'] = 'Cannot delete the selected Zip(s).'; $MOD_MyModule_MESSAGE['ARCHIVE_NOT_DELETED'] = 'Cannot delete the selected Zip(s).';
-</PHP>+</code>
 Das sieht nicht soo gut aus, aber es funktioniert. Beide Schreibweisen erzeugen jedenfalls die selben Translate-Schlüsselwörter. Das sieht nicht soo gut aus, aber es funktioniert. Beide Schreibweisen erzeugen jedenfalls die selben Translate-Schlüsselwörter.
-<PHP>+<code php>
 echo $oTrans->MOD_MyModule_PRINT; echo $oTrans->MOD_MyModule_PRINT;
 echo $oTrans->MOD_MyModule_LOAD_LAYOUT; echo $oTrans->MOD_MyModule_LOAD_LAYOUT;
Zeile 65: Zeile 38:
 echo $oTrans->MOD_MyModule_MESSAGE_ARCHIVE_DELETED; echo $oTrans->MOD_MyModule_MESSAGE_ARCHIVE_DELETED;
 echo $oTrans->MOD_MyModule_MESSAGE_ARCHIVE_NOT_DELETED; echo $oTrans->MOD_MyModule_MESSAGE_ARCHIVE_NOT_DELETED;
-</PHP>+</code>
 Zwingend ist derzeit jedoch noch der Präfix "$MOD_MyModule_" bzw."$MOD_MyModule[". Zwingend ist derzeit jedoch noch der Präfix "$MOD_MyModule_" bzw."$MOD_MyModule[".
 Nur so lassen sich ungewollte Überschneidungen der Schlüsselwörter verhindern. Nur so lassen sich ungewollte Überschneidungen der Schlüsselwörter verhindern.
  
-Solange jedoch die Variablen aus den Sprachdateien noch nach alter Prä-Translate-Methode benutzt werden+==== Aufbau der DB-Sprachtabelle ==== 
-<PHP>+FIXME 
 + 
 +===== Historisches ===== 
 +Fangen wir beim Stand vor der 2.10.0. Im zentralen Sprachverzeichnis des Core existieren eine große Anzahl von Sprachdateien (DE.php | EN.php | usw.). Ja, es waren noch reale Dateien!. Jede dieser Dateien enthält eine schier unüberschaubare Anzahl von Sprachvariablen (genauer gesagt, derzeit etwas über 600!!). Das benutzte System erfordert, dass in jeder Sprachdatei jeder Eintrag vorhanden ist. Fehlt einer, löst das im Benutzungsfall häufig einen Laufzeitfehler aus. Sobald WebsiteBaker startet, wird zwangsweise eine dieser Sprachdateien mit ihren vollen 600 Einträgen geladen. völlig unabhängig davon, ob auch nur ein einziger davon benötigt wird! Selbstverständlich laden dann verschiedene Addons ihre eigenen Sprachdateien noch zusätzlich dazu. Bei mehreren verschiedenen Addons auf einer Seite kann da zusätzlich noch eine ganz erkleckliche Anzahl zusammenkommen.\\ //(Aus historischen Zeiten sind da auch die längst veralteten Übersetzungen von sehr vielen uralten Modulen enthalten und eine wirkliche Pflege der Dateien ist, mit vernünftigem Zeit-/Arbeitsaufwand praktisch unmöglich. Wer was anderes behauptet, darf gerne ab sofort die Pflege dieser fossilen Dateien übernehmen.;-))//\\ 
 + 
 +Die Sprachdateien sowohl im Core als auch in Modulen mussten mit solchen und ähnlichenabenteuerlichen Konstrukten 'eingebaut' werden: 
 +<code php> 
 +// Load Language file 
 +if(is_readable(WB_PATH.'/modules/MyModule/languages/EN.php')) { 
 +    require_once(WB_PATH.'/modules/MyModule/languages/EN.php'); 
 +}     
 +if(is_readable(WB_PATH.'/modules/MyModule/languages/'.DEFAULT_LANGUAGE.'.php')) { 
 +    require_once(WB_PATH.'/modules/MyModule/languages/'.DEFAULT_LANGUAGE.'.php'); 
 +}     
 +if(is_readable(WB_PATH.'/modules/MyModule/languages/'.USER_LANGUAGE.'.php')) { 
 +    require_once(WB_PATH.'/modules/MyModule/languages/'.USER_LANGUAGE.'.php'); 
 +}     
 +if(is_readable(WB_PATH.'/modules/MyModule/languages/'.LANGUAGE.'.php')) { 
 +    require_once(WB_PATH.'/modules/MyModule/languages/'.LANGUAGE.'.php'); 
 +}     
 +</code> 
 +Die Ausgabe erfolgte nach dem rudimentären Muster: 
 +<code php>
 // Syntax Typ 1 // Syntax Typ 1
 global $MOD_MyModule; global $MOD_MyModule;
Zeile 81: Zeile 76:
 echo $MOD_MyModule_TEXT['GUEST']; echo $MOD_MyModule_TEXT['GUEST'];
 echo $MOD_MyModule_MESSAGE['ARCHIVE_DELETED']; echo $MOD_MyModule_MESSAGE['ARCHIVE_DELETED'];
-</PHP+</code
-solange kann auf die oft ellenlangen Präfixes leider noch nicht verzichtet werden.+Nach dieser alten Prä-Translate-Methode sind leider noch die teils ellenlangen Präfixes notwendig. 
 +<div important>Die Benutzung der alten Sprachvariablen ist deprecatet!\\ Die alten Sprachvariablen werden mit Abschluss der Umstellung auf **Translate** ohne extra Ankündigung aus dem System entfernt, was auch die obigen Ausgabemethoden entfernt.</div>
  
 +===== Die Zukunft =====
 +hat bereits begonnen.
 +<div info>Ab 2.10.0 beginnt die schrittweise Umstellung auf **Translate**. Bis diese komplett abgeschlossen ist, bleiben parallel dazu die 'alten' Sprachvariablen funktionsfähig.</div>
 +Wo die Umstellung schon erfolgte, genügt ab jetzt ein einfaches: <php>$oTrans->enableAddon('modules\\MyModule');</php> 
 +und schon ist alles erledigt.
  
 +Wenn jetzt die berechtigte Frage kommt: 'was ist dann alles erledigt?', dann einfach weiterlesen, wie **Translate** funktioniert.
  
- +===== Das Grundsystem hinter Translate =====
-==== Das Grundsystem hinter Translate ====+
 Translate basiert auf der Vorgabe, dass Sprachdateien grundsätzlich jeweils nur die für den jeweiligen Bereich notwendigen Einträge enthalten. Im Gegenzug werden relativ viele, kleine Sprachdateien eingesetzt. Jedes Addon, jede ACP-Erweiterung **muss** und sogar jedes einzelne Template/Theme **kann** seine eigenen Sprachdateien mitbringen.\\ Translate basiert auf der Vorgabe, dass Sprachdateien grundsätzlich jeweils nur die für den jeweiligen Bereich notwendigen Einträge enthalten. Im Gegenzug werden relativ viele, kleine Sprachdateien eingesetzt. Jedes Addon, jede ACP-Erweiterung **muss** und sogar jedes einzelne Template/Theme **kann** seine eigenen Sprachdateien mitbringen.\\
 Diese Aufteilung vereinfacht die Arbeit eines Entwicklers. Er muss nicht mehr 'halbwegs passende' Einträge in der zentralen Datei suchen und dort schon gar keine neuen Einträge hinzufügen, die dann in ~25 verschiedenen Sprachen gepflegt/übersetzt werden müssen. Als absolute Mindestanforderung genügt es völlig, eine Addon-spezifische Datei in der Systemsprache '//englisch//' mitzuliefern, die alle Texte eines Addons, abzüglich der zentralen Texte enthält.\\ Diese Aufteilung vereinfacht die Arbeit eines Entwicklers. Er muss nicht mehr 'halbwegs passende' Einträge in der zentralen Datei suchen und dort schon gar keine neuen Einträge hinzufügen, die dann in ~25 verschiedenen Sprachen gepflegt/übersetzt werden müssen. Als absolute Mindestanforderung genügt es völlig, eine Addon-spezifische Datei in der Systemsprache '//englisch//' mitzuliefern, die alle Texte eines Addons, abzüglich der zentralen Texte enthält.\\
Zeile 120: Zeile 121:
  
 Für Addon-Entwickler ist Translate sehr einfach einzusetzen. Die Grundinitialisierung wird **immer** automatisch vom Core vorgenommen und Addons haben damit überhaupt nichts zu schaffen. Bei älteren Addons, die noch PHP-Dateien enthalten, die direkt von außen aufgerufen werden müssen, sind 2 bis maximal 4 Translate-Methoden erforderlich (alle Kommandos werden in der Standalone-Form angegeben). Bedingung für den Einsatz von Translate ist, dass die Datei ''framework/initialize.php'' bereits geladen (included) ist: Für Addon-Entwickler ist Translate sehr einfach einzusetzen. Die Grundinitialisierung wird **immer** automatisch vom Core vorgenommen und Addons haben damit überhaupt nichts zu schaffen. Bei älteren Addons, die noch PHP-Dateien enthalten, die direkt von außen aufgerufen werden müssen, sind 2 bis maximal 4 Translate-Methoden erforderlich (alle Kommandos werden in der Standalone-Form angegeben). Bedingung für den Einsatz von Translate ist, dass die Datei ''framework/initialize.php'' bereits geladen (included) ist:
-  * <php>Translate::getInstance()->enableAddon('modules\\MeinAddon');</php> Dieser Befehl wird gleich zu Beginn einer aufgerufenen Datei eingesetzt. Dadurch werden eventuell vorhandene Sprachdateien dieses Addons aktiviert. Sollte noch ein anderes Addon aktiviert sein, wird dieses zuerst deaktiviert. +  * ''Translate::getInstance()->enableAddon('modules\\MeinAddon');'' Dieser Befehl wird gleich zu Beginn einer aufgerufenen Datei eingesetzt. Dadurch werden eventuell vorhandene Sprachdateien dieses Addons aktiviert. Sollte noch ein anderes Addon aktiviert sein, wird dieses zuerst deaktiviert. 
-  * <php>Translate::getInstance()->enableAddonTemplate('NameDesTemplates');</php> Dieser Befehl aktiviert bei Bedarf vorhandene Sprachdateien eines zugehörigen Templates. Wird kein 'NameDesTemplates' angegeben, wird nach dem allgemein eingestellten Template gesucht. Wird das nicht gefunden, erfolgt ein Fallback auf das Default-Template. +  * ''Translate::getInstance()->disableAddon();'' Mit diesem Kommando wird das aktive Addon mitsamt seinem Theme und/oder Template wieder von Translate getrennt. 
-  * <php>Translate::getInstance()->enableAddonTheme('NameDesThemes');</php> Dieser Befehl aktiviert bei Bedarf vorhandene Sprachdateien eines zugehörigen Themes. Wird kein 'NameDesThemes' angegeben, wird nach dem allgemein eingestellten Theme gesucht. Wird das nicht gefunden, erfolgt ein Fallback auf das Default-Theme. +<div info>Die folgenden Methoden stehen erst ab Template Version 1.0.0 zur Verfügung!</div> 
-  * <php>Translate::getInstance()->disableAddon();</php> Mit diesem Kommando wird das aktive Addon mitsamt seinem Theme und/oder Template wieder von Translate getrennt.+  * ''Translate::getInstance()->enableAddonTemplate('NameDesTemplates');'' Dieser Befehl aktiviert bei Bedarf vorhandene Sprachdateien eines zugehörigen Templates. Wird kein 'NameDesTemplates' angegeben, wird nach dem allgemein eingestellten Template gesucht. Wird das nicht gefunden, erfolgt ein Fallback auf das Default-Template. 
 +  * ''Translate::getInstance()->enableAddonTheme('NameDesThemes');'' Dieser Befehl aktiviert bei Bedarf vorhandene Sprachdateien eines zugehörigen Themes. Wird kein 'NameDesThemes' angegeben, wird nach dem allgemein eingestellten Theme gesucht. Wird das nicht gefunden, erfolgt ein Fallback auf das Default-Theme. 
 Einfacher noch geht es bei Addon-Dateien, die Core-gesteuert aufgerufen werden: Hier wird das Addon bereits vom Core aktiviert. Einzig das Template und/oder das Theme müssen derzeit noch vom Addon selbst aktiviert werden. Auch die Deaktivierung erfolgt automatisch durch den Core. Einfacher noch geht es bei Addon-Dateien, die Core-gesteuert aufgerufen werden: Hier wird das Addon bereits vom Core aktiviert. Einzig das Template und/oder das Theme müssen derzeit noch vom Addon selbst aktiviert werden. Auch die Deaktivierung erfolgt automatisch durch den Core.
  
 Jetzt müssen eigentlich nur noch die Übersetzungstexte von Translate abgerufen werden. Der einfachste Weg ist:\\ Jetzt müssen eigentlich nur noch die Übersetzungstexte von Translate abgerufen werden. Der einfachste Weg ist:\\
-<php> $oTrans = Translate::getInstance();</php>\\ +<code php>$oTrans = Translate::getInstance(); 
-<php> $sText = $oTrans->TEXT_CANCEL; </php>\\  +$sText = $oTrans->TEXT_CANCEL; 
-entspricht dem früheren\\  +// oder auch  
-<php> globals $TEXT; </php>\\ +$sText = Translate::getInstance()->TEXT_CANCEL; 
-<php> $sText = $TEXT['CANCEL']; </php>+</code
 +entspricht dem früheren 
 +<code php>$sText = $GLOBALS['TEXT']['CANCEL'];</code>
  
 Für ältere Addons existiert vorübergehend eine Methode, sämtliche Übersetzungstexte in einem Zug an die //**phplib**// Templateengine zu übergeben:\\ Für ältere Addons existiert vorübergehend eine Methode, sämtliche Übersetzungstexte in einem Zug an die //**phplib**// Templateengine zu übergeben:\\
-<php> $template->set_var(Translate::getInstance()->getLangArray()); </php> eingebunden werden die Texte im Template mit ''{TEXT_CANCEL}''+<code php> $template->set_var(Translate::getInstance()->getLangArray()); </code> eingebunden werden die Texte im Template mit ''{TEXT_CANCEL}''
 Das Problem bei dieser Methode ist, dass immer eine komplette Kopie der Übersetzungstabelle an die Templateengine übergeben wird. Das Problem bei dieser Methode ist, dass immer eine komplette Kopie der Übersetzungstabelle an die Templateengine übergeben wird.
  
-Wesentlich einfacher und platzsparender ist die Verwendung in Verbindung mit Twig, da hier nur eine speichersparende Referenz auf das Translateobjekt übergeben wird:\\ +Wesentlich einfacher und platzsparender ist die Verwendung in Verbindung mit Twig, da hier im Php-Code nur eine speichersparende Referenz auf das Translateobjekt übergeben wird: 
-<php> $aTwigData['Trans'] = Translate::getInstance(); </php> die Anzeige im Template erfolgt durch ''%%{{ Trans.TEXT_CANCEL }}%%''+<code php>$aTwigData['Trans'] = Translate::getInstance();</code> 
 +die Anzeige im Twig-Template erfolgt dann durch 
 +<code twig>{{ Trans.TEXT_CANCEL }}</code>
  
  
dev/284/translate.1531998969.txt.gz · Zuletzt geändert: 19.07.2018 11:16 von Manuela v.d.Decken