2013-03-21 14 views
10

Ich habe für die Internationalisierung ein Open-Source-Projekt Optionen suchen:Verwenden Sie PHP Gettext ohne Locales installieren

  • Gettext, die jeder zu empfehlen scheint, offenbar Gegenden muss sein „auf Ihrem System installiert " benutzt werden. Siehe hierzu note im PHP-Handbuch, das genau meine Situation widerspiegelt. Diese SO question fragt auch nach dem gleichen Problem. Dies ist für ein Open-Source-Projekt nicht geeignet, da ich nicht darauf vertrauen kann, dass die Endbenutzer die entsprechenden Ländereinstellungen auf ihrem System installiert haben. Außerdem ist es sehr merkwürdig, dass Sie Locales installieren müssen, nur um die von Ihnen übersetzten Strings (IMO) zu verwenden.

  • Zend_Translate wird manchmal auch für Gettext empfohlen, aber ich benutze das Zend Framework nicht, also glaube ich nicht, dass es eine Option für mich ist. Einige Leute haben gesagt, dass Sie es vom Zend-Framework trennen können, aber ich hätte keine Ahnung, wie. Wenn mir jemand sagen kann, welche Dateien ich benötige (ich habe einen Tarball des Zend-Frameworks heruntergeladen), würde ich gerne Zend_Translate benutzen.

  • Arrays. Das ist, was ich jetzt mache, aber es ist nicht ideal, weil:

  • Es wird viel Speicher verwenden, um jede Übersetzung zu definieren, wenn die meisten nicht von der aktuellen Seite verwendet werden.
  • Ich habe Probleme mit dem Duplizieren der Schlüssel im Array, die bereits 1000 Zeilen Code lang geworden ist und ich habe noch nichts hinzugefügt ...
  • Es bedeutet, dass nicht-Programmierer nicht wirklich übersetzen können , während POedit der Standard ist, den jeder erwartet.

Kann ich lesen irgendwie .mo Dateien ohne Gettext oder Zend_Translate, oder muss ich Gettext verwenden? Wenn ja, wie kann ich alle Locales arbeiten lassen, wie in der Frage, die ich oben verlinkt habe?

EDIT: Ich bin jetzt bereit, Zend_Translate zu verwenden. Ich muss nur herausfinden, welche Dateien ich brauche (es wäre großartig, wenn sie zu einer Datei kombiniert werden könnten) - Ich möchte nicht das gesamte Zend Framework in meinem Projekt haben.


Update: Ich war daran interessiert zu sehen, wie groß Open-Source-Projekte i18n Griff:

  • Moodle verwendet arrays.
  • Drupal scheint arrays, with a database fallback zu verwenden. Sie führen auch setlocale('C'), um ein generisches Gebietsschema zu erhalten und das gesamte setlocale Durcheinander zu umgehen.
  • Wordpress verwendet heaps of their own functions für i18n, obwohl darunter gettext verwendet wird.
  • Also keines dieser drei zufälligen Projekte verwenden Zend_Translate, noch Gettext direkt, soweit ich sehen kann.

    Vielleicht ist es eine gute Idee, das Gebietsschema C zu verwenden, den Namen der Sprache im Textdomänennamen zu speichern und von dort zu gehen.


    Also hier ist so weit wie ich damit habe:

    $lang = 'de'; //debug 
    setlocale(LC_ALL, 'C'); 
    bindtextdomain('default', PATH . "/locale/$lang"); 
    bind_textdomain_codeset('default', 'UTF-8'); 
    textdomain('default'); 
    
    var_dump(file_exists(PATH . "/locale/$lang/C/LC_MESSAGES/default.mo")); //bool(true) 
    

    Aber ich bekomme immer noch nur die englische Zeichenfolge, obwohl ich poedit verwendet habe, msgfmt usw. die entsprechende machen Dateien. Ich habe auch versucht, Apache neu zu starten. Hier

+0

Install locales? Was meinen Sie? Sie fügen nur die spezifischen '.mo'-Dateien ein und legen das entsprechende Gebietsschema fest. Es ist wirklich nicht so gruselig wie du es ausgemacht hast. – vanneto

+2

Es wäre toll, wenn das der Fall wäre, aber ich glaube nicht, dass es ... siehe den Link oben auf der Frage. [User notes] (http://www.php.net/manual/en/book.gettext.php#91187) im PHP-Handbuch sagen Sie dies auch, und Sie müssen 'locale -a' ausführen, um zu sehen, welche Ländereinstellungen stehen zur Verfügung (und führen Sie 'sudo apt-get install language-pack-langcode-base' aus, um zusätzliche Sprachpakete zu installieren). Meine eigenen Tests spiegeln dies auch wider. Dies ist für ein Open-Source-Projekt nicht geeignet, da ich von Benutzern nicht erwarten kann, dies zu tun. – stackunderflow

+0

Einfacher Schlüssel => Wert-Arrays reichen für ein komplettes Übersetzungssystem kaum aus. Unterstützen sie den Plural? Kontext? Kategorien? Domänen? Bemerkungen? Das sind alles Funktionen, die Sie * benutzen sollten, vielleicht wissen Sie es noch nicht. Wenn Sie Gettext ablehnen, geben Sie Zend_Translate eine Chance. Ihre Gründe dagegen sind wirklich keine Gründe. – deceze

Antwort

2

ist die Lösung:

$lang = 'de'; //debug 
setlocale(LC_ALL, 'C.UTF-8'); 
bindtextdomain('default', PATH . "/locale/$lang"); 
bind_textdomain_codeset('default', 'UTF-8'); 
textdomain('default'); 

Der einzige Unterschied zwischen diesem und dem Beispiel, das ich am Ende meiner Antwort geschrieben ist, dass es C.UTF-8 verwendet nicht nur C.

Ich werde mehr testen, und wenn es plattformübergreifend funktioniert, und werde diese Antwort aktualisieren, wenn ich etwas anderes finde.

+0

Glückwunsch, es scheint auch für mich zu funktionieren. Aber es scheint wirklich hacky zu sein und ich kann nicht glauben, dass dies der übliche Weg ist, dies zu lösen. Ich verstehe nicht, was die Sprache "C.UTF-8" ist, aber es scheint auf jeder Umgebung installiert zu sein. Da Ihr Beitrag vor 2 Jahren veröffentlicht wurde, möchte ich Sie bitten, ob Sie in der Zwischenzeit eine bessere Lösung gefunden haben. – steven

+0

Sorry @steven, ich habe PHP seither nicht wirklich benutzt. Heutzutage stört mich die Best Practice jedoch weniger und würde wahrscheinlich direkt auf eine Array-basierte Lösung zurückgreifen, die die Frustrationen von gettext kennt. – stackunderflow

+0

Wissen Sie, wie Sie locales auf xampp für Windows installieren? – Gonzalo

3

Versuchen Sie gettext-php. Es ist ein Drop-In-Ersatz für gettext in PHP geschrieben. Es wurde ursprünglich für WordPress gemacht, denke ich, weil WP auf freigegebenen Hosts laufen muss, die nicht immer für jedes Gebietsschema konfiguriert sind. Dies scheint mir auch dein Problem zu sein.

Es hat ein bisschen Leistung getroffen, aber es war überhaupt kein Problem für mich.

+0

Danke für den Vorschlag. Nun, da ich (endlich) Gettext in Gang gebracht habe, denke ich, dass ich vorerst hier bleiben werde, aber ich werde das im Hinterkopf behalten, wenn ich weitere Probleme habe. – stackunderflow