Teil 4 "Sprachdateien erstellen" aus der Serie "updatesichere Anpassungen in GX2"

Thema wurde von Nonito (Gambio), 1. Februar 2012 erstellt.

  1. Nonito (Gambio)

    Nonito (Gambio) Administrator

    Registriert seit:
    21. April 2011
    Beiträge:
    279
    Danke erhalten:
    134
    Danke vergeben:
    52
    Standardmäßig kommen alle Texte aus der Datenbank. Es besteht jedoch die Möglichkeit die Geltung einer Sprachvariablen aus der Datenbank zur Laufzeit mit der einer Variablen aus einer Spachdatei zu überschreiben. So haben Entwickler die Möglichkeit unsere Sprachvariablen aus der Datenbank komfortabel mit eigenen Sprachdateien zu verändern oder zu erweitern, ohne Gefahr zu laufen bei einem Shop-Update die Anpassungen zu verlieren.

    Im Verzeichnis lang/german/sections/_samples liegen für diesen Zweck Sprachdateien, die sämtliche Sprachvariablen enthalten, die aus der lang_german.conf stammen und wir in die Datenbank übernommen haben. Die einzelnen Sprachdateien können in das übergeordnete Verzeichnis "sections" kopiert und angepasst werden. Anstelle der Texte aus der Datenbank werden vom Shop dann die Texte aus diesen kopierten Sprachdateien verwendet.

    Es können für dieselbe "section" auch mehrere Sprachdateien platziert werden, die sich in ihrer Gültigkeit dann nicht überschreiben, sondern ergänzen. So können mehrere Entwickler an derselben Sache arbeiten.

    Hierfür muss lediglich der Dateiname erweitert werden. Aus "imagemap_editor.lang.inc.php" wird z.B. "imagemap_editor.ENTWICKLER1.lang.inc.php" und "imagemap_editor.ENTWICKLER2.lang.inc.php", usw.

    In den Sprachdateien selbst müssen dann nur noch die folgenden Änderungen am Format berücksichtigt werden:
    Code:
    $t_new_items_array = array
    (
      'button_general' => 'Allgemein',
      'button_flyover' => 'Flyover'
    );
    $t_language_text_section_content_array = array_merge(
    	$t_language_text_section_content_array, 
    	$t_new_items_array
    );
    
    Wer neue Template-Dateien erstellt und hierfür neue Sprachdateien benötigt, kann diese ebenfalls im sections-Verzeichnis ablegen. Die Namenskonvention bei Sprachdateien sieht wie folgt aus:

    entweder [SECTIONNAME].lang.inc.php
    oder [SECTIONNAME].[ZUSATZ].lang.inc.php

    [ZUSATZ] kann z.B. für eine Sortiernummer benutzt werden oder um einen Entwickler- oder Modulnamen unterzubringen. In den meisten Fällen wird diese zusätzliche Bezeichnung nicht benötigt.

    Der Inhalt dieser Sprachdatei wird mit folgendem Code in einer Template-Datei zur Verfügung gestellt:
    Code:
    {load_language_text section="[COLOR="red"][SECTIONNAME][/COLOR]"}
    
    Beispiel:

    Die neue Sprachdatei heißt "account_test.lang.inc.php" und wird mit diesem Code in einer neuen Template-Datei eingebunden:
    Code:
    {load_language_text section="account_test"}
    
    Innerhalb des Templates können die einzelnen Textvariablen in dem Format {$txt.TEXTVARIABLE} eingesetzt werden, z.B. {$txt.street} oder {$txt.city}

    Standardmäßig werden die Textvariablen mit dem Präfix "txt" bereitgestellt. In eine Template-Datei können auch mehrere Sprachdateien eingebunden werden. Um Konflikte bei den Namen der Textvariablen zu vermeiden, kann bei zusätzlich eingebundenen Sprachdateien ein abweichender Präfix angegeben werden:
    Code:
    {load_language_text section="buttons" [COLOR="red"]name="button"[/COLOR]}
    
    Die Texte aus der buttons-Section stehen dann mit dem Präfix "button" zur Verfügung, z.B. {$button.ok} oder {$button.edit}

    Die Inhalte aus den Sprachdateien lassen sich auch in einer PHP-Umgebung abrufen:
    Code:
    $coo_text_mgr = MainFactory::create_object('LanguageTextManager', array('account_test', $_SESSION['languages_id']) );
    $ok_button = $coo_text_mgr->get_text('ok');
    $cancel_button = $coo_text_mgr->get_text('cancel');
    
    Hier wird über die Factory ein Objekt vom Typ "LanguageTextManager" für die Section "account_test" erzeugt und mit der get_text()-Methode auf die Texte "ok" und "cancel" zugegriffen.

    Hinweis zum Cache:
    Nach dem Hinzufügen neuer Sprachdateien sollten über den Adminbereich auf der Seite "Cache leeren" die Punkte "Cache für Seitenausgabe leeren" und "Cache für Modulinformationen leeren" ausgeführt werden.
     
  2. Avenger

    Avenger G-WARD 2012/13/14/15

    Registriert seit:
    26. April 2011
    Beiträge:
    4.771
    Danke erhalten:
    1.478
    Danke vergeben:
    89
    Besser wäre es m.E. wenn die zusätzlich definiert werden könnten...

    Also in der DB schon vorhandene überschreiben, aber auch neue definieren.
     
  3. Nonito (Gambio)

    Nonito (Gambio) Administrator

    Registriert seit:
    21. April 2011
    Beiträge:
    279
    Danke erhalten:
    134
    Danke vergeben:
    52
    Da hast du recht! Das geht aber auch schon. Ich editiere eben nochmal die Anleitung ;)
     
  4. Pascal

    Pascal Aktives Mitglied

    Registriert seit:
    5. Februar 2012
    Beiträge:
    40
    Danke erhalten:
    0
    Danke vergeben:
    5
    Ich sehe das es schon zwei Monate her ist, als hier das letzte mal geschrieben wurde, ich stelle meine Frage denn noch...

    Wenn ich dies richtig verstanden habe, könnte ich aus der Vorlage unter /lang/german/sections/_samples die Datei "new_products.lang.inc.php" nehmen diese unter /lang/german/sections/ und dann mit meinen Werten ergänzen und gegebenefals bestehende überschreiben.

    PHP:
    <?php

    $t_language_text_section_content_array 
    = array
    (
      
    'heading_text' => 'Neue Artikel',
      
    'heading_advice' => 'Unsere Empfehlungen',
      
    'text_details' => 'Details',
    );

    ?>

    PHP:
    <?php

    $t_language_text_section_content_array 
    = array
    (
      
    'heading_text' => 'Meine Neue Artikel',
      
    'heading_advice' => 'Wir Empfehlen',
      
    'text_details' => 'Details',
      
    'mein_wert' => 'Neuer Text'
    );

    ?>
    aber dass funktioniert irgend wie nicht.

    ...sicher mache ich da irgend wo einen Überlegungsfehler.
    Vielleicht kann mir da ja jemand weiter helfen.
     
  5. Manni_HB

    Manni_HB G-WARD 2012/13/14/15

    Registriert seit:
    26. April 2011
    Beiträge:
    9.098
    Danke erhalten:
    1.540
    Danke vergeben:
    909
    Ort:
    Bremen
    Hallo Pascal,

    das versteh´ ich nun aber gar nicht - ich arbeite mit den Dingern ziemlich intensiv ... ohne Probs!
     
  6. Pascal

    Pascal Aktives Mitglied

    Registriert seit:
    5. Februar 2012
    Beiträge:
    40
    Danke erhalten:
    0
    Danke vergeben:
    5
    Hallo Manfred,

    Nun ich denke das dies ja schon richtig ist was ich gemacht habe oder?

    Ich habe in /admin/include/modules/new_product.php ein neues Feld generiert. Sogenannte Losnummer. Dies hatte ich auch schon vor dem SP1.1 am laufen.

    Nun dachte ich dass ich die Texte in eine seperate Sprachdatei lege, also nicht in /lang/german/admin/new_product sondern dann eben in
    /lang/german/section/new_products.1.lang.inc.php
    Mit dem Inhalt


    PHP:
    <?php

    $t_language_text_section_content_array 
    = array
        (
        
    'TEXT_PRODUCTS_LOSNUMMER' => 'Losnummer:',
        
    'BOX_SHIPPING_STATUS2' => 'Lieferstatus bei Ausverkauft'
        
    );

    ?>
    Wäre dies soweit korrekt?
     
  7. Manni_HB

    Manni_HB G-WARD 2012/13/14/15

    Registriert seit:
    26. April 2011
    Beiträge:
    9.098
    Danke erhalten:
    1.540
    Danke vergeben:
    909
    Ort:
    Bremen
    Versuch mal dies:
    PHP:
    $t_new_items_array = array (    
       
    'TEXT_PRODUCTS_LOSNUMMER' => 'Losnummer:',
       
    'BOX_SHIPPING_STATUS2' => 'Lieferstatus bei Ausverkauft'
     
    ); 
    $t_language_text_section_content_array array_merge
    (     
    $t_language_text_section_content_array,     
     
    $t_new_items_array 
    );
     
  8. Moritz (Gambio)

    Moritz (Gambio) Administrator

    Registriert seit:
    26. April 2011
    Beiträge:
    5.786
    Danke erhalten:
    2.692
    Danke vergeben:
    903
    Pascal, wie sprichst du denn die neuen Sprachvariablen an? Also welchen Aufruf machst du, der nicht funktioniert?
     
  9. Pascal

    Pascal Aktives Mitglied

    Registriert seit:
    5. Februar 2012
    Beiträge:
    40
    Danke erhalten:
    0
    Danke vergeben:
    5
    #9 Pascal, 3. April 2012
    Zuletzt bearbeitet: 3. April 2012
    Hallo Zusammen

    @Manfred
    Habe ich auch schon versucht, wobei dies ja nur eine Zusammenführung der Array ist.

    @Moritz
    HTML:
    <td><?php echo TEXT_PRODUCTS_LOSNUMMER; ?></td>
    
    oder aber auch schon so...
    HTML:
    <td><?php echo $txt.TEXT_PRODUCTS_LOSNUMMER; ?></td>
    
    ich habe jetzt gerade eine Test übersteuerung für "text_weight_unit" gemacht.
    Hierzu die "product_info.lang.inc.php" in "product_info.1.lang.inc.php" umbenennt und in /lang/german/section kopiert

    PHP:
    <?php

    $t_language_text_section_content_array 
    = array
    (
      
    'text_weight_unit' => ' g'
    );
    ?>

    cache geleert und voila dass geht...
     
  10. Moritz (Gambio)

    Moritz (Gambio) Administrator

    Registriert seit:
    26. April 2011
    Beiträge:
    5.786
    Danke erhalten:
    2.692
    Danke vergeben:
    903
    Da du dich nicht in einer Template-Datei, sondern in einer PHP-Datei befindest, muss der Aufruf wie folgt lauten:
    PHP:
    <td><?php 
    $coo_text_mgr 
    MainFactory::create_object('LanguageTextManager', array('new_products'$_SESSION['languages_id']) );
    echo 
    $coo_text_mgr->get_text('TEXT_PRODUCTS_LOSNUMMER');
    ?></td>
     
  11. Pascal

    Pascal Aktives Mitglied

    Registriert seit:
    5. Februar 2012
    Beiträge:
    40
    Danke erhalten:
    0
    Danke vergeben:
    5
    Hallo Moritz

    acho, ich muss das Object zuerst selber generieren...
    dann habe ich dies falsch verstanden.

    Besten Danke
    .. es geht jetzt.
     
  12. HolgerNils (xycons.de)

    HolgerNils (xycons.de) G-WARD 2013/2014

    Registriert seit:
    29. Oktober 2011
    Beiträge:
    1.972
    Danke erhalten:
    456
    Danke vergeben:
    369
    #12 HolgerNils (xycons.de), 21. Juli 2012
    Zuletzt bearbeitet: 21. Juli 2012
    Es gelingt mir nicht die Zuweisungen von /lang/german/gm_tell_a_friend.php auf der dargestellten Weise zu redefinieren. ;-(
    Die Datei gibts auch nicht als Vorlage unter _samples.
    Ich habe eine der Samples-Dateien genommen, umbenannt nach "gm_tell_a_friend.lang.inc.php" und dann den Inhalt wie in der Beispieldatei gestaltet.
    Aber pustekuchen. Wo ist mein Denkfehler (Cache geleert, yepp!)?
     
  13. Steffen (indiv-style.de)

    Steffen (indiv-style.de) G-WARD 2013/14/15/16

    Registriert seit:
    30. Juni 2011
    Beiträge:
    5.143
    Danke erhalten:
    1.466
    Danke vergeben:
    452
    Beruf:
    Systemadmin, Webentwickler bei Indiv-Style
    Ort:
    PhpStorm
    Geht das auch für den Adminbereich???

    Ich muss für den OnePage-Checkout einiges in die /lang/german/admin/configuration.php eintragen. Z.B.:
    PHP:
    define('CHECKOUT_SHOW_SHIPPING_MODULES_TITLE','Versandmodule aufgeklappt?');
    define('CHECKOUT_SHOW_SHIPPING_MODULES_DESC','Sollen die Versandmodule standardm&auml;&szlig;ig angezeigt werden?');
    define('CHECKOUT_SHOW_SHIPPING_ADDRESS_TITLE','Versandadresse aufgeklappt?');
    Allerdings finde ich keinen Sections-Ordner.
     
  14. Avenger

    Avenger G-WARD 2012/13/14/15

    Registriert seit:
    26. April 2011
    Beiträge:
    4.771
    Danke erhalten:
    1.478
    Danke vergeben:
    89
    Nein, im Admin klappt das so nicht, da die Einbindung der Sprachdateien ja über Smarty erfolgt, das ja im Admin nicht verwendet wird.

    Aber man kann das trotzdem updatesicher ändern.

    Ich würde das so machen:

    in "/lang/german/admin/pt_onestep_configuration.php" lege ich meine Definitionen an (evtl. auch im Verzeichnis "english")

    Im Verzeichnis "user_classes\overloads\AdminApplicationTopExtenderComponent\" lege ich ein Programm "pt_onestep_AdminApplicationTopExtender.inc.php" wie folgt an, in dem ich meine Sprachdatei lade, wenn "configuration.php" das aktuelle Programm ist (ungetestet):

    PHP:
    <?php
    /* --------------------------------------------------------------
    pt_onestep_AdminApplicationTopExtender.inc.php 2012-01-16 gm
    Gambio GmbH
    http://www.gambio.de
    Copyright (c) 2012 Gambio GmbH

    Copyright (c) 2012 Avenger, entwicklung@powertemplate.de
    General admin initialisations

    Released under the GNU General Public License (Version 2)
    [http://www.gnu.org/licenses/gpl-2.0.html]
    --------------------------------------------------------------
    */

    class pt_onestep_AdminApplicationTopExtender extends pt_onestep_AdminApplicationTopExtender_parent
    {
      function 
    proceed()
      {
        
    parent::proceed();
        if (
    basename($_SERVER['PHP_SELF'])==FILENAME_CONFIGURATION)
        {
          
    $file=DIR_FS_CATALOG.'lang/'.$_SESSION['language'].'/admin/pt_onestep_configuration.php';
          if (
    file_exists($file))
          {
            include(
    $file);
          }
        }
      }
    }
    ?>
    Das gleiche Verfahren kann ich auch für anderen Sprachdatei-Erweiterungen verwenden.
     
  15. Steffen (indiv-style.de)

    Steffen (indiv-style.de) G-WARD 2013/14/15/16

    Registriert seit:
    30. Juni 2011
    Beiträge:
    5.143
    Danke erhalten:
    1.466
    Danke vergeben:
    452
    Beruf:
    Systemadmin, Webentwickler bei Indiv-Style
    Ort:
    PhpStorm
    #15 Steffen (indiv-style.de), 6. August 2012
    Zuletzt bearbeitet: 6. August 2012
    Einbau ist ja simple aber:

    WARNING(2): "constant(): Couldn't find constant CHECKOUT_AJAX_STAT_TITLE" in /blabla/blablabla/htdocs/admin/configuration.php


    Er findet die Constanten nicht!
     
  16. Avenger

    Avenger G-WARD 2012/13/14/15

    Registriert seit:
    26. April 2011
    Beiträge:
    4.771
    Danke erhalten:
    1.478
    Danke vergeben:
    89
    Cache geleert?

    Sonst musst Du mit Deinem Debugger mal nachschauen, warum die Datei nicht geladen wird.
     
  17. Steffen (indiv-style.de)

    Steffen (indiv-style.de) G-WARD 2013/14/15/16

    Registriert seit:
    30. Juni 2011
    Beiträge:
    5.143
    Danke erhalten:
    1.466
    Danke vergeben:
    452
    Beruf:
    Systemadmin, Webentwickler bei Indiv-Style
    Ort:
    PhpStorm
    Die pt_onestep_AdminApplicationTopExtender.inc.php darf nicht in /user_classes/
    sondern muss in /system/overloads/AdminApplicationTopExtender Component/

    jetzt funktionierts prächtig!!!
     
  18. Avenger

    Avenger G-WARD 2012/13/14/15

    Registriert seit:
    26. April 2011
    Beiträge:
    4.771
    Danke erhalten:
    1.478
    Danke vergeben:
    89
    Nein, muss sie nicht.....

    Die muss auch in "/user_classes/overloads/AdminApplicationTopExtender Component/" funktionieren!

    Ich denke eher, der Cache war nicht geleert.....
     
  19. Steffen (indiv-style.de)

    Steffen (indiv-style.de) G-WARD 2013/14/15/16

    Registriert seit:
    30. Juni 2011
    Beiträge:
    5.143
    Danke erhalten:
    1.466
    Danke vergeben:
    452
    Beruf:
    Systemadmin, Webentwickler bei Indiv-Style
    Ort:
    PhpStorm
    Ich habe den Cache geleert! Sogar manuell alles raus gelöscht! Und es ging nicht. Der hat nicht darauf zugegriffen. Aber wieso gibts dann 2 Overloads-Ordner wo es funktionieren müsste???
     
  20. Avenger

    Avenger G-WARD 2012/13/14/15

    Registriert seit:
    26. April 2011
    Beiträge:
    4.771
    Danke erhalten:
    1.478
    Danke vergeben:
    89
    Der "system"-Order ist für die Gambios, der "user_classes"-Order für's gemeine Volk :)