Qual é o sentido da sintaxe gettext?

9

Até agora, tenho lidado com algumas traduções no Wordpress e tentei ler a documentação oficial do gettext, mas não entendi o que é uma coisa simples: quais são as diferenças entre os inícios como __ (, _e (, etc.? E até mais: quais outros existem ao lado? Agradecemos antecipadamente!

Frank

Circuit Circus
fonte
Obrigado a todos por suas respostas elaboradas! Eu realmente aprecio isso aqui!
Circuit Circus
... Talvez mais uma pergunta seja feita: a entrada do domínio de texto pode ser deixada de fora? I na vertical começou a trazê-lo para cada corda eu queria traduzir, mas depois reconheceu alguns exemplos no Codex Wordpress que não contê-lo em tudo ...
Circuito Circus
... Ok, agora eu deparei com ele nesta página codex - sorry para esta pergunta redundante :-)
Circuito Circus

Respostas:

13

__(sublinhado duplo) é a função de conversão base. Ele traduz uma string e a retorna como uma string.

_efaz o mesmo que __, mas eco é o resultado imediatamente.

_xé a função de conversão contextual. Tem uma segunda opção para fornecer contexto às pessoas que fazem a tradução.

_exé o mesmo que _x, mas eco é o resultado.

Exemplo de uso _x:

$string = _x( 'Buffalo', 'an animal', 'plugin-domain' );
$string = _x( 'Buffalo', 'a city in New York', 'plugin-domain' );
$string = _x( 'Buffalo', 'a verb meaning to confuse somebody', 'plugin-domain' );

Às vezes, a mesma string pode ser diferente em outros idiomas. Fornecer contexto aos tradutores pode ajudá-los a escolher as palavras certas.

Funções de atalho:

  • esc_attr__: Equivalente a, __mas também executa o resultado esc_attr.
  • esc_html__: Equivalente a, __mas também executa o resultado esc_html.
  • esc_attr_e: Equivalente a, _emas também executa o resultado esc_attr.
  • esc_html_e: Equivalente a, _emas também executa o resultado esc_html.
  • esc_attr_x: Equivalente a, _xmas também executa o resultado esc_attr.
  • esc_html_x: Equivalente a, _xmas também executa o resultado esc_html.

_né o manipulador de pluralização. Exemplo:

$string = sprintf( _n(
        'You have %d taco.', 
        'You have %d tacos.', 
        $number, 
        'plugin-domain'), 
    $number );

Nesse exemplo, há duas maneiras de dizer o número de tacos, dependendo se é singular ou não. O primeiro uso do número $ informa à _nfunção qual versão usar. O segundo uso do número $ acontece no sprintf, para substituir o% d pelo número real na sequência.

Não existe uma função de eco equivalente a _n, mas existe uma função denominada _nx. É uma combinação de _ne _x. Pluralização e contexto.

_n_noopé especial. É usado para traduzir seqüências de caracteres pluralizadas, mas na verdade não realiza a tradução imediatamente. Isso é útil se você deseja tornar as seqüências centralizadas, mas na verdade faz o trabalho em outro lugar. A função que realmente faz o trabalho em outro lugar é translate_nooped_plural.

Exemplo:

$holder = _n_noop('You have %d taco.', 'You have %d tacos.', 'plugin-domain');
// ... later ...
$string = sprintf( translate_nooped_plural( $holder, $count ), $count );

Isso não é muito usado, mas pode ser útil para organização. Se você colocar todas as suas seqüências de caracteres em um arquivo, por exemplo, referenciá-las em outro lugar, isso não seria possível com apenas _n, você precisará de algo como _n_noopisso.

_nx_noopé o mesmo que _n_noop, mas também pode ter um contexto para os tradutores, o mesmo que _x.

Observe que você pode colocar o domínio na chamada de função noop ou na chamada de função translate_nooped_plural. O que fizer mais sentido para sua organização. Se ambos tiverem um domínio, o que foi passado para a chamada noop vence.

number_format_i18né o equivalente a do PHP embutido number_format , mas acrescenta no manuseio para coisas como decimais e assim por diante, que são diferentes em outros locais.

date_i18né o equivalente a do PHP built-in data , com toda a pertinência manipulação lá também. Nomes de meses, nomes de dias etc.

Além disso, nunca viole as leis . Apenas um lembrete. :)

