php.de

Zurück   php.de > php.de Intern > Off-Topic Diskussionen

Off-Topic Diskussionen Mach mal Pause vom Programmieren!

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 23.02.2008, 14:07  
Moderator
 
Benutzerbild von agrajag
 
Registriert seit: 02.10.2006
Beiträge: 3.820
PHP-Kenntnisse:
Fortgeschritten
agrajag wird schon bald berühmt werdenagrajag wird schon bald berühmt werden
Standard Mehrsprachigkeit - gettext()

Hi,

vielleicht hat ja der ein oder andere von euch schon mit gettext() zu tun gehabt oder hast schonmal eine mehrsprachige Seite erstellt...

Ich möchte demnächst eine Seite in mehreren Sprachen anbieten. Dabei möchte ich gettext einsetzen.


Jetzt gibt es im Grunde 2 Möglichkeiten wie ich das angehen kann:
a) Ich habe eine Standardsprache und die verwende ich auch als msgid:
Code:
<?php echo gettext('Hallo, wie geht's?');?>
Für englisch hinterlege ich dann ein .po File mit der Übersetzung:
Code:
msgid 'Hallo, wie geht's?'
msgstr "Hello, how are you?"
oder
b)
Ich verwende als msgid wirklich irgendeinen Platzhalter / eine Id:
Code:
<?php echo gettext('welcome_blurb');?>
Und erstelle sowohl für deutsch als auch für englisch die .po-Files


Hat einer von euch da schon Erfahrungen was die bessere Alternative ist bzw. wo jeweils die Fallstricke von a oder b liegen?

Ich tendiere ja zu a) weil meine Applikation anfangs einsprachig sein wird und ich so zu anfangs keine Sprachfiles pflegen muss.

Würde mich über jeden Hinweis freuen. Auch über allgemeine Hinweise zu Internationalisierung/Lokalisierung.
__________________
Today you...Tomorrow me.
agrajag ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 23.02.2008, 18:35  
Moderator und Wett-König
 
Benutzerbild von dr.e.
 
Registriert seit: 21.05.2008
Beiträge: 3.654
PHP-Kenntnisse:
Fortgeschritten
dr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblick
dr.e. eine Nachricht über Skype™ schicken
Standard

Hallo Agrajag,

soweit ich das noch weiß müssen in gettext jeweils IDs (auch als string) verwendet werden. Die *.mo-Dateien liegen dabei als kompilierte Text-Dateien vor. Dazu gab es mal einen Artikel im PHPmag, oder in der C't. Infos zum Thema findest du unter

- http://www.cpan.org/modules/by-autho...xt-1.01.readme
- http://mel.melaxis.com/devblog/2005/...using-gettext/
- http://www.onlamp.com/pub/a/php/2002/06/13/php.html

Alternativ dazu kannst du dir mal das Konzept des APF ansehen. Hier kennt jedes Objekt das Attibute $__Language. Mit Hilfe dieser Information kann man aus Konfigurationsdateien bequem sprachabhängige Werte auslesen und an entsprechender Stelle einsetzen. Da der ConfigurationManager ein Singleton ist und bereits ausgelesene Konfigurationsdateien im Speicher cached, ist das Auslesen sehr schnell (~100µs). Mehr Informationen dazu gibts unter http://www.adventure-php-framework.o.../Konfiguration, Kapitel 5.
__________________
Viele Grüße,
Dr.E.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1. Think about software design before you start to write code!
2. Discuss and review it together with experts!
3. Choose good tools (-> Adventure PHP Framework (APF))!
4. Write clean and reusable software only!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
dr.e. ist offline   Mit Zitat antworten
Alt 24.02.2008, 14:17  
Moderator
 
Benutzerbild von agrajag
 
Registriert seit: 02.10.2006
Beiträge: 3.820
PHP-Kenntnisse:
Fortgeschritten
agrajag wird schon bald berühmt werdenagrajag wird schon bald berühmt werden
Standard

Hallo dr.e,

danke für deine Antwort.
Wie gettext() grundsätzlich funktioniert ist mir klar. Mir geht es mehr darum ob es praktischer ist dann als gettext-msgid schon den eigentlichen Inhalt zu verwenden oder einfach einen Bezeichner.
Also:
PHP-Code:
<?php echo gettext('Form.Email');?> <input ....>
wobei ich Language-Files für deutsch und englisch hinterlegen muss:
Code:
msgid "Form.Email"
msgstr "Ihre Email-Adresse"
und
Code:
msgid "Form.Email"
msgstr "Your Email address"
oder ist es praktikabler als msgstr schon die Standardsprache zu vewenden:
PHP-Code:
<?php echo gettext('Ihre Email-adresse');?>
Wobei ich nur noch ein Language-File für englisch brauche:
Code:
msgid "Ihre Email-adresse"
msgstr "Your Email adress"
und bei deutsch wird - da es kein Language-File dafür gibt - als Fallback einfach der Text direkt ausgegeben der bei gettext() angegeben wurde.


