php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > PHP Developer Forum
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Fragen zu Laravel, YII oder anderen PHP-Frameworks.

Antwort
 
LinkBack Themen-Optionen Bewertung: Bewertung: 1 Stimmen, 5,00 durchschnittlich.
  #1 (permalink)  
Alt 20-10-2006, 12:37
deklarmart
 Junior Member
Links : Onlinestatus : deklarmart ist offline
Registriert seit: Sep 2002
Ort: # my_home.php - line 213 ;-)
Beiträge: 112
deklarmart ist zur Zeit noch ein unbeschriebenes Blatt
Lightbulb 3 verschiedene Möglichkeiten für Multilanguages

Hallo zusammen.

Nach längerer Zeit melde ich mich hier auch mal wieder zu Wort. Ich muss
gerade ein größeres Projekt planen, wo ich mal die fachmännische Erfahrung
einiger User hier benötige.

Es geht um ein System, das später in min. 13 Sprachen verfügbar sein wird.
Das System ist keine Homepage in dem Sinne, sondern dient zum verwalten
von (ich nenne es mal) Produkten. Diese Produkte haben eine vielzahl
von Attributen! Es wird also in der Browser-Ansicht später große
Tabellen geben, mit vielen Feld-Beschriftungen und Buttons,
sowie Info-Texten zu den Eingabefeldern. Die müssen natürlich alle
jeweils in der vom Benutzer gewählen Sprache erscheinen.

Es geht jetzt um die Frage, welche der folgenden drei Varianten zur
Mehrsprachigkeit dafür am geeignetsten ist.

1) Array:
Ein Array mit allen Beschriftungen für jede Sprache.
Vorteil: Einfach zu handhaben bei der Entwicklung.
Nachteil: Das Array muss bei jedem Aufruf neu initialisiert werden, und
da es vermutlich sehr sehr groß wird, nimmt das viele Ressourcen weg.

2) Datenbank mit Sprachen-Tabelle:
Alle Beschriftungen stehen stehen in den jeweiligen Sprachen in
einer Tabelle.
Vorteil: Ist schneller als ein Array.
Nachteil: Ich muss im gesamten Script immer ein Objekt mit dem Ergebnis
der Tabellenabfrage für die ausgewählte Sprache mitschleifen und diese Variante
ist sicherlich sehr umständlich bei der Entwicklung.

3) i18n GetText:
Binäre Sprachdateien
Vorteil: Sehr einfach bei der Entwicklung und ist vermutlich die schnellste
der hier vorgestellten Möglichkeiten.
Nachteil: Ich habe gelesen, das PHP dafür auf dem jeweiligen System
speziell kompiliert werden muss. Ist dies tatsächlich so, fällt die GetText
Variante leider ins Wasser, da das System später auch auf Shared-Hosting
Servern laufen soll. Kann dazu jemand was sagen?

Frage an alle:
welche der drei Möglichkeiten habt ihr für was für ein System schon
mal eingesetzt und welche Erfahrungen habt ihr damit gemacht? Bzw.
welche der Möglichkeiten würdet ihr favorisieren?

Ich bin sehr gespannt auf eure Antworten.
Vielen Dank, Gruß dek*


Edit:
Habe vergessen zu erwähnen, dass das System auf Apache- sowie
IIS Webservern laufen können soll. Ich weiß nicht, ob das für die dritte
Variante von Bedeutung ist. So wie ich das verstanden habe, arbeitet
i18n sehr System nah, bzw. irgendwie über die Shell oder so!? Denn
dann weiß ich auch nicht, wie man auf einem Shared-Hosting Webspace
ein Tool wie das GNU xgettext installieren und ausführen soll...
__________________
GLORIA PERPETUA

Geändert von deklarmart (20-10-2006 um 12:42 Uhr)
Mit Zitat antworten
  #2 (permalink)  
Alt 20-10-2006, 12:55
Kropff
  Administrator
Links : Onlinestatus : Kropff ist offline
Registriert seit: Mar 2002
Ort: Köln
Beiträge: 11.722
Kropff befindet sich auf einem aufstrebenden Ast
Standard

eine mischung aus variante 1 und 2