Otto
fonte
Uau, esta é realmente uma boa explicação disso! Muito obrigado por ajudar! Agora eu vejo claro.
Circuit Circus
6

__ (), _e () e _x (), _ex ()

__()e _e()são essencialmente um invólucro de translate()(não use diretamente) e quase o mesmo.

A diferença está em que __()retorna a string traduzida e a _e()repete. Ambos precisam ser alimentados com uma string como um parâmetro necessário e, geralmente, embora opcional, também como um domínio de texto.

Analogamente, existe _x()e _ex(), que permite especificar um contexto que pode descrever onde a string aparece. Se o seu projeto incluir mais do que algumas dezenas de strings traduzíveis, o uso do contexto faz muito sentido.

Observe também a existência de _n()e _nx()para plurais.

Exemplo de uso comum

$output = '<label for="some_field">' .
        _x( 'Some Information.', 'Some Form Field', 'your-text-domain' ) .
    '</label>' .
    '<input type="text" name="some_field" value="" />' .
    '<p class="description">' .
        _x( 'Here you can enter some info.', 'Some Form Field', 'your-text-domain' ) .
    '</p>';

return $output;

Parâmetros

__( $text, $domain )
_e( $text, $domain )
_x( $text, $context, $domain )
_ex( $text, $context, $domain )
_n( $single, $plural, $number $domain )
_nx( $single, $plural, $number, $context, $domain )

Todos os parâmetros, mas $numbersão cadeias de caracteres. Todos, exceto $domainsão obrigatórios.

Maior flexibilidade com variáveis ​​e sprintf ()

Se suas seqüências conterem números ou palavras variáveis, use sprintf():

$stars = get_post_meta( $post->ID, 'rating', true );
$title = get_the_title( $post->ID );

$output = '<p>' .
        sprintf(
            _x(
                'The movie titled %2$s received a %1$d star rating.',
                'Movie Description',
                'your-text-domain'
            ),
            $stars,
            $title
        ) .
    '</p>';

return $output;

Recursos adicionais

Alguns recursos adicionais para o próximo WordPress I18n Ninja:

Johannes Pille
fonte
Verifique também "Localização" em "Diversos" no códice para obter uma análise completa das funções e explicações detalhadas.
TheDeadMedic 07/07/2012
e este é o lugar onde os wp-poliglotas se encontram .
71112 brasofilo
@Johnnes Pille: Eu não notei sua resposta até publicar a minha, devo excluir minha postagem?
Jeremy Jared
@JeremyJared Não, por quê? Mais informações não podem ser uma coisa ruim, podem ?! Eu acho que sua resposta é bem pensada. +1 de mim.
Johannes Pille
@TheDeadMedic Editado em "recursos adicionais".
Johannes Pille
3

Não sou especialista em traduções, mas a Página de Codex do WordPress tem uma boa documentação e explica o motivo de usar cada instância.

Nas páginas do codex:

__()

É usado quando a mensagem é passada como argumento para outra função; _e()é usado para escrever a mensagem diretamente na página. Mais detalhes sobre essas duas funções:

__('message')

Procura no módulo de localização a tradução de 'message' e passa a tradução para a instrução de retorno do PHP. Se nenhuma tradução for encontrada para 'message', ela retornará 'message'.

_e('message')

Procura no módulo de localização a tradução de 'message' e passa a tradução para a instrução de eco do PHP. Se nenhuma tradução for encontrada para 'message', apenas ecoará 'message'.

Observe que se você estiver internacionalizando um tema ou plug-in, use a "Text Domain" .

A estrutura do gettext cuida da maior parte do WordPress. No entanto, existem alguns lugares na distribuição do WordPress em que o gettext não pode ser usado:

  • O principal arquivo LEIA-ME do WordPress - é um arquivo HTML estático, não um arquivo PHP, portanto, não pode ser executado através das funções gettext.
  • Algumas mensagens de erro são geradas muito cedo no ciclo de carregamento do WordPress, antes do carregamento do gettext.

Link para a página do Codex

Informações adicionais sobre quando o gettext não funciona

Espero que isso responda à sua pergunta, se não, deixe-nos saber e talvez alguém possa ajudar ou eu possa fazer mais algumas pesquisas.

Jeremy Jared
fonte