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

15

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

Então, aqui estã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' ) . '">';
_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' );

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 mexam com isso. Também é bastante SECO (não se repita), pois você não precisa traduzir toda a parte HTML repetidas vezes.

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

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

Taco Verdo
fonte

Respostas:

17

Este é um problema muito facetado. Ele combina questões inerentes ao conteúdo HTML com uma carga totalmente nova de desafios 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. Destino do URL (na forma segura e de preferência traduzível, pode ser específico para o idioma!)

Também precisamos considerar a familiaridade e a arte anterior, em outras palavras - o que o núcleo faria. Ok, não ajuda que, a partir da verificação rápida, o núcleo faça isso na maioria (se não em todas) dessas maneiras.

A partir desses fatores e da discussão envolvente, eu diria que existem três grupos 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 em código
  • permite traduzir todas as partes (texto, marcação, URL) como um todo
  • URL codificado
  • propenso a quebras de HTML
  • popular no núcleo

Balanceado - 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 os URLs precisam de uma chamada de tradução separada
  • URL pode ser dinâmico e ter escapado
  • propenso a quebras de HTML
  • popular no núcleo
  • anedoticamente popular entre desenvolvedores / tradutores

Pouco a pouco - 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 núcleo
  • precisa de mais contexto fornecido para tradução

Regra de um polegar (tanto quanto eu vejo)

  1. simples mantê-lo o mais simples possível
  2. fragmentada para impedir quebras de HTML
  3. equilibrado para todos os outros casos (provavelmente o mais comum)
Rarst
fonte
+1. I como a opção "equilibrada", talvez pode ser melhorada adicionando contexto usando _xem vez de__
gmazzap
Eu pretendia trechos como exemplos básicos, e não abrangentes. Provavelmente haverá variações em cada uma devido ao grande número de cenários e funções de tradução.
Rarst
A opção equilibrada também tem o problema: os tradutores podem criar marcações erradas. Para uma tradução segura e segura, é melhor você excluir o html. Também voto nas funções de tradução com contexto. Isso dá aos tradutores a chance de entender como, sem um conhecimento sobre posição, contexto no plugin, tema.
bueltge
Já ouvi o argumento 'tradutores precisam de contexto' antes, mas isso me faz pensar. Para que eles precisam de contexto neste exemplo ? Eu acho que é uma boa prática fornecer contexto quando necessário, mas os tradutores realmente precisam disso neste caso? Eles precisam saber se %srepresenta <strong>ou <a href target="#">? Isso influencia a tradução deles?
Taco Verdo 15/10
@TacoVerdo se o link estiver quebrado, eu assumiria que o texto sem ele pode ser muito ambíguo; nesse caso, o contexto deve informar para que destino o texto é. O contexto serve para preencher as informações até que sejam completas e inequívocas. À medida que você divide o texto em partes menores e independentes, cada um deles precisa de mais contexto para o local onde se encaixa no todo.
Rarst
7

Atualmente, trabalho com muitos sites multilíngues e devo dizer:

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

Por todas essas razões, é difícil traduzir corretamente o texto que contém os links. A única solução viável que leva em conta tudo o que foi dito acima é:

$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 detalhado e um PITA para implementar, especialmente se isso tiver que ser feito para vários links ...

No entanto, para um código liberado na natureza com milhares de usuários (reais ou potenciais) falando muitos idiomas, é assim que eu adotaria.

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


Nota :

Pode parecer exagero tornar a palavra "Google" traduzível separadamente, e provavelmente isso é verdade para este caso específico. Mas às vezes até assume que os nomes das marcas estão errados. Só para citar um exemplo, na Itália temos a marca "Algida", que é conhecida com ~ 30 nomes diferentes ao redor do mundo .

Nesse caso, a codificação incorreta do URL e / ou do nome da marca causará problemas.

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

gmazzap
fonte
2

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

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

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

fuxia
fonte