¿Cómo hacer un texto con hipervínculo traducible en WordPress?

15

He visto diferentes formas de hacer que un texto con un hipervínculo sea traducible. Sin embargo, no he podido encontrar una sola mejor práctica.

Entonces, aquí están algunas de las soluciones que encontré:

// METHOD 1
sprintf( __( 'Please read %1$sthis%2$s.', 'tacoverdo-example-domain' ), '<a target="_blank" href="' . esc_url( 'https://goo.gl' ) . '">', '</a>' );

// METHOD 2
echo '<a target="_blank" href="' . esc_url( 'https://goo.gl' ) . '">';
_e( 'Please read this.', 'tacoverdo-example-domain' );
echo '</a>';

// METHOD 3
sprintf( __( 'Please read <a href="%s">this</a>.', 'tacoverdo-example-domain' ), esc_url( 'https://goo.gl' ) );

// METHOD 4
sprintf( __( 'Please read %sthis%s.', 'tacoverdo-example-domain' ), '<a target="_blank" href="' . esc_url( 'https://goo.gl' ) . '">', '</a>' );

// METHOD 5
_e( 'Please read <a target="_blank" href="' . esc_url( 'https://goo.gl' ) . '">this</a>', 'tacoverdo-example-domain' );

Mi primer pensamiento sería que el método 1 sería el mejor. No requiere que sus traductores sepan HTML. Pero tampoco permite que los que lo hacen se metan. También es bastante SECO (no se repita) ya que no tiene que traducir toda la parte HTML una y otra vez.

Sin embargo, al publicar esta pregunta en Twitter, la gente respondió que el método 3 sería el mejor, como puede ver aquí .

Entonces, ¿cómo debo hacer un texto con hipervínculo traducible en WordPress?

Taco Verdo
fuente

Respuestas:

17

Este es un tema muy facetado. Combina problemas inherentes de contenido HTML con nuevos desafíos de traducción, como el escaneo de cadenas, el proceso de traducción en sí y su verificación.

Entonces tenemos que combinar:

  1. Texto (en forma traducible)
  2. Marcado HTML (en formato difícil de romper, pero preferiblemente flexible)
  3. Destino de URL (en forma segura y preferiblemente traducible, ¡puede ser específico del idioma!)

También debemos tener en cuenta la familiaridad y el estado de la técnica, en otras palabras, qué haría el núcleo. Ok, no ayuda que desde la verificación rápida el núcleo haga esto en la mayoría (si no todas) de estas formas.

A partir de estos factores y la discusión circundante , diría que hay tres grupos de enfoques, dependiendo de las necesidades y prioridades.

Simple: una cadena con todo

__( 'Please read <a href="https://goo.gl">this</a>', 'example-domain' );
  • fácil de seguir en código
  • permite traducir todas las partes (texto, marcado, URL) como un todo
  • URL codificada
  • propenso a pausas HTML
  • popular en el núcleo

Equilibrado: URL descompuesta

sprintf( 
    __( 'Please read <a href="%s">this</a>', 'example-domain' ), 
    esc_url( 'https://goo.gl' ) 
);
  • fácil de seguir
  • puede traducir todas las partes, pero las URL necesitan una llamada de traducción separada
  • La URL puede ser dinámica y escapada
  • propenso a pausas HTML
  • popular en el núcleo
  • anecdóticamente popular entre desarrolladores / traductores

Poco a poco - marcado marcado

sprintf( 
    __( 'Please read %1$sthis%2$s.', 'example-domain' ), 
    '<a href="' . esc_url( 'https://goo.gl' ) . '">',
    '</a>' 
);

o por concatenación

'<a href="' . esc_url( 'https://goo.gl' ) . '">' 
. __( 'Please read this.', 'example-domain' );
. '</a>';
  • menos legible
  • más resistente a las pausas HTML
  • menos popular en el núcleo
  • necesita más contexto para la traducción

Regla general (por lo que yo veo)

  1. simple para mantenerlo lo más simple posible
  2. poco a poco para evitar pausas HTML
  3. equilibrado para todos los demás casos (probablemente el más común)
