HTML dentro da string de tradução do idioma __ () ou _e ()

24

Qual é a abordagem adequada para criar strings de conversão?

Por exemplo,

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

Posso adicionar as strings e / ou HTML ou isso deve ser feito primeiro e depois executar a tradução como:

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

Respostas:

41

Há um segundo argumento na __()função. Ele deve ser definido como o domínio que você está usando para o seu plugin ou tema. Nos exemplos abaixo eu uso 'text_domain'. A string do seu domínio deve ser única. Não deve corresponder a nenhuma outra sequência de domínio. Não usar um argumento de domínio de texto é 'default'o padrão para o nome de domínio do WordPress. Veja o link para mais detalhes.

Sempre use a string ( 'text_domain'). Nunca use uma variável, função ou constante com a string nela. A maioria dos programas de tradução (todos?) Não o verá sem a string lá.

Seu código:

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

Não inclua variáveis ​​na sequência.

Uma maneira melhor:

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

Ou apenas:

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

O %smarcador indica ao tradutor humano que uma string está sendo inserida lá. Use %dpara números. Existem também outros espaços reservados .

(Esta frase está em inglês gramaticalmente incorreto. Use um 'Hello %s, you owe me money.'ou 'Hello %s, you own my money.'dependendo do significado que você pretendia.)


Seu código:

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

Não traduza HTML. É o mesmo em qualquer idioma.

Uma maneira melhor:

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

Ou divida-o em várias linhas:

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

Se não estiver aparente o que é Top e Bottom, você pode usá-lo _x()para explicar o contexto desses termos.


Você pode encontrar outros casos de tradução aqui: Internacionalização: você provavelmente está fazendo errado

Charles Clarkson
fonte
Você diz que não traduz HTML. Posso salientar que não está sendo traduzido, está sendo pesquisado em uma tabela existente de seqüências pré-traduzidas. Ter HTML na string não faz diferença, desde que o tradutor não os tenha removido. De fato, em algumas situações, ele melhora o desempenho do que a pesquisa e substituição de expressões regulares.
Twifty 15/09/13
Não relacionado, mas observando: o arquivo textdomaindeve ser literal, não pode ser uma variável / constante / propriedade.
Brasofilo 15/09/2013
@brasofilo, esse conselho está escrito na resposta perto do topo, mas vale a pena repetir. Cometi esse erro em vários plugins personalizados que escrevi para os clientes.
Charles Clarkson
+1 para sprintf(). Essa é realmente a maneira de ter HTML na string traduzível.
helgatheviking
Não vejo como o uso de sprintf()ajuda seja de outra forma, além de um visual mais limpo. Se você possui uma frase com HTML, Some text with a <strong>strong</strong> word inside.como é possível traduzir a frase como um todo e não traduzir Some text with a, stronge word insideindividualmente (o que não faz sentido).
Phpheini 3/06
4

Não abordarei a questão das variáveis ​​na string, pois já foi dito.

Você deseja manter sua string estática, o que significa que o conteúdo não será alterado. Você também deseja excluir HTML desnecessário.

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

O acima irá ocupar duas linhas na sua tabela para o que é essencialmente o mesmo texto. Eles podem ser reescritos como:

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

Reduzindo-o para uma única linha.

Às vezes, o HTML no texto é inevitável. Considere por exemplo:

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

Como os idiomas são gramaticais, a divisão do texto causaria problemas para quem traduzisse.

Regra básica. As tags de formatação de texto HTML no meio da frase estão OK. As frases que começam e terminam com HTML apenas desperdiçam espaço.

Twifty
fonte
No último exemplo, você pode colocar as marcas em negrito no argumento inserido "<b>$string</b>". Então você pode usar 'You currently owe %s dollars'. Mas pode precisar permanecer se você o usar com a _n()função que requer um %despaço reservado.
Charles Clarkson
@CharlesClarkson Good call. Talvez eu devesse ter deixado de fora %spara torná-lo um pouco mais claro.
Twifty 15/09/13