Ich hab mir jetzt auchmal die Lösung im APF angeschaut, allerdings finde ich es doch recht umständlich bzw. etwas viel Tipparbeit für jede Übersetzung in den Views eine ellenlange XML-Zeile tippen zu müssen.
Im Controller ist es etwas weniger Tipparbeit. Aber auch da könnte man es doch noch verkürzen. Ich schätze mal du hast bestimmt einen guten Grund dafür es so zu machen...aber wäre es nicht eine Erleichterung die Parameter Reihenfolge von config::getValue() zu ändern und dann falls nur ein Parameter angegeben wurde die Standard-Sprache zu verwenden. Oder eine $Config->setLanguage()-Methode einzubauen. So tippt man sich ja einen Wolf bzw. Copy&Pasted sich kaputt
__________________
Today you...Tomorrow me.
agrajag ist offline   Mit Zitat antworten
Alt 24.02.2008, 19:14  
Moderator und Wett-König
 
Benutzerbild von dr.e.
 
Registriert seit: 21.05.2008
Beiträge: 3.654
PHP-Kenntnisse:
Fortgeschritten
dr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblick
dr.e. eine Nachricht über Skype™ schicken
Standard

Hallo Agrajag,

ich meinte schon, dass du besser IDs, also Keys für deine Texte verwenden solltest, nicht die Ausgabe direkt, da das weniger Tipparbeit ist. Hier bietet sich natürlich an, irgendwie zu Klassifizieren, wie du das bereits mit "Form.Email" gemacht hast. Sinnvollerweise baust du dir dafür noch einen *.mo-Compiler, der dir aus CSV-Dateien die richtigen language files kompiliert, dann tust du dir leichter bei der Pflege und beim Deployment.

Was die Lösung im APF angeht, so habe ich - wie du schon vermutet hast - einen Grund: Generik. Schränke ich die Parameter-Geschichte ein, so muss man im "Nicht-Standard"-Fall anderes reagieren. Man könnte sicher noch einen Tag basteln, der den Namespace, Context und Sprache des Vater-Objekts zieht und an Hand dieser Informationen die Ausgabe erzeugt, jedoch hat man dann das Problem, dass ein View, der mit einem anderen Context importiert wurde nicht mehr funktioniert und damit Module nicht mehr so effektiv gekapselt werden können.

Auch ich habe mir die gettext()-Geschichte zur Integration in das Framework angesehen, es ist jedoch nicht schön, dass man die Konfiguration global für eine komplette Applikation setzen muss und nicht flexibel pro Modul machen kann, wie man Lustig ist.

Egal, du kommst damit zurecht, dann sollst du das auch so machen!
__________________
Viele Grüße,
Dr.E.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1. Think about software design before you start to write code!
2. Discuss and review it together with experts!
3. Choose good tools (-> Adventure PHP Framework (APF))!
4. Write clean and reusable software only!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
dr.e. ist offline   Mit Zitat antworten
Alt 24.02.2008, 21:46  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard

Nimm Platzhalter, bei Änderungen biste gearscht und darfst alles irgendwie nachtragen, im PO werden die ja sowieso als Platzhalter behandelt und außerdem ist das einfacher, wenn du längere Texte hast. Sehe jetzt keinen großartigen Vorteil von "richtigen" Texten als Platzhalter.


Ein Hinweis noch, ich weiß nicht wie das bei PHP's gettext() ist, aber bei JavaScript gab es Parser, die die gettext() Texte direkt aus den Projektdateien rausgezogen haben. Da wurden einfache Anführungszeichen nicht unterstützt, weil das wohl von C/C++ auch nicht unterstützt wird, man musste also immer drauf achten, doppelte Anführungszeichen in seinen gettext("PLATZHALTER") Deklarationen zu verwenden. Vielleicht machste dich da kurz schlau drüber bevor du loslegst - kann aber auch sein, dass bei PHP die Platzhalter direkt registriert werden, ist ja schließlich mächtiger als JavaScript in der Hinsicht.
Zergling-new ist offline   Mit Zitat antworten
Alt 24.02.2008, 22:49  
Moderator
 
Benutzerbild von agrajag
 
Registriert seit: 02.10.2006
Beiträge: 3.820
PHP-Kenntnisse:
Fortgeschritten
agrajag wird schon bald berühmt werdenagrajag wird schon bald berühmt werden
Standard

