WebsiteBaker Community Forum
WebsiteBaker Support (2.8.x) =>
Hilfe & Support (deutsch) => General Help & Support => Diskussion über WB (closed) => Topic started by: Stefek on September 10, 2010, 04:39:39 PM
-
Hallo,
[ NOTE: obwohl dies ein gangbarer Weg ist, im nächsten Post ist ein weiterer möglicher Ansatz, wie man das ledige Problem angehen kann - Stefek]
sicher hat sich schon manch ein Modulentwickler darüber geärgert, dass man die Language Files immer vollständig anpassen muss, wenn man mehrere Sprachfiles erstellt, um das Module in mehreren Sprachen anzubieten (multilanguage).
Ich arbeite neuerdings zwar gerne mit Thorns PMF an Modulen (weil es eine praktische Funktionssammlung ist), aber ich will auch eine Herangehensweise vorstellen, die für die "Standardsverfahrens weise" von WB geeignet ist.
Das Prinzip ist denkbar einfach und wenn Du bereits an Modulen gearbeitet hast, wirst Du diese Lösung möglicherweise begrüßen.
Auch für die Core-Files dürfte es von Nutzen sein, denn schließlich gibt es mittlerweile eine Menge Sprachpakete und ich kann mir vorstellen, dass es eine ziemliche "Bremse" für Veröffentlichungen sein kann, wenn man auf die verschiedenen Übersetzungen warten muss.
WAS TUT ES?
Die Herangehensweise ermöglicht es, neue Indexes zum ENglischen Sprachfile hinzuzufügen und dann weiter zu arbeiten, ohne auch die anderen Sprachfiles anzupassen.
Normallerweise ist es so, dass sich NOTICES einschalten Notice: Undefined index: BLABLA in C:\xampp\htdocs\ wenn man in WB eine andere Sprache als EN eingestellt hat und da eben diese Übersetzungen noch fehlen.
Mit dieser Methode ist es nicht mehr der Fall.
Alles was übersetz ist, ist übersetzt und was nicht -> hier wird dann auf die EN.php und das englische Sprach-Array zurückgegriffen.
Hier ein Beispiela anhand des NEWS Modules:
<?php
//Modul Description
$module_description = 'Mit diesem Modul können sie eine News Seite ihrer Seite hinzufügen.';
/**
* include original Language Array as fallback for non existing indexes
*/
require('EN.php');
/**
Generate Language Array for the specified Language
*/
$MOD_NEWS_de = array(
//index => value
//Variables for the backend
// 'SETTINGS' => 'News Einstellungen',
//Variables for the frontend
'TEXT_READ_MORE' => 'Weiterlesen',
'TEXT_POSTED_BY' => 'Veröffentlicht von',
'TEXT_ON' => 'am',
'TEXT_LAST_CHANGED' => 'Zuletzt geändert am',
'TEXT_AT' => 'um',
'TEXT_BACK' => 'Zurück',
'TEXT_COMMENTS' => 'Kommentare',
'TEXT_COMMENT' => 'Kommentar',
'TEXT_ADD_COMMENT' => 'Kommentar hinzufügen',
'TEXT_BY' => 'von',
'PAGE_NOT_FOUND' => 'Seite nicht gefunden',
);
/*
Now, merge the arrays for the final Output.
*/
$MOD_NEWS = array_merge($MOD_NEWS, $MOD_NEWS_de);
/*
The function 'array_merge()' will replace EN indexes by
those from the new LANGUAGE array but will keep all
NOT specified indexes an its values intact.
*/
/* TEST Array Output */
// print '<pre>';
// print_r($MOD_NEWS);
// print '</pre>';
$TEXT['UNKNOWN'] = 'Gast';
?>
Es wird zuerst das EN Array herangezogen, dann das DE geschaffen, dann werden beide mit array_merge() verschmolzen, sodass fehlende Indizes der neuen Sprache aus der originalsprache beibehalten werden.
Feedback willkommen.
Ich hoffe natürlich, Euch damit ein wenig Frustration beim nächsten Projekt ersparen zu können.
Frohes Backen,
Stefek
P.S. Im Anhang findet ihr die so angepasste DE.php des Newsmoduls als Beispiel und zum unmittelbaren Testen. Achtet darauf, dass ich dort die deutsche Übersetzung für 'SETTINGS' auskommentiert habe.
[gelöscht durch Administrator]
-
das geht auch noch ein klein wenig einfacher:
in den aktuellen Sprachmodulen werden die Arrays nicht explizit angelegt, sondern einfach durch Zuweisung von Werten initialisiert.
Das ermöglicht jetzt eine ganz simple Vorgehensweise:
Die EN.php wird grundsätzlich primär gepflegt und enthält alle Texte.
Alle anderen Sprachen werden sukkzesive gelegentlich 'nachgezogen'.
jetzt genügt ein einfaches
<?php
include('EN.php');
include('DE.php');
?>
(natürlich mit entsprechenden 'if exists' - Abfragen etc.)
Was passiert:
durch den Include der EN.php werden sämtliche Sprachvariablen wie gewohnt angelegt.
wird jetzt noch eine 2. Sprache (hier DE.php) includiert, so erfolgt einfach eine Neuzuweisung der Werte zu den bereits bestehenden Arrayelementen. D.h., dass die englischen Texte durch die Texte der 2. Sprache einfach überschrieben werden. Fehlt in der 2. Sprache ein Key-Value Paar, passiert nichts weiter, als dass das im Englischen bereits includierte Paar seinen englischen Wert behält.
Die 'Beschreibungsvariab len'
<?php
$language_code = 'EN';
$language_name = 'English';
$language_version = '2.8';
$language_platform = '2.8.x';
$language_author = 'Ryan Djurovich, Christian Sommer';
$language_license = 'GNU General Public License';
?>
enthalten danach die Werte aus der zuletzt includierten Sprachdatei, da auch sie überschrieben werden.
Stefeks Methode funktioniert auch problemlos, erfordert jedoch erstens eine Änderung an der Struktur der Sprachdateien und zweitens ist bei 95% der Coder der Befehl 'unset($variable)' leider unbekannt, so dass bei array_merge() für die ganze Laufzeit der 3-fache Speicherplatz für die Sprachvariablen belegt bleibt (Sprache1 + Sprache2 + Mergeresult).
-
Du hast Recht.
Damit geht es einfacher.
Warum wird dann nicht die eigens dafür angedachte (aber nicht mal in Coremodulen verwendete Funktion) entsprechend angepasst?
<?php
// function to obtain the module language file depending on the backend language of the current user
if (!function_exists('get_module_language_file')) {
function get_module_language_file($mymod_dir) {
$mymod_dir = strip_tags($mymod_dir);
if(file_exists(WB_PATH .'/modules/' .$mymod_dir .'/languages/' .LANGUAGE .'.php')) {
// a module language file exists for the users backend language
return (WB_PATH .'/modules/' .$mymod_dir .'/languages/' .LANGUAGE .'.php');
} else {
// an English module language file must exist in all multi-lingual modules
if(file_exists(WB_PATH .'/modules/' .$mymod_dir .'/languages/EN.php')) {
return (WB_PATH .'/modules/' .$mymod_dir .'/languages/EN.php');
} else {
echo '<p><strong>Error: </strong>';
echo 'Default language file (EN.php) of module "' .htmlentities($mymod_dir) .'" does not exist.</p><br />';
return false;
}
}
}
}
Das würde doch auf jeden Fall nützlich sein, wenn sie angepasst ist und auch besser bekannt.
Gruß,
Stefek
-
step by step... ;)
Ich hab's gerade noch als 'Schönheitskorrektur' eingestuft, bis noch ein paar weitere, wichtigere Teile bereinigt sind.
-
So so,
ich verliere im Moment leider die Brotkrümmel aus der Sicht.
Aber wenn Du es sagst, dann hoffe ich mal was.
Gruß,
Stefek