spezielle sprachdateien mit den allgemeinen bezeichungen (z.b. produkt, preis) in arrays
produkte mit beschreibung, preis etc. in identisch benamten felder + sprachsuffix also produkt_de, produkt_en, produkt_fr, usw.

dann wird eine globale variable mit entsprechenden suffix definiert, über die die sprachsteuerung lauft, z.b:
PHP-Code:
global $suffix;
$suffix 'de';

....
include (
'lang/'.$suffix.'.inc.php'); 
und die abfragen dann so:
PHP-Code:
$query='SELECT produkt_'.$suffix.' AS produkt FROM ...'
hat sich als sehr flexible methode herausgestellt. ein code und zig sprachen.

gruß
peter
__________________
Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
Meine Seite
Mit Zitat antworten
  #3 (permalink)  
Alt 20-10-2006, 12:58
Abraxax
  THE REAL HAXE (Administrator)
Links : Onlinestatus : Abraxax ist offline
Registriert seit: Jul 2002
Ort: neuss.nrw.de
Beiträge: 22.623
Abraxax befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
und die abfragen dann so:
PHP-Code:
$query='SELECT produkt_'.$suffix.' AS produkt FROM ...'
hat sich als sehr flexible methode herausgestellt. ein code und zig sprachen.
du willst ihm doch nicht ernsthaft raten, für jede sprache eine eigene produkttabelle zu definieren. oder doch?
__________________
INFO: Erst suchen, dann posten! | MANUAL(s): PHP | MySQL | HTML/JS/CSS | NICE: GNOME Do | TESTS: Gästebuch | IM: Jabber.org |


Mit Zitat antworten
  #4 (permalink)  
Alt 20-10-2006, 13:03
Kropff
  Administrator
Links : Onlinestatus : Kropff ist offline
Registriert seit: Mar 2002
Ort: Köln
Beiträge: 11.722
Kropff befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
produkttabelle zu definieren
nein, sprachfelder innerhalb einer tabelle

gruß
peter
__________________
Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
Meine Seite
Mit Zitat antworten
  #5 (permalink)  
Alt 21-10-2006, 09:50
Abraxax
  THE REAL HAXE (Administrator)
Links : Onlinestatus : Abraxax ist offline
Registriert seit: Jul 2002
Ort: neuss.nrw.de
Beiträge: 22.623
Abraxax befindet sich auf einem aufstrebenden Ast
Standard

und bei 13 sprachen hast du 13 spalten nur für den namen eines produktes? und wenn die beschreibung dann auch noch mit dabei ist, hast du noch einmal 13 beschreibungsfelder? udsw ...
__________________
INFO: Erst suchen, dann posten! | MANUAL(s): PHP | MySQL | HTML/JS/CSS | NICE: GNOME Do | TESTS: Gästebuch | IM: Jabber.org |


Mit Zitat antworten
  #6 (permalink)  
Alt 21-10-2006, 11:11
Benutzerbild von onemorenerd onemorenerd
  Moderator
Links : Onlinestatus : onemorenerd ist offline
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.471
onemorenerd wird schon bald berühmt werdenonemorenerd wird schon bald berühmt werden
Standard

@abraxax: Das läßt sich doch irgendwie gar nicht vermeiden?! Wenn man den Namen eines Produktes in 13 Sprachen ausgeben muß, dann muß man diese 13 Namen auch irgendwo gespeichert haben. Ob das nun in 13 Dateien, 13 Datenbanken, 13 Tabellen oder 13 Feldern ist, ist eine Frage für sich. Aber 13 Namen z.B. serialized in 1 Feld oder 1 Datei zu schreiben ist sicher nicht der Königsweg.

Die Sprachen auf eigene Datenbanken aufzuteilen, könnte performanter sein und vom Code her ist es ziemlich egal, ob man
SELECT ... FROM table_$lang ...
oder
SELECT col_$lang FROM table ...
schreibt. Da Preise ja auch von Land zu Land unterschiedlich sind, ist das kein Problem, lediglich wenn Bestellnummern oder sowas überall gleich sind, muß man aufpassen, alles schon synchron zu halten. In diesem Fall würde ich diesen Weg nicht gehen.
Mit Zitat antworten
  #7 (permalink)  
Alt 21-10-2006, 11:39
closure
 Master
