Vollautomatisierte Sprachnavigation

zyclop

Erfahrenes Mitglied
Hallo zusammen, wie Ihr evtl. bemerkt habt, bin ich ungewollt an einem PHP Projekt beteiligt. Auf folgendes Problem habe ich.

Ich habe eine Index.php welche die Navigation über eine Switch Case anweisung die Navigation Included.

PHP:
			switch($_GET['lang']) { 
				case "en": 
					include("_nav/nav.en.php");  
					break; 
				case "fr": include("_nav/nav.fr.php");   
					break;
				case "it": include("_nav/nav.it.php");   
					break; 
				default : include("_nav/nav.de.php");
					break; 
			}

Die DE Navigationsdatei sieht so aus:

PHP:
<!-- Navigation DE -->
<li><a href="index.php?cont=home&lang=de">HOME</a></li>
<li><a href="index.php?cont=fly&lang=de">FL&Uuml;GE</a></li>
<li><a href="index.php?cont=hotel&lang=de">HOTELS</a></li>
<li><a href="index.php?cont=interhome&lang=de">FERIENWOHNUNGEN</a></li>
<li><a href="index.php?cont=car&lang=de">MIETWAGEN</a></li>
<li><a href="index.php?cont=bus&lang=de">BUSLINIEN</a></li>
<li><a href="index.php?cont=partner&lang=de">REEDEREIEN</a></li>
<li><a href="index.php?cont=links&lang=de">LINKS</a></li>
<li><a href="index.php?cont=contact&lang=de">KONTAKT</a></li>

Die EN Navigationsdatei sieht eigentlich gleich aus, nur ist bei der EN Datei der link = ....&lang=en und der Name des Links ändert z.B. von Kontakt auf Contact. Das selbe gibt es dann für Französisch und auch Italienisch. Gibt es nun eine Möglichkeit dies nur in eine Datei zu schreiben. Damit eigentlich die Links immer nur an einem Ort gepflegt werden müssen und der Linktitel dann Sprachenabhängig ist? Ich hoffe Ihr versteht die anfrage.

gruss Zyclop
 
Hallo zusammen, wie Ihr evtl. bemerkt habt, bin ich ungewollt an einem PHP Projekt beteiligt.
*gg das klingt ja nicht sehr begeistert :D

Die EN Navigationsdatei sieht eigentlich gleich aus, nur ist bei der EN Datei der link = ....&lang=en und der Name des Links ändert z.B. von Kontakt auf Contact. Das selbe gibt es dann für Französisch und auch Italienisch. Gibt es nun eine Möglichkeit dies nur in eine Datei zu schreiben. Damit eigentlich die Links immer nur an einem Ort gepflegt werden müssen und der Linktitel dann Sprachenabhängig ist? Ich hoffe Ihr versteht die anfrage.
Klar geht das.
Gibt es auch die unterschiedlichsten Ansätze dafür.
Du könntest ein language array anlegen z.B.:
PHP:
$lang["de"]["nav"]["contact"] = "KONTAKT";

PHP:
<?php 
// language konstante dynamisch mit language kürzel belegen (beispiel statisch).
define("LANG", "de");

// dein language array kann auch aus einer xml oder ini eingelesen werden oder in einer php datei festgelegt werden.
$lang["de"]["nav"]["contact"] = "KONTAKT";
$lang["en"]["nav"]["contact"] = "CONTACT";

?>
<li><a href="index.php?cont=contact&lang=<?=LANG;?>"><?=$lang[LANG]["nav"]["contact"];?></a></li>
 
Ja, du kennst das evtl. kannst du das kurz ändern. *ftpaufbauen* 20 HTML Flies.....neiiiiiiiiiiiiiiiiiiiinnn...jetzt habe ich bereits den Content per PHP eingebunden und sogar verschiedene Div ausgaben.

Zurück zum Thema:

Wenn ich das Richtig verstehe, erstelle ich eine Datei z.b. nav.lang.php

Darin würde ich folgendes Eintragen:

