Probleme mit gettext
Vor geraumer Zeit begegnete ich immer wieder einer nervigen Fehlermeldung:
Warning: unpack() [function.unpack]: Type V: not enough input,
need 4, have 0 in /***/wp-includes/gettext.php on line 85
Hierbei handelt es sich um PHP-Dateien einer WordPress-Installation (Version 2.2.3 DE und Version 2.3 DE). Unter Unix ist GNU gettext eine weit verbreitete Bibliothek. Sie macht im Grunde nichts anderes, als einen übergebenen “originalen” String (in der Regel ein englischer Text) in einen entsprechenden String einer anderen Sprache zu übersetzen. Das Mapping zwischen diesen Strings befindet sich in so genannten MO-Dateien (z.B. “de_DE.mo”). Auch WordPress setzt solche Dateien für die Übersetzung ein.
(Gelöst mit WordPress 2.6.1 – Details weiter unten…)
PHP könnte direkt mit gettext-Support kompiliert werden. Dadurch stünden entsprechende Funktionen direkt zur Verfügung. Doch würde solch ein Programm nicht auf einem Rechner ohne entsprechende Unterstützung laufen. Aus diesem Grund wurde in WordPress das Projekt PHP gettext integriert. Die Implementierung liegt in den Dateien “gettext.php” und “streams.php” im “wp-includes”-Verzeichnis. WordPress erhält dadurch die Fähigkeit diese MO-Dateien einzulesen. Doch genau hier entstanden ab und zu Probleme.
Betrachtung des Problems
Die oben dargestellte Fehlermeldung kam bei mir sporadisch. Und ich kenne die Fehlerstelle genau. Sie befindet sich in der Datei “streams.php” in der Klasse StringReader. Und dort in der Funktion read($bytes). Hier lieferte die Zeile $data = substr($this->_str, $this->_pos, $bytes); nicht immer den richtigen Teilstring zurück. Manchmal war der Inhalt genau um ein Byte verschoben. Dadurch wurden in der Datei “gettext.php” in der Funktion gettext_reader(…) Strukturinformationen einer MO-Datei falsch interpretiert, was wiederum dazu führte, dass Mengenangaben komplett falsch eingelesen wurden. In solch einem Fehlerfall wurde die seekto() Funktion mit einem großen negativen Wert aufgerufen, was dazu führte, dass der Stream-Positionszeiger an das Ende der Daten gesetzt wurde. Dadurch lieferte jeder weitere Aufruf der Lesemethode einen Leerstring zurück. Und genau solch ein Leerstring wurde der Methode unpack() in der Datei “gettext.php” in der Zeile 85 übergeben, was zu der oben besagten Meldung führte.
Es ist zwar nicht wirklich eine Lösung, doch hatte ich die oben benannte Codezeile temporär mit folgenden Kommandos ausgetauscht:
Alter Code:
$data = substr($this->_str, $this->_pos, $bytes);
Neuer Code, der immer den richtigen Teilstring ermittelt:
$data = "";
for ($i=0; $i<$bytes; $i++) {
$data .= $this->_str[$this->_pos+$i];
};
Gibt man hier noch eine Meldung aus, sobald die beiden ermittelten Teilstrings unterschiedlich sind, dann merkte man, dass diese gleichzeitig mit dem hier beschriebenen Fehler auftauchte. Verglich man die Inhalte, sah man, dass bei einer Startposition > 0 der Teilstring aus substr() um ein Zeichen/Byte verschoben war. Statt z.B. den Inhalt von Index 4-7 zu ermitteln, lieferte diese Methode dann die Zeichen 5-8. Wohl bemerkt, dies aber nur sehr sporadisch!
Eigentlich eine fatale Sache, wenn ein regulärer PHP-Befehl Probleme verursacht. Dieser Befehl, der Teile aus gegebenen Texten extrahiert, kommt in WordPress häufiger zum Einsatz. Am sichtbarsten ist er in Kombination mit der Datei “gettext.php”, da hier ein Fehler geworfen wird. Aber mir ist ebenfalls aufgefallen, dass es auch Probleme mit dem Abspeichern geschriebener Inhalte gab. Hier kam es vor, dass an Stellen eingebundener Steuercodes (Links, Code-Tags) Teile des Inhaltes verschwanden. Man bemerkte die Fehlersituation, da der berühmte gettext-Fehler auftrat. Aus diesem Grund ließ ich die oben beschriebenen neuen Codezeilen auch nicht in meiner Installation. Mir sind mit diesem Code schon Inhalte verschwunden, ohne dass ich dies sofort bemerkte.
Lösungswege
Auf jeden Fall musste die Problemursache an einer Server-Konfiguration oder –Komponente liegen. Ich verwalte noch eine weitere WordPress-Webseite und dort bekam ich noch keine Fehler. Zu erwähnen ist auch, das beide Seiten beim gleichen Provider gehostet werden, die gleiche PHP-Version installiert war und inzwischen bei beiden WordPress in der Version 2.3 vorlag.
Meine temporäre Lösung bestand darin, dass ich auf meiner Seite die originale englische Version von WordPress installierte. Somit trat der Fehler seltener auf, da eine Sprachdatei weniger eingelesen werden musste. Er verschwand aber nicht komplett, weil noch PlugIns mit Sprachdateien installiert waren. Dies machte sich dann aber eher im Admin-Bereich, vor allem beim Speichern der Beiträge bemerkbar.
Dank dem schnellen und motivierten Support meines Providers All-Inkl.de dachten wir zuerst, dass wir den Fehler eindämmen konnten. Der erste Versuch bestand darin, den ZEND-Optimizer zu installieren und weitere PHP-Parameter an den Parametern des Servers meiner anderen WordPress-Präsenz anzupassen. Leider ohne dem gewünschten Ergebnis. Ein Update der PHP-Installation von der Version 5.2.3 auf 5.2.4, sowie die Aktualisierung der Apache-Installation von der Version 2.2.4 auf 2.2.6 ließen den nervigen Fehler dann kurzzeitig doch verschwinden. Vermutlich besitzt substr() in PHP 5.2.3 nicht die erhoffte Stabilität.
Update 24.10.07:
Das Problem tritt seit heute leider wieder auf! Womöglich lag es doch nicht an der alten PHP-Version. Ich verfolge das weiter…
Update 30.10.07:
Das ist schade, aber auch das Update auf Wordpress 2.3.1 DE brachte nicht den erhofften Erfolg. Wir sind leider so langsam am Ende mit dem Suchen, auch mit der Geduld. Der nächste Schritt besteht wohl darin, meinen Webspace innerhalb meines Providers auf einen anderen Server zu verschieben. Zur Zeit habe ich die Datei “/wp-includes/languages/de_DE.mo” entfernt, damit der Fehler nicht mehr so häufig auftritt.
Update 03.11.07:
Mein Provider All-Inkl hat nun meine Webseite auf einen anderen Server installiert. Seit dem scheint die Webseite ohne Probleme zu funktionieren. Schade ist nur, dass wir nun nicht genau wissen, welche Server-Einstellung / Hardware-Kombination hier wohl Probleme mit der Funktion substr() aus PHP 5 verursacht.
Update:
Der Fehler taucht wieder auf…
Update 15.11.07:
Heute wurde PHP 5.2.5 auf dem Webserver installiert. Laut All-Inkl bin ich der Erste, der diese Installation testen darf. Ich laufe nun auch wieder auf der originalen deutschen Version. Bis jetzt sind mir noch keine Probleme begegnet. Die Zeit wird zeigen, ob das die Lösung war…
Update 26.02.08:
Im Kommentar Nr. 48 berichtet Niko_K, dass das Problem wohl durch nicht übereinstimmende Spracheinstellungen zwischen der WordPress-Configuration und dem Linux-System (Variable LANG) auftritt. Danke!
Ich vermute stark, dass PHP-String-Funktionen wie das substr() wohl abhängig von den Systemeinstellungen sind und somit mit den richtigen Daten befüttert werden müssen.
Update 25.04.08:
Im Kommentar Nr. 60 berichtet Kretzschmar darüber, dass der Fehler unter PHP 4 nicht mehr auftaucht. Die Umstellung von PHP 5 auf PHP 4 kann beim Provider All-Inkl wohl selbst vorgenommen werden.
Ubdate 24.06.08:
Der Bug ist inzwischen schon bei Wordpress registriert (Bug 5599 – danke an Codestyler für den Hinweis). Hier wird aktuell eine Alternative zu substr() eingesetzt. Diese Lösung ist eleganter als die oben beschriebene. Leider ist die korrigierte Stelle nicht die einzige mit dem Befehl substr(), weswegen man trotzdem ein Fehlverhalten bzw. Datenverlust in der Anwendung erwarten kann.
Update 15.08.08:
Endlich! Wordpress 2.6.1 liefert nun ein Bugfix zu diesem Problem. Der Fehler tritt auf, sobald man in der php.ini den Eintrag mbstring.func_overload auf einen anderen Wert als 0 stellt. Meist erlauben die Provider es, diesen Wert für die eigene Web-Präsenz zu ändern. Ein Bug im Apache-Modul mod_php sorgt allerdings bei dieser Art der Umstellung dafür, dass sie für alle V-Hosts des Servers gilt! Sobald also ein User des gleichen V-Hosts an dieser Einstellung dreht, erscheinen bei den anderen WordPress-Präsenzen auf dem Server wohl diese Fehler, zumindes bis eine andere Präsenz diesen Wert wieder auf 0 stellt. Näheres hierzu unter code-styling.de.
Native Lösung
Es lief einige Tage gut, nun sind seit heute (06.11.2007) alle WordPress-Seiten auf dem neuen Server wohl auch betroffen…
Im deutschsprachigen WordPress-Forum bin ich nun auf eine weitere Lösung gestoßen: Einsatz des originalen gettext() Kommandos. Diese Lösung kann leider nur dann angewendet werden, wenn gettext auf dem entsprechenden Server installiert ist. Ein Blick in die PHP-Info liefert hierzu Informationen:
GetText Support enabled
Worin besteht die Lösung? In der WordPress-Datei /wp-includes/l10n.php wird die WordPress-Version von gettext() aufgerufen. Der Code wird nun so geändert, dass die installierte Funktion gettext() anstelle der problematischen gettext-Vertretung aufgerufen wird. Dazu muss die Sprachdatei /wp-includes/languages/de_DE.mo zu wordpress.mo umbenannt und in ein neues Verzeichnis kopiert werden. Der Name des Verzeichnisses ist abhängig von der eingestellten Codierung in der Datei wp-config.php:
Eine Sprachdefinition define (’WPLANG’, ‘de_DE.UTF-8′); benötigt das Verzeichnis wp-includes/locale/de_DE.UTF-8/LC_MESSAGES/.
Lautet die Sprachdefinition define (’WPLANG’, ‘de_DE’); muss das Verzeichnis den Namen wp-includes/locale/de_DE/LC_MESSAGES/ tragen.
Wenn man will, kann man in der Datei wp-settings.php die Zeilen
include_once(ABSPATH . WPINC . ‘/gettext.php’);
include_once(ABSPATH . WPINC . '/streams.php');
auskommentieren und die Dateien gettext.php und streams.php löschen.
Damit die Umstellung schnell vollzogen werden kann, hab ich für WordPress 2.3.1 Deutsch ein kleines ZIP-File mit allen nötigen Änderungen erstellt:
Native_gettext_WordPress_2.3.1.zip
ACHTUNG:
hier bitte auf die richtige Codierung achten, damit beim Posten keine Inhalte verloren gehen. Am Besten vorher ein Backup der Datenbank anlegen. Wenn eine andere Wordpress-Version unterstützt werden soll, dann einfach die Sprachdateien aus dem ZIP-File entsprechend der obigen Anleitung selbst generieren.
Und nicht vergessen: somit ist das Anzeige-Problem gelöst, der Fehler taucht nicht mehr auf, aber es gibt noch viele andere substr()-Aufrufe, welche schief laufen können. Auffällig ist dabei Datenverlust an den Steuer-Tags aus der Code-Ansicht.



