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

24

¿Cuál es el enfoque adecuado para construir 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 debe hacerse primero y luego ejecutarse a través de la traducción como:

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

Respuestas:

41

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 utilizo '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 predeterminado es 'default'el nombre de dominio de WordPress. Vea el vínculo para mas detalles.

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

Tu codigo:

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

No incluya variables en la cadena.

Una mejor manera:

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

O solo:

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

El %smarcador de posición le dice al traductor humano que hay una cadena allí. Usar %dpara números. También hay otros marcadores de posición .

(Esta oración es un inglés gramaticalmente incorrecto. Úselo 'Hello %s, you owe me money.'o 'Hello %s, you own my money.'dependiendo del significado que estaba intentando)


Tu codigo:

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

No traduzcas 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 es evidente qué son Arriba y Abajo , puede usar el _x()para explicar el contexto de estos términos.


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

Charles Clarkson
fuente
Dices que no traduzcas HTML. Debo señalar que no se está traduciendo, se está buscando en una tabla existente de cadenas traducidas previamente. Tener HTML en la cadena no hace ninguna diferencia siempre que el traductor no los elimine. De hecho, en algunas situaciones es un mejor rendimiento que la búsqueda y reemplazo de expresiones regulares.
Twifty
Sin relación, pero teniendo en cuenta: textdomaintiene que ser una cadena literal, no puede ser una variable / constante / propiedad.
brasofilo
@brasofilo, ese consejo está escrito en la respuesta cerca de la parte superior, pero vale la pena repetirlo. Cometí este error en varios complementos personalizados que escribí para clientes.
Charles Clarkson
+1 para sprintf(). Esa es realmente la forma de tener HTML en la cadena traducible.
helgatheviking
No veo cómo el uso de sprintf()ayuda de otra manera que no sea un aspecto más limpio. Si tiene una oración con HTML adentro, como Some text with a <strong>strong</strong> word inside.cómo es posible traducir la oración como un todo y no traducir Some text with a, stronge word insideindividualmente (lo cual no tiene sentido).
phpheini
4

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

Desea mantener su cadena estática, lo que significa que el contenido no cambiará. También desea evitar HTML innecesario.

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

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

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

Reduciéndolo a una sola fila.

Algunas veces el HTML en el texto es inevitable. Tomar como ejemplo:

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

Como los idiomas son gramaticales, dividir el texto puede causar problemas a quien traduce.

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

Twifty
fuente
En el último ejemplo, podría ajustar las etiquetas en negrita alrededor del argumento que se inserta "<b>$string</b>". Entonces puedes usar 'You currently owe %s dollars'. Pero es posible que deba quedarse si lo usa con la _n()función que requiere un %dmarcador de posición.
Charles Clarkson
@CharlesClarkson Buena llamada. Quizás debería haber dejado de lado %spara hacerlo un poco más claro.
Twifty