Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

Homepage mehrsprachig machen mit PHP und MySQL

Anleitung Entwicklung PHP

Mitglied: ChiefRebelAngel

ChiefRebelAngel (Level 1) - Jetzt verbinden

15.09.2005, aktualisiert 11.10.2008, 41216 Aufrufe, 10 Kommentare

In diesem Tutorial möchte ich euch zeigen wie ihr ganz einfach und schnell eure Homepage mehrsprachig machen könnt - mit Hilfe von PHP und MySQL. Ich benutze in meinem Beispiel die Sprachen Deutsch und Englisch. Aber ihr könnt jede beliebige Sprache benützen. Ihr könnt natürlich auch mehr als zwei Sprachen benutzen, aber dann müsst ihr die MySQL-Tabelle entsprechend anpassen. Wenn ich ein bisschen mehr Zeit habe ändere ich das Tutorial noch und bringe euch noch Beispiel wie man das ganze auch ohne MySQL machen kann.

Manchmal ist es erforderlich, das der Inhalt einer Homepage in mehreren Sprachen verfügbar ist. Sei es nun um die Firmen-Homepage internationalen Kunden zu präsentieren oder um ein Produkt/eine Idee/ein Service international bekannt zu machen. Der normale Weg ist der Weg des statischen HTML. Das bedeutet aber jede HTML-Datei von Hand zu Fuss zu übersetzen. Und das bedeutet eine Menge Schreibkram. Darum ist diese PHP/MySQL-Lösung äußerst bequem und elegant. Und nachdem ihr dieses Tutorial gelesen habt wisst ihr auch wie es geht!




Zunächst einmal müssen wir auf unserem Datenbank-Server eine Datenbank anlegen. Ich gehe mal davon aus, das ihr wisst wie man phpMyAdmin oder ähnliche Tools benutzt. Trotzdem schreibe ich euch hier den SQL Code auf.
01.
   CREATE DATABASE my_db;
Mit dem Befehl \u my_db; wechseln wir in unsere neu erstellte Datenbank. Jetzt können wir die Tabelle anlegen, die wir benötigen um den Text zu speichern.
01.
   CREATE TABLE lang ( 
02.
      id int(11) NOT NULL default '0', 
03.
      `key` varchar(254) NOT NULL default '', 
04.
      de text, 
05.
      en text, 
06.
      PRIMARY KEY  (id) 
07.
   ) TYPE=MyISAM;
In dieser Tabelle gibt es drei Spalten, die besonders wichtig sind. Das sind `key`, de und en! In `key` wird ein Schlüsselwort abgespeichert, mit dessen Hilfe wir uns später den gewünschten Text anzeigen lassen können. In de bzw. en ist der deutsche bzw. englische Text gespeicher.
Um die multilingualität unserer Homepage zu testen, müssen wir auch einen Test-Eintrag in unserer MySQL-Tabelle speichern. Das geht so:
01.
   INSERT INTO lang VALUES (1, 'willkommen', 'Willkommen auf meiner Homepage', 'Welcome to my homepage');
Jetzt sind wir bereit uns dem PHP-Code zuzuwenden!