HTML:
<li><a href="index.php?cont=contact&lang=<?=LANG;?>"><?=$lang[LANG]["nav"]["contact"];?></a></li>
etc.

und in der Index.php mach ich diesen Eintrag:

PHP:
<?php  
// language konstante dynamisch mit language kürzel belegen (beispiel statisch). 
define("LANG", "de"); 

// dein language array kann auch aus einer xml oder ini eingelesen werden oder in einer php datei festgelegt werden. 
$lang["de"]["nav"]["contact"] = "KONTAKT"; 
$lang["en"]["nav"]["contact"] = "CONTACT";

Das war gemeint mit, ungewollt reingerutscht. Kenne mich in PHP sehr beschränkt aus. Darum die *dumme* nachfrage.

gruss zyclop
 
mh ne eher anders rum ^^

index.php
PHP:
// language konstante dynamisch mit language kürzel belegen (beispiel statisch).
define("LANG", "de");

// Sowie weitere Logik

language.php
PHP:
$lang["de"]["nav"]["contact"] = "KONTAKT";
$lang["en"]["nav"]["contact"] = "CONTACT";

nav.tpl oder nav.php
PHP:
<li><a href="index.php?cont=contact&lang=<?=LANG;?>"><?=$lang[LANG]["nav"]["contact"];?></a></li>
 
Lol...vielen dank für die Erklärung.

Ich habe es versucht. Jedoch erhalte ich als Ergebnis nur leere <li></li>'s. So sieht es im Moment aus

index.php
PHP:
			<?php
			ob_start();  					
			switch($_GET['lang']) {  <--Sprachanweisung
				case "en": 
						define("LANG", "en");				
					break; 
				case "fr": define("LANG", "fr");   
					break;
				case "it": define("LANG", "it");  
					break; 
				default : define("LANG", "de");
					break; 
			}
				$lang= ob_get_clean();
				$idmenu = 'menu_normal';
				$idcontentground = 'content_ground_normal';				
				$idcontent = 'content_normal';
				
				ob_start();  
				switch($_GET['cont']) {
					case 'home':
						$idmenu = 'menu_forth';
						$idcontentground = 'content_ground_forth';
						$idcontent = 'content_forth';
						include '_cont/cont.home.php';
						break;
					case 'fly':
						include '_cont/cont.fly.php';
						break;
				 
					case 'links':
						include '_cont/cont.links.php';
						break;
				 
					case 'partner':
						include '_cont/cont.partner.php';
						break;
				 
					case 'contact':
						include '_cont/cont.contact.php';
						break;
				 
					case 'hotel':
						include '_cont/cont.hotel.php';
						break;
				 
					case 'interhome':
						include '_cont/cont.interhome.php';
						break;
				 
					case 'car':
						include '_cont/cont.car.php';
						break;
				 
					case 'bus':
						include '_cont/cont.bus.php';
						break;
				 
					default: include '_cont/cont.home.php';
						$idmenu = 'menu_forth';
						$idcontentground = 'content_ground_forth';
						$idcontent = 'content_forth';
						break;
				}
				$content = ob_get_clean();  
//Ausgabe des Inhalts
				echo '<div id="'.$idmenu.'">'."\n"; 
				echo '<ul>'; 
				include '_nav/nav.php'; <--- nav.php include
				echo '</ul>'; 
				echo '</div>'; 
				
				echo '<div id="'.$idcontentground.'">'."\n"; 				
				echo '<div id="'.$idcontent.'">'."\n"; 
				echo $content; 
				echo '</div>'; 
				include ('_nav/nav.r.php'); 
				echo '</div>';

Inhalt der nav.php
HTML:
<!-- Fahnen und Sprachwahl -->
<div style="padding-top:5px; text-align:center; padding-bottom: 5px;">
	<a <?php if($_GET['lang'] == "de") echo "id='aktiv'";?> href="index.php?lang=de">
	<img src="images/lang/german.jpg" alt="german" width="20" height="13" border="0" />
	</a>
	<a <?php if($_GET['lang'] == "en") echo "id='aktiv'";?> href="index.php?lang=en">
	<img src="images/lang/englisch.jpg" alt="englisch" width="20" height="13" border="0" />
	</a>
	<a <?php if($_GET['lang'] == "fr") echo "id='aktiv'";?> href="index.php?lang=fr">
	<img src="images/lang/france.jpg" alt="france" width="20" height="13" border="0" />
	</a> 
	<a <?php if($_GET['lang'] == "it") echo "id='aktiv'";?> href="index.php?lang=it">
	<img src="images/lang/italian.jpg" alt="italian" width="20" height="13" border="0" />
	</a>
