2013-06-14 5 views
5

Ich folge den Anweisungen von bryanh Antwort hier: gettext() equivalent in Intl library? und versuchen, Lokalisierung (Übersetzung) mit php-intl zu implementieren, aber ich halte das gleiche Problem dieser Person hatte immer: ResourceBundle returns NULL without any errors being raisedWie erstelle ich ICU-Ressourcendateien für die Verwendung in PHP?

Er erwähnt schuf er die dat-Dateien mit einem Werkzeug (das ich nicht herausfinden kann, wie man arbeitet), während die Person in der ehemaligen Antwort scheint, txt-Dateien mit einer .res-Erweiterung zu verwenden.

Wie kann ich die Lokalisierung mit php-intl und ResourceBundle richtig implementieren, und was mache ich falsch?

Das Ziel ist es, verschiedene Datendateien mit verschiedenen Sprachen zu haben, so dass ich etwas ähnliches wie

$t = new Translator(); 
$t->setResource(new \ResourceBundle('es', 'locales_folder/')); 
$t->echo("somestring"); // "el stringo" 

..much wie die Person in der ersten Antwort hatte tun können. Das Ziel ist auch, leicht bearbeitbare Dateien zu haben, damit ich sie für Korrekturen, Updates usw. an Übersetzer weitergeben kann. Ich weiß, ich könnte dies leicht mit benutzerdefinierten Lösung durch eine einfache Textdatei tun, die geparst und in Memcache auf erste Anfrage gespeichert wird, wo es dann bleibt und bedient wird, ohne die .dat-Dateien neu zu lesen, aber ich würde lieber Nehmen Sie die vorgeschlagene Route hier.

Edit: Nur um es rauszubekommen - ich habe dasselbe mit Gettext erfolgreich implementiert und es war einfach - außer einem Fehler, der über Linux-Systeme hinweg besteht (http://www.php.net/manual/en/book.gettext.php#91187) - aber ich würde mich gerne auf die mehr verlassen moderne und all-inclusive Intl-Erweiterung, wenn möglich.

Antwort

9

Ich kann eine Lösung für Ihre Frage zur Erstellung und Verwendung von .res Dateien für die intl PHP-Erweiterung, aber ich habe keine Erfahrung mit Geschwindigkeit und Verwendung in Produktionssystemen, müssen Sie für sich selbst sehen, ob dies sein kann ein Ersatz für .

Meiner Meinung nach ein großer Vorteil von sind zusätzliche Tools wie xgettext, die zu übersetzende Zeichenfolgen extrahieren können. Dennoch kann die Verwendung von Ressourcen in Ihrem Anwendungsfall hilfreicher sein.

Um eine .res Datei zu erzeugen, müssen Sie das Programm genrb verwenden, das bundled with ICU ist. (Zum Beispiel, wenn ICU auf OSX Installation mit brew install icu4c (see this tutorial) können Sie das Werkzeug bei /usr/local/Cellar/icu4c/*/bin/genrb finden (ersetzen * mit der Versionsnummer))

Weiter Sie für jedes Gebietsschema eine Datei vorzubereiten. Lassen Sie uns dies in diesem Beispiel für zwei Sprachen tun, Deutsch und Spanisch.

$ cat de.txt 
de { 
    hello { "Hallo" } 
} 

$ cat es.txt 
es { 
    hello { "Hola" } 
} 

$ genrb *.txt 
genrb number of files: 2 

Sie haben nun zwei weitere Dateien de.res und es.res, die Sie jetzt in PHP zugreifen können

<?php 
foreach (array("de", "es") as $locale) { 
    $r = ResourceBundle::create($locale, __DIR__); 
    echo $r["hello"], "\n"; 
} 

, die ausgegeben

Hallo 
Hola 

Also im Grunde, können Sie diese *.txt Hand Dateien zu Ihren Übersetzern und bereiten sie für PHP unter Verwendung genrb vor.

Schließlich ist ein kleines Beispiel für die Klasse versuchen, Sie zu schreiben:

<?php 
class Translator { 
    private $resourceBundle = null; 

    public function __construct(\ResourceBundle $r) { 
     $this->resourceBundle = $r; 
    } 

    public function __get($string) { 
     return $this->resourceBundle[$string]; 
    } 
} 
$t = new Translator(new \ResourceBundle('es', __DIR__)); 
echo $t->hello; 
+0

Danke, das würde tun. Da dies threadsicher sein soll, denke ich, dass es die Lösung ist, nach der ich gesucht habe. Jetzt muss ich nur meinen eigenen String Extractor schreiben und das sollte funktionieren. – Swader

+1

Es wäre sehr nützlich, wenn Sie Ihre Erfahrung mit ihm teilen könnten, auch mit Ihrem String-Extraktor (vielleicht könnten Sie ihn sogar öffnen?). Danke im Voraus! – akirk

+0

Da poedit automatisch für gettext extrahieren kann, dachte ich mir, ich könnte es einfach einem anderen Muster geben, nach $ t -> _ ($ string) zu suchen, das dann auch .mo und .po Dateien für diese Strings erzeugt. Alles, was ich dann tun müsste, ist ein Werkzeug zu schreiben, das diese in das RES-Format konvertiert, was ziemlich einfach klingt. Ich werde einen Blogbeitrag über die gesamte Tortur schreiben und ihn hier verlinken. – Swader

Verwandte Themen