HTML all'interno della stringa di traduzione __() o _e()

15 set 2013, 06:19:01
Visualizzazioni: 50.5K
Voti: 29

Qual è l'approccio corretto per costruire le stringhe di traduzione?

Per esempio,

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

È corretto aggiungere le stringhe e/o l'HTML o dovrebbe essere fatto prima e poi passato attraverso la traduzione come:

$html = '<div><p>Top: ' . $t_margin . '</p>' . '<p>Bottom: ' . $b_margin . '</p></div>';
echo __( $html ); 
0
Tutte le risposte alla domanda 2
5
49

C'è un secondo argomento nella funzione __(). Dovrebbe essere impostato sul dominio che stai utilizzando per il tuo plugin o tema. Negli esempi qui sotto uso 'text_domain'. La stringa del tuo dominio dovrebbe essere unica. Non dovrebbe corrispondere a nessun'altra stringa di dominio. Non utilizzare un argomento per il dominio di testo farà sì che venga utilizzato il dominio predefinito di WordPress, 'default'. Vedi il link per maggiori dettagli.

Utilizza sempre la stringa ('text_domain'). Non utilizzare mai una variabile, funzione o costante che contenga la stringa. La maggior parte (tutti?) i programmi di traduzione non la vedranno senza la stringa presente.

Il tuo codice:

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

Non includere variabili nella stringa.

Un modo migliore:

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

O semplicemente:

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

Il segnaposto %s indica al traduttore umano che verrà inserita una stringa. Usa %d per i numeri. Ci sono anche altri segnaposto.

(Questa frase è grammaticalmente scorretta in inglese. Usa 'Hello %s, you owe me money.' o 'Hello %s, you own my money.' a seconda del significato che intendevi.)


Il tuo codice:

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

Non tradurre l'HTML. È lo stesso in qualsiasi lingua.

Un modo migliore:

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

Oppure suddividilo in più righe:

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

Se non è chiaro cosa siano Top e Bottom, potresti usare la funzione _x() per spiegare il contesto di questi termini.


Puoi trovare altri casi di traduzione qui: Internazionalizzazione: Probabilmente lo stai facendo nel modo sbagliato

15 set 2013 07:09:45
Commenti

Dici di non tradurre l'HTML. Vorrei far notare che non viene tradotto, ma cercato in tabelle esistenti di stringhe pre-tradotte. Avere HTML nella stringa non fa differenza, purché il traduttore non li rimuova. In effetti, in alcune situazioni offre prestazioni migliori rispetto alla ricerca e sostituzione con regex.

Twifty Twifty
15 set 2013 10:12:32

Non correlato, ma vale la pena notarlo: il textdomain deve essere una stringa letterale, non può essere una variabile/costante/proprietà.

brasofilo brasofilo
15 set 2013 13:33:22

@brasofilo, questo consiglio è scritto nella risposta in alto, ma vale la pena ripeterlo. Ho commesso questo errore in diversi plugin personalizzati che ho scritto per clienti.

Charles Clarkson Charles Clarkson
15 set 2013 14:27:57

+1 per sprintf(). È davvero il modo per evitare di avere HTML nelle stringhe traducibili.

helgatheviking helgatheviking
15 set 2013 14:31:21

Non vedo come l'uso di sprintf() aiuti in alcun modo, se non forse per una resa più pulita. Se hai una frase con HTML all'interno come Some text with a <strong>strong</strong> word inside. come è possibile tradurre la frase nel suo insieme e non tradurre Some text with a, strong e word inside individualmente (il che non avrebbe senso).

phpheini phpheini
3 giu 2017 19:56:21
2

Non affronterò il problema delle variabili nella stringa poiché è già stato detto.

Vuoi mantenere la tua stringa statica, il che significa che il contenuto non cambierà. Vuoi anche evitare HTML non necessario.

__( '<p>Ciao Mondo!</p>' );
__( '<h1>Ciao Mondo!</h1>' );

Il codice sopra occuperà due righe nella tua tabella per quello che è essenzialmente lo stesso testo. Possono essere riscritti come:

'<p>' . __( 'Ciao Mondo!' ) . '</p>'
'<h1>' . __( 'Ciao Mondo!' ) . '</h1>'

Riducendolo a una singola riga.

A volte l'HTML nel testo è inevitabile. Prendiamo ad esempio:

__( 'Al momento devi <b>%s</b> dollari' );

Poiché le lingue sono grammaticali, dividere il testo causerebbe problemi a chi traduce.

Regola generale. I tag HTML di formattazione all'interno della frase vanno bene. Le frasi che iniziano e finiscono con HTML sono solo uno spreco di spazio.

15 set 2013 10:43:58
Commenti

Nell'ultimo esempio, potresti avvolgere i tag bold attorno all'argomento che viene inserito "<b>$string</b>". Quindi puoi usare 'Al momento devi %s dollari'. Ma potrebbe essere necessario mantenerlo se lo usi con la funzione _n() che richiede un segnaposto %d.

Charles Clarkson Charles Clarkson
15 set 2013 14:36:15

@CharlesClarkson Ottima osservazione. Forse avrei dovuto omettere il %s per renderlo un po' più chiaro.

Twifty Twifty
15 set 2013 14:52:55