Page 1 of 2

Zweisprachigkeit: Navigationsleisten-Links

Posted: Fri Jul 04, 2008 11:54 am
by goethe
Hallo,

ich verwende für einen Blog das Bullet-Proof-Template, damit über dem Banner eine Navigation angezeigt wird.
Im Blog erscheinen Inhalte in zwei Sprachen, mittels der Plugins Sprachauswahl und des HTML nuggets für Sprachen.

Gibt es eine Möglichkeit die Navigation über dem Banner auch in beiden Sprachversionen anzeigen zu lassen?

Nehmen wir als Beispiel den Punkt "Kontakt" / "Contact".


Und eine weitere Frage zur Zweisprachigkeit. Es gibt Elemente, die bei Sprachwechsel (Plugin:Sprachauswahl) ebenfalls auf die neue Sprache umstellen, aber eben auch Elemente, die sich davon nicht berühren lassen.

Ein Element, dass davon "unberührt" bleibt ist z.B. das Plugin "Artikel Tags" oder "Syndicate this Blog".
Wie kann man das steuern?

Re: Zweisprachigkeit: Navigationsleisten-Links

Posted: Fri Jul 04, 2008 12:42 pm
by garvinhicking
Hi!

Leider nein, die Konfiguration des Bulletproof-Templates lässt sich so ohne weiteres nicht auf Sprachversionen ausweiten.

Du müsstest dafür vermutlich das index.tpl template selbst in einem Editor anpassen um dort die gerade aktive Sprachvariante zu prüfen (über Smarty If-Abfragen) und dann die korrekte Navigationsbezeichnung einzufügen.

Etwas sexier kann man das dann lösen indem man Sprachkonstanten einsetzt, die man in dem jeweiligen Sprach-Include definiert. Und dann gibt man die Konstanten im Template aus, ansteller von Begriffen die man in den Bulletproof-Optionen festlegt. Dort gibt man dann nur den Konstantennamen ein.

Da das etwas komplex ist, sag mir erstmal ob Du das machen willst. Wenn ja, kann ich das mit den Sprachkonstanten noch genauer erklären.
Ein Element, dass davon "unberührt" bleibt ist z.B. das Plugin "Artikel Tags" oder "Syndicate this Blog".
Wie kann man das steuern?
Hier gilt dasselbe, Konfigurationswerte von Plugins und Templates speichern in der Datenbank fest einen Stringwert, da es für unterschiedliche Sprachen keine eigenen Felder gibt. Man kann das nur lösen indem man der Datenbank Konstantennamen vortäuscht die man dann definiert und über Template-Modifikationen ausliest.

Geht also alles, ist nur nahe dran an Programmierung. ;)

Grüße,
Garvin

Posted: Fri Jul 04, 2008 6:00 pm
by goethe
Hi,

kannst du das vielleicht genauer erklären?

Vielen Dank!

Posted: Fri Jul 04, 2008 9:57 pm
by garvinhicking
Hi!

Mache ich gerne, gib mirallerdings bitte Zeit bis Montag, ich bin am Wochenende unterwegs :)

Viele Grüße,
Garvin

Posted: Mon Jul 07, 2008 1:01 pm
by garvinhicking
Hi!

Also, sagen wir Du willst den Titel des Plugins "Freie Artikel-Tags" sprachabhängig haben.

Dazu ist folgendes zu tun:

1. In der normalen s9y Pluginadministration das Plugin "Freie Artikel-Tags" konfigurieren. Als Titel trägst Du ein "MEIN_TAGTITEL".

2. Nun hast Du eine Sprachkonstante namens "MEIN_TAGTITEL" eingetragen und vorgesehen. Du musst nun für alle verfügbaren Sprachen diese Konstante definieren. Dazu erstellst Du in deinem Template-Verzeichnis jeweils eine lang_de.inc.php, lang_it.inc.php, lang_en.inc.php usw. (für jedes Sprachkürzel eine Datei). Dasselbe musst Du auch im UTF-8 Unterverzeichnis tun, so dass Du am Ende folgende Dateien für Deutsch und Englisch hättest:

templates/bulletproof/lang_de.inc.php
templates/bulletproof/lang_en.inc.php
templates/bulletproof/UTF-8/lang_de.inc.php
templates/bulletproof/UTF-8/lang_en.inc.php

In diese Datei trägst Du am Ende jeweils folgendes ein:

(lang_de.inc.php)

Code: Select all

@define('MEIN_TAGTITEL', 'Freie Artikel-Tags, Deutsch');
(lang_en.inc.php)

Code: Select all

@define('MEIN_TAGTITEL', 'Article tags, English');
Die Dateie im Stammverzeichnis müssen mit ISO-8859-1 Kodierung gespeichert sein, die Dateien in UTF-8/ müssen als UTF-8 Zeichensatz gespeichert sein.

