2010-02-23 14 views
10

Finora le uniche 2 cose positive che ho visto sull'uso di gettext invece degli array è che non devo creare il "saluto" "sotto-array" (o qualunque sia il suo nome). E non devo creare una cartella per la "lingua predefinita".Utilizzo di PHP Gettext Extension vs matrici PHP in siti Web multilingue?

Esistono altri vantaggi per l'utilizzo degli array gettext e php per i siti Web multilingue?

UTILIZZO gettext:

spagnolo/messages.po:

#: test.php:3 
msgid "Hello World!" 
msgstr "Hola Mundo" 

index.php:?

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

index.php lang = spagnolo:

<?php echo _("Hello World!"); ?> turns to Hola Mundo 

usando array PHP:

lang.en.php

<?php 
$lang = array(
    "greeting" => "Hello World", 
); 
?> 

lang.es.php

<?php 
$lang = array(
    "greeting" => "Hola Mundo", 
); 
?> 

index.php:?

<?php echo $lang['greeting']; ?> greeting turns to Hello World 

index.php lang = spagnolo

<?php echo $lang['greeting']; ?> greeting turns to Hola Mundo 

(ho iniziato con gettext, ma non è stato supportato nel mio comune gratuita Zymic hosting. Non volevo usare Zend_translate, l'ho trovato troppo complicato per il mio compito semplice, quindi alla fine ho finito con php define, ma più tardi qualcuno mi ha detto che dovrei usare gli array)

risposta

7

Utilizzando GNU gettext si ottiene supporto per segnaposto come con printf e forme plurali internazionali. L'ordine dei segnaposti può essere modificato in traduzione o saltato.

Esempio da documentazione di PHP:


<?php 
setlocale(LC_ALL, 'cs_CZ'); 
printf(ngettext("%d window", "%d windows", 1), 1); // gives "1 okno" 
printf(ngettext("%d window", "%d windows", 2), 2); // gives "2 okna" 
printf(ngettext("%d window", "%d windows", 5), 5); // gives "5 oke" 
?> 

Un altro pro è che è possibile utilizzare gli strumenti standard per la gestione della terminologia, memoria di traduzione e traduzione automatica come sottolineato dal @middus.

Per gli ambienti condivisi c'è un ottimo php-gettext library di Danilo Segan.

+0

Quando si utilizza le matrici, è comunque possibile utilizzare pladeholders utilizzando printf, no? (Non hai le forme plurali, però) – middus

+0

Sì, puoi. :) –

+0

Il gettext di PHP è veramente instabile con mod_php almeno. Non solo il problema di memorizzazione nella cache, ma in alcuni aggiornamenti le traduzioni semplicemente non funzionano. Quindi c'è una sostituzione quasi in calo: [php-gettext] (https://launchpad.net/php-gettext/) È estremamente semplice da usare invece di 'setlocale' si usa' _setlocale' e così via ... – Ciantic

4

A mio parere non lo fa troppo senso usare un formato binario (file .mo di gettext) per un linguaggio dinamico come php.

Tuttavia, un professionista di gettext è l'esistenza di un enorme ecosistema di strumenti che i traduttori del software sono in grado di utilizzare (ad esempio Poedit). Il rovescio della medaglia è che devi sempre compilare il tuo file .po in .mo prima di distribuirlo, mentre puoi semplicemente sostituire un file php contenente un array al volo.

Un altro cono è, come hai già riconosciuto, non è disponibile su tutte le installazioni di php.

5

Il pro più ovvio per l'utilizzo di gettext() è ovviamente che la stringa di origine è posizionata a cui appartiene. Cioè rende molto più senso di scrivere questo

echo _("This is a string"); 

di

echo $lang['a_string']; 

Senza contare che avete per realizzare una nuova segnaposto variabile per ogni possibile traduzione. Con gettext() la stringa di traduzione stessa funge da indice.

+0

@tobefound Sono d'accordo con te, ma ho trovato 2 pros dell'utilizzo di echo $ lang ['a_string']; (in realtà ora ho usato l ('string_a);): 1. Poiché il contenuto è al di fuori della pagina dell'indice, il codice sembra più leggibile e compatto. 2. Se voglio tradurre l'intero contenuto della pagina web posso copiare incollare il contenuto in un traduttore (dal momento che il file lang.php contiene solo frasi e parole. – alexchenco

8

Si consiglia di utilizzare gettext, lo sto facendo in PHP per 5 anni con buoni risultati.

Prima di tutto se si utilizza echo _('my text to translate') e non ci sono traduzioni per esso, vedrete la stringa originale nell'output, che è buona. Utilizzando matrici come echo $translation['were is my translation'] e non ce ne sono, non vedrai nulla. ma attenzione, usare poedit e fare uno echo _(''); non è una buona idea, poedit usa lo msgid "" per le informazioni sul progetto che molto probabilmente non vuoi mostrare al tuo pubblico, quindi bisogna stare attenti a non provare a tradurre stringhe vuote :)

inoltre è molto veloce e ha alcune caratteristiche aggiuntive per i plurali e cose, anche poedit ad esempio rende la vita più facile avendo un db di traduzione, quindi non è necessario tradurre le stesse cose più e più volte, quelli che hai fatto già sarà precompilato e contrassegnato come "controlla se è giusto". Molto comodo.

Il middus di cui sopra è necessario compilare il file po mentre si potrebbe facilmente sovrascrivere un file php quando si usano gli array - beh basta sovrascrivere anche il file mo, e se si utilizza poedit, esegue la compilazione dopo aver salvato il file file. Quindi, in effetti, premi Salva e copia il file, sam come con la modifica di un file php.

Ma un vero svantaggio è, se si utilizza mod_php. Essere consapevoli del fatto che con mod_php non è thread-sicuro, anche se non ho mai avuto problemi.

Principalmente è solo necessario riavviare l'apache quando si utilizza mod_php o le chiamate gettext falliscono (a volte non vengono restituite traduzioni, a volte si finisce con la pagina bianca preferita senza contenuti). Ma usando qualcosa come mod_itk (credo che cgi/fastcgi possa farlo) non si avrà più questo problema.

-1

Quando l'utente seleziona qualsiasi lingua dal menu a discesa o di qualsiasi area quindi salvare selezionata la lingua id in sessione come,

$ _SESSION [ 'linguaggio'] = 1;

Ora recupera i dati dal "contenuto" della tabella del database in base all'ID lingua memorizzato nella sessione.

Maggiori dettagli qui

http://skillrow.com/multilingual-website-in-php-2/