Qual é o ponto na sintaxe gettext?

9

Até agora eu tenho lidado com algumas traduções no Wordpress e tentei ler a documentação oficial do gettext, mas não vou entender o ponto de uma coisa simples: quais são as diferenças entre aquelas iniciações como __ (, _e (etc.) E ainda mais: quais os outros que estão lá ao lado? Agradecemos antecipadamente!

Frank

    
por Circuit Circus 07.07.2012 / 19:34

3 respostas

12

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

_e faz o mesmo que __ , mas o eco é o resultado imediatamente.

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

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

Exemplo de uso de _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 em esc_attr .
  • esc_html__ : Equivalente a __ , mas também executa o resultado em esc_html .
  • esc_attr_e : Equivalente a _e , mas também executa o resultado em esc_attr .
  • esc_html_e : Equivalente a _e , mas também executa o resultado em esc_html .
  • esc_attr_x : Equivalente a _x , mas também executa o resultado em esc_attr .
  • esc_html_x : Equivalente a _x , mas também executa o resultado em 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 de $ number informa a função _n qual versão usar. O segundo uso de $ number acontece no sprintf, para substituir o% d pelo número real na string.

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

_n_noop é especial. É usado para traduzir strings pluralizadas, mas na verdade não realiza a tradução imediatamente. Isso é útil se você quiser tornar as strings 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 a organização. Se você colocar todas as suas strings em um arquivo, por exemplo, então referenciá-las em outro lugar, isso não seria possível com apenas _n , você precisa de algo como _n_noop para fazer isso.

_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, aquele que foi passado para a chamada noop ganha.

number_format_i18n é o equivalente ao number_format do PHP, mas adiciona o manuseio de coisas como decimais e assim por diante, que são diferentes em outras localidades.

date_i18n é o equivalente à data do PHP, com todas as informações pertinentes manipulação lá também. Nomes dos meses, nomes dos dias, etc.

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

    
por Otto 07.07.2012 / 21:23
6

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

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

A diferença está em que __() retorna a string traduzida e _e() ecoa. Ambos precisam ser alimentados com uma string como um parâmetro obrigatório e geralmente, embora opcional, também um textdomain.

Analogamente, há _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.

Além disso, observe 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 $number , são strings. Todos, exceto $domain , são obrigatórios.

Maior flexibilidade com variáveis e sprintf ()

Se as suas strings contiverem 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 Ninja do WordPress I18n:

por Johannes Pille 07.07.2012 / 20:28
3

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

Das páginas do códice:

__()

É usado quando a mensagem é passada como um argumento para outra função; _e() é usado para gravar a mensagem diretamente na página. Mais detalhes sobre estas 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 'mensagem', apenas retornará 'mensagem'.

_e('message')

Procura no módulo de localização a tradução de 'message' e passa a tradução para a instrução PHP echo. Se nenhuma tradução for encontrada para 'mensagem', apenas ecoa 'mensagem'.

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

.

O framework 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 arquivo README principal 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 de o gettext ser carregado.

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 nos informar e talvez outra pessoa possa ajudar ou eu possa fazer mais pesquisas.

    
por Jeremy Jared 07.07.2012 / 20:35