Um es schön sauber und ordentlich zu machen erstellen wir mit unserem Editor am besten eine neue Datei die wir module.inc.php nennen. Diese Datei speichern wir in dem dafür angelegten Verzeichnis "inc/". Der Inhalt der module.inc.php-Datei ist folgende Funktion:
01.
<?php 
02.
   function LoadLang($lang) { 
03.
      $text = array(); 
04.
      if(mysql_connect("host", "user", "passwort")): 
05.
         mysql_select_db("my_db); 
06.
	 $GETlang = "select `key`,`".$lang."` from lang order by id;"
07.
	 $RESlang = mysql_query($GETlang); 
08.
	 while($row = mysql_fetch_row($RESlang)): 
09.
	    $text[$row[0]] = $row[1]; 
10.
	 endwhile
11.
      endif
12.
			 
13.
      return $text
14.
15.
?>
Sehen wir uns diese Funktion jetzt etwas genauer an. Als erstes fällt auf, das die Funktion ein Argument erwartet, nämlich $lang. $lang muss die Sprache enthalten, die man gerne hätte. Zum Beispiel "de" für Deutsch oder "en" für Englisch. Warum ausgerechnet "de" bzw. "en"??? Ganz einfach: Weil so unsere Spalten in der MySQL-Tabelle heißen. Wenn wir den Query-String den wir an die Datenbank senden näher untersuchen fällt uns auch auf, wieso das so sein muss! $GETlang = "select `key`,`".$lang."` from lang order by id;"; bedeutet das SQL die Spalten `key` und `de|en` ausspucken soll!
In einer while-Schleife wird die Tabelle solange ausgelesen wie Daten gespeichert sind. Und diese Daten werden in einem Array gespeichert. Auch hier gibt es eine kleine Besonderheit. Wir benutzen hier kein normales Array, sondern ein assoziatives Array (auch Hash genannt). Hier wird nicht über einen Index auf die Daten zugegriffen sondern über ein Schlüsselwort. Nach der while-Schleife wird das erzeugte Array als Rückgabewert zurückgegeben.

Jetzt kümmern wir uns um unsere fiktive index.php-Datei. Hier müssen wir als erstes unsere Modul-Datei einbinden, damit wir auf die Funktion zugreifen können.
01.
   require_once("inc/module.inc.php");
Jetzt müssen wir nur noch unsere Funktion aufrufen und dann sind wir fertig. Zunächst möchte ich aber noch etwas erläutern! Ich gehe davon aus, das die Sprache, die man sehen möchte als Argument an die Datei index.php übergeben wird.Dabei ist es unabhängig ob der Benutzer auf einen Link klickt oder die Sprache in einem Drop-Down-Menü auswählt. Wichtig ist nur das die Daten per GET an die Datei übergeben werden. Das sieht dann in der URL-Leiste eures Browsers so aus:
01.
   http://www.eure-homepage.tld/index.php?lang=de
lang ist der Name der Variable und de ist ihr Wert! Wir überprüfen jetzt, ob es die Variable $_GET['lang'] gibt und interagieren entsprechend.
01.
<?php 
02.
   if(!empty($_GET['lang'])): 
03.
      $lang = LoadLang($_GET['lang']); 
04.
   else
05.
      $lang = LoadLang("de"); 
06.
   endif
07.
?>
Wir überprüfen hier, ob die Variable $_GET['lang'] leer ist. Wenn nicht, wir unsere Funktion von oben aufgerufen und ihr als Argument die gewünschte Sprache ("de" oder "en") übergeben.
Wenn $_GET['lang'] leer ist rufen wir die Funktionauf und übergeben ihr als Wert unsere Standard-Sprache. Das ist hier im Beispiel "de".


Soweit, so gut! Nun müssen wir nur noch unsere Daten aus dem Array $lang holen, damit wir sie auf dem Bildschirm darstellen können.
01.
<?php 
02.
echo $lang['willkommen']; 
03.
?> 

Ich hoffe das dieses kleine Tutorial für euch verständlich und vor allem nützlich ist. Bei Fragen oder Problemen einfach posten!
Änderung(en):
Ich hab mir erlaubt die Codes in Codeblocks zu packen.
masterG
23.06.2007
Mitglied: 36213
03.10.2006 um 22:54 Uhr
Hi, du schreibst (unter anderem):

<font class="code">
if(!empty($_GET['lang'])):
$lang = LoadLang($_GET['lang']);
else:
$lang = LoadLang("de");
endif;
</font>

wieso nicht einfacher und sicherer:
01.
#oben im code (oder in einer config.inc, die entsprechend früher eingebunden wird) 
02.
 
03.
$lang ='de'; 
04.
 
05.
# ...viel Code... 
06.
$allowedLanguages = array('de','en','es'); 
07.
if($_GET['lang']){ 
08.
    if(in_array($_GET['lang'], $allowedLanguages){ 
09.
        $lang = $_GET['lang']; 
10.
11.
12.
# und erst hier wird $lang ausgewertet.
Fragend,

Netzbaer
Bitte warten ..
Mitglied: francesco
05.10.2006 um 20:10 Uhr
Warum nicht so, default-Sprache ist immer deutsch und geht auch ohne Mysql.
01.
 //Start der Session 
02.
 session_start(); 
03.
 
04.
 // Gültige Sprachen definieren 
05.
 $gueltige_sprachen = array ( 'de', 'en' ); 
06.
 
07.
 if(isset($_GET['lang']) && in_array($_GET['lang'], $gueltige_sprachen) ) { 
08.
    $_SESSION['language'] = $_GET['lang']; 
09.
 } else
10.
    if (!isset($_SESSION['language'])) { 
11.
        //default ist immer deutsch 
12.
        $_SESSION['language'] = "de"
13.
14.
15.
 //aus dem imcludeverzeichniss die sprachdatei auslesen 
16.
 @include("includes/" . $_SESSION['language'] . "/language.php");
Mit freundlichen Grüßen
Francesco
Änderung:
Ich hab mir hier erlaubt den Code in einen Codeblock zu packen.
masterG(Moderator)
23.06.2007
Bitte warten ..
Mitglied: chris23
08.12.2007 um 11:45 Uhr
Hallo zusammen,
ich habe das Script von ChiefRebelAngel getestet. Es funktioniert, wenn man in der Zeile mysql_select_db("my_db); noch die Anführungszeichen schließt nach dem Namen der Datenbank.

Hat jemand eine Idee, wie ich auf dieselbe Weise Bilder aus der Datenbank importieren kann? Die Navigationspunkte bestehen aus Icons, kein HTML-Text.

Vielen Dank und viele Grüße
Chris
Bitte warten ..
Mitglied: 36213
08.12.2007 um 12:18 Uhr
Hat jemand eine Idee, wie ich auf dieselbe Weise Bilder
aus der Datenbank importieren kann? Die Navigationspunkte
bestehen aus Icons, kein HTML-Text.

Indem Du die Pfade zu den Bildern in die DaBa schreibst?

01.
$bildpfad= './img/';
DaBa:
id,name, alt, pfad
1 ,"schoenesBild.jpg", "meine Katze", "privat/kater/"

01.
 
02.
<img src="<?php echo getBild(1, $bildpfad);?>" /> 
03.
 
04.
<?php 
05.
function getBild($bildid,$bpfad)){ 
06.
    dbCon(); 
07.
    sql = "select name, alt, pfad from table where id =".$bildid; 
08.
    $res = mysql_query($sql); 
09.
    $erg = mysql_fetch_array($res); 
10.
    $size = getimagesize($bpfad.$erg['pfad'].$erg['name']; 
11.
    $retVal = $bpfad.$erg['pfad'].$erg['name'].' alt="'.$erg['alt'] . $size[3]; 
12.
    return $retVal; 
13.
}
HTH
Bitte warten ..
Mitglied: rompers
08.03.2008 um 18:36 Uhr
habe es bei mir auch eingebaut leider geht es nicht wenn ich es in einer while schleife
habe dann habe ich zb.: $name in der sprache mit drin dann setzt er immer den ersten
namen der als erstes ausgelesen wird

wo habe ich da den fehler?
Bitte warten ..
Mitglied: 36213
08.03.2008 um 19:21 Uhr
habe es bei mir auch eingebaut leider geht es
nicht wenn ich es in einer while schleife
habe dann habe ich zb.: $name in der sprache
mit drin dann setzt er immer den ersten
namen der als erstes ausgelesen wird

wo habe ich da den fehler?

Du fragst die Sprache nicht mit ab. Da Du mit dem Code hinterm Berg hälst ist das die einzig mögliche Antwort.

Tipp: Speichere die Sprache in einer Session und hänge hinter jede Abfrage "and lang = $_SESSION['lang']
Bitte warten ..
Mitglied: rompers
08.03.2008 um 19:34 Uhr
in meiner while gebe ich ihm ja auch $name mit an
habe jetzt mit
01.
eval("\$lang[gbook_mail]=\"$lang[gbook_mail]\";");
einen namen angezeigt bekommen allerdings auch nur einen
und der ist dann auch bei denn anderen mit drin
01.
		while($daten = mysql_fetch_array($sqlanfrage)) { 
02.
			$page_entry_start = $page_entry_start-1; 
03.
			$datum = $daten['date']; 
04.
			$name = $daten['name']; 
05.
			$lang[gbook_mail] = preg_replace('/\{(.*?)}/', $name, $lang[gbook_mail]); 
06.
			$email = stripslashes($daten['email']); 
07.
			$homepage = stripslashes($daten['homepage']); 
08.
			$zeit = datetime($datum, $sprache, 0); 
09.
			$nachricht = stripslashes(bbcode($daten['message'])); 
10.
			eval("\$gaestebuch_bit.= \"".$tpl->get("gaestebuch_bit")."\";"); 
11.
		}
und da steht ja auch $name
Bitte warten ..
Mitglied: HeikoD
23.04.2008 um 20:14 Uhr
Hallo,

ich setze für die Mehrsprachigkeit XML und simplexml ein. Ich habe eine Zugriffsklasse (als Singleton) geschrieben die je nach Anforderung den Text in der jeweiligen Sprache zurückgibt. Wenn die Sprachdatei nicht existiert wird der Text zurückgegeben der Im Quellcode als default definiert wird.

Beispiel:
/*irgendwo im Start*/
$_SESSION["language"]='de';

/* Aufruf im PHP File*/

/* Laden der Klasse*/
$Language = Language::getLanguage($_SESSION["language"]);
/* Hier der Text der angezeigt werden soll*/
$Output= "<p>".$Language->get('txt_hello_world','hello world')."</p>";
/* wenn die Sprachdatei existiert und der xml knoten ->txt_hello_world'<- existiert dann wird der Wert des Knotens ausgegeben*/

<p>Hallo Welt</p>
/* ansonsten*/
<p>hello world</p>
/*wenn kein default text dann*/
<p>*no default value</p>

Die XML Datei hat ungefähr den Aufbau (language_de.xml):
<root>
<page id="login">
<txt_hello_world>Hallo Welt</txt_hello_world>
</page>
</root>

Die Klasse ist etwas mehr Text.
Aber vom Prinzip geht es so.

/*CODE*/
class Language
{
private static $instance=null;
private $_Language="de";
private $path_to_languages="";
private function __construct($Language ="de")
{
$_Language = $Language;
$this->loadXml($this->path_to_languages."languagefile_".$Language.".xml";


public static function getLanguage($language="de")
{
if(self::$instance==null)
{
self::$instance = new self();
}
return self::$instance;
}

private function loadXml($File="")
{
If File exists
read XML into simple xml

}
public function get($NodeName="",$DefaultText="")
{
check if node exist
return escaped node vale
if not exist return DefaultValue if not empty

otherwise return "* no default value";
}
}


Vorteil: XML ist besser zu lesen, kann jederzeit im Lauf geändert werden (Rechtschreibfehler ), Viele beliebige Sprachen können eingebunden werden.

Wer Interresse Hat kann sich ja bei mir melden.

Achso: wenn man nicht alles immer laden will kann man auch kleine Rubrikdateien mache wie zb: module_xy_de.xml
und so weiter.

Mit freundlichen Grüßen Heiko.
Bitte warten ..
Mitglied: 70648
11.10.2008 um 14:30 Uhr
//aus dem imcludeverzeichniss die sprachdatei auslesen
@include("includes/" . $_SESSION['language'] .
"/language.php");
</code>

Ist das so zu verstehen, dass in Sprachdatei (language.php) nur die Wörter in der relevanten Sprache in Variabelen oder Konstanten schreibt, die dann verwendet werden? Ginge das auch als INI-Datei? Oder sind das ganze Sites, die mehrfach(sprachig) gecodet sind?

Viele Grüße steffen700
Bitte warten ..
Mitglied: MKzero
20.05.2009 um 12:14 Uhr
Zitat von HeikoD:
Hallo,

ich setze für die Mehrsprachigkeit XML und simplexml ein. Ich
habe eine Zugriffsklasse (als Singleton) geschrieben die je nach
Anforderung den Text in der jeweiligen Sprache zurückgibt. Wenn
die Sprachdatei nicht existiert wird der Text zurückgegeben der
Im Quellcode als default definiert wird.

Alles ganz nette ansätze, aber ich würde das eher über eine einfache Datei machen. Also entweder CSV-ähnlich(da ist die Lesbarkeit für die meisten sogar noch höher als in der XML ;) ) oder z.B. als DBM, die sind beide performanter als die normale DB(zumindest für so einen Zweck) und für DBM muss man sich nur in die entsprechende Doku schnell einlesen
Bitte warten ..
Neuester Wissensbeitrag
Ähnliche Inhalte
PHP
PHP MySQL Login (7)

Frage von Yanmai zum Thema PHP ...

PHP
gelöst PHP-MySQL - mysqli liefert einen Datensatz zu wenig (3)

Frage von Windows-Spieler zum Thema PHP ...

PHP
MySQL-Abfrage mit php: Wert + true bzw. false (2)

Frage von tomolpi zum Thema PHP ...

Heiß diskutierte Inhalte
Windows Userverwaltung
Ausgeschiedene Mitarbeiter im Unternehmen - was tun mit den AD Konten? (33)

Frage von patz223 zum Thema Windows Userverwaltung ...

LAN, WAN, Wireless
FritzBox, zwei Server, verschiedene Netze (21)

Frage von DavidGl zum Thema LAN, WAN, Wireless ...

Viren und Trojaner
Aufgepasst: Neue Ransomware Goldeneye verbreitet sich rasant (20)

Link von Penny.Cilin zum Thema Viren und Trojaner ...