HTML în interiorul funcțiilor de traducere __() sau _e()

15 sept. 2013, 06:19:01
Vizualizări: 50.5K
Voturi: 29

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 ); 
0
Toate răspunsurile la întrebare 2
5
49

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

15 sept. 2013 07:09:45
Comentarii

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.

Twifty Twifty
15 sept. 2013 10:12:32

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

brasofilo brasofilo
15 sept. 2013 13:33:22

@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.

Charles Clarkson Charles Clarkson
15 sept. 2013 14:27:57

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

helgatheviking helgatheviking
15 sept. 2013 14:31:21

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).

phpheini phpheini
3 iun. 2017 19:56:21
2

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.

15 sept. 2013 10:43:58
Comentarii

Î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.

Charles Clarkson Charles Clarkson
15 sept. 2013 14:36:15

@CharlesClarkson Bună observație. Poate ar fi trebuit să omit %s pentru a face lucrurile puțin mai clare.

Twifty Twifty
15 sept. 2013 14:52:55