2012-05-07 12 views
6

Sto cercando di utilizzare l'estensione gettext di PHP per tradurre alcune stringhe. Tutte le funzioni sembrano restituire i valori corretti ma chiamando gettext()/_() restituisce solo la stringa originale. I file PO/MO sembrano corretti e credo di aver impostato correttamente le directory. Sto facendo funzionare WAMP Server con PHP 5.3.10 su Windows (ho anche provato a eseguire 5.3.4 e 5.3.8 perché ho le installazioni).PHP Gettext - Nessuna traduzione

Innanzitutto, vedi /new2/www/index.php:

$locale = 'esn'; # returns Spanish_Spain.1252 in var dump 

putenv("LC_ALL={$locale}"); // Returns TRUE 
setlocale(LC_ALL, $locale); // Returns 'Spanish_Spain.1252' 

$domain = 'messages'; 
bindtextdomain($domain, './locale'); // Returns C:\wamp\www\new2\www\locale 
bind_textdomain_codeset($domain, 'UTF-8'); // Returns UTF-8 
textdomain($domain); // Returns'messages' 

print gettext("In the dashboard"); // Prints the original text, not the translation. 
exit; 

Ho creato la seguente struttura di file:

www/new2/www/locale/Spanish_Spain.1252/LC_MESSAGES/messages.mo 

ho anche provato a sostituire Spanish_Spain.1252 con: es_ES, esn, esp, Spanish e Spanish_Spain.

Il file PO utilizzato per generare il MO è in questo modo (solo la voce relativa data):

#: C:\wamp\www\new2/www/index.php:76 
msgid "In the dashboard" 
msgstr "TRANSLATED es_ES DASHBOARD" 

Questo è stato generato utilizzando PoEdit. Ho riavviato Apache dopo aver aggiunto un nuovo file .MO. Si noti inoltre che in precedenza utilizzavo Zend_Translate con Gettext e si stava traducendo correttamente. Desidero fare affidamento sull'estensione gettext nativa, anche se, in parte perché sto tentando di creare un framework leggero per conto mio.

Qualsiasi aiuto sarebbe apprezzato.

Modifica: Struttura della directory modificata. Nota: sarà in grado di provare risposte recenti entro 24 ore.

+0

Le impostazioni internazionali e la directory non dovrebbero essere "es_ES.UTF-8'? – mario

+0

@mario Ho provato quella locale e la directory ma 'setlocale()' restituisce quindi false. – Pete171

risposta

1

Look here. Funziona anche per me su Windows e su Linux. Gli ultimi valori nell'array funzionano per Windows. Elenco dei nomi delle lingue può essere trovato here. I miei cataloghi sono in

./locales/en/LC_MESSAGES/domain.mo 
     /cs/LC_MESSAGES/domain.mo 
+0

@ Fanda Ho provato ad usare i nomi delle impostazioni locali di Windows (inclusi 'esn' e' esp' - come nella mia domanda). Ho appena provato diversi esempi direttamente dal post a cui ti sei collegato, impostando le impostazioni locali su 'array ('de_DE.UTF-8', 'de_DE', 'de', 'german')'. Ho creato un file 'locale/[VALUE-FROM-ARRAY]/LC_MESSAGES/messages.mo' per ognuno di questi valori e riavviato Apache prima di riprovare, senza fortuna. Tutte le funzioni ritornano correttamente, però. Qualche ulteriore suggerimento? – Pete171

+0

