Jaki jest sens składni gettext?

9

Do tej pory zajmowałem się niektórymi tłumaczeniami w Wordpress i próbowałem przeczytać oficjalną dokumentację gettext, ale nie mogę zrozumieć jednej prostej rzeczy: jakie są różnice między tymi początkami jak __ (, _e (itp.)? A nawet więcej: obok których są inni? Z góry dzięki!

Szczery

Circuit Circus
źródło
Dziękujemy wszystkim za wyszukane odpowiedzi! Naprawdę to doceniam tutaj!
Circuit Circus
... Może jeszcze jedno pytanie: czy można pominąć wpisanie domeny tekstowej? Zacząłem przynosić go do każdego ciągu, który chciałem przetłumaczyć, ale potem rozpoznałem kilka przykładów w kodeksie Wordpress, które go wcale nie zawierają ...
Circuit Circus
... Okej, teraz natknąłem się na to na stronie kodeksu - przepraszam za to zbędne pytanie :-)
Circuit Circus

Odpowiedzi:

13

__(podwójny znak podkreślenia) to podstawowa funkcja tłumaczenia. Tłumaczy ciąg znaków i zwraca go jako ciąg znaków.

_erobi to samo co __, ale echo jest wynikiem natychmiast.

_xjest funkcją tłumaczenia kontekstowego. Ma drugą opcję zapewnienia kontekstu osobom wykonującym tłumaczenie.

_exjest taki sam jak _x, ale echo jest wynikiem.

Przykład użycia _x:

$string = _x( 'Buffalo', 'an animal', 'plugin-domain' );
$string = _x( 'Buffalo', 'a city in New York', 'plugin-domain' );
$string = _x( 'Buffalo', 'a verb meaning to confuse somebody', 'plugin-domain' );

Czasami ten sam ciąg znaków może być inny w innych językach. Zapewnienie tłumaczom kontekstu może pomóc im wybrać właściwe słowa.

Funkcje skrótów:

  • esc_attr__: Odpowiednik wyniku, __ale także wynik esc_attr.
  • esc_html__: Odpowiednik wyniku, __ale także wynik esc_html.
  • esc_attr_e: Odpowiednik wyniku, _eale także wynik esc_attr.
  • esc_html_e: Odpowiednik wyniku, _eale także wynik esc_html.
  • esc_attr_x: Odpowiednik wyniku, _xale także wynik esc_attr.
  • esc_html_x: Odpowiednik wyniku, _xale także wynik esc_html.

_njest operatorem pluralizacji. Przykład:

$string = sprintf( _n(
        'You have %d taco.', 
        'You have %d tacos.', 
        $number, 
        'plugin-domain'), 
    $number );

W tym przykładzie istnieją dwa sposoby określenia liczby tacos, w zależności od tego, czy jest to liczba pojedyncza, czy nie. Pierwsze użycie $ number informuje _nfunkcję, której wersji użyć. Drugie użycie $ number ma miejsce w sprintf, w celu zastąpienia% d rzeczywistą liczbą w ciągu.

Nie istnieje odpowiednik funkcji echa _n, ale istnieje funkcja o nazwie _nx. To połączenie _ni _x. Pluralizacja i kontekst.

_n_noopjest wyjątkowy. Służy do tłumaczenia ciągów pluralizowanych, ale nie wykonuje tłumaczenia natychmiast. Jest to przydatne, jeśli chcesz, aby łańcuchy były scentralizowane, ale faktycznie działały gdzie indziej. Funkcja, która faktycznie wykonuje pracę gdzie indziej, to translate_nooped_plural.

Przykład:

$holder = _n_noop('You have %d taco.', 'You have %d tacos.', 'plugin-domain');
// ... later ...
$string = sprintf( translate_nooped_plural( $holder, $count ), $count );

Nie jest to często używane, ale może być przydatne w organizacji. Jeśli na przykład umieścisz wszystkie swoje ciągi w jednym pliku, a następnie odniesiesz je gdzie indziej, nie byłoby to możliwe tylko dlatego _n, że potrzebujesz czegoś takiego _n_noop.

_nx_noopjest taki sam jak _n_noop, ale może również wziąć kontekst dla tłumaczy, tak samo jak _x.

Pamiętaj, że możesz umieścić domenę w wywołaniu funkcji noop lub w wywołaniu funkcji translate_nooped_plural. W zależności od tego, co jest bardziej sensowne dla Twojej organizacji. Jeśli oba mają domenę, wygrywa ta przekazana do połączenia noop.

number_format_i18njest równoważne wbudowanemu numerowi_formatowi PHP , ale dodaje obsługę takich elementów, jak dziesiętne itp., które różnią się w innych lokalizacjach.

date_i18njest odpowiednikiem wbudowanej daty PHP , z wszystkimi stosownymi funkcjami. Nazwy miesięcy, nazwy dni itp.

Nigdy też nie łamaj prawa . Tylko przypomnienie. :)

