HTML wewnątrz łańcucha tłumaczenia języka __ () lub _e ()

24

Jakie jest właściwe podejście do budowania ciągów tłumaczeń?

Na przykład,

echo __( 'Hello ' . $first . ' you owe me money.' );
echo __( '<div><p>Top: ' . $t_margin . '</p>' . '<p>Bottom: ' . $b_margin . '</p></div>' )

Czy można dodawać ciągi i / lub HTML, czy należy to zrobić najpierw, a następnie uruchomić tłumaczenie:

$html = '<div><p>Top: ' . $t_margin . '</p>' . '<p>Bottom: ' . $b_margin . '</p></div>';
echo __( $html ); 
Jason
źródło

Odpowiedzi:

41

W funkcji jest drugi argument __(). Powinien być ustawiony na domenę, której używasz dla wtyczki lub motywu. W poniższych przykładach używam 'text_domain'. Ciąg domeny powinien być unikalny. Nie powinien pasować do żadnego innego ciągu domeny. Nieużywanie argumentu domeny tekstowej domyślnie 'default'oznacza nazwę domeny WordPress. Zobacz link po więcej szczegółów.

Zawsze używaj string ( 'text_domain'). Nigdy nie używaj zmiennej, funkcji lub stałej z zawartym w niej łańcuchem. Większość (wszystkich?) Programów tłumaczących nie zobaczy go bez napisu.

Twój kod:

echo __( 'Hello ' . $first . ' you own me money.' );

Nie dołączaj zmiennych do łańcucha.

Lepszy sposób:

echo sprintf( __( 'Hello %s you own me money.', 'text_domain' ), $first );

Lub tylko:

printf( __( 'Hello %s you own me money.', 'text_domain' ), $first );

Symbol %szastępczy mówi ludzkiemu tłumaczowi, że tam jest łańcuch. Użyj %ddla liczb. Istnieją również inne symbole zastępcze .

(To zdanie jest gramatycznie niepoprawne w języku angielskim. Użyj jednego 'Hello %s, you owe me money.'lub w 'Hello %s, you own my money.'zależności od zamierzonego znaczenia).


Twój kod:

$html = '<div><p>Top: ' . $t_margin . '</p>' . <p>Bottom: ' . $b_margin . '</p></div>';

Nie tłumacz HTML. Tak samo jest w każdym języku.

Lepszy sposób:

$html = sprintf( '<div><p>%s</p><p>%s</p></div>', __( 'Top: ', 'text_domain' ) .  $t_margin, __( 'Bottom: ', 'text_domain' ) . $b_margin );

Lub podziel go na wiele linii:

$html = sprintf(
    '<div><p>%s</p><p>%s</p></div>',
    __( 'Top: ', 'text_domain' ) .  $t_margin,
    __( 'Bottom: ', 'text_domain' ) . $b_margin
);

Jeśli nie jest jasne, jakie są Górne i Dolne, możesz użyć _x()do wyjaśnienia kontekstu tych terminów.


Możesz znaleźć inne przypadki tłumaczeń tutaj: Internacjonalizacja: Prawdopodobnie robisz to źle

Charles Clarkson
źródło
Mówisz, że nie tłumacz HTML. Mogę wskazać, że nie jest on tłumaczony, lecz przeglądany w istniejącej tabeli / tabelach wstępnie przetłumaczonych ciągów. Umieszczenie HTML w ciągu nie ma znaczenia, pod warunkiem, że tłumacz go nie usunie. W rzeczywistości w niektórych sytuacjach zapewnia lepszą wydajność niż wyszukiwanie wyrażeń regularnych i zamiana.
Twifty
Niepowiązane, ale z drugiej strony: textdomainciąg musi być dosłowny, nie może być zmienną / stałą / właściwością.
brasofilo
@brasofilo, ta rada jest napisana w odpowiedzi u góry, ale trzeba ją powtarzać. Popełniłem ten błąd w kilku niestandardowych wtyczkach, które napisałem dla klientów.
Charles Clarkson
+1 dla sprintf(). To naprawdę jest sposób na HTML w tłumaczonym ciągu.
helgatheviking
Nie rozumiem, w jaki sposób użycie sprintf()pomaga w jakikolwiek inny sposób niż może bardziej czysty wygląd. Jeśli masz zdanie z HTML wewnątrz, na przykład, Some text with a <strong>strong</strong> word inside.jak można przetłumaczyć zdanie jako całość, a nie tłumaczyć Some text with a, strongi word insideindywidualnie (co nie ma sensu).
phpheini,
4

Nie zajmę się kwestią zmiennych w łańcuchu, ponieważ zostało już powiedziane.

Chcesz utrzymać ciąg statyczny, co oznacza, że ​​treść się nie zmieni. Chcesz także unikać niepotrzebnego kodu HTML.

__( '<p>Hello World!</p>' );
__( '<h1>Hello World!</h1>' );

Powyższe zajmie dwa wiersze w tabeli dla zasadniczo tego samego tekstu. Można je przepisać jako:

'<p>' . __( 'Hello World!' ) . '</p>'
'<h1>' . __( 'Hello World!' ) . '</h1>'

Zmniejszenie do jednego rzędu.

Czasami HTML w tekście jest nieunikniony. Weź na przykład:

__( 'You currently owe <b>%s</b> dollars' );

Ponieważ języki są gramatyczne, podział tekstu spowodowałby problemy dla każdego, kto tłumaczy.

Praktyczna zasada. Tagi formatujące tekst HTML w połowie zdania są OK. Zdania zaczynające się i kończące na HTML marnują miejsce.

Twifty
źródło
W ostatnim przykładzie można owinąć pogrubione znaczniki wokół wstawionego argumentu "<b>$string</b>". Następnie możesz użyć 'You currently owe %s dollars'. Ale może to wymagać pozostania, jeśli używasz go z _n()funkcją, która wymaga %dsymbolu zastępczego.
Charles Clarkson
@CharlesClarkson Dobra rozmowa. Być może powinienem był pominąć, %saby uczynić to nieco jaśniejszym.
Twifty