Links : Onlinestatus : closure ist offline
Registriert seit: Mar 2006
Beiträge: 796
closure ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Hi,
grundsätzlich geb ich onemornerd recht. Den nachteil den ich aber
grundsätzlich bei der 13-column-methode sehe ist die erweiterbarkeit.
Kommt eine sprache hinzu muss eine neue spalte angelegt werden.
Das skaliert schlecht.

Wenn ich von vornherein weiss dass die anwendung multilingual
sein soll, dann lege ich immer eine eigene tabelle bzw. zwei.

Code:
language
id|name

item
id|name_id

language_text
foreign_id|lang_id|text
Der query sieht dann so aus.
Code:
"SELECT * FROM item
         INNER JOIN language_text AS name_text ON (name_text.foreign_id = item.name_id AND name_text.lang_id = {$lang_id})";
$lang_id wird einmalig abhängig vom benutzter selected und dann
in der session gespeichert.
Meistens cache ich dann die ergebnisse damit sie bei häufiger
verwendung schnell da sind.
Nachteil dieses vorgehens sind riesige joins wenn man viele
textbausteine internationalisieren muss.

greets
__________________
(((call/cc call/cc) (lambda (x) x)) "Scheme just rocks! and Ruby is magic!")
Mit Zitat antworten
  #8 (permalink)  
Alt 21-10-2006, 11:44
aimbot
 PHP Junior
Links : Onlinestatus : aimbot ist offline
Registriert seit: Feb 2004
Ort: Lahr - Germany
Beiträge: 779
aimbot ist zur Zeit noch ein unbeschriebenes Blatt
Standard

zu gettext:

für jede sprache musst eine mo und eine po (afaik) generiert werden. das passiert direkt auf dem system ist also nicht für shared server gedacht.

da gibts so ein fw. prado, die haben ne ähnliche technik im einsatz (imho auch für shared geeignet). kannst dir das ja mal ansehen.
__________________
MfG
aim
Lies mich jetzt!
- OT-Tags-Liebhaber und BB-Code-Einrücker -
Mit Zitat antworten
  #9 (permalink)  
Alt 21-10-2006, 13:30
Slava
 PHP Senior
Links : Onlinestatus : Slava ist offline
Registriert seit: Nov 2002
Ort: Köln->Karlsruhe
Beiträge: 1.589
Slava befindet sich auf einem aufstrebenden Ast
Standard

ich habe ähnlich wie @closure geschrieben hat eine mehrsprachige seite mal Aufgebaut.

um auf einer Seite mehrere selects zu vermeiden, habe ich zusätzlich eine Tabelle "Seite" aufgebaut

Tabelle Seite
seiten_id: primary key
begriff_id: id von dem Text, der in mehreren Sprache übersetzt ist
assign: platzhalter für die Template z.b.s CONTENT oder HEADER

dadurch könnte ich mit einem query erst alle Inhalte bekommen

select Seite.assign, Begriff.text from Seite INNER JOIN Begriff on
Seite.begriff_id= Begriff.begriff_id INNER JOIN Sprache
ON Begriff.sprache_id=Sprache.sprache_id
WHERE Seite.seiten_id=$aktueleseite
and
Sprache.sprach_kurz = '$sprache'

und bei auslesen mit misql_query
könnte ich direkt die Template initialisieren.
PHP-Code:
while($erg=mysql_fetch_array($handle)){
$templ->assign($erg['assign'],$erg['text']);

hoffentlich kannst du das auch irgendwie benutzen.
__________________
Slava
bituniverse.com
Mit Zitat antworten
  #10 (permalink)  
Alt 21-10-2006, 17:42
bärlina
 Junior Member
Links : Onlinestatus : bärlina ist offline
Registriert seit: Oct 2005
Beiträge: 131
bärlina ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Original geschrieben von closure
Wenn ich von vornherein weiss dass die anwendung multilingual
sein soll, dann lege ich immer eine eigene tabelle bzw. zwei.

ich hab zwar keine großen Erfahrungen, aber die lösung mit der tabelle für jede sprache ist bei uns auch im einsatz (großes motorsportportal)

denn die passenden scripte also querys usw lassen sich sehr leicht
erstellen..bsp sind ja schon hier im thread : tabelle_$language

so ist das erweitern immer sehr leicht, per knopdruck lassen sich alle tabellen generieren, falls eine neue sprache benötigt wird.
dabei werden auch gleich excel-dateien erzeugt fürs übersetzungsbüro.

damit bei uns nicht immer der komplette datensatz einer sprachtabelle geladen wird, haben alle texte nen content key, der bei dem select query der jeweiligen seite mit übergeben wird :where content=trulli
Mit Zitat antworten
  #11 (permalink)  
Alt 21-10-2006, 19:09
Abraxax
  THE REAL HAXE (Administrator)
Links : Onlinestatus : Abraxax ist offline
Registriert seit: Jul 2002
Ort: neuss.nrw.de
Beiträge: 22.623
Abraxax befindet sich auf einem aufstrebenden Ast
Standard

@onemorenerd
die lösung / der lösungsansatz von closure ist sicherlich der bessere weg für eine multilanguage-fähigkeit.

um sich joins für ein großes aufkommen an seitenanfragen zu umgehen kann man sicherlich auch mit (einer) temporären tabelle(n) arbeiten ....

aber für jede sprache eigene tabellen oder spalten in tabellen zu definieren, halte ich für nicht klug.
__________________
INFO: Erst suchen, dann posten! | MANUAL(s): PHP | MySQL | HTML/JS/CSS | NICE: GNOME Do | TESTS: Gästebuch | IM: Jabber.org |


Mit Zitat antworten
  #12 (permalink)  
Alt 22-10-2006, 16:38
deklarmart
 Junior Member
Links : Onlinestatus : deklarmart ist offline
Registriert seit: Sep 2002
Ort: # my_home.php - line 213 ;-)
Beiträge: 112
deklarmart ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Danke zunächst für die Antworten. Vielleicht habe ich es nicht genau genug
formuliert. Also, für den Produktnamen haben wir in der Tablle tatsächlich
mehrere Felder jeweils in anderen sprachen.
PHP-Code:
produktname_deproduktname_enproduktname_fr, ... 
usw. Genauso bei den Beschreibungen. Es ist zwar (wie hier auch gesagt
wurde) nicht so gut skalierbar, aber das ist (laut Projekt-Team) in Ordnung so.
Das nehmen wir bitte als gegeben hin, egal ob sinnig oder unsinnig

Was jetzt genau meine Frage war, ist folgendes:

Ein Benutzer soll nun das Produkt in seiner Sprache angezeigt bekommen.
Er hat zB englisch ausgewählt. Die Abfrage macht nun folgendes:
PHP-Code:
$lang 'en';
"SELECT produktname_$lang, besch_$lang FROM produkte..." 
soweit ok! So, jetzt kommt mein Problem: es wird auf einer HTML Seite
angezeigt:


PHP-Code:
Helloyou selected this product:<br />
<
b>Product-Name:</b> {hier produktname in englisch aus der DB (produktname_en)}
<
b>Product-Description:</b> {hier die beschreibung aus der DB (besch_en)}
<
input type="submit" value="save" />
<
input type="submit" value="edit" /> 
Oder das ganze wenn deutsch ausgewählt ist:

PHP-Code:
Hallosie haben folgendes Produkt ausgewählt:<br />
<
b>Produkt-Name:</b> {hier produktname in deutsch aus der DB (produktname_de)}
<
b>Produkt-Beschreibung:</b> {hier die beschreibung aus der DB (besch_de)}
<
input type="submit" value="speichern" />
<
input type="submit" value="bearbeiten" /> 
Ist es deutlicher was ich meine? Es geht um die vielen vielen Beschriftungen,
Überschriften, Bezeichnungsfelder, Infofelder, Button-Beschriftungen usw.
Die ändern sich ja im Grunde nie! Müssen aber in der jeweiligen Sprache
erscheinen. Und da war die Frage, wie man soetwas löst.
__________________
GLORIA PERPETUA

Geändert von deklarmart (22-10-2006 um 18:59 Uhr)
Mit Zitat antworten
  #13 (permalink)  
Alt 22-10-2006, 16:57
Slava
 PHP Senior
Links : Onlinestatus : Slava ist offline
Registriert seit: Nov 2002
Ort: Köln->Karlsruhe
Beiträge: 1.589
Slava befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Original geschrieben von deklarmart
Danke zunächst für die Antworten. Vielleicht habe ich es nicht genau genug
formuliert.......
Und da war die Frage, wie man soetwas löst.
also ab jetzt verstehe ich nicht mehr was du wirklich willst
__________________
Slava
bituniverse.com
Mit Zitat antworten
  #14 (permalink)  
Alt 23-10-2006, 12:59
deklarmart
 Junior Member
Links : Onlinestatus : deklarmart ist offline
Registriert seit: Sep 2002
Ort: # my_home.php - line 213 ;-)
Beiträge: 112
deklarmart ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Original geschrieben von Slava
also ab jetzt verstehe ich nicht mehr was du wirklich willst
OK, nochmal das ganze

Also angenommen du kannst NUR russisch und KEIN deutsch. Du hast
dann natürlich russisch als deine Sprache ausgewählt. Die Produkt-Daten
werden also auf russisch aus der DB geholt. Nun werden die Daten dir
im Browser angezeigt und dort steht folgendes:

Hallo, Sie haben folgendes Produkt ausgewählt:
Produktname: ме-ньше знаешь
Produktbeschreibung: спишьлучше тем спишьспишь луч ше спишь


(Die russischen Zeichen habe ich dir mal aus deiner Signatur geklaut^^)
Du kannst wie gesagt kein deutsch, bekommst das aber nun so angezeigt
wie eben verdeutlicht. Kannst du damit was anfangen? Nein, weil du ja
den deutschen Satz "Hallo, Sie haben folgendes Produkt ausgewählt:"
gar nicht verstehen würdest, genausowenig wie das deutsche Wort "Produktname".
Diese Wörter und Sätze müssen also genauso in alle 13 Sprachen übersetzt
werden, und DAS ist genau die Frage, also wie man das macht!

Am Ende sollte es dann für dich so aussehen:

Создайте, свой онлайн-дневник Бесплатные блоги и личн:
платные: ме-ньше знаешь
рубрикантерн:спишьлучше тем спишьспишь луч ше спишь


Ich weiß nicht wie ich es noch verständlicher
erklären soll, aber ich hoffe mal, das du jetzt weißt was ich meine.
__________________
GLORIA PERPETUA
Mit Zitat antworten
  #15 (permalink)  
Alt 23-10-2006, 13:04
wahsaga
  Moderator
Links : Onlinestatus : wahsaga ist offline
Registriert seit: Sep 2001
Beiträge: 25.236
wahsaga befindet sich auf einem aufstrebenden Ast
Standard

Und warum willst du diese sprachabhängigen Daten jetzt im PHP-Code oder Datenbank ablegen?

Ich würde sagen, du möchtest deine Templates in x verschiedenen Sprachversionen anlegen.
Dann pack doch die Templates in einen Unterordner mit Sprachbezeichnung, oder nehme sie in die Dateinamen mit auf.
__________________
I don't believe in rebirth. Actually, I never did in my whole lives.
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an


PHP News

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni

Wissensbestand in Unternehmen
Wissensbestand in UnternehmenLebenslanges Lernen und Weiterbilden sichert Wissensbestand in Unternehmen

25.05.2018 | Berni


 

Aktuelle PHP Scripte

PHP Server Monitor

PHP Server Monitor ist ein Skript, das prüft, ob Ihre Websites und Server betriebsbereit sind.

11.09.2018 Berni | Kategorie: PHP/ Security
PHP WEB STATISTIK ansehen PHP WEB STATISTIK

Die PHP Web Statistik bietet Ihnen ein einfach zu konfigurierendes Script zur Aufzeichnung und grafischen und textuellen Auswertung der Besuchern Ihrer Webseite. Folgende zeitlichen Module sind verfügbar: Jahr, Monat, Tag, Wochentag, Stunde Folgende son

28.08.2018 phpwebstat | Kategorie: PHP/ Counter
Affilinator - Affilinet XML Produktlisten Skript

Die Affilinator Affilinet XML Edition ist ein vollautomatisches Skript zum einlesen und darstellen der Affili.net (Partnerprogramm Netzwerk) Produktlisten und Produktdaten. Im Grunde gibt der Webmaster seine Affilinet PartnerID ein und hat dann unmittelb

27.08.2018 freefrank@ | Kategorie: PHP/ Partnerprogramme
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 15:20 Uhr.