2013-06-14 13 views
5

che sto seguendo le istruzioni dalla risposta di BryanH qui: gettext() equivalent in Intl library? e cercando di attuare la localizzazione (traduzione) con PHP-Intl, ma io continuo a ricevere lo stesso problema questa persona aveva: ResourceBundle returns NULL without any errors being raisedCome posso creare file di risorse ICU da utilizzare in PHP?

Accenna ha creato i file dat con uno strumento (che non riesco a capire come lavorare) mentre la persona nella prima risposta sembra semplicemente che stia usando file txt con estensione .res.

Come implementare correttamente la localizzazione con php-intl e ResourceBundle e cosa sto facendo male?

L'obiettivo è quello di avere i vari file di dati con lingue diverse in modo che io possa fare qualcosa di simile a

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

..much come la persona nella prima risposta doveva. Inoltre, l'obiettivo è quello di avere file facilmente modificabili, così posso darli ai traduttori per correzioni, aggiornamenti e così via. Mi rendo conto che potrei facilmente farlo con una soluzione personalizzata attraverso un semplice file di testo che viene analizzato e salvato in memcache alla prima richiesta, dove poi persiste e viene servito senza dover rileggere i file .dat, ma preferirei prendi il percorso suggerito qui.

Modifica: Solo per ottenerlo - Ho implementato la stessa cosa con gettext correttamente ed è stato semplice: salva un bug che persiste nei sistemi Linux (http://www.php.net/manual/en/book.gettext.php#91187) - ma mi piacerebbe fare affidamento su più estensione intl moderna e all-inclusive, se possibile.

risposta

9

Posso fornire una soluzione alla tua domanda su come creare e utilizzare i file .res per l'estensione PHP intl, tuttavia non ho esperienza con la velocità e l'utilizzo nei sistemi di produzione, devi vedere da solo se questo può essere una sostituzione per gettext.

A mio parere, un grande vantaggio di gettext sono strumenti aggiuntivi come xgettext che possono estrarre le stringhe da tradurre. Tuttavia, l'utilizzo delle risorse potrebbe essere più utile nel caso d'uso.

Per generare un file .res è necessario utilizzare il programma genrb che è bundled with ICU. (Ad esempio quando si installa ICU su OSX utilizzando brew install icu4c (see this tutorial) è possibile trovare lo strumento a /usr/local/Cellar/icu4c/*/bin/genrb (sostituire * con il numero di versione))

successivo si prepara un file per ogni locale. Facciamo questo per due lingue in questo esempio, tedesco e spagnolo.

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

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

$ genrb *.txt 
genrb number of files: 2 

Si dispone ora di 2 file aggiuntivi de.res e es.res, che ora è possibile accedere in PHP

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

che sarà uscita

Hallo 
Hola 

Quindi, in sostanza, è possibile consegnare quelle *.txt file ai tuoi traduttori e preparali per PHP usando genrb.

Infine, un piccolo esempio per la classe che si stavano cercando di scrivere:

<?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

Grazie, basta così. Dal momento che questo dovrebbe essere thread-safe, ritengo che sia la soluzione che stavo cercando. Ora ho solo bisogno di scrivere il mio estrattore di corde e questo dovrebbe funzionare. – Swader

+1

Sarebbe molto utile se potessi condividere la tua esperienza con esso, anche con il tuo estrattore di corde (forse potresti persino aprirlo?). Grazie in anticipo! – akirk

+0

Poed poedit può auto-estrarre per gettext, ho pensato che potevo semplicemente dargli un altro pattern da cercare come $ t -> _ ($ string), che poi creerebbe i file .mo e .po anche per quelle stringhe. Tutto quello che dovrei fare è scrivere uno strumento che converta quelli in formato RES, il che sembra abbastanza facile. Scriverò un post sul blog sull'intera vicenda e collegherò qui. – Swader