• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Mehrsprachigkeit

  • Ersteller Ersteller DerMitSkill
  • Erstellt am Erstellt am
Status
Für weitere Antworten geschlossen.
D

DerMitSkill

Guest
Hallo,
will meine neue Seite mehrsprachig machen.... schaut euchs mal an... was kann man verbessern und optimieren? Mir kommt die Lösung irgendwie unelegant vor :mrgreen:

PHP:
    if(isset($_GET['sprache'])) {
        if($_GET['sprache'] == "en") {
            function sprache($id) {
                require_once($_SERVER['DOCUMENT_ROOT']."/dateien/mysql.php");
                $MySQLBefehl = "SELECT Englisch FROM Sprachen WHERE ID='".$id."'";
                $MySQLErgebnis = $MySQLVerbindung->query($MySQLBefehl);
                $MySQLAusgabe = $MySQLErgebnis->fetch_row();
                echo($MySQLAusgabe[0]);
            }
        }
        else {
            function sprache($id) {
                require_once($_SERVER['DOCUMENT_ROOT']."/dateien/mysql.php");
                $MySQLBefehl = "SELECT Deutsch FROM Sprachen WHERE ID='".$id."'";
                $MySQLErgebnis = $MySQLVerbindung->query($MySQLBefehl);
                $MySQLAusgabe = $MySQLErgebnis->fetch_row();
                echo($MySQLAusgabe[0]);
            }
        }
    }
    else {
        function sprache($id) {
            require_once($_SERVER['DOCUMENT_ROOT']."/dateien/mysql.php");
            $MySQLBefehl = "SELECT Deutsch FROM Sprachen WHERE ID='".$id."'";
            $MySQLErgebnis = $MySQLVerbindung->query($MySQLBefehl);
            $MySQLAusgabe = $MySQLErgebnis->fetch_row();
            echo($MySQLAusgabe[0]);
        }
    }
Im Template kommt dann folgendes:

Code:
<?php sprache(1); ?>
Erklärung:

domain.de -> deutsch
domain.de?sprache -> deutsch
domain.de?sprache= -> deutsch
domain.de?sprache=de -> deutsch
domain.de?sprache=fr -> deutsch
domain.de?sprache=irgendwas -> deutsch
domain.de?sprache=en -> englisch

Wie mach ichs besser? Das ist mir spontan eingefallen und für mich die einfachste Lösung ohne gleich ein Templatesystem zu schreiben...

Helft mir bitte :)
 
Zuletzt bearbeitet von einem Moderator:
Du schreibst 3 mal die gleiche Funktion mit unterschiedlichen Statements. Unnötigen Quellcode sollte man sparen. Das einzige was im if und else stehen sollt ist die Zuweisung von $MySQLBefehl
 
gettext wäre auch mein Vorschlag gewesen. Ist auch einfach das schnellste. Natürlich nicht für ganze Inhalte geeignet, sondern nur für etwas, das man einmal übersetzt und dann nicht mehr.
Wordpress z.B. benutzt PHP gettext. Das ist GNU gettext nur als PHP-Implementation und funktioniert genauso nur besser. Bei GNU scheitert es oft an der Server-Umgebung.
Ich hänge mal eine bisschen gehackte Version an, weil das Projekt auf PHP gettext - Summary [Savannah] wohl ein bisschen eingefroren wurde. Ah und du brauchst dazu den Poedit. Ich hab auch mal eine typische po-Datei angehängt. Einfach mit dem Poedit öffnen und das meiste müsste sich von selbst erschließen.
Die Weiche, also welche Sprachtabelle genutzt werden soll, ist da noch das geringste Problem.

So würde das dann funktionieren:
PHP:
// php-gettext
require_once("gettext/main.php");

// Aushilfsfunktion, unabhängig von GNU gettext
_setlocale (LC_ALL, 'de_DE');
_bindtextdomain ("app", dirname(__FILE__)."/lang");
_bind_textdomain_codeset ("app", "UTF-8");
_textdomain ("app");
Übersetzen kannst du einen String dann einfach mit
PHP:
echo __("Das da ist ein doppelter Unterstrich");
Viele Grüße
Voodoo
 

Anhänge

Ohje das versteh ich nicht so ganz. Habt ihr eine Lösung für dumme? ;ugl

Du schreibst 3 mal die gleiche Funktion mit unterschiedlichen Statements. Unnötigen Quellcode sollte man sparen. Das einzige was im if und else stehen sollt ist die Zuweisung von $MySQLBefehl

Dann kann ich aber nicht einfach die Funktion aufrufen und dann funktionierts, weil der Rest dann nicht da drinnen steht....
 
Ich hatte das so gemeint:

PHP:
if(isset($_GET['sprache']) && $_GET['sprache'] == "en") {
    $sprache = "Englisch";
} else {
    $sprache = "Deutsch";
} 

function sprache($id, $sprache) {
    require_once($_SERVER['DOCUMENT_ROOT']."/dateien/mysql.php");
    $MySQLBefehl .= "SELECT "'.$sprache.'" FROM Sprachen WHERE ID='".$id."'";
    $MySQLErgebnis = $MySQLVerbindung->query($MySQLBefehl);
    $MySQLAusgabe = $MySQLErgebnis->fetch_row();
    echo($MySQLAusgabe[0]);
}
 
