2013-04-28 28 views
9

Korzystanie gettextgettext, jak radzić sobie z homonimami?

wartość pojedyncze

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

plurals

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

English homonim?

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

samo z angielskiego słowa „charakter”, może to być znak od osoby lub listem! W jaki sposób gettext ma identyfikować właściwe tłumaczenie homonimów?

+0

Odpowiedź wydaje się być konteksty * * http: //www.gnu .org/software/gettext/manual/html_node/Contexts.html Nie wiem, w jaki sposób są one używane w kontekście PHP. –

+0

Powiązane ?: http://www.php.net/manual/en/book.gettext.php# 89975 –

Odpowiedz

8

To, czego szukasz, to konteksty dla gettext, które rozwiązują niejednoznaczności, takie jak Twój przykład. Możesz znaleźć informacje na temat w documentation. Wciąż potrzebna jest metoda pgettext nie jest zaimplementowana w PHP, więc możesz użyć metody pomocnika podanej w user comment w dokumentacji 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; 
    } 

} 

W twoim przypadku byłoby

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

Byłoby lepiej używać 'textdomain (NULL)' zamiast ''messages'', aby ta funkcja zachowywała się w taki sam sposób jak ekwiwalent makra C. – RobertT

+4

Co więcej, warto zauważyć, że należy podać '--keyword = pgettext: 1c, 2' do' xgettext', aby poinformować go o istnieniu tej funkcji podczas pobierania ciągów translacji. – RobertT

+0

Mam problem z użyciem tej funkcji, po pierwsze: wywołanie 'dcgettext' nie wydaje się poprawne, uważam, że powinno to być' dcgettext ('messages', $ contextString, 5) '. Następnie: funkcja nie zwraca tłumaczenia lub może coś jest nie tak z moim plikiem PO. Ja [zadałem pytanie na temat tego problemu tutaj] (http://stackoverflow.com/questions/31994975/gettext-to-work-with-context-pgettext). – Zealot

3

Starając się użyć narzędzia GNU xgettext wyodrębnić ciągów z kodu źródłowego wpadłem w kłopoty z pgettext (idei) powyżej.

Na początku wygląda na to, że zadziała. Korzystanie z --keyword argumentu mogę uruchomić xgettext narzędzia, aby wyodrębnić te kontekst i wiadomość ciągi ze skryptu testowego:

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

i pobrać plik .pot z oczekiwanego wyjścia:

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

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

Ale funkcje PHP * gettext() nie pozwalają mi przekazywać ciągów kontekstów - więc nie mogę uzyskać przetłumaczonego tekstu.

Będąc w stanie korzystać z narzędzi GNU sprawia, że ​​rzeczy łatwiejsze dla mnie, więc rozwiązaniem dla mnie było użyć czegoś takiego:

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

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

Teraz uruchom narzędzie xgettext

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

przeciwko mój skrypt testowy. To generuje plik .pot z prostymi msgid tych, które są dostępne za pośrednictwem funkcji PHP gettext():

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

Następny skopiować szablon .pot do różnych folderów LC_MESSAGE jako.Plik PO i edytować przetłumaczone teksty:

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

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

A mój skrypt testowy działa:

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

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

Dokumentacja xgettext jest tutaj: http://www.gnu.org/software/gettext/manual/html_node/xgettext-Invocation.html

(nadal mam problem z poeditem i tekstem "w liczbie mnogiej", ale jest to inny temat.)

+0

Dziękuję za podzielenie się wrażeniami, to zdecydowanie ciekawy obrót wydarzeń, nie spodziewałem się, że gettext spowoduje tyle problemów w php –

2

Dla osób używających Poedit tak jak ja, musisz podążać. Najpierw utwórz funkcję. Używam jednego nazwie _x takie jak wykorzystanie jednego WordPress:

if (!function_exists('_x')) { 

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

Następnie na poedit trzeba wpisują na karcie Źródła kluczowe:

_x:1,2c 
_ 

więc kiedy trzeba użyć tłumaczenia kontekstowego użyj funkcji _x. Np:

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

Wziąłem wszystkie informacje z tych linków.