HTML dentro de la cadena de traducción de idioma __ () o _e ()

21

¿Cuál es el enfoque adecuado para crear cadenas de traducción?

Por ejemplo,

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

¿Está bien agregar las cadenas y / o HTML o debería hacerse primero y luego ejecutar la traducción como:

$html = '<div><p>Top: ' . $t_margin . '</p>' . '<p>Bottom: ' . $b_margin . '</p></div>';
echo __( $html ); 
    
pregunta Jason 15.09.2013 - 05:19

2 respuestas

35

Hay un segundo argumento en la función __() . Debe establecerse en el dominio que está utilizando para su complemento o tema. En los ejemplos a continuación uso 'text_domain' . Su cadena de dominio debe ser única. No debe coincidir con ninguna otra cadena de dominio. No usar un argumento de dominio de texto por defecto es 'default' el nombre de dominio de WordPress. Vea el enlace para más detalles.

Siempre use la cadena ( 'text_domain' ). Nunca use una variable, función o constante con la cadena en ella. La mayoría de los programas de traducción (¿todos?) No lo verán sin la cadena allí.

Tu código:

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

No incluir variables en la cadena.

Una mejor manera:

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

O simplemente:

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

El marcador de posición %s le dice al traductor humano que una cadena va allí. Use %d para los números. También hay otros marcadores de posición .

(Esta frase es gramaticalmente incorrecta en inglés. Usa 'Hello %s, you owe me money.' o 'Hello %s, you own my money.' según el significado que pretendías).

Tu código:

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

No traducir HTML. Es lo mismo en cualquier idioma.

Una mejor manera:

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

O divídalo en varias líneas:

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

Si no está claro qué arriba y abajo puede utilizar _x() para explicar el contexto de estos términos.

Puede encontrar otros casos de traducción aquí: Internacionalización: probablemente lo esté haciendo mal

    
respondido por el Charles Clarkson 15.09.2013 - 06:09
4

No abordaré el problema de las variables en la cadena porque ya se ha dicho.

Quieres mantener tu cadena estática, lo que significa que el contenido no cambiará. También quieres mantener el HTML innecesario.

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

Lo anterior ocupará dos filas en su tabla para lo que esencialmente es el mismo texto. Se pueden reescribir como:

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

Reduciéndolo a una sola fila.

A veces, el HTML en el texto es inevitable. Tomemos por ejemplo:

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

Dado que los idiomas son gramaticales, dividir el texto causaría problemas a quien esté traduciendo.

Regla de oro. Las etiquetas de texto formato del texto HTML a mitad de la frase están bien. Las oraciones que comienzan y terminan con HTML solo desperdician espacio.

    
respondido por el Twifty 15.09.2013 - 09:43

Lea otras preguntas en las etiquetas