HTML în interiorul funcțiilor de traducere __() sau _e()
Care este abordarea corectă pentru construirea șirurilor de traducere?
De exemplu,
echo __( 'Hello ' . $first . ' you owe me money.' );
echo __( '<div><p>Top: ' . $t_margin . '</p>' . '<p>Bottom: ' . $b_margin . '</p></div>' )
Este OK să adăugăm șirurile și/sau HTML sau ar trebui să fie făcut mai întâi și apoi procesat prin traducere astfel:
$html = '<div><p>Top: ' . $t_margin . '</p>' . '<p>Bottom: ' . $b_margin . '</p></div>';
echo __( $html );

Există un al doilea argument în funcția __()
. Acesta ar trebui să fie setat la domeniul pe care îl utilizați pentru pluginul sau tema dumneavoastră. În exemplele de mai jos, folosesc 'text_domain'
. Șirul dumneavoastră de domeniu ar trebui să fie unic. Nu ar trebui să se potrivească cu niciun alt șir de domeniu. Dacă nu utilizați un argument de domeniu de text, acesta va fi implicit setat la 'default'
, numele de domeniu WordPress. Consultați linkul pentru mai multe detalii.
Utilizați întotdeauna șirul ('text_domain'
). Nu utilizați niciodată o variabilă, funcție sau constantă care să conțină șirul. Majoritatea (toate?) programelor de traducere nu îl vor recunoaște fără ca șirul să fie prezent.
Codul dumneavoastră:
echo __( 'Hello ' . $first . ' you own me money.' );
Nu includeți variabile în șir.
O metodă mai bună:
echo sprintf( __( 'Hello %s you own me money.', 'text_domain' ), $first );
Sau pur și simplu:
printf( __( 'Hello %s you own me money.', 'text_domain' ), $first );
Marcatorul %s
indică traducătorului uman că acolo va fi introdus un șir. Utilizați %d
pentru numere. Există și alte marcatoare.
(Această propoziție este gramatical incorectă în engleză. Utilizați fie 'Hello %s, you owe me money.'
fie 'Hello %s, you own my money.'
în funcție de sensul dorit.)
Codul dumneavoastră:
$html = '<div><p>Top: ' . $t_margin . '</p>' . <p>Bottom: ' . $b_margin . '</p></div>';
Nu traduceți HTML. Acesta este același în orice limbă.
O metodă mai bună:
$html = sprintf( '<div><p>%s</p><p>%s</p></div>', __( 'Top: ', 'text_domain' ) . $t_margin, __( 'Bottom: ', 'text_domain' ) . $b_margin );
Sau împărțiți-l pe mai multe linii:
$html = sprintf(
'<div><p>%s</p><p>%s</p></div>',
__( 'Top: ', 'text_domain' ) . $t_margin,
__( 'Bottom: ', 'text_domain' ) . $b_margin
);
Dacă nu este clar ce reprezintă Top și Bottom, ați putea utiliza _x()
pentru a explica contextul acestor termeni.
Puteți găsi alte cazuri de traducere aici: Internaționalizare: Probabil o faceți greșit

Spuneți să nu traduceți HTML. Pot să subliniez că nu este tradus, ci este căutat într-un tabel/tabele existente de șiruri pre-traduse. Faptul că există HTML în șir nu face nicio diferență, cu condiția ca translatorul să nu le fi eliminat. De fapt, în unele situații, aceasta oferă o performanță mai bună decât căutarea și înlocuirea cu regex.

Nerelat, dar merită menționat: textdomain
trebuie să fie un șir literal, nu poate fi o variabilă/constantă/proprietate.

@brasofilo, acest sfat este scris în răspuns aproape de început, dar merită repetat. Am făcut această greșeală în mai multe plugin-uri personalizate pe care le-am scris pentru clienți.

+1 pentru sprintf()
. Aceasta este într-adevăr soluția pentru a evita includerea HTML în șirurile de caractere traductibile.

Nu văd cum utilizarea sprintf()
ajută în vreun fel, în afară de o posibilă aspect mai curat. Dacă ai o propoziție cu HTML în interior precum Un text cu un cuvânt îngroșat în interior.
cum este posibil să traduci propoziția în întregime și nu să traduci Un text cu un
, îngroșat
și cuvânt în interior
individual (ceea ce nu are sens).

Nu voi aborda problema variabilelor în șiruri de caractere, deoarece a fost deja discutată.
Doriți să păstrați șirul static, adică conținutul să nu se schimbe. De asemenea, doriți să excludeți HTML-ul inutil.
__( '<p>Hello World!</p>' );
__( '<h1>Hello World!</h1>' );
Exemplele de mai sus vor ocupa două rânduri în tabelul dvs. pentru ceea ce este în esență același text. Ele pot fi rescrise astfel:
'<p>' . __( 'Hello World!' ) . '</p>'
'<h1>' . __( 'Hello World!' ) . '</h1>'
Reducând astfel la un singur rând.
Uneori, HTML-ul în text este inevitabil. Luați de exemplu:
__( 'You currently owe <b>%s</b> dollars' );
Deoarece limbile au reguli gramaticale, despărțirea textului ar cauza probleme pentru cei care traduc.
Regula generală. Etichetele HTML de formatare în mijlocul propoziției sunt acceptabile. Propozițiile care încep și se termină cu HTML doar ocupă spațiu inutil.

În ultimul exemplu, poți înfășura tag-urile de bold în jurul argumentului care este inserat "<b>$string</b>"
. Apoi poți folosi 'În prezent datorezi %s dolari'
. Dar poate fi necesar să rămână dacă îl folosești cu funcția _n()
care necesită un substituent %d
.
