2011-01-13 14 views
5

Ho un .po e un file .mo in una cartella il cui indirizzo è /locale/nld_nld/LC_MESSAGES/. Entrambi i nomi dei file sono messaggi. Ho cercato di utilizzare il seguente codice:Come usare i file po/pot con php?

try.php:

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

il Localization.php va qui:

<?php 
$locale = "nld_nld"; 
if (isSet($_GET["locale"])) $locale = $_GET["locale"]; 
putenv("LC_ALL=$locale"); 
setlocale(LC_ALL, $locale); 
bindtextdomain("messages", "./locale"); 
bind_textdomain_codeset("messages", 'UTF-8'); 
textdomain("messages"); 
?> 

Sia il file di localizzazione try.php e sono nella stessa directory. Inoltre, io uso xampp. Ho anche implementato lo phpinfo();. Nella tabella, di fronte a "GetText Support", è stato menzionato l'abilitato. I messaggi . e messages.mo sono file validi che ho creato utilizzando poEdit. Sono un utente di Windows. Tuttavia, quando ho aperto try.php, ha semplicemente fatto eco a Hello World! (Non la sua stringa tradotta. Inoltre, ho tradotto il .po file di 100% (secondo poEdit). Eppure, non sto ottenendo i risultati. Un po 'di aiuto su questo sarebbe apprezzato.

Grazie ! in anticipo

risposta

2

Quando guardando indietro a codice che ho. posto in un sito di lavoro per la traduzione in spagnolo, noto che ho anche le stesse linee in un ordine diverso, forse questo fa la differenza? Per esempio:

<?php 
putenv('LC_MESSAGES=es_ES'); 
setlocale(LC_MESSAGES, 'es_ES.utf8'); 
bindtextdomain('es','/full/path/here/application/locale'); 
textdomain('messages-es'); 
bind_textdomain_codeset('messages-es', 'UTF-8'); 
?> 

Per il codice qui sopra per lavorare, il mio file .mo si trova nella cartella /full/path/here/application/locale/es_ES.utf8.

Forse il seguente codice che ho usato prima potrebbe aiutare a risolvere ulteriormente:

<?php 
function TestLang($langCode) { 
    echo('<b>TESTING LANG CODE: ' . strtolower($langCode) . '</b><br />'); 
    putenv('LC_MESSAGES=' . strtolower($langCode) . '_' . strtoupper($langCode)); 
    echo('LC_MESSAGES: ' . getenv('LC_MESSAGES') . '<br />'); 
    $localeResult = setlocale(LC_MESSAGES, strtolower($langCode) . '_' . strtoupper($langCode) . '.utf8'); 
    echo('Locale: ' . $localeResult . '<br />'); 
    $textDomain = bindtextdomain(strtolower($langCode), ROOT . '/' . APP_DIR . '/locale'); 
    echo('Text Domain: ' . $textDomain . '<br />'); 
    textdomain(strtolower($langCode)); 
    $codeSet = bind_textdomain_codeset(strtolower($langCode), 'UTF-8'); 
    echo('Code Set: ' . $codeSet . '<br />'); 
    echo('.mo File: ' . $textDomain . '/' . $localeResult . '/LC_MESSAGES/' . $langCode . '.mo<br />'); 
    echo('<br />-- ' . _('Hello World!') . ' --<br />'); 
} 

TestLang('en'); 
TestLang('de'); 
TestLang('es'); 
TestLang('fr'); 
// etc.. 
?> 
+0

il textdomain() è in genere l'ultima chiamata di funzione (in realtà potrebbe essere necessario prima di ogni chiamata gettext aka _() se si lavora con domini di tipo mutiple.Innanzitutto leghi tutti i domini, quindi ne selezioni uno. – eckes

+0

Nel tuo esempio utilizzi due diversi nomi di dominio "es" e "messaggi-es". Potrebbe non funzionare (e in genere non si ha l'identificatore della lingua nel nome del file come invece viene definito dalla directory). Quindi "/full/path/here/application/locale/es_ES/LC_MESSAGES/messages.mo" sarà il nome file del dominio "messaggi" e il LC_TYPE es_ES. – eckes

0

uscita il valore di ritorno di $result=bindtextdomain($domain,$path), vi dirà se il vostro percorso locale è infatti il ​​percorso vi aspettate il vostro file di traduzione alla vita. E poi controlla i permessi di accesso ai file di quei file se questi (e le directory fino alla radice) sono accessibili dall'utente www. È da qualche parte in ./locale/LC_MESSAGES/nld_nld/

textdomain($domain) dovrebbe essere l'ultimo metodo (prima delle traduzioni gettext effettive). Il parametro di dominio di bindtextdomain e textdomain dovrebbe essere lo stesso nome di dominio (non era nella risposta) e uguale al nome di base dei file mo.

Assicurati anche che nessuno dei tuoi file php usi un altro dominio di testo, specialmente quando usi "require_once".

BTW, il codice che si cerca un identificatore di impostazioni internazionali nella richiesta (senza filtro) e utilizza nld_nld come failback predefinito, inserirò invece una lingua normale (linguaggio del sito primario come "en").