</div>

<!-- Navigation -->
<li><a href="index.php?cont=homet&lang=<?=LANG;?>"><?=$lang[LANG]["nav"]["home"]?></a></li>
<li><a href="index.php?cont=fly&lang=<?=LANG;?>"><?=$lang[LANG]["nav"]["fly"];?></a></li>
<li><a href="index.php?cont=contact&lang=<?=LANG;?>"><?=$lang[LANG]["nav"]["hotel"];?></a></li>
<li><a href="index.php?cont=contact&lang=<?=LANG;?>"><?=$lang[LANG]["nav"]["interhome"];?></a></li>
<li><a href="index.php?cont=contact&lang=<?=LANG;?>"><?=$lang[LANG]["nav"]["car"];?></a></li>
<li><a href="index.php?cont=contact&lang=<?=LANG;?>"><?=$lang[LANG]["nav"]["bus"];?></a></li>
<li><a href="index.php?cont=contact&lang=<?=LANG;?>"><?=$lang[LANG]["nav"]["partner"];?></a></li>
<li><a href="index.php?cont=contact&lang=<?=LANG;?>"><?=$lang[LANG]["nav"]["links"];?></a></li>
<li><a href="index.php?cont=contact&lang=<?=LANG;?>"><?=$lang[LANG]["nav"]["contact"];?></a></li>

Und jetzt noch der Inhalt der language.php

PHP:
<?php
//DE - Deutsch
$lang["de"]["nav"]["home"] = "HOME";
$lang["de"]["nav"]["fly"] = "FLÜGE"; 
$lang["de"]["nav"]["hotel"] = "HOTELS"; 
$lang["de"]["nav"]["interhome"] = "FERIENWOHNUNGEN"; 
$lang["de"]["nav"]["car"] = "MIETWAGEN"; 
$lang["de"]["nav"]["bus"] = "BUSLINIEN"; 
$lang["de"]["nav"]["partner"] = "REEDEREIEN"; 
$lang["de"]["nav"]["links"] = "LINKS"; 
$lang["de"]["nav"]["contact"] = "KONTAKT"; 

//EN - Englisch
$lang["en"]["nav"]["home"] = "HOME";
$lang["en"]["nav"]["fly"] = "FLÜGE"; 
$lang["en"]["nav"]["hotel"] = "HOTELS"; 
$lang["en"]["nav"]["interhome"] = "FERIENWOHNUNGEN"; 
$lang["en"]["nav"]["car"] = "MIETWAGEN"; 
$lang["en"]["nav"]["bus"] = "BUSLINIEN"; 
$lang["en"]["nav"]["partner"] = "REEDEREIEN"; 
$lang["en"]["nav"]["links"] = "LINKS"; 
$lang["en"]["nav"]["contact"] = "KONTAKT"; 

//FR - Französisch
$lang["fr"]["nav"]["home"] = "HOME";
$lang["fr"]["nav"]["fly"] = "FLÜGE"; 
$lang["fr"]["nav"]["hotel"] = "HOTELS"; 
$lang["fr"]["nav"]["interhome"] = "FERIENWOHNUNGEN"; 
$lang["fr"]["nav"]["car"] = "MIETWAGEN"; 
$lang["fr"]["nav"]["bus"] = "BUSLINIEN"; 
$lang["fr"]["nav"]["partner"] = "REEDEREIEN"; 
$lang["fr"]["nav"]["links"] = "LINKS"; 
$lang["fr"]["nav"]["contact"] = "KONTAKT"; 

