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

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


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.


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.