XHTMLforum

XHTMLforum (http://xhtmlforum.de/index.php)
-   Serveradministration und serverseitige Scripte (http://xhtmlforum.de/forumdisplay.php?f=80)
-   -   Merhsprachige Website (http://xhtmlforum.de/showthread.php?t=69913)

mymaksimus 29.08.2013 02:21

Merhsprachige Website
 
Hallöle,
Ich wollte mal Fragen wie man das "am besten" mit einer mehrsprachigen Website löst. Ich habe das mal ausprobiert und folgende methode angewandt:
Die jeweilige Sprache wird in der session gespeichert, dann die session variable geswitcht und je nach sprache eine funktion aufgerufen - das sieht ungf. so aus:

PHP-Code:

$lang_arr;
switch(
$_SESSION['lang']){
    case 
'english'english();
}
funcion english(){
    
$lang_arr = array("welcome" => "welcome"
                            "fruit" 
=> "bananas, apples");


So, das heisst auf der eigentlichen Seite muss ich dann jedesmal wenn ich text ausgeben will folgendes machen:

PHP-Code:

<?php echo $lang_arr("fruit"); ?>

Das funktioniert zwar ganz gut, aber ist natürlich - code technisch - ziemlich unübersichtlich... Aber ich würde nur ungern für jede Sprache eine Eigene Seite machen. Es gibt ja die Leute bei denen sehen die ordner dann so aus:

website
---- index_en.html
index_fr.html
index_gr.html

... also wie macht man das am besten? und wie managen das "proffesionelle" Seiten oder cms tools? Ist meine Variante vielleicht doch gar nicht so übel?

Vielen Dank.

Thielo 29.08.2013 03:20

Mod Rewrite, ausgelagerte Sprach-Dateien, Datenbank-Einträge wären hier Worte der Wahl.

Mod-Rewrite
hast du beispielsweise folgende URLs:
www.seite.de/de/test.html
www.seite.de/en/test.html

kann über das Modrewrite die URL mit einem Parameter der die Sprache enthält weiterreichen an eine Datei.

Sprachdateien
Auf Basis des Mod-Rewrites werden unterschiedliche Sprachdateien angetriggert und ausgelesen. Jede Sprache hat beispielsweise eine eigene Sprachdatei.

Datenbank
Du hast deine Seiten und Einträge in einer Datenbank gespeichert. Und je nach Sprache kann ein Feld in der Datenbank beim Eintrag gesetzt sein.

protonenbeschleuniger 29.08.2013 09:58

Das ist etwas komplizierter, als du dir es jetzt vorstellst. Ein Wort zu übersetzen funktioniert so, aber was ist mit sowas: "you have {zahl} apples"?
Das läßt sich im Zweifel noch mit einer printf Syntax lösen, aber was ist, wenn du nicht weißt ob Zahl eins oder zwei ist?
"Es wurde 1 Datei gelöscht" vs. "Es wurden 2 Dateien gelöscht"

Dafür gibt es aber eine Lösung gettext Übersetzers Liebling | PHP Magazin

mymaksimus 29.08.2013 11:07

Naja das ist erstmal nicht das problem, man kann die ei traege ja auch trennen. Aber ich frage mich ob es bei mehrsorachigen seiten normal ist dass man wirklich nur noch ueber php text ausgibt.
Naja es geht ja auch nicht anders.

explanator 29.08.2013 11:24

Zitat:

Zitat von mymaksimus (Beitrag 532711)
Aber ich frage mich ob es bei mehrsorachigen seiten normal ist dass man wirklich nur noch ueber php text ausgibt..

Du hast im Prinzip 3 Möglichkeiten:
  1. Ausgabe von statischen Seiten. Du erstellst für jede Sprache eine eigene HTML-Seite.
  2. Ausgabe von dynamischen Seiten. Erstellung durch serverseitige Sprache(Standardvorgehen)
  3. Ausgabe von statischer Seite und Inhalte über AJAX dynamisch einpflegen.
Ausser bei Fall 1 hasst du immer auch eine serverseitige Sprache im Spiel.

Ob die Seite hinterher
de.example.org/index
example.org/de/index
example.org/index_de
heisst und ob sie eine Dateiendung hat ist erst mal nebensächlich.

lottikarotti 29.08.2013 12:04

Hallöchen,

Zitat:

Zitat von mymaksimus (Beitrag 532711)
Naja das ist erstmal nicht das problem, man kann die ei traege ja auch trennen. Aber ich frage mich ob es bei mehrsorachigen seiten normal ist dass man wirklich nur noch ueber php text ausgibt.
Naja es geht ja auch nicht anders.

irgendwo müssen die Daten nunmal herkommen. Viele stülpen über PHP (was ja bereits eine Template-Engine ist) weitere Template-Enginges um die Übersichtlichkeit zu wahren. Ich persönlich nutze für meine Projekte eine eigens entwickelte Template-Engine, welche das ebenso von mir entwickelte Wörterbuch direkt abfragen kann. Das sieht in der Praxis dann etwa so aus:

de.php:
PHP-Code:

...
i18n::add('welcome''Herzlich willkommen');
i18n::add('online_user_count', function($param){
    return 
i18n::nswitch(
        
'Es sind keine weiteren Benutzer online.',
        
'Es ist %d weiterer Benutzer online.',
        
'Es sind %d weitere Benutzer online.',
        
$param
    
);
});
... 

template.html:
HTML-Code:

...
<h1>#dict.welcome#</h1>
<p>#dict.online_user_count(online_user_count)#</p>
...

Diese Template-Datei wird von meiner Engine automatisch in eine lauffähige PHP-Datei übersetzt und tut letztlich nichts anderes wie:
PHP-Code:

<?php echo i18n::get('welcome'); ?>
<?php 
echo i18n::get('online_user_count'$online_user_count); ?>

Auf die Frage, wie die "professionellen Seiten" das lösen, gibt es sicherlich keine pauschale Antwort. Jeder Entwickler hat da so seine Vorlieben in Sachen Bibliotheken, Flexibilität, Handhabung, Performance usw.

Viele Grüße,
lotti

inta 29.08.2013 12:39

Wenn dich solche grundlegenden Techniken interessieren, lies dir doch das Symfony-Buch durch. Das ist natürlich alles auf Symfony bezogen, aber sehr gut und leicht verständlich geschrieben und lässt sich oft auch auf allgmeine Anwendungsfälle übertragen.

mymaksimus 29.08.2013 13:09

Danke erstmal für die Antworten ^^
Aber lottikarotti, jetzt bin ich etwas verwirrt - wie schaffst du es php code zwischen #...# auszuführen?? Oder übersehe ich da etwas?

lottikarotti 29.08.2013 15:25

Hallöchen,

Zitat:

Zitat von mymaksimus (Beitrag 532724)
Aber lottikarotti, jetzt bin ich etwas verwirrt - wie schaffst du es php code zwischen #...# auszuführen?? Oder übersehe ich da etwas?

Stell dir vor du hast eine Datei "index.html" welche eine x-beliebige Syntax für Platzhalter verwendet. Bein "rendern" wird nun die gesamte Datei "index.html" eingelesen, alle sich darin befindlichen Platzhalter werden durch die tatsächlichen Werte ersetzt und anschließend wird das Ergebnis ausgegeben. Du machst quasi aus der Zeichenkette:

HTML-Code:

<h1>#welcome#</h1>
die folgende:

HTML-Code:

<h1>Herzlich willkommen!</h1>
---

Um das nun etwas flexibler und performanter zu gestalten, gehe ich den Weg, dass ich die "rohe Fassung" der Templates selbst übersetze - und zwar in lauffähigen PHP-Code. So wird aus

HTML-Code:

<h1>#welcome#</h1>
zunächst ein PHP-Script mit dem Inhalt:

PHP-Code:

<h1><?php echo $data['welcome']; ?></h1>

Anschließend kann ich diese übersetzte Fassung mittels include "rendern":

PHP-Code:

ob_start();
$data['welcome'] = 'Herzlich willkommen';
include(
'template.php');
$html ob_get_clean(); 

In der Praxis sieht das bei mir natürlich nicht ganz so aus. Für den praktischen Einsatz nutze ich spezielle Klassen, welche mir die ganze Arbeit abnehmen und die Templates bei Bedarf automatisch übersetzen, Parameter weiterreichen usw. Das kann dann so aussehen:
PHP-Code:

<?php
    
echo Template::render'index', [ 'welcome' => 'Herzlich willkommen' ] );
?>

Auch habe ich meiner Template-Engine die Syntax #dict.VAR# beigebracht, damit ich Zeichenketten wie 'Herzlich willkommen' nicht extra an das Template übergeben muss, da diese sich ohnehin nicht ändern.

Derartige Techniken sind eigt. üblich im PHP-Umfeld und du wirst zu dem Thema viele weitere Informationen im Netz finden.

Viele Grüße,
lotti

mymaksimus 29.08.2013 16:15

Hm unter welchem Stichwort suche ich denn da?
Also wie bringe ich meinem Dokument bei zB aus $ $ <?php ?> zu machen?


Alle Zeitangaben in WEZ +2. Es ist jetzt 11:05 Uhr.

Powered by vBulletin® Version 3.8.11 (Deutsch)
Copyright ©2000 - 2024, vBulletin Solutions, Inc.

© Dirk H. 2003 - 2023