2011-01-13 6 views
5

Ich habe ein .po und eine .mo Datei in einem Ordner, deren Adresse /locale/nld_nld/LC_MESSAGES/. Die Namen beider Dateien sind Nachrichten. Ich habe versucht, den folgenden Code zu verwenden:Wie po/Pot-Dateien mit PHP zu verwenden?

try.php:

<?php 
require_once("Localization.php"); 
echo _("Hello World!"); 
?> 

die Localization.php geht hier:

<?php 
$locale = "nld_nld"; 
if (isSet($_GET["locale"])) $locale = $_GET["locale"]; 
putenv("LC_ALL=$locale"); 
setlocale(LC_ALL, $locale); 
bindtextdomain("messages", "./locale"); 
bind_textdomain_codeset("messages", 'UTF-8'); 
textdomain("messages"); 
?> 

Sowohl die try.php und die Lokalisierungsdateien sind im selben Verzeichnis. Außerdem verwende ich xampp. Ich implementierte auch die phpinfo();. In der Tabelle, vor 'GetText Support', wurde enabled erwähnt. Die messages.po und die messages.mo Dateien sind gültige Dateien, die ich mit poEdit erstellt habe. Ich bin ein Windows-Benutzer. Als ich jedoch try.php geöffnet habe, hat es einfach Hallo Welt wiederholt! (Nicht seine übersetzte Zeichenfolge auch. Habe ich übersetzt die .po Datei 100% (nach poEdit). Aber ich bin nicht immer die Ergebnisse. Eine kleine Hilfe auf diesem würde geschätzt.

Dank ! im Voraus

Antwort

2

bei der Betrachtung Code zurück ich habe. An einer Arbeitsstelle für spanische Übersetzungen stelle ich fest, dass ich vielleicht auch die gleichen Zeilen in einer anderen Reihenfolge habe Das macht einen Unterschied? Zum Beispiel:

<?php 
putenv('LC_MESSAGES=es_ES'); 
setlocale(LC_MESSAGES, 'es_ES.utf8'); 
bindtextdomain('es','/full/path/here/application/locale'); 
textdomain('messages-es'); 
bind_textdomain_codeset('messages-es', 'UTF-8'); 
?> 

für den obigen Code zu arbeiten, meine .mo Datei im /full/path/here/application/locale/es_ES.utf8 Ordner.

Vielleicht ist der folgende Code, den ich vor verwendet haben könnten Sie weiter beheben helfen:

<?php 
function TestLang($langCode) { 
    echo('<b>TESTING LANG CODE: ' . strtolower($langCode) . '</b><br />'); 
    putenv('LC_MESSAGES=' . strtolower($langCode) . '_' . strtoupper($langCode)); 
    echo('LC_MESSAGES: ' . getenv('LC_MESSAGES') . '<br />'); 
    $localeResult = setlocale(LC_MESSAGES, strtolower($langCode) . '_' . strtoupper($langCode) . '.utf8'); 
    echo('Locale: ' . $localeResult . '<br />'); 
    $textDomain = bindtextdomain(strtolower($langCode), ROOT . '/' . APP_DIR . '/locale'); 
    echo('Text Domain: ' . $textDomain . '<br />'); 
    textdomain(strtolower($langCode)); 
    $codeSet = bind_textdomain_codeset(strtolower($langCode), 'UTF-8'); 
    echo('Code Set: ' . $codeSet . '<br />'); 
    echo('.mo File: ' . $textDomain . '/' . $localeResult . '/LC_MESSAGES/' . $langCode . '.mo<br />'); 
    echo('<br />-- ' . _('Hello World!') . ' --<br />'); 
} 

TestLang('en'); 
TestLang('de'); 
TestLang('es'); 
TestLang('fr'); 
// etc.. 
?> 
+0

Die Textdomäne() ist normalerweise der letzte Funktionsaufruf (tatsächlich könnte es vor jedem Aufruf von gettext aka _() benötigt werden, wenn Sie mit mehreren Domänen arbeiten.Zuerst binden Sie alle Domänen, dann wählen Sie eine aus. – eckes

+0

In Ihrem Beispiel verwenden Sie zwei verschiedene Domain-Namen 'es' und 'messages-es'. Das funktioniert möglicherweise nicht (und normalerweise haben Sie nicht den Sprachenbezeichner im Dateinamen, wie er stattdessen vom Verzeichnis definiert wird). Also "/full/path/here/application/locale/es_ES/LC_MESSAGES/messages.mo" ist der Dateiname der Domain "messages" und der LC_TYPE es_ES. – eckes

0

Ausgabe der Rückgabewert von $result=bindtextdomain($domain,$path), wird es Ihnen sagen, wenn Ihr lokaler Pfad in der Tat ist der Weg Sie Ihre Übersetzungsdateien erwarten zum Leben. Und dann überprüfen Sie die Dateizugriffsrechte für diese Dateien, wenn sie (und die Verzeichnisse bis zum Root) vom WWW-Benutzer erreichbar sind. Es ist irgendwo in ./locale/LC_MESSAGES/nld_nld/

textdomain($domain) sollte die letzte Methode sein (vor den eigentlichen Gettext-Übersetzungen). Der Domänenparameter von bindtextdomain und textdomain sollte derselbe Domänenname sein (er war nicht in Ihrer Antwort) und entspricht dem Basisnamen der mo-Datei.

Stellen Sie außerdem sicher, dass keine Ihrer PHP-Dateien eine andere Textdomäne verwendet, besonders wenn Sie "require_once" verwenden.

BTW, der Code, den Sie haben, sucht nach einer Gebietsschema-Kennung in der Anfrage (ohne Filter) und verwendet nld_nld als Standard-Failback, würde ich stattdessen eine normale Sprache (primäre Site-Sprache wie "en") dort.

Verwandte Themen