Referenzen auf diesen Beitrag
(6. November 2007)
(22. April 2008)
(6. Mai 2008)
(11. Mai 2008)
(16. August 2008)
Kommentare
Ich habe das Problem auch. Und dass Du das auch mit einem Update auf WP 2.3 nicht hinbekommen hast, macht mir Sorgen, da ich das bisher als Lösungsweg sah.
Liegt es denn sicher an einem “deutschen” Problem, d.h. an der de-Version von Wordpress bzw. an deutschsprachigen Plugins, d.h., wenn ich auf die englische Wordpress-Version zurückgreife und keine deutschsprachigen Plugins mehr installiert habe, geht’s wieder? Und wie bekomme ich das hin?
Oder kann der Provider was machen? Wäre auch nett, wenn man im deutschen Wordpress-Forum mehr dazu lesen könnte. Aber wenn Du hier die Lösung findest, wäre mir/uns/vermutlich auch anderen auch schon geholfen.
Lustigerweise (naja, wenn man’s lustig findet) ist gerade auch beim Absenden des oberen Kommentars die Fehlermeldung erschienen…
Der Fehler taucht wohl in der substr() Funktion von PHP 5 auf (oder hast du noch PHP 4.x installiert?)… Und diese wird häufig bei der Übersetzung der Texte aufgerufen. Deswegen ist hier wohl die Wahrscheinlichkeit des Auftretens eines Fehlers erhöht.
Ob es sich hier um einen Folgeeffekt eines noch unbekannten Problems handelt ist mir unklar. Fakt ist, dass ich noch einen weiteren Webspace mit WP 2.3 DE beim gleichen Provider habe. Und hier erscheint dieser Fehler nicht!
Wenn man die Übersetzungen unter /wp-includes/languages/de_DE.mo entfernt, sollte schon das Problem stark reduziert sein. Ansonsten kann man einfach alle PHP-Dateien (Ausnahme wp-config.php, .htaccess uns sonstige eigene Dateien/Verzeichnisse) mit der englischen Version von WordPress ersetzen.
Die Datenbank-Struktur innerhalb der gleichen Version ist zwischen der deutschen und englischen Version gleich. Wenn man auf 2.3 Updaten willst, findest sich unter der entsprechenden WordPress-Seite die Anleitung zum Updaten.
Zurzeit lauf ich noch auf der deutschen Version, um den Fehler besser zu beobachten. Sollte eine Lösung allerdings nicht bald gefunden werden, spiele ich die englische Version wieder auf.
Ich bin ebenfalls von dieser nervigen Fehlermeldung geplagt. Vor der deutschen Version 2.3 ist sie nie aufgetreten.
Vieleicht liegt es ja doch an all-inkl. Ich bin nämlich ebenfalls dort auf php5 gehosted.
Bin nicht bei All-Inkl, habe PHP5 und inzwischen die neueste Wordpress-Version – und bin immer noch betroffen. Wir sind übrigens nicht alleine – eine Google-Suche nach der Fehlermeldung liefert ein paar schöne Treffer mit gerade betroffenen Blogs. Kann man das Problem nicht in die offizielle Fehlerliste von Wordpress aufnehmen?
Vielleicht sollte man den Fehler eher an die PHP-Entwickler weiterleiten. Da doch die Methode substr() hier aus irgendeinem Grund versagt.
Mein Provider All-Inkl hat nun den Umzug auf einen anderen internen Server vollzogen. Inzwischen läuft auch wieder die deutsche Version. Bisher sind mir keine Fehler mehr begegnet, aber da will ich erst einmal noch ein bißchen weitertesten, bevor ich dies zu laut rausschreie…
Auf meine Seite kommen seit heute ebenfalls die doofen Meldungen. Meine Seiten sind auch bei all inkl auf PHP5, habe mich sofort bei denen kundig gemacht. Und herausgekommen ist: “Das Problem liegt nicht bei All Inkl, sonder das es ein WordPress Fehler ist und das ich mich direkt an WodPress Entwickler richten soll.” Also sollte der Fehler auf jeden Fall von WordPress behoben werden.
Da bei mir die deutsche Sprachdatei nach einem Serverumzug auf amd64 nicht mehr funktionierte, habe ich auch diese native Lösung verwendet.
Bleibt noch hinzuzufügen, dass man jetzt noch in wp-settings.php die Zeile
auskommentieren und die Datei gettext.php löschen kann.
Hallo zusammen,
schöner, zusammengefasster Beitrag. Bin auch durch google auf dein Posting gestoßen und ebenfalls von dem Fehler betroffen. Hatte den Fehler noch nie, bei keiner meiner Wordpress Seiten… Heute das erste mal. Bin auch bei allinkl auf php5 server… mal beobachten
*bookmarked*
PHP 5.2.5 wurde nun installiert. Bis jetzt sieht es gut aus. Wir werden sehen ob das die Lösung ist…
Ich bin Dir gefolgt und habe PHP aktualisieren lassen. Bei mir ist die Fehlermeldung gerade erneut dreimal erschienen (auf meinem Blog). Bei Dir habe ich sie noch NIE gesehen (auf dieser Seite).
Hast Du eine Übersicht über Deine verwendeten Plugins? Möglicherweise benutzen wir ja beide ein Plugin, welches NEBENBEI diesen Fehler verursacht?
Hier mal meine installierte Plugins:
Akismet (2.0.2)
Breadcrumb (0.5.1)
Easy HTML Metadata (1.2) – mein Plugin
Follow-URL (1.0)
Gravatars2 (2.7.0)
Lightbox JS v2.03.3 Plugin (1.7)
NextGEN Gallery (0.72)
o42-clean-umlauts (0.2.0)
Role Manager (2.0.8)
Search Pages (2.0)
Simple Trackback Validation (2.1)
Top Level Categories (1.0)
Yet Another Advanced Paged Navigation (1.05)
Ich habe alle Plugins deaktiviert, die mit Deinen identisch sind. Es hat aber nichts geholfen. Der Fehler tritt regelmäßig auf. Mich wundert, dass er jetzt ständig auftritt, vor ein paar Tagen aber praktisch nicht.
Ich bin ein wenig genervt.
Also am Sonntag Abend hab ich ihn auch wieder gehabt! Ich vermute da eher Überlastungsprobleme…
Womöglich Ausführungs-Speicher zu knapp…
Hatte auch bei deiner Seite heute einige Male die Meldung erhalten. Hast du deinen letzten Lösungsvorschlag bereits eingebaut ?
Scheint wohl die bittere Realität zu sein, dass man einige Zeit mit dem Fehler leben muss.
*seufz*
Ich laufe wieder im “deutschen Original-Modus”, da ich testen wollte, ob das neue PHP-Update die Lösung war. Leider lief das gerade mal eine Woche gut, dann kamen die Fehler immer häufiger vor. Laut meinem Provider All-Inkl wurde aber am Server nichts geändert. Doch ich hab nun festgestellt, dass mein Server wieder auf PHP 5.2.3 läuft !!!
Ich hatte jetzt einige Zeit keine Probleme mehr. Aber immer dann schlägt es erbarmungslos zu. Nach der Ruhe kommt der Sturm. Ein Fehler jagt dann den nächsten und niemand kann sagen warum.
was sagt dein infophp()? Läufst du noch auf PHP 5.2.5?
Also seit heute bin ich wieder auf einem neuen Server mit 65MB Memory-Limit (davor 40MB) und PHP 5.2.5… Eins muss man lassen: mein Provider All-Inkl gibt sich echt Mühe!
Jetzt heißt es wieder: beobachten…
Server- Einstellungen
* Betriebssystem : Linux
* Server : Apache/2.2.6
* Speicherverbrauch : 17,23 MByte
* MySQL Version : 5.0.45-community-log
* SQL Modus : Nicht gesetzt
* PHP Version : 5.2.5
* PHP Safe Mode : Aus
* PHP Allow URL fopen : An
* PHP Memory Limit : 65M
* PHP Max Upload Size : 200M
* PHP Max Post Size : 200M
* PHP Max Script Execute Time : 30s
GD Unterstützung
* GD Version : bundled (2.0.34 compatible)
* FreeType Support : Ja
* FreeType Linkage : with freetype
* T1Lib Support : Ja
* GIF Read Support : Ja
* GIF Create Support : Ja
* JPG Support : Ja
* PNG Support : Ja
* WBMP Support : Ja
* XPM Support : Ja
* XBM Support : Ja
* JIS-mapped Japanese Font Support : Nein
Ich habe seit einigen Tagen keine Probleme mehr. Schätze, dass all-inkl da etwas geändert haben.
Bei mir läuft es heute auch schon fehlerfrei, soweit ich das sehe. Die Parameter stimmen meist auch mit meinen überein. Ich denke echt, dass es an PHP 5.2.5 liegt, will es aber noch nicht laut raus schreien…
Wie hast du deine Liste ermittelt?
Ich benutze NextGenGallery und im NGG Panel werden diese Informationen ausgegeben. Kein phpinfo() notwendig. Klasse. Ist überhaupt eines der besten Plugins für Wordpress.
Heute trat der Fehler wieder auf (nachdem ich Akismet wieder aktiviert hatte). Versuch mal, ob es vielleicht daran liegt.
NextGenGallery und Akismet laufen bei mir auch…
bist jetzt bin ich keinem Fehler mehr begegnet…
Kam der Fehler bei dir trotzt PHP 5.2.5 oder wurdest du da auch zurückgestellt wie es bei mir war…
Trotz 5.25. Komischerweise geht es jetzt. Ich bin trotzdem ohne Hoffnung.
Ich hatte Recht, komme kaum auf meine Seite heute. Muss immer wieder neu laden.
Somit liegt die Lösung also auch nicht in PHP 5.2.5…
Frag mal bei AllInkl nach, ob du an den bestimmten Zeiten irgend eine Überlastung auf deinem Server hast… hab ich auch gemacht und es gab diese wohl…
Teste mal folgendes:
http://faq.wordpress-deutschland.org/wieso-zeigt-wordpress-trotz-sprachdatei-englischen-text-an/
Ich glaube nicht an Überlastung. Denn manchmal läuft es nach einem reload wunderbar schnell weiter. Keine sichtbaren Verzögerungen usw.
Im SVN (Wordpress 2.4 alpha) ist die gepatchte gettext.php bereits enthalten. Ich habe diese Version ebenfalls ausprobiert und erhalte dennoch die Fehlermeldung.
Versuch mal die “Native Lösung” mit UTF-8 wie oben beschrieben. Die habe ich zur Zeit auf http://bcxp.de laufen. Wie es aussieht funktioniert die ziemlich gut… mach aber zur Sicherheit regelmäßig DB-Backups… Ich hab keine Ahnung, ob es noch an anderen Stellen Probleme mit PHP5 gibt, die sich nicht gleich bemerkbar machen…
Die native Lösung klappt bei mir zwar, allerdings wird dann mein theme nicht mehr gettexted.
Also die überschriebenen Übersetzungsfunktionen __() usw. in I10n.php werden ja weiterhin aufgerufen. Und wenn das neue Verzeichnis “locale” mit dem zur Konfiguration passenden Unterverzeichnis existiert, die Sprachdatei aus “language” entsprechend umbenannt wird und dort abgelegt wird, müsste es eigentlich gehen. Oder verwendet dein Theme andere Funktionen zum Übersetzten, die nicht aus I10n.php kommen?
Also ich hab bisher auch noch keine Lösung gefunden und auch die im Forum erwähnte bringt mich nicht weiter.
Hab mich heute auch mal an all-inkl gewandt, die mir als Lösungsansatz dieses Blogpost empfohlen haben
Bleibt nur zu hoffen, dass der Fehler in WP2.4 behoben wird…
Geht bei dir die Native-Lösung nicht, weil du noch ein Theme-Language-File hast?
Wenn ja, dann musste dieses File womöglich genauso wie das Haupt-Language-File einbinden…
Danke Matthias, du hattest Recht. Bei mir klappt es jetzt. Ich bin dennoch nicht zufrieden, da ich nicht jedes Mal Wordpress patchen möchte. Wenn gettext von PHP nicht unterstützt wird, führt dann ein Aufruf von ‘bind_textdomain’ zu einer Fehlermeldung?
So wie es aussieht, ist dies eines der Funktionen, die du durch die Native-GetText-Integration dazu bekommst.
http://www.php-homepage.de/manual/ref.gettext.php
Es ist schon schade, dass hier WordPress nach jedem Update gepatcht werden muss, aber es bleibt wohl keine andere Lösung zur Zeit…
Immerhin habe ich seit der Änderung tatsächlich keinerlei Fehler mehr.
Hiho du,
habe das nun so gemacht wie du beschrieben hast. Hat alles hin gehauen, Seite ist jetzt gut, leider sieht sie nicht mehr gut aus! Bissle verschoben und NextGenGallery geht nicht mehr. Genau so habe ich nun keinen Editor mehr unter Schreiben Beitrag/Seiten!!! Womöglich irgendwas verhauen…
cu
So wie ich das sehe geht’s auf deiner Seite wieder. Was war das Problem?
Hallo,
ich habe mir gestern die deutsche WP v. 2.3.3 installiert.
Habe auch das beschriebene (und anscheinend mit Verwendung durch das native gettext von php gelöste) Problem.
Jetzt habe ich die .zip file für v. 2.3.1 installiert (also die l10n.php ersetzt), dann in wp-settings.php die beiden include_once auskommentiert und die Sprachdateien in das locale Verzeichniss (mit beachteter Codierung aus der wp-config.php) kopiert.
Der Fehler tritt nun auch nicht mehr auf, ABER:
Bei mir ist der Admin Bereich wieder komplett in Englisch.
Wo könnte hier der Fehler liegen (bzw. wie finde ich den Fehler)?
Welche PHP-Version läuft bei dir? Bei mir läuft die PHP Version 5.2.5 und Wordpress 2.3.1 original ohne Probleme. Die neue WP-Version muss ich hier erste selber testen…
Hatte bis gestern noch 5.2.0 (release weis ich leider nicht mehr)… habe dann gestern in der nacht aber noch ein update gemacht.
Jetzt bekomme ich per “php –version” folgendes;
PHP 5.2.5-0.dotdeb.2 with Suhosin-Patch 0.9.6.2 (cli) (build: Dec 10 2007 08:40:36)
Ich habe per phpinfo(); auch nochmal geprüft, ob gettext wirklich “an” ist… und es scheint alles zu passen (war mir da nicht mehr 100% sicher)
WordPress ist wie gesagt 2.3.3 DE
Hoffe das hilft ein wenig… wend du mehr Infos braucht, dann einfach fragen. Der Server steht hier privat bei mir… soll heissen… dem Basteln sind (fast) keine Grenzen gesetzt!
Ich habe heute endlich wieder ein wenig Zeit gefunden mich mit dem
WordPress gettext-Problem zu beschäftigen.
Das Problem scheint nicht an der neuen Wordpress Version zu liegen.
Ich habe heute in die translate-funktion der veränderten l10n.php einen logging output eingebaut (ziemlich simple… einfach den String vor und nach der Übersetzung durch gettext ausgegeben) und allem Anschein nach funktioniert bei mir der call zu gettext nicht richtig…
Ich habe jetzt auch schon diverse Versuche mit der Ordnerstruktur
“wp-includes/locale” hinter mir (habe da jetzt 4 Unterverzeichnisse…
de_AT; de_AT.UTF-8; de_DE und de_DE.UTF-8… um auch wirklich ganz sicher zu sein), aber leider erfolglos. Als nächstes habe ich dann gettext auf der Shell ausprobiert. Auch hier verstehe ich das Problem nicht ganz. Selbst ein “gettext -d locale/de_AT.UTF-8/LC_MESSAGES/wordpress.mo -s “%d topics” übersetzt nicht richtig und gibt mir nur wieder den originalString “%d topics” zurück. Ich habe das schon mit mehreren textdomains versucht (da ich nicht genau weis, was hier rein soll; darunter “locale” und auch
“locale/de_DE/”). Eine weitere Vermutung war dann noch, dass ich ein Problem mit den .mo files selbst habe, aber alles was ich hier nachprüfen kann sind die Zugriffsrechte und die sind okay (hat alles www-data).
Entweder verwende ich hier den Textbereich falsch, oder gettext übersetzt mit aus irgendeinem Grund nicht. Vielleicht kennt ja hier jemand die Lösung… ich denke jetzt mal, dass es einige gibt, die sich besser mit gettext auskennst als MeinerEiner und einen Tipp für mich haben (hoffentlich, bitte, bitte…).
An der PHP-Info kann es jedenfalls nicht liegen. Die sieht gut aus (gettext Support enabled)
LG,
Niko
Vielen Dank für deine ausführliche Analyse. Sehe ich das richtig, bei dir geht weder die PHP-WordPress-Version von GetText, noch die native Version (welche du auf der Shell getestet hast)? Kann es an irgendwelchen Installations-Parametern, -Kombinationen oder -Versionen der Serverkomponenten liegen? Ich denke dabei auch an die ZEND-Produkte. Ich kann das hier leider nicht selber testen.
Die WordPress-Version läuft ja hier mit der substr() Funktion schief, was ich mir nicht erklären kann… (Schon mal den SubStr-Ersatz von oben ausprobiert?) Läuft deine Umgebung auf den gleichen Apache- und PHP Versionen wie bei mir (Bezug auf unsere Mail)? Inzwischen habe ich ja wieder das originale WordPress laufen und wohl keine Probleme damit.
Also die verwendete PHP Version ist die selbe. Ich selbst verwende Apache 2.2.3 (alles als .deb Pakete von dotdeb bzw. von den Original Debian Quellen)
Ich konnne in der deine PHP-Info die Apache Version nicht finden, aber ansosnten sieht alles sehr ähnlich aus
Meine Apache-Version lautet: 2.2.6 (laut AllInkl) und die PHP-Version ist 5.2.5
Dann werde ich am Wochenden mal versuchen, den Apache Version 2.2.6 installieren und nachsehen ob sich was ändert (kann ich mir zwar nicht vorstellen aber probieren geht über studieren)
Juhu… hab das Problem nun durch ein wenig herumprobieren lösen können.
Es lag nicht an der Apache version (habe noch kein Update gemacht)
Das Problem war wohl eine Diskrepanz der Sprachen zwischen dem Linux-System selbst und WordPress. WP hatte “de_AT” eingestellt während im System ein LANG=”de_AT.UTF-8″ gesetzt war.
Ich habe nun WP auf de_AT.UTF-8 gesetzt (in wp-config.php) und nun funktioniert die Übersetzung wieder!
BTW:
Ich habe noch ein “locale-gen” ausgeführt. Da das ja die locales des Sytsems selbst übersetzt glaube ich zwar nicht, dass es einen Einfluss auf die Lösung hat, aber sicherheitshalber will ich es doch erwähnen.
Das Kommandozeilen gettext arbeitet bei mir immer noch nicht… aber ich glaube wirklich, dass das an einem fehlerhaften Aufruf meinerseits liegt (ich finde leider keine gute Anleitung im web oder auch in gettext selbst, die mir genau sagt, was ich wie verwenden kann…)
Super! Danke für die Infos…
Ich werde mal deinen Kommentar oben im Text erwähnen.
Ist die Lösung gefunden? Und kann jemand den Lösungsweg so erklären, dass es auch ein Nicht-Programmierer versteht?
Welche Lösung gibt es für Blog-Betreiber bei Shared Hosting? Ein Einfügen von (’WPLANG’, ‘de_AT.UTF-8′) in wp-config.php führt bei mir dazu, dass die WP-Admin-Oberfläche statt in Deutsch in Englisch erscheint, das hilft mir also vermutlich nur bedingt weiter.
Hi Probek,
hast du es schon mal mit “de_DE.UTF-8″ versucht?
BTW: auf meiner Webinstanz läuft das Wordpress 2.3.1 nun ohne irgendwelchen Tricks. Als Sprache steht bei mir “de_DE” eingetragen. Ob der Provider hier was angepasst hat, kann ich nicht sagen…
Bei “de_DE.UTF-8″ (schon probiert) wird mein Theme nicht übersetzt. Und den Fehler habe ich sporadisch immer noch (was man schön über die Google Webmaster-Tools sehen kann).
Wenn du dich traust und ein Backup deiner Datenbank machst, kannst du ja mal versuchen Wordpress 2.5 zu installieren… Aber prüfe erst, ob all deine Plugins auch den Versionssprung überstanden haben…
Ich habe bereits Wordpress 2.5 installiert. Der Fehler tritt bei mir ab und an immer noch auf. Diese Probleme habe ich allerdings nur bei all-inkl. Andere Installationen funktionieren einwandfrei.
Ich habe mittlerweile auch eine komplett neue Datenbank angelegt und alle Beiträge exportiert und in die neue importiert. Ein Datenbankproblem ist also eher unwahrscheinlich.
Auch tritt der Fehler ohne Plugins auf.
Da scheint es bei deinem All-Inkl-Server wohl irgend ein Konfigurationsproblem zu geben… Sprache oder Codierung (UTF8 ?)… Schade dass man da nicht selbst nachprüfen kann… Wie schon gesagt, ich bin auch bei All-Inkl und hab keine Probleme mehr…
Hi Matthias,
ich habe das gleiche Problem (übrigens ebenfalls all-inkl.), und habe Deine native Lösung ausprobiert. Es scheint zu klappen, allerdings bekomme ich nun im Backend beim Aufruf des Reiters “Verwalten” (WP 2.5) folgende Fehlermeldung:
Fatal error: Call to undefined function __ngettext_noop() in /www/htdocs/w009abf0/wp-admin/includes/post.php on line 522
Was kann denn hier passiert sein?
Grüße
Hallo die Runde,
also ich habe heute ein Update auf Version 2.5 durchgeführt… und… man mag es kaum glauben… es geht wieder nix mehr.
Also:
Nach dem ersten Versuch mit dem Wordpress “internen” Mechanismus die Page übersetzen zu lassen (einfach in der wp-config.php als WP_LANG de_DE angeben) bekam ich nen Fehler, dass gettext.php und in weiterter folge auch stream.php zu lange brauchen (ich weis die genau Fehlermeldung nicht mehr… aber Apache mekerte im error.log, dass mehr als 60sec benötigt wurden… nachdem der Server hier mein eigener is… sehr wenig Applikationen drauf laufen und auch die Hardware recht neu ist, bin ich mir sicher, dass es nichts nützt den timeout-wert nach oben zu setzen)
Mit dem hier vorgeschlagenen Mechanismus, der mich ja schon in Version 2.3.3 einiges an Nerven gekosttet hat (siehe oben), funktioniert das Übersetzen… dachte ich… also:
Das Frontend (Datumsangeben, etc.) werden problemlos übersetzt. Nur im Backend is das alles nicht soo super. Erstens werden nicht alle Strings übersetzt (ja ich habe die neue Sprachdatei der Version 2.5 in das LC_MESSAGES Verzeichnis kopiert und verwende nicht mehr die alte Sprachdatei der Version 2.3.3) und zweitens kann ich dann manche Seiten gar nicht mehr öffnen (bekomme eine leere Seite). Den Fehler hierbei konnte ich noch nicht finden…
…aus Gründen der Verzweiflung werde ich WordPress wohl erst mal einige Zeit auf englisch verwenden.
LG,
Niko
Schade dass es so viele Probleme gibt…
Hier mal meine Parameter aus der wp-config.php:
define(’DB_CHARSET’, ‘utf8′);
define(’DB_COLLATE’, ”);
define (’WPLANG’, ‘de_DE’);
Aus der PHP-Info:
HTTP_ACCEPT_CHARSET: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
_SERVER["HTTP_ACCEPT_CHARSET"]: ISO-8859-1,utf-8;q=0.7,*;q=0.7
default_charset: no value – no value
iconv support: enabled
iconv implementation: glibc
iconv library version: 2.4
iconv.input_encoding: ISO-8859-1 – ISO-8859-1
iconv.internal_encoding: ISO-8859-1 – ISO-8859-1
iconv.output_encoding: ISO-8859-1 – ISO-8859-1
Ich laufe auf WP 2.3.1 sowie WP 2.3.3 (beide Original) wohl ohne Probleme. Beide Server sind von All-Inkl.
@Holger:
Ich denke, dass es eine neue Funktion in der Version 2.5 gibt, die in der Lösung in meinem Zip (Version 2.3.1) nicht vorhanden ist. Schau dir meinen Code an und vergleiche diesen mit den Funktionen in der neuen l10n.php von WP 2.5. Womöglich musst du entsprechend die neue Funktion hinzufügen und auf den Nativ-Aufruf umleiten.
@Niko:
Du hast doch Komplett-Zugriff auf deinen Server? Kannst du mal nachsehen, ob es irgendwo entsprechende Einstellungen der Sprache oder (vielleicht wichtiger) des verwendeten Zeichensatzes (z.B. UTF-8 oder ISO-8859-1) gibt? Haste schon “de_DE.UTF-8″ versucht? Wäre cool wenn du einen System- /Server- /PHP-Parameter findest, der die originale Lösung zum Laufen bringt…
Grüße, Matthias
Ich habe leider noch keine weiteren Einstellungen gefunden.
UTF-8 scheint jedoch nicht die Lösung zu sein, wenn ich diesen Parameter in der WP_LANG anhänge, dann erscheint alles auf englisch… WordPress versucht dann nicht einmal zu übersetzen (wie gesagt… ohne das UTF-8 in der WP_LANG bekomme ich eine Zeitüberschreitung, aber da versucht WP wenigstens die Seite zu übersetzen)
Da ich nicht wirklich php5 benötige, habe ich kurzerhand einmal meinen Account auf php4 “zurückgestellt”. Seitdem habe ich keine Probleme mehr. Mit Hilfe eines kleinen Eingriffs in die .htacess klappt das sogar, ohne den Support in Anspruch nehmen zu müssen.
Unter # END WordPress in der .htacess
muss nur hinzugefügt werden:
AddHandler php4-cgi .php
(Wenn keine .htacess Datei vorhanden ist, weil Permalinks nicht genutzt werden, muss diese angelegt werden!)
Hmmja, scheint bei mir auch zu funktionieren, ich frage mich nur, ob die ältere PHP-Version zu irgendwelchen anderen Problem im Betrieb von WP führt…?
Das sollte grundsätzlich nicht der Fall sein. Allenfalls einzelne Plugins VERLANGEN PHP5. Ich selbst nutze z.B. das “Now Reading” Plugin. Dieses verlang tin der aktuellen Version eine PHP5 Installation.
Da Wordpress offiziell PHP4.? voraussetzt, ist ALL-INKL nicht mal unbedingt etwas vorzuwerfen.
Ich ärgere mich nur darüber, dass ich monatelang selber herumprobieren musste. Eine Suche nach unpack() zeigt ja, dass sehr viele Webseiten unter diesem Problem leiden.
Vielleicht funktioniert auch der Einsatz von mb_subsr() im Quellcode:
http://de.php.net/mb_substr
Man müsste die oben beschriebene Codezeile von gettext.php da mal austauschen…
Das werde ich nicht mehr testen können, da ich mittlerweile zu einem amerikanischen Hoster gewechselt bin.
Ich hab das Problem ebenfalls analysiert und einen performanten Ersatz für die spontan fehlerhafte PHP substr() Funktion gefunden.
Dies hab ich bereits im WP Trac gemeldet und einen Fix bereitgestellt: http://www.code-styling.de/deutsch/wordpress-sprachdateien-erzeugen-fehler-in-gettext-php
Ich konnte dies bereits auf einen betroffenen System testen, denn bei mir trat dies nicht auf.
Danke für den Hinweis. Doch bedenkt, dass im Programmcode von Wordpress der Befehl substr() noch öffters vorkommt… Womöglich ist das Fehlverhalten von substr() nun an einer anderen Stelle sichtbar…
Wordpress liefert mit der Version 2.6.1 nun endlich eine Lösung. Dies haben wir wohl dem Einsatz von “Codestyling” zu verdanken. Er beschreibt hier die Ursache auf seiner Seite näher:
http://www.code-styling.de/deutsch/wordpress-fehler-durch-sprachdateien-die-ursache
Zeichen und Wunder.
Seltsamerweise kommt es bei mir ebenfalls zu diesem Fehler, obwohl ich die englische Wordpress-Version 2.6.1 nutze. Hat da jemand eine Idee, woran das liegen kann?
Haste in deiner .htaccess mal die folgenden Zeilen versucht (siehe Beitrag auf http://www.code-styling.de)?
PHP_VALUE magic_quotes_runtime Off
PHP_VALUE mbstring.func_overload 0
Ja, habe ich. Der Fehler kommt immer noch
Bin da völlig ratlos.
Ich hatte den Fehler auch, konnte Ihn jedoch dank der vielen Informationen beheben. Problem ist hier ein Bug in PHP (mod_php). Wenn nur irgendwer auf dem Server in der .htaccess den Wert mbstring.func_overload den Wert auf 0 unterschiedlich setzt, kann es zu diesen Problemen kommen. Eine nähere Beschreibung inkl. Patch gibt es unter:
http://bugs.php.net/bug.php?id=27421&edit=1
In der nächsten PHP Version (5.2.7?) sollte dies dann auch mit aufgenommen sein.
Heute bekam ich eine eMail von meinem Provider All-Inkl:
“Im Netz habe ich gelesen das Sie ebenfalls von dem wordpress/unpack Problem betroffen sind. Ich habe eben auf Ihrem Server ein aktuelles PHP mit diesbezüglichem Patch installiert. Könnten Sie mich bitte dahingehend unterstützen zu versuchen den Fehler zu provozieren?
Dies würde mir bei der endgültigen Beseitigung erheblich helfen.”
Meine PHP-Version lautet nun 5.2.6.
Also falls einem von euch der Fehler hier auf meiner Webseite begegnet, lasst es mich bitte wissen…
Ihre Meinung zählt