Como fazer um texto com hiperlink traduzível no WordPress?

9

Eu já vi diferentes maneiras de fazer um texto com um hiperlink traduzível. No entanto, não consegui encontrar uma única prática recomendada.

Então, algumas das soluções que encontrei:

// 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' ) . '">';
__( '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
__( 'Please read <a target="_blank" href="' . esc_url( 'https://goo.gl' ) . '">this</a>', 'tacoverdo-example-domain' );

Meu primeiro pensamento seria que o método 1 seria o melhor. Não requer que seus tradutores conheçam HTML. Mas também não permite que os que fazem para mexer com isso. Também é bastante DRY (Don't Repeat Yourself), já que você não precisa traduzir toda a parte HTML repetidamente.

No entanto, ao publicar essa pergunta no Twitter, as pessoas responderam que o método 3 seria melhor, como você pode ver aqui .

Então, como devo fazer um texto com hiperlink traduzível no WordPress?

    
por Taco Verdo 14.10.2014 / 17:25

3 respostas

10

Esta é uma questão muito facetada. Ele combina problemas de conteúdo HTML inerentes com novos desafios de carga de tradução, como a verificação de strings, o próprio processo de tradução e sua verificação.

Então temos que combinar:

  1. Texto (em formato traduzível)
  2. Marcação HTML (em formato difícil de quebrar, mas de preferência flexível)
  3. O destino do URL (de forma segura e preferencialmente traduzível, pode ser específico para o idioma!)

Também precisamos considerar a familiaridade e o estado da técnica, em outras palavras - o que o núcleo faria. Ok, não ajuda que, a partir de uma verificação rápida, o núcleo faça isso na maioria (se não em todos) destas formas.

A partir desses fatores e da discussão ao redor , eu diria que existem três tipos de abordagens, dependendo das necessidades e prioridades.

Simples - uma string com tudo

__( 'Please read <a href="https://goo.gl">this</a>', 'example-domain' );
  • fácil de seguir no código
  • permite traduzir todas as partes (texto, marcação, URL) como um todo
  • URL codificado
  • propenso a quebras de HTML
  • popular no core

Equilibrado - URL dividido

sprintf( 
    __( 'Please read <a href="%s">this</a>', 'example-domain' ), 
    esc_url( 'https://goo.gl' ) 
);
  • fácil de seguir
  • pode traduzir todas as partes, mas o (s) URL (s) precisa de uma chamada de tradução separada
  • o URL pode ser dinâmico e escapou
  • propenso a quebras de HTML
  • popular no core
  • anedoticamente popular entre desenvolvedores / tradutores

Por partes - marcação dividida

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

ou via concatenação

'<a href="' . esc_url( 'https://goo.gl' ) . '">' 
. __( 'Please read this.', 'example-domain' );
. '</a>';
  • menos legível
  • mais resiliente a quebras de HTML
  • menos popular no core
  • precisa de mais contexto para tradução

Regra de polegar (até onde eu vejo)

  1. simples para mantê-lo o mais simples possível
  2. fragmentado para evitar quebras de HTML
  3. equilibrado para todos os outros casos (provavelmente mais comuns)
por Rarst 14.10.2014 / 22:55
5

Hoje em dia eu trabalho com muitos sites multilíngues, e tenho que dizer:

  1. URLs de links geralmente precisam ser traduzíveis.
  2. A saída da função de tradução confiável é ruim. Eu praticamente nunca uso __() , mas sempre esc_html__() / esc_attr__() . O que significa que a string a ser traduzida não pode conter HTML de qualquer tipo.
  3. Escrevendo em inglês, muitas vezes não percebemos que em outras línguas uma palavra pode ser escrita de maneiras diferentes, dependendo do contexto. Portanto, quando o texto contiver 1 ou poucas palavras, é sempre melhor usar a variante *_x() das funções de tradução.
  4. para incluir mais de um espaço reservado para cada string traduzível pode ser "perigoso". Se o tradutor não for um desenvolvedor, ele interromperá facilmente a renderização da página. No exemplo %1$sthis%2$s um tradutor não técnico não entende que s antes de this é necessário para a renderização adequada, e pode também pensar que o desenvolvedor queria digitar this , mas tinha um erro de digitação e escreveu sthis .

Por todas essas razões, a tradução "correta" de textos que contém links é difícil. A única solução viável que leva tudo em conta é:

$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 );

O que é seguro e fácil de ser traduzido por pessoas não-técnicas, mas também verboso e um PITA para implementar, especialmente se isso tiver que ser feito por vários links ...

No entanto, para um código lançado na natureza com milhares de usuários (reais ou potenciais) falando muitas línguas, esta é a maneira que eu usaria.

Esta é realmente a maneira que eu tomo mesmo para código de uso interno, mas sou eu.

Observação :

Pode parecer muito para tornar a palavra "Google" traduzível separadamente, e isso é provavelmente verdade para este caso específico. Mas às vezes até mesmo assumir que nomes de marca estão errados. Só para citar um exemplo, na Itália temos a marca "Algida" que é conhecida com ~ 30 nomes diferentes em todo o mundo .

Nesse caso, codificar o URL e / ou o nome da marca, causará problemas.

Fornecer contexto para a tradução ajudará os tradutores a decidirem se precisam traduzir o nome da marca ou não.

    
por gmazzap 13.12.2016 / 20:39
2

Você precisa manter a marcação na string traduzível, porque os tradutores precisam saber se existe um link. Em alguns idiomas, o texto do link resultante pode abranger várias palavras, pode até haver uma vírgula (ou um equivalente) dentro ou outra marcação que precisa ser aninhada corretamente.

Também é importante criar um texto de link de fala, não este ou aqui .

2 ou 3 são as únicas opções traduzíveis, mas você deve tornar o URL traduzível também.

    
por fuxia 14.10.2014 / 17:40