//IT - Italienisch
$lang["it"]["nav"]["home"] = "HOME";
$lang["it"]["nav"]["fly"] = "FLÜGE"; 
$lang["it"]["nav"]["hotel"] = "HOTELS"; 
$lang["it"]["nav"]["interhome"] = "FERIENWOHNUNGEN"; 
$lang["it"]["nav"]["car"] = "MIETWAGEN"; 
$lang["it"]["nav"]["bus"] = "BUSLINIEN"; 
$lang["it"]["nav"]["partner"] = "REEDEREIEN"; 
$lang["it"]["nav"]["links"] = "LINKS"; 
$lang["it"]["nav"]["contact"] = "KONTAKT"; 
?>

Habe ich etwas falsch verstanden oder ist es möglich dass es an dem Includen der Dateien liegen? Die nav & language Datei liegen im Verzeichnis _/nav. Macht das etwas aus?

gruss Zyclop
 
Also ich sehe nirgends wo du die sprachdatei includest.
Das sollte möglichst früh geschehen.
Ausserdem wäre das hier ein Fehler wenn du es so drin stehen hast:
PHP:
 include '_nav/nav.php'; <--- nav.php include
So ist es dann kein Fehler:
PHP:
 include '_nav/nav.php'; //<--- nav.php include



EDIT:
PHP:
	<a <?php if($_GET['lang'] == "de") echo "id='aktiv'";?> href="index.php?lang=de">
so wäre es in kurzschreibweise sogar mit trinitäts operator:
PHP:
	<a <?=($_GET['lang'] == "de") ? "id='aktiv'" : "";?> href="index.php?lang=de">

Hier gibts nen guten Artikel dazu: http://tut.php-q.net/de/short.html
 
Zuletzt bearbeitet:
Ich Include Sie einbisschen weiter oben. Sorry

PHP:
	</head>
	<body> 
	<?php include '_nav/language.php' ?>
		<div id="ballina">
			<div id="banner"><img src="http://www.tutorials.de/forum/images/banner.jpg" width="1024" height="173" alt="testtest"/>
			</div>
			<!-- Navigation Links oben -->
			<?php
			ob_start();  					
			switch($_GET['lang']) { 
				case "en": 
						define("LANG", "en");				
					break; 
				case "fr": define("LANG", "fr");   

.....

Ich weiss nicht ob ich evtl. die switch Get lang anweisung ändern muss. Ich benötige nur 3 Dateien oder? nav.php, language.php und die Index.php. Ich glaube ich verstehe etwas nicht. Wo müsste denn der Include stattfinden? Und wie kann ich Ihn dann ausgeben?

grz zyclop

EDIT: Ich glaube ich habe rausgefunden warum die LI Elemte klein sind, weil kein Text drin ist. Ich habe Sie nachträglich mit FireBug vergrössert. Der Link der erstellt wird ist
HTML:
index.php?cont=homet&lang=<?=LANG;?>
.

Somit müsste es an der nav.php liegen...?
 
Zuletzt bearbeitet:
Also jetz müsste ich dich doch mal nach dem kompletten Code fragen denn so hab ich keine Überblick mehr.

Nochmal fürs verständnis:
Ein PHP Script läuft von oben nach unten ab. Ein Include ist wie wenn du den PHP Code den die includierte Datei enthält an der Stelle des includes einfügst. Du musst also nichts mehr ausgeben. Der Interpreter springt quasi in die Datei führt alles aus und springt wieder an die Stelle des Includes zurück.

Aber was mich stutzig macht: Du verwendest mehrmals output buffering....

Grundsätzlich sollte es soweit passen aber um den Fehler zu finden müsste ich den ganzen Code im Context mal sehen.
Am besten postest du es mal auf http://pastebin.com/ um das Forum nicht so zu überfüllen.
Und zwar am besten alle 3 Files.
 
Verstehe ich. Das mit dem Output Buffering weiss ich nicht besser.

Im Anhang findest du die ganze Website.

Bin offen für Verbesserungsvorschläge.

grz zyclop

und danke nochmals das du dir den Code anschaust.
 
Zuletzt bearbeitet:
Zurück