Jetzt hat man seine Sprachkonstanten im Template und muss dafür sorgen, dass die auch ausgewertet werden.

3. Dazu nimmt man sich der Datei "sidebar.tpl" an. Da wird der Plugin-Seitenleistentitel immer ausgegeben. Im Bulletproof-Template sieht das so aus:

Code: Select all

            <h3 class="serendipitySideBarTitle {$item.class}">{$item.title}</h3>
Standardmäßig landet in $item.title genau die Zeichenkette die man im Plugin eingetragen hat. Bei uns wäre das also "MEIN_TAGTITEL". Damit diese Variable brav aber als sprachabhängige Zeichenkette ausgegeben wird, muss man dafür sorgen dass nicht die ZEichenkette selbst dargestellt wird, sondern der Inhalt der so benannten Sprachkonstante.

Dazu ändert man die Abfrage wie folgt ab:

Code: Select all

            <h3 class="serendipitySideBarTitle {$item.class}">{$item.title|serendipity_constant}</h3>
Das sorgt dafür, dass eine Smarty-Funktion namens "serendipity_constant" aufgerufen wird, als Parameter wird der Name der Konstanten übermittlet.

4. Diese Funktion gibt es aber noch nicht, daher müssen wir sie in der templates/config.inc.php erstellen/anpassen. Der folgende Code kann an beliebiger Stelle eingebunden werden, am sinnvollsten nach dem $serendipity['smarty']->assign(...) Befehl in Zeile 14:

Code: Select all

function serendipity_constant($zeichenkette) {
  if (defined($zeichenkette)) {
    return constant($zeichenkette);
  } else {
    return $zeichenkette;
  }
}
$serendipity['smarty']->register_modifier('serendipity_constant', 'serendipity_constant');
Der Modifier (streng genommen ist es keine Smarty-Funktion) sorgt dann dafür, dass die Konstante geliefert wird wenn eine existiert.

Nun sollte beim Aufruf des Blogs also der Inhalt der vom Besucher abhängigen Sprache da stehen.

Analog kann man das ganze für die Navigation durchführen:

1. Namen einer Konstante als Menüpunktnamen hinterlegen.
2. Sprachkonstanten in Sprachvariablendateien einbauen.
3. Smarty-Modifier in der config.inc.php einbauen.
4. Diesmal die index.tpl statt sidebar.tpl bearbeiten, und dort bei der Navigationsausgabe anstelle von:

Code: Select all

                    {foreach from=$navlinks item="navlink" name=navbar}
                        <li class="{if $currpage==$navlink.href}currentpage{/if}{if $smarty.foreach.navbar.first} navlink_first{/if}{if $smarty.foreach.navbar.last} navlink_last{/if}"><a href="{$navlink.href}" title="{$navlink.title}">{$navlink.title}</a></li>
                    {/foreach}
lieber folgendes nutzen:

Code: Select all

                    {foreach from=$navlinks item="navlink" name=navbar}
                        <li class="{if $currpage==$navlink.href}currentpage{/if}{if $smarty.foreach.navbar.first} navlink_first{/if}{if $smarty.foreach.navbar.last} navlink_last{/if}"><a href="{$navlink.href}" title="{$navlink.title|@serendipity_constant}">{$navlink.title|@serendipity_constant}</a></li>
                    {/foreach}
Sprich, überall wo man eigentlich Sprachkonstanten eingibt muss der |serendipity_constant modifier angehangen werden, damit eine Konstante in eine Zeichenkette umgewandelt wird.

Grüße,
Garvin

Posted: Mon Jul 07, 2008 3:55 pm
by goethe
Vielen Dank Garvin, super Hilfe!

Posted: Mon Jul 14, 2008 1:34 pm
by goethe
Hallo Garvin,

leider klappt das nicht bei mir.
Ich habe versucht, alles wie in der Anleitung umzusetzen.
Am Ende zeigt er mir nur noch eine weiße Seite an.

Ist da vielleicht irgendwo ein Fehler drin?

Posted: Mon Jul 14, 2008 1:40 pm
by garvinhicking
Hi!

Eine weiße Seite heißt meist, dass PHP Parse Error vorliegen. Hast Du Zugriff auf deine PHP Errorlogs?

Wie sieht deine config.inc.php denn jetzt aus, wo hast Du da genau die serendipity_constant Funktion mit eingebaut?

Ab welchem Punkt erhälst Du die weiße Seite?

Grüße,
Garvin

Posted: Mon Jul 14, 2008 1:57 pm
by goethe
Leider nicht.