Zuletzt bearbeitet:
Ahh, hasts nochmal geändert, okay schon logischer :)

Bei nicht so vielen Teilen die übersetzt werden dürfte die Methode ja nicht so langsam sein? Ich denke mal nicht merkbar, oder?
 
Oder wäre das ganze auf Dateibasis vielleicht besser?

Ich hab zum Beispiel auf meiner Seite den "Bereich" Benutzerprofil... dafür lege ich eine Sprachdatei an...(für jeden Bereich eine eigene, daher sind sie nicht so groß) /sprachen/de/benutzerprofil.php

In die Datei schreibe ich dann die Übersetzungen...

PHP:
<?php
    $Sprache[1] = "Startseite";
    $Sprache[2] = "Herzlich Willkommen";
    usw.
?>

Und für jede Sprache halt die eigenen Datei und je nachdem welche Sprache gewählt ist include ich die Datei und binde die Sprachvariable mit <?php echo($Sprache[1]); ?> usw. ein....

Wäre das so schneller und besser?

Diese Methode nutzt z.B. das phpBB
 
ich mache das ebenso.

in der config.php steht irgendwo:
PHP:
 $_SESSION['lang'] = 'de';

im script dann
PHP:
include("langauge/".$_SESSION['lang']."/language.php");
umschalten per switcher ist problemlos und ich kann leuten mal eben die datei zum übersetzen mitgeben. einen online-editor zum übersetzen habe ich auch.
 
Irgendeinen Geschwindigkeitsvorteil gegenüber Variablen? Oder sonst irgendeinen?
 
Geschwindigkeit wohl kaum, aber du hast keine Probleme mit Namespace, wenn du zum Beispiel mit Objekten, Funktionen usw. herumhantierst. Sonst müsstest du die Sprachvariablen alle als global definieren. Und, wie wir alle wissen, ist das böse.
 
sorry aber warum muss er sie als global definieren? :-D
ne kleine klasse die das handlet und gut ist :P ich denke mal das sollte unter 100 zeilen zu schaffen sein. ^^

wenn ich nachher n augenblick zeit habe kann ich eine schreiben mit der du ohne probleme klar kommen solltest ^^ (solange du wenigstens n bissel oop kannst ^^)

property files finde ich immernoch am angenehmsten also alles in eine eigenne sprachdatei und gut ist.
 
benutz einfach parse_ini_file, wird nativ geparst und kannst jedes Modul eine eigene sprachfile zuordnen, zudem ist alles sortiert innem array :mrgreen:
 
Ich möchte mal so ein Modell dafür aufstellen, ob es so ok ist:

/sprachen/de/ - deutsche Sprachdateien
/sprachen/en/ - englische Sprachdateien

/sprachen/de/menue.ini - deutsche Sprachdatei für das Menü
Code:
001 = "Startseite"
002 = "Artikel"
003 = "Kontakt"
usw.
/sprachen/en/menue.ini - englische Sprachdatei für das Menü
Code:
 001 = "Homepage"
 002 = "Articles"
 003 = "Contact"
usw.
Hier wird die Sprache abgefragt und in der Variable $Sprache gespeichert.
PHP:
    if(isset($_GET['sprache'])) {
        if($_GET['sprache'] == "englisch") {
            $Sprache = "en";
        }
        if($_GET['sprache'] == "deutsch") {
            $Sprache = "de";
        }
    }
    else {
        $Sprache = "de";
    }
Die Standardsprache ist auf deutsch festgelegt.

domain.de?sprache=deutsch -> deutsch
domain.de?sprache=englisch -> englisch

Umgeschrieben mit mod_rewrite:
Code:
RewriteEngine On
RewriteBase /
RewriteRule ^en/(.*) $1?sprache=englisch
RewriteRule ^de/(.*) $1?sprache=deutsch
domain.de/de/ -> deutsch
domain.de/en/ -> englisch

Die Sprachdateien werden eingebunden, $Menue ist das Array:
PHP:
    $Menue = parse_ini_file($_SERVER['DOCUMENT_ROOT']."/sprachen/".$Sprache."/menue.ini");
Im Template wird die Sprache so ausgegeben:
PHP:
<?php echo($Menue[001]); ?>
<?php echo($Menue[002]); ?>
<?php echo($Menue[003]); ?>
usw.
Ist es so ok? Verbesserungsvorschläge? Denkfehler? Sonstwas?

PS: Das ganze ist ja schon fast wie ein Tutorial geworden, muss es nur noch richtig sein :D
 
Zuletzt bearbeitet von einem Moderator:
das öffnen und einlesen einer datei dauert fast so lange wie das parsen.
ich würde versuchen nicht für jedes kleine element eine sprachdatei zu bauen, gruppiere lieber das array in der ini.
zudem empfehle ich sprechene vars.

getL('menu','home'); z.b.

001 macht garkeinen sinn :) und ist unübersichtlich
 
Status
Für weitere Antworten geschlossen.

Neueste Beiträge

Zurück
Oben