Otto
źródło
Wow, to naprawdę dobre wytłumaczenie! Dziękuję bardzo za pomoc! Teraz widzę jasno.
Circuit Circus
6

__ (), _e () i _x (), _ex ()

__()i _e()są zasadniczo zarówno opakowaniem translate()(nie używaj bezpośrednio), jak i prawie tym samym.

Różnica polega na tym, że __()zwraca przetłumaczony ciąg i _e()powtarza go. Oba wymagają podania łańcucha jako wymaganego parametru i zwykle, choć opcjonalnie, również domeny tekstowej.

Analogicznie istnieje _x()i _ex(), które pozwalają określić kontekst, w którym można opisać, gdzie pojawia się ciąg. Jeśli twój projekt zawiera więcej niż kilkadziesiąt tłumaczonych ciągów, użycie kontekstu ma sens.

Zwróć też uwagę na istnienie _n()i _nx()dla liczby mnogiej.

Przykład powszechnego użycia

$output = '<label for="some_field">' .
        _x( 'Some Information.', 'Some Form Field', 'your-text-domain' ) .
    '</label>' .
    '<input type="text" name="some_field" value="" />' .
    '<p class="description">' .
        _x( 'Here you can enter some info.', 'Some Form Field', 'your-text-domain' ) .
    '</p>';

return $output;

Parametry

__( $text, $domain )
_e( $text, $domain )
_x( $text, $context, $domain )
_ex( $text, $context, $domain )
_n( $single, $plural, $number $domain )
_nx( $single, $plural, $number, $context, $domain )

Wszystkie parametry, ale $numbersą łańcuchami. Wszystkie $domainsą wymagane.

Większa elastyczność dzięki zmiennym i sprintf ()

Jeśli ciągi będą zawierać zmienne liczby lub słowa, użyj sprintf():

$stars = get_post_meta( $post->ID, 'rating', true );
$title = get_the_title( $post->ID );

$output = '<p>' .
        sprintf(
            _x(
                'The movie titled %2$s received a %1$d star rating.',
                'Movie Description',
                'your-text-domain'
            ),
            $stars,
            $title
        ) .
    '</p>';

return $output;

Dodatkowe zasoby

Niektóre dodatkowe zasoby dla nadchodzącego WordPress I18n Ninja:

Johannes Pille
źródło
Sprawdź także „Lokalizacja” w części „Różne” w kodeksie, aby uzyskać pełny podział funkcji i szczegółowe objaśnienia.
TheDeadMedic,
i to jest miejsce, w którym spotykają się wp-polyglots .
brasofilo,
@Johannes Pille: Nie zauważyłem twojej odpowiedzi, dopóki nie opublikowałem mojej, czy powinienem usunąć swój post?
Jeremy Jared,
@JeremyJared Nie, dlaczego? Dalsze informacje nie mogą być złe, prawda ?! Myślę, że twoja odpowiedź jest dobrze przemyślana. +1 ode mnie
Johannes Pille,
@TheDeadMedic Edytowano w „dodatkowych zasobach”.
Johannes Pille,
3

Nie jestem ekspertem od tłumaczeń, ale strona Kodeksu WordPress ma dobrą dokumentację i wyjaśnia powód korzystania z każdej instancji.

Ze stron kodeksu:

__()

Jest używany, gdy wiadomość jest przekazywana jako argument do innej funkcji; _e()służy do pisania wiadomości bezpośrednio na stronie. Więcej szczegółów na temat tych dwóch funkcji:

__('message')

Przeszukuje moduł lokalizacyjny pod kątem tłumaczenia „wiadomości” i przekazuje tłumaczenie do instrukcji return PHP. Jeśli nie znaleziono tłumaczenia dla „wiadomość”, po prostu zwraca „wiadomość”.

_e('message')

Przeszukuje moduł lokalizacyjny pod kątem tłumaczenia „wiadomości” i przekazuje tłumaczenie do instrukcji echo PHP. Jeśli nie znaleziono tłumaczenia dla „wiadomość”, to tylko echo „wiadomość”.

Pamiętaj, że jeśli internacjonalizujesz kompozycję lub wtyczkę, powinieneś użyć "Text Domain" .

Struktura gettext zajmuje się większością WordPress. Jest jednak kilka miejsc w dystrybucji WordPress, w których nie można używać gettext:

  • Główny plik README WordPress - to statyczny plik HTML, a nie plik PHP, więc nie można go uruchomić za pomocą funkcji gettext.
  • Kilka komunikatów o błędach jest generowanych bardzo wcześnie w cyklu ładowania WordPress, zanim zostanie załadowany gettext.

Link do strony Kodeksu

Dodatkowe informacje dotyczące tego, kiedy gettext nie działa

Mam nadzieję, że to odpowiada na twoje pytanie, jeśli nie, daj nam znać, a może ktoś inny może pomóc lub mogę zrobić więcej badań.

Jeremy Jared
źródło