2013-03-21 11 views
10

Sto guardando le opzioni per internazionalizzare un progetto open source:Utilizzare PHP Gettext senza dover installare locali

  • Gettext, che tutti sembrano consigliare, a quanto pare ha bisogno di locali di essere "installato sul proprio sistema " da essere usato. Vedi questo note sul manuale PHP, che riflette esattamente la mia situazione. Questo SO question chiede anche lo stesso problema. Questo non è adatto per un progetto open source perché non posso fidarmi che gli utenti finali abbiano le localizzazioni appropriate installate sul loro sistema. Inoltre, è molto strano che devi installare local solo per usare le stringhe che hai tradotto (IMO).

  • Zend_Translate è consigliato anche a gettext a volte, ma non sto utilizzando il framework Zend quindi non penso che sia un'opzione per me. Alcune persone hanno detto che puoi dividerlo dal framework Zend, ma non avrei idea di come. Se qualcuno può dirmi di quali file ho bisogno (ho scaricato un tarball del framework Zend) per scegliere, sarei aperto all'utilizzo di Zend_Translate.

  • Array. Questo è quello che sto facendo ora, ma non è l'ideale perché:

    • Utilizzerà molta memoria per definire ogni traduzione, quando la maggior parte non verrà utilizzata dalla pagina corrente.
    • Sto riscontrando problemi con la duplicazione delle chiavi nell'array, che è già diventato 1000 righe di codice e non ho ancora aggiunto nulla ...
    • Significa che i non programmatori non possono realmente tradurre , mentre POEDIT è lo standard che tutti si aspettano di usare.

Posso in qualche modo di leggere i file senza .mo Gettext o Zend_Translate, o devo usare Gettext? In tal caso, come posso far funzionare tutte le impostazioni locali, come nella domanda che ho collegato sopra?

MODIFICA: Ora desidero utilizzare Zend_Translate. Ho solo bisogno di capire quali file ho bisogno (sarebbe bello se potessero essere combinati in un unico file) - Non voglio l'intero Zend Framework nel mio progetto.


Aggiornamento: ero curioso di vedere come grande progetti open source di gestire i18n:

Quindi nessuno di questi tre progetti casuali usa Zend_Translate, né direttamente, per quanto posso vedere.

Forse è una buona idea usare la locale C, memorizzare il nome della lingua nel nome del dominio del testo e andare da lì.


Quindi, ecco quanto ho con quel:

$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) 

Ma io ancora appena ottenere la stringa inglese, anche se ho usato poEdit, msgfmt ecc per rendere l'appropriato File. Ho anche provato a riavviare Apache.

+0

Installare le impostazioni locali? Cosa intendi? Devi solo includere i file '.mo' specifici e impostare le impostazioni internazionali appropriate. Non è davvero così spaventoso come lo si può essere. – vanneto

+2

Sarebbe bello se fosse così, ma non penso che sia ... vedi il link in cima alla domanda. [Note dell'utente] (http://www.php.net/manual/en/book.gettext.php#91187) sul manuale PHP anche dire questo, e che è necessario eseguire 'locale -a' per vedere quali impostazioni locali sono disponibili per l'uso (ed esegui 'sudo apt-get install language-pack-langcode-base' per installare language pack aggiuntivi). Anche i miei test riflettono questo. Questo non è adatto per un progetto open source in quanto non posso aspettarmi che gli utenti lo facciano. – stackunderflow

+0

Chiave semplice => gli array di valori sono appena sufficienti per un sistema di traduzione completo. Supportano i plurali? Contesto? Categorie? Domini? Commenti? Queste sono tutte caratteristiche che dovresti * usare *, forse non lo sai ancora. Se sei contrario a gettext, dai un colpo a Zend_Translate. Le tue ragioni contro di essa sono in realtà non-ragioni. – deceze

risposta

2

ecco la soluzione:

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

L'unica differenza tra questo e l'esempio che ho postato in fondo la mia risposta è che utilizza C.UTF-8 non solo C.

Farò più test di questo, e se funziona su più piattaforme, e aggiornerò questa risposta se trovo qualcos'altro.

+0

Congratulazioni, sembra funzionare anche per me. Ma sembra essere veramente hacky e non posso credere che questo sia il modo comune per risolverlo. Non capisco quale sia il linguaggio "C.UTF-8" ma sembra essere installato su ogni ambiente. Dato che il tuo post è 2 anni fa, ti chiederei gentilmente se hai trovato una soluzione migliore nel frattempo. – steven

+0

Scusa @steven, non ho usato PHP da allora. Tuttavia al giorno d'oggi sono meno infastidito dalle migliori pratiche e probabilmente andrei direttamente per una soluzione basata su array, conoscendo le frustrazioni di gettext. – stackunderflow

+0

Sapete come installare locales su xampp per windows? – Gonzalo

3

Prova gettext-php. È un sostituto drop-in per gettext scritto in PHP. È stato originariamente fatto per WordPress, penso, perché WP deve essere eseguito su host condivisi che non sono sempre configurati per ogni locale. Questo mi sembra il tuo problema pure.

Ha un po 'di prestazioni, ma non è stato un problema per me.

+0

Grazie per il suggerimento. Ora che ho (finalmente) ottenuto Gettext, penso che per il momento ci rimarrò, ma lo terrò a mente, se dovessi avere altri problemi. – stackunderflow