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


24

Qual è l'approccio corretto per la creazione di 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>' )

Va bene aggiungere le stringhe e / o HTML o dovrebbe essere fatto prima e poi eseguire la traduzione come:

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

Risposte:


41

C'è un secondo argomento nella __()funzione. Dovrebbe essere impostato sul dominio che stai utilizzando per il tuo plugin o tema. Negli esempi seguenti uso 'text_domain'. La tua stringa di dominio dovrebbe essere unica. Non deve corrispondere a nessuna altra stringa di dominio. Non utilizzare un argomento del dominio di testo per impostazione predefinita è 'default'il nome di dominio di WordPress. Vedi il link per ulteriori dettagli.

Usa sempre la stringa ( 'text_domain'). Non usare mai una variabile, una funzione o una costante con la stringa al suo interno. La maggior parte (tutti?) I programmi di traduzione non lo vedranno senza la stringa lì.

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 %ssegnaposto dice al traduttore umano che sta entrando una stringa. Utilizzare %dper i numeri. Ci sono anche altri segnaposto .

(Questa frase è un inglese grammaticalmente errato. Usa uno 'Hello %s, you owe me money.'o 'Hello %s, you own my money.'secondo il significato che stavi cercando.)


Il tuo codice:

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

Non tradurre 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 );

O 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 quale sia la parte superiore e inferiore, è possibile utilizzare il _x()per spiegare il contesto di questi termini.


Puoi trovare altri casi di traduzione qui: Internazionalizzazione: probabilmente stai sbagliando


Dici di non tradurre HTML. Potrei sottolineare che non viene tradotto, viene cercato in una tabella esistente di stringhe pre tradotte. La presenza di HTML nella stringa non fa alcuna differenza a condizione che il traduttore non li abbia rimossi. In effetti, in alcune situazioni offre prestazioni migliori rispetto alla ricerca e alla sostituzione di regex.
Twifty,

Non correlato, ma notando: textdomaindeve essere una stringa letterale, non può essere una variabile / costante / proprietà.
brasofilo,

@brasofilo, quel consiglio è scritto nella risposta vicino all'inizio, ma porta ripetizione. Ho fatto questo errore in diversi plugin personalizzati che ho scritto per i clienti.
Charles Clarkson,

+1 per sprintf(). Questo è davvero il modo di aggirare HTML nella stringa traducibile.
Helgatheviking,

Non vedo come l'uso di sprintf()aiuti in alcun modo diverso da forse un aspetto più pulito. Se si dispone di una frase con al suo interno HTML come Some text with a <strong>strong</strong> word inside.come è possibile tradurre la frase nel suo complesso e non tradurre Some text with a, stronge word insidesingolarmente (che non ha senso).
phpheini,

4

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

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

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

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

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

Riducendolo a una singola riga.

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

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

Poiché le lingue sono grammaticali, la suddivisione del testo causerebbe problemi a chiunque stia traducendo.

Regola del pollice. I tag di formattazione del testo HTML a metà frase sono OK. Le frasi che iniziano e finiscono con HTML sprecano solo spazio.


Nell'ultimo esempio, è possibile avvolgere i tag in grassetto attorno all'argomento inserito "<b>$string</b>". Quindi puoi usare 'You currently owe %s dollars'. Ma potrebbe essere necessario rimanere se lo si utilizza con la _n()funzione che richiede un %dsegnaposto.
Charles Clarkson,

@CharlesClarkson Buona chiamata. Forse avrei dovuto tralasciare %sdi renderlo un po 'più chiaro.
Twifty,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.