2013-04-28 12 views
9

Utilizzando gettextgettext, come gestire gli omonimi?

valore singolo

echo gettext("Hello, world!\n"); 

Plurali

printf(ngettext("%d comment", "%d comments", $n), $n); 

inglese omonimo?

echo gettext("Letter");// as in mail, for Russian outputs "письмо" 
echo gettext("Letter");// as in character, for Russian outputs "буква" 

Stessa cosa con la parola inglese "carattere", può essere il carattere di una persona o di una lettera! In che modo si suppone che gettext identifichi la traduzione corretta per gli omonimi?

+0

La risposta sembra essere contesti * * http: //www.gnu .org/software/gettext/manual/html_node/Contexts.html Non sai come vengono utilizzati in un contesto PHP anche se –

+0

correlati ?: http://www.php.net/manual/en/book.gettext.php# 89975 –

risposta

8

Quello che stai cercando è contesti per gettext che risolve ambiguità come il tuo esempio. È possibile trovare informazioni su nello documentation. Ancora il metodo necessario pgettext non è implementato in PHP, quindi è possibile utilizzare il metodo helper indicato in user comment nella documentazione php.

if (!function_exists('pgettext')) { 

    function pgettext($context, $msgid) 
    { 
    $contextString = "{$context}\004{$msgid}"; 
    $translation = dcgettext('messages', contextString,LC_MESSAGES); 
    if ($translation == $contextString) return $msgid; 
    else return $translation; 
    } 

} 

Nel tuo caso sarebbe

echo pgettext('mail', 'Letter'); 
echo pgettext('character', 'Letter'); 
+2

Sarebbe preferibile usare 'textdomain (NULL)' invece di ''messages'' in modo che questa funzione si comportasse allo stesso modo dell'equivalente macro C. – RobertT

+4

Inoltre, vale la pena notare che è necessario fornire '--keyword = pgettext: 1c, 2' a' xgettext' per informarlo dell'esistenza di questa funzione durante il recupero delle stringhe di traduzione. – RobertT

+0

Ho problemi ad usare questa funzione, prima di tutto: la chiamata a 'dcgettext' non sembra essere corretta, credo che dovrebbe essere' dcgettext ('messages', $ contextString, 5) '. Quindi: la funzione non restituisce la traduzione, o forse c'è qualcosa di sbagliato nel mio file PO. Ho [posto una domanda su questo problema qui] (http://stackoverflow.com/questions/31994975/gettext-to-work-with-context-pgettext). – Zealot

3

Durante il tentativo di usare la GNU xgettext programma di utilità per estrarre le stringhe dal codice sorgente mi sono imbattuto in alcuni problemi con l'idea pgettext() di cui sopra.

All'inizio sembra che funzionerà. Utilizzando l'argomento --keyword posso eseguire l'utilità xgettext per estrarre queste contesto e messaggi stringhe dallo script di test:

echo pgettext('Letter','mail'); 
echo pgettext('Letter','character'); 

e ottenere un file pot con i risultati attesi:

... 
msgctxt "mail" 
msgid "Letter" 
msgstr "" 

msgctxt "character" 
msgid "Letter" 
msgstr "" 
... 

Ma le funzioni di PHP * gettext() non mi permettono di passare le stringhe di contesto - quindi non posso ottenere il testo tradotto.

Essere in grado di utilizzare le utilità GNU rende le cose più facili per me, quindi la soluzione per me è stato quello di usare qualcosa di simile:

function _c($txt) { return gettext($txt); } 

echo "<P>", _c("mail:Letter"), "\n"; 
echo "<P>", _c("character:Letter"), "\n"; 

Ora avvio l'utilità di xgettext

xgettext ... --keyword="_c:1" ... 

contro il mio script di test. Questo genera un file .pot con semplici msgstr di cui si può accedere tramite la funzione PHP gettext():

... 
msgid "mail:Letter" 
... 
msgid "character:Letter" 
... 

Poi ho copiare il modello pot alle varie cartelle LC_MESSAGE come.file po e modificare i testi tradotti:

... 
msgid "mail:Letter" 
msgstr "Russian outputs for Mail: \"письмо\"" 

msgid "character:Letter" 
msgstr "Russian outputs for Letter of the Alphabet: \"буква\"" 
... 

E il mio script di test funziona:

... 
Russian outputs for Mail: "письмо" 

Russian outputs for Letter of the Alphabet: "буква" 
... 

La documentazione per xgettext è qui: http://www.gnu.org/software/gettext/manual/html_node/xgettext-Invocation.html

(Ho ancora un problema con testo poedit e "plurale" ma questo è un altro argomento.)

+0

Grazie per aver condiviso la tua esperienza, questo è sicuramente un giro di eventi interessante, non mi aspettavo che gettext causasse così tanti problemi in php –

2

Per quelli che utilizzano Poedit come me devi seguire. Prima crea la funzione. Sto usando uno chiamato _x come l'uso uno WordPress:

if (!function_exists('_x')) { 

function _x($string, $context) 
{ 
    $contextString = "{$context}\004{$string}"; 
    $translation = _($contextString); 
    if ($translation == $contextString) 
    return $string; 
    return $translation; 
} 
} 

Poi poedit è necessario inserire il seguente sulla scheda Fonti Parole chiave:

_x:1,2c 
_ 

Così, quando è necessario utilizzare contesto traduzione che usa la funzione _x. Ad esempio:

<?php 
echo _x('Letter', 'alphabet'); 
echo _x('Letter', 'email'); 
echo _('Regular translation'); 

Ho preso tutte le informazioni da questi link:.