Rarst
fuente
+1. Me gusta la opción "Equilibrada", tal vez se pueda mejorar agregando contexto usando en _xlugar de__
gmazzap
Pensé que los fragmentos eran ejemplos básicos en lugar de completos. Probablemente habrá variaciones en cada uno debido a la gran cantidad de escenarios y funciones de traducción.
Rarst
La opción equilibrada también tiene el problema, que los traductores pueden crear un marcado incorrecto. Para una traducción segura y segura, es mejor que excluya html. También voto por las funciones de traducción con contexto. Eso les da a los traductores la oportunidad de entender cómo sin un conocimiento sobre la posición, el contexto en el complemento, el tema.
bueltge
He escuchado los argumentos de los 'traductores necesitan contexto' antes, pero me hace preguntarme. ¿Para qué necesitan contexto en este ejemplo ? Creo que es una buena práctica proporcionar contexto cuando sea necesario, pero ¿los traductores realmente lo necesitan en este caso? ¿Necesitan saber si %ssignifica <strong>o significa <a href target="#">? ¿Influye en su traducción?
Taco Verdo
@TacoVerdo si el enlace está roto, supongo que el texto sin él podría ser ambiguo, en ese caso el contexto debería indicar para qué destino es el texto. El contexto sirve para rellenar la información hasta que esté completa y sin ambigüedades. A medida que divide el texto en piezas independientes más pequeñas, cada una de ellas necesita más contexto para adaptarse al conjunto.
Rarst
7

En estos días trabajo con muchos sitios web multilingües, y tengo que decir:

  1. Las URL de los enlaces a menudo deben ser traducibles.
  2. La salida de la función de traducción de confianza es mala. Casi nunca uso __()pero siempre esc_html__()/ esc_attr__(). Lo que significa que la cadena a traducir no puede contener HTML de ningún tipo.
  3. Al escribir en inglés, a menudo no nos damos cuenta de que, en otros idiomas, una palabra puede escribirse de diferentes maneras según el contexto. Entonces, cuando el texto contiene 1 o pocas palabras, siempre es mejor usar la *_x()variante de las funciones de traducción.
  4. incluir más de un marcador de posición para cada cadena traducible puede ser "peligroso". Si el traductor no es desarrollador, romperá fácilmente la representación de la página. En el ejemplo, %1$sthis%2$sun traductor no técnico no comprende que lo sjusto antes thises necesario para una representación adecuada, y también puede pensar que el desarrollador quería escribir thispero tenía un error tipográfico y escribió sthis.

Por todas estas razones, traducir "correctamente" el texto que contiene enlaces es difícil. La única solución viable que tiene en cuenta todo lo dicho anteriormente es:

$anchor = esc_html_x( 'Google', 'link text for google.com', 'txt-domain' );
$domain = esc_url( __( 'google.com', 'txt-domain' ) );  
$link   = sprintf( '<a href="https://%s">%s</a>', $domain, $anchor );

 /* translators: 1 is a link with text "Google" and URL google.com */
echo sprintf( esc_html__( 'Use %1$s to search.', 'example-domain' ), $link );

Lo cual es seguro y fácil de traducir por personas no técnicas, pero también detallado y un PITA para implementar, especialmente si esto tiene que hacerse para varios enlaces ...

Sin embargo, para un código lanzado en la naturaleza con miles de usuarios (reales o potenciales) que hablan muchos idiomas, esta es la forma en que lo tomaría.

Esta es realmente la forma en que tomo incluso el código de uso interno, pero ese soy yo.


Nota :

Puede parecer demasiado hacer que la palabra "Google" sea traducible por separado, y eso probablemente sea cierto para este caso específico. Pero a veces incluso asumir que las marcas están mal. Solo por nombrar un ejemplo, en Italia tenemos la marca "Algida" que se conoce con ~ 30 nombres diferentes en todo el mundo .

En tal caso, codificar la URL y / o el nombre de la marca causará problemas.

Proporcionar contexto para la traducción ayudará a los traductores a decidir si necesitan traducir el nombre de la marca o no.

gmazzap
fuente
2

Debe mantener el marcado en la cadena traducible, porque los traductores deben saber que hay un enlace. En algunos idiomas, el texto del enlace resultante puede abarcar varias palabras, incluso podría haber una coma (o un equivalente) dentro u otro marcado que deba anidarse correctamente.

También es importante construir un texto de enlace hablado, no este o aquí .

2 o 3 son las únicas opciones traducibles, pero también debe hacer que la URL sea traducible.

fuxia
fuente