Ich habe es hier eingebaut:
$serendipity['smarty']->assign(array('currpage'=> "http://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']));

function serendipity_constant($zeichenkette) {
if (defined($zeichenkette)) {
return constant($zeichenkette)
} else {
return $zeichenkette;
}
}
$serendipity['smarty']->register_modifier('serendipity_constant', 'serendipity_constant');


if ($serendipity['GET']['adminModule'] == 'templates') {
$css_files = glob(dirname(__FILE__) . '/*_style.css');
foreach($css_files AS $css_file) {
$css_file = str_replace('_style.css', '', basename($css_file));
if (!isset($colorsets[$css_file])) {
$colorsets[$css_file] = $css_file;
}
}
}
Die weiße Seite erhalte ich, wenn ich die Sidebar.tpl bearbeitet habe und dann die Config.inc.php

Kommentiere ich die Änderungen in der Config aus, steht folgendes da:
Fatal error: Smarty error: [in file:D:/blog/testblog2/templates/building-bridges/sidebar.tpl line 11]: [plugin] (secure mode) modifier 'serendipity_constant' is not allowed (core.load_plugins.php, line 118) in D:\blog\testblog2\bundled-libs\Smarty\libs\Smarty.class.php on line 1095

Posted: Mon Jul 14, 2008 2:00 pm
by garvinhicking
Hi!

Mach mal aus dem

Code: Select all

return constant($zeichenkette) 
ein

Code: Select all

return constant($zeichenkette);
Also auf's Semikolon am Ende achten.

Grüße,
Garvin

Posted: Mon Jul 14, 2008 2:42 pm
by goethe
super, jetzt klappts!

Zweisprachigkeit bei Kategorien

Posted: Mon Aug 18, 2008 9:37 am
by goethe
Hallo,

kann man auch einzelne Kategoriepunkte in verschiedenen Sprachen anlegen?

Besten Dank!

Re: Zweisprachigkeit bei Kategorien

Posted: Mon Aug 18, 2008 1:04 pm
by garvinhicking
kann man auch einzelne Kategoriepunkte in verschiedenen Sprachen anlegen?
Ja, dafür kann man meine Beschreibung auch nutzen. Man muss das Konzept dann nur auf die plugin_categories.tpl übertragen.

Grüße,
Garvin

Re: Zweisprachigkeit: Navigationsleisten-Links

Posted: Thu May 12, 2011 11:57 am
by goethe
Hallo zusammen,

ich habe das obige Beispiel für unsere Seitennavigation genutzt. Das heißt,
  • 1. in der config.inc.php den Block

    Code: Select all

    function serendipity_constant($zeichenkette) {
      if (defined($zeichenkette)) {
        return constant($zeichenkette);
      } else {
        return $zeichenkette;
      }
    }
    $serendipity['smarty']->register_modifier('serendipity_constant', 'serendipity_constant');
    hinzugefügt
  • 2. In der index.tpl an allen Stellen, an denen

    Code: Select all

    title="{$navlink.title}">{$navlink.title}
    vorkommt, durch

    Code: Select all

    title="{$navlink.title|@serendipity_constant}">{$navlink.title|@serendipity_constant}
    ersetzt.
  • 3. Zwei Sprachdateien im Templateverzeichnis (neue_Vorlage) und neue_Vorlage/UTF-8 angelegt.
    lang_de.inc.php:

    Code: Select all

    <?php
    @define('MENU_1', 'Start');
    @define('MENU_1', 'Kultur');
    @define('MENU_1', 'Tagebuch');
    und
    lang_en.inc.php:

    Code: Select all

    <?php
    @define('MENU_1', 'Home');
    @define('MENU_2', 'Culture');
    @define('MENU_3', 'Diary');
    
Leider werden zwar die deutschen Werte für die Menüpunkte ausgegeben, nicht aber die englischen (Siehe http://origin-blog.goethe.de/neue_vorla ... anguage=de und http://origin-blog.goethe.de/neue_vorla ... anguage=en. Zur Sicherheit habe ich auch das templates_c-Verzeichnis gelöscht, hat aber nichts gebracht.

Ich bin ratlos. Hat jemand eine Idee?

Viele Grüße,
Katrin

Re: Zweisprachigkeit: Navigationsleisten-Links

Posted: Thu May 12, 2011 1:14 pm
by Timbalu
Zu Fragen ist: Hast du die CONSTANTS auch in die templates/bulletproof/lang_en.inc.php eingetragen? (Ich könnte mir vorstellen, dass eine en Datei im UTF-8 Ordner nichts bringt)

Liegt der eingefügte modifier |@serendipity_constant auch wirklich innerhalb von {if $template_option.sitenavpos == 'below'} ??

Beachte, dass deine Beispiel-Konstante MENU_1 im <de> nicht alteriert.

Da die Function is defined abfragt, muss der eingefügte Code unterhalb von

Code: Select all

include dirname(__FILE__) . '/lang_en.inc.php';

    function serendipity_constant($zeichenkette) { ....
liegen