Hai provato a rinominare lang subdir in 2 lettere di codice? (locales/de/LC ...? – Fanda

+0

@FandaYes, ho. Nessuna fortuna – Pete171

0

problema può essere anche che quando si cambia * .po e .mo * i file, è necessario riavvio del server Apache. Questo può essere un problema, quindi puoi usare il workaround - rinominare sempre questi file con un nuovo nome e questi verranno ricaricati.

+0

@jasirPer favore, leggi la mia domanda originale; Ho riavviato Apache ogni volta che i miei file .MO sono cambiati. Grazie – Pete171

2

Un suggerimento: potrebbe essere necessario il locale completo per il file .mo. Questo è probabilmente Spanish_Spain.UTF8 o esn_esn.UTF8 o esn_esp.UTF8 (non 1252, quando si modifica la base del codice).

Per tenere traccia della directory che sta cercando, è possibile installare Process monitor (http://technet.microsoft.com/en-us/sysinternals/bb896645). Spiega i carichi del bucket sulle informazioni, ma dovresti essere in grado di scoprire quale file/directory è stato cercato.

(Il mio altro pensiero è quello di controllare i permessi dei file - ma se hai già qualcosa di simile in Zend_Translate, probabilmente non è la causa, ma vale comunque la pena controllare).

Scusate se non buono, ma potrebbe darvi un indizio.

+0

Grazie - darò un'occhiata al monitor Process in seguito e vedrò se mi aiuta. Potrebbe essere esattamente quello che sto cercando. – Pete171

3

L'ho impostato sulla mia istanza XAMPP e l'ho scoperto.

  • Flat out setlocale non funziona su Windows, quindi ciò che restituisce è irrilevante.
  • Per Windows è possibile impostare la versione locale con i codici di linguaggio/standard del Paese (in questo caso è es_ES spagnolo parlato in Spagna)
  • sotto la directory locale creare es_ES/LC_MESSAGES /. Questo dove vive il tuo file messages.mo.

    $locale = 'es_ES'; 
    
    putenv("LC_ALL={$locale}"); // Returns TRUE 
    
    $domain = 'messages'; 
    bindtextdomain($domain, './locale'); 
    bind_textdomain_codeset($domain, 'UTF-8'); 
    textdomain($domain); // Returns'messages' 
    
    print gettext("In the dashboard"); 
    exit; 
    

io non sono sicuro se questo ha fatto un diverso, ma ho fatto due cose quando si crea il file po. In poEdit in File -> Preferenze ho modificato il formato di fine linea in Windows. E dopo aver creato l'iniziale po con poEdit ho aperto il file in Notepad ++ e ho cambiato il tipo di codifica in UTF-8 poEdit non l'ha fatto.

Spero che questo almeno punti nella giusta direzione.

Riferimenti

PHP Localization Tutorial on Windows

Country Codes

Language Codes

1

Non ho mai provato con gettext su Windows, ma ogni volta che ho avuto problemi con gettext su sistemi Linux, il motivo era che non è stato installato un language pack appropriato.

3

Il codice cita questo come il valore restituito da bindtextdomain:

C:\wamp\www\new2\www\locale 

Con la setlocale di Spanish_Spain.1252 e textdomain di messages, chiama a gettext cercherà in questo percorso:

C:\wamp\www\new2\www\locale\Spanish_Spain.1252\LC_MESSAGES\messages.mo 

Ma voi ha creato la struttura file di:

www/new2/locale/Spanish_Spain.1252/LC_MESSAGES/messages.mo 
     ^^ 
     www/ missing here 

Modifica

Ok, quindi non è stato d'aiuto. Ho creato uno script di test su Windows e utilizzando poEdit come te:

$locale = "Dutch_Netherlands.1252"; 
putenv("LC_ALL=$locale"); // 'true' 
setlocale(LC_ALL, $locale); // 'Dutch_Netherlands.1252' 
bindtextdomain("messages", "./locale"); // 'D:\work\so\l10n\locale' 
textdomain("messages"); // 'messages' 

echo _("Hello world"); // 'Hallo wereld' 

La mia struttura di cartelle è come questo:

D:\work\so\l10n\ 
    \locale\Dutch_Netherlands.1252\LC_MESSAGES\messages.mo 
    \locale\Dutch_Netherlands.1252\LC_MESSAGES\messages.po 
    \test.php 

Speranza che aiuta, anche se sembra quasi identico al tuo. Un paio di cose che ho trovato on-line:

  • E 'importante impostare il set di caratteri nel file .po
  • gli ambienti, all'interno del file di localizzazione potrebbe avere un UTF8 alternativa, quindi diffidare di ricerche chiave fallimento. Probabilmente la cosa migliore da testare prima sono le chiavi senza spazi.
+0

Ahh, Mi dispiace, l'ho copiato in modo errato. In realtà ho creato 'C: \ wamp \ www \ new2 \ www \ locale \ spagnolo ...' ecc. Modificherò la mia domanda ora. Grazie per averlo notato, però! – Pete171

+0

@ Pete171 Ho aggiornato la mia risposta, dai un'occhiata. –