Zitat:
Zitat von dr.e.
ich meinte schon, dass du besser IDs, also Keys für deine Texte verwenden solltest, nicht die Ausgabe direkt, da das weniger Tipparbeit ist. Hier bietet sich natürlich an, irgendwie zu Klassifizieren, wie du das bereits mit "Form.Email" gemacht hast.
Das "Form.Email"-Beispiel habe ich quasi aus Deiner APF-Doku kopiert

Zitat:
Sinnvollerweise baust du dir dafür noch einen *.mo-Compiler, der dir aus CSV-Dateien die richtigen language files kompiliert, dann tust du dir leichter bei der Pflege und beim Deployment.
Das muss ich mir noch anschauen wie ich das genau mache.
Ich benutze bei dem Projekt CakePHP und hab gerade gesehen, dass die garnicht gettext() direkt verwenden bzw. dass es zumindest keine kompilierten Sprachfiles gibt sondern das direkt aus den .po-Textfiles gelesen wird. Mal schauen

Zitat:
Egal, du kommst damit zurecht, dann sollst du das auch so machen!
Zumindest reicht es mir wohl momentan so. Aber schadet ja nie was auch ein bißchen rechts und links zu schauen was noch so möglich ist falls man mal andere Anforderungen hat.

Danke für deine Hilfe.




Zitat:
Zitat von Zergling
Nimm Platzhalter, bei Änderungen biste gearscht und darfst alles irgendwie nachtragen, im PO werden die ja sowieso als Platzhalter behandelt und außerdem ist das einfacher, wenn du längere Texte hast. Sehe jetzt keinen großartigen Vorteil von "richtigen" Texten als Platzhalter.
Der Vorteil wäre einfach, dass ich eine Sprache weniger pflegen muss und mir anfangs weniger Gedanken machen muss: Solange ich nur eine Sprache habe muss ich einfach nur jede Ausgabe durch gettext() jagen und sie wird normal ausgegeben ohne dass ich irgendwelche Sprachfiles pflegen muss.
Und zusätzlich ist es eine Art Fallback: Falls keine Übersetzung gefplegt ist wird so trotzdem etwas sinnvolles ausgegeben.

Aber, dass das später zum Problem werden kann denke ich auch. Wenn sich dann wirklich mal der Text ändert müsste ich in allen Übersetzungen die msgids nachziehen.

Also werde ich wohl Platzhalter verwenden.

Danke auch für deinen Hinweis mit den Anführungszeichen. Muss ich mir mal anschauen. da bei CakePHP wohl sowieso nicht direkt die gettext-Funktion verwendet wird muss ich sowieso mal schauen wie genau ich die Texte da automatisiert rausziehen kann.


Erstmal danke für eure Hinweise. Muss mich jetzt erstmal in das ganze reinfuchsen
__________________
Today you...Tomorrow me.
agrajag ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine 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
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
[Erledigt] Gettext Pluralformen parsen Manko10 PHP Tipps 2008 3 13.07.2008 16:46
gettext, einige fragen notyyy PHP Tipps 2008 12 01.05.2008 12:09
Mehrsprachigkeit und kyrillische Zeichen Sclot PHP Tipps 2006 8 15.11.2006 08:07
Sprachfiles / Mehrsprachigkeit ... Wie macht Ihr das? heohni PHP-Fortgeschrittene 17 30.05.2006 23:58
Probleme mit GetText() und Umlaute! eighteen PHP-Fortgeschrittene 1 27.04.2006 21:03
Mehrsprachigkeit innerhalb einer Datenbank Datenbanken 4 14.09.2005 17:01
i18n mit gettext PHP-Fortgeschrittene 1 11.07.2005 14:17
[Erledigt] Mal wieder mod_rewrite in .htaccess ;-) / Mehrsprachigkeit Server, Hosting und Workstations 3 07.09.2004 17:27

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
cakephp gettext, javascript mehrsprachig, php mehrsprachigkeit gettext, gettext platzhalter, php gettext platzhalter, mehrsprachigkeit javascript, gettext anführungszeichen, php gettext mehrsprachig, mehrsprachige website javascript, mehrsprachigkeit durch javascript, c mehrsprachig, php mehrsprachige website gettext, php konzept mehrsprachig, cakephp mehrsprachigkeit, http://www.php.de/off-topic-diskussionen/45554-mehrsprachigkeit-gettext.html, gettext mehrsprachigkeit, mehrsprachig mit javascript, php mehrsprachig gettext, mehrsprachigkeit php gettext, javascript mehrsprachiger text

Alle Zeitangaben in WEZ +2. Es ist jetzt 13:22 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum

Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.