HTML dentro de __ () ou _e () cadeia de tradução de idioma

21

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

Por exemplo,

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

Não há problema em adicionar as strings e / ou HTML ou isso deve ser feito primeiro e, em seguida, executar a tradução como:

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

2 respostas

35

Há um segundo argumento na função __() . Deve ser definido para o domínio que você está usando para o seu plugin ou tema. Nos exemplos abaixo eu uso 'text_domain' . Sua string de domínio deve ser exclusiva. Não deve corresponder a nenhuma outra cadeia de domínio. O não uso de um argumento de domínio de texto é padronizado como 'default' do 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 não o verá sem a string.

Seu código:

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

Não inclua variáveis na string.

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 espaço reservado %s informa ao tradutor humano que uma cadeia está sendo inserida. Use %d para números. Há também outros marcadores .

(Esta frase é gramaticalmente incorreta em inglês. Use '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 for aparente o que Top e Bottom você pode usar o _x() para explicar o contexto desses termos.

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

    
por Charles Clarkson 15.09.2013 / 06:09
fonte
4

Eu não vou abordar o problema das variáveis na string desde que já foi dito.

Você deseja manter sua string estática, o que significa que o conteúdo não será alterado. Você também quer evitar 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 para uma única linha.

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

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

Como os idiomas são gramaticais, dividir o texto causaria problemas para quem está traduzindo.

Regra de ouro. As tags de formatação de texto em HTML estão bem. Frases começando e terminando com HTML apenas desperdiçam espaço.

    
por Twifty 15.09.2013 / 09:43
fonte