theHacker

sieht vor lauter Ads den Content nicht mehr
Teammitglied
ID: 69505
L
20 April 2006
22.682
1.316
Moin.

Ich möchte versuchen, eine Webseite in mehreren Sprachen anzubieten. Im Moment beruht alles schon auf Smarty.

Meine Versuche mit Google haben mir zwei mögliche Ansätze gebracht:


Ich würde zu Ansatz 2 tendieren und das Ganze dann noch mittels XML-Files machen, der Art
HTML:
<?xml version="1.0" encoding="UTF-8" ?>
<language name="deutsch">
  <phrase1>Übersetzung für Phrase 1</phrase1>
  <!-- ... -->
</language>
Problematisch finde ich nur - und das is bei beiden Ansätzen der Fall -, wenn ich in meinen Templates Textpassagen drin hab, in denen Variablen sind.

Mal ein Extrembeispiel:
HTML:
<p>Dies ist ein langer Text, der übersetzt werden müsste.
Heute haben wir {$temperature}. Man braucht {$count_umbrellas}
{if $count_umbrellas == 1}Regenschirm{else}Regenschirme{/if},
wenn man aus dem Haus geht.
Und so weiter...</p>
Überall, wo die Variablen und Funktionen sind, muss ich praktisch ja die Übersetzung aufsplitten :-?

HTML:
<p>##longtextpart1## {$temperature}##longtextpart2## {$count_umbrellas}
{if $count_umbrellas == 1}##umbrella_singular##{else}##umbrella_plural##{/if}##longtextpart3##</p>
Die entsprechende Übersetzung:
HTML:
<?xml version="1.0" encoding="UTF-8" ?>
<language name="deutsch">
  <longtextpart1>Dies ist ein langer Text, der übersetzt werden müsste.
Heute haben wir</longtextpart1>
  <longtextpart2>. Man braucht</longtextpart2>
  <longtextpart3>,
wenn man aus dem Haus geht.
Und so weiter...</longtextpart3>
  <umbrella_singular>Regenschirm</umbrella_singular>
  <umbrella_plural>Regenschirme</umbrella_plural>
</language>
Sieht sehr doof aus.

Alternative: Ich setze die Variablen mit in die Übersetzung. Da sich die Übersetzung vor der Kompilierung abspielt, wäre es möglich.
Konkret am Beispiel:
HTML:
<p>##sometext##</p>
HTML:
<?xml version="1.0" encoding="UTF-8" ?>
 <language name="deutsch">
   <sometext>Dies ist ein langer Text, der übersetzt werden müsste.
Heute haben wir {$temperature}. Man braucht {$count_umbrellas}
{if $count_umbrellas == 1}##umbrella_singular##{else}##umbrella_plural##{/if},
wenn man aus dem Haus geht.
Und so weiter...</sometext>
   <umbrella_singular>Regenschirm</umbrella_singular>
   <umbrella_plural>Regenschirme</umbrella_plural>
 </language>
Problem: Kurz vor der Kompilierung hab ich dann
HTML:
<p>Dies ist ein langer Text, der übersetzt werden müsste.
 Heute haben wir {$temperature}. Man braucht {$count_umbrellas}
 {if $count_umbrellas == 1}##umbrella_singular##{else}##umbrella_plural##{/if},
 wenn man aus dem Haus geht.
 Und so weiter...</p>
- also noch Übersetzungskonstrukte drin. Ich müsste also mehrmals meinen Prefilter anwenden, um schließlich
HTML:
<p>Dies ist ein langer Text, der übersetzt werden müsste.
  Heute haben wir {$temperature}. Man braucht {$count_umbrellas}
  {if $count_umbrellas == 1}Regenschirm{else}Regenschirme{/if},
  wenn man aus dem Haus geht.
  Und so weiter...</p>
zu erhalten.

Wie oft? Eine bestimmte Anzahl vorgeben oder solange durchgehen, bis alle "##irgendwas##"-Ausdrücke weg sind? Letztes könnte zur Endlosschleife werden, wenn man nicht aufpasst. Also auch böse.

Was würdet ihr empfehlen?
 
Ich weiß nicht ob du das Problem noch hast, da du aber keine Bearbeitung vorgenommen hast gehe ich mal davon aus.

[..]Wie oft? Eine bestimmte Anzahl vorgeben oder solange durchgehen, bis alle "##irgendwas##"-Ausdrücke weg sind? Letztes könnte zur Endlosschleife werden, wenn man nicht aufpasst. Also auch böse.[..]

Naja, wie kann das denn zur Endlosschleife werden?
Was mir einfällt, so lange alle '##irgendwas##' ersetzen, bis ~##([^#]*)##~ nicht mehr gefunden wird. Aber daran wirst du wohl auch gedacht haben, oder?

Ich frage mich aber gerade, warum man in der Übersetzung noch ein '##irgendwas##' schreiben soll, man weiß doch welche Sprache aktuell dran ist und schreibt dann dort direkt das Wort hin, in deinem Beispiel: "Regenschirm" bzw. "Regenschirme".
Also:
HTML:
<?xml version="1.0" encoding="UTF-8" ?>
 <language name="deutsch">
   <sometext>Dies ist ein langer Text, der übersetzt werden müsste. 
Heute haben wir {$temperature}. Man braucht {$count_umbrellas} 
{if $count_umbrellas == 1}Regenschirm{else}Regenschirme{/if}, 
wenn man aus dem Haus geht. 
Und so weiter...</sometext>
 </language>
 
Zuletzt bearbeitet:
Ich rate dir zu einem modifizierten Ansatz 1. Sprache in Templates ist überwiegend lästig und auf Grund von variablen Inhalten auch noch eklig zu übersetzen.

Sprachbezogene Inhalte würde ich am besten in eine ini-Dateien packen, allerdings nicht in eine sondern in mehrere, themenbezogen. Es ist ineffizient, jedes Mal die gesamte Sprachdatei zu laden, obwohl nur eine Phrase gebraucht wird, also cachet du zusätzlich zur Aufsplittung der Dateien die Inhalte in Instanzvariablen einer Sprachabstraktionsklasse.
Auf die Phrases greifst du ja dann über Keys zu. Wenn du diese nach einer bestimmten Konvention benennst (z.B. je nach "Thema" bestimmte Präfixe), kannst du die dynamische Einbindung leichter automatisieren, das erledigt auch die Sprachabstraktionsklasse.
Variable Inhalte werden durch Platzhalter in den Phrases gekennzeichnet. Die Ersetzung durch konkrete Werte erfolgt auch über deine Klasse und kann als Parameter der get-Methode übergeben werden. Sofern variable Inhalte selbst wieder sprachbezogen sind (Singular, Plural z.B.), müssen sie natürlich als Platzhalter gekennzeichnet werden. Die Platzhaltersyntax ließe sich da regexähnlich erweitern und müßte vor der Ersetzung von deiner Klasse prozessiert werden.

Sehe da keine Probleme bei.

P.S. Verdammt, der Beitrag ist ja schon nen Monat alt :(
 
P.S. Verdammt, der Beitrag ist ja schon nen Monat alt :(

das ist nicht schlimm, dies ist ein Thema welches immerwieder aufkommt und bis heute ich auch noch keine perfekte Lösung dafür gefunden habe, ausser vllt eine Engine für Lokalisierungen zu schreiben.

Und Häckerlein hat auch vor nem Monat keine Lösung gefunden, die ihm optimal gefallen hat, sondern das kleinste Übel war, gell? :p:biggrin: