Como imprimir texto suportado por tradução com URL HTML

4

Sou um pouco novo no WordPress se for sobre personalização "mais profunda".

Agora estou com esta função:

esc_html_e( 'Dear Guest, with Your information we not find any room at the moment. Please contact us per email info@whitesandsamuiresort.com.', 'awebooking' );

E o texto está aparecendo até agora.

Mas o que função eu preciso usar quando gosto de adicionar um a href (link HTML)?

Então, eu gosto de ter este texto:

  

Prezado hóspede, com suas informações não encontramos espaço no momento.

     

Entre em contato conosco em <a href="http://www.whitesandsamuiresort.com/contact-us/">contact page</a> ou por e-mail info@whitesandsamuiresort.com .

Estou com problemas para suportar tradução (internacionalização / localização) e escape de links HTML ao mesmo tempo.

    
por Simon Vetterli 18.03.2017 / 05:28

3 respostas

3

Como esc_html_e irá escapar do link HTML (daí mostrará a âncora HTML como texto simples), você precisará segmentar o texto e escapar da parte não HTML com esc_html_e ou esc_html__ e imprima a parte HTML LINK sem escape de HTML.

Método 1 (apenas para sua compreensão):

Você pode fazer isso em partes, assim:

esc_html_e( 'Dear Guest, with Your information we could not find any room at the moment.', 'text-domain' );
echo "<br><br>";

printf(
    esc_html__( '%1$s %2$s', 'text-domain' ),
    esc_html__( 'Please contact us on our', 'text-domain' ),
    sprintf(
        '<a href="%s">%s</a>',
        esc_url( 'http://www.example.com/contact-us/' ),
        esc_html__( 'Contact Page', 'text-domain' )
    )
);

printf(
    ' or <a href="%s">%s</a>',
    esc_url( 'mailto:info@example.com', array( 'mailto' ) ),
    esc_html__( 'Email', 'text-domain' )
);

Método 2 (apenas para sua compreensão):

Obviamente, diferentes idiomas terão diferentes ordenações de textos, então, para dar mais flexibilidade aos tradutores (com escape e ordenação de texto), você pode fazer isso da seguinte maneira:

printf(
    esc_html__( '%1$s%2$s%3$s%4$s%5$s', 'text-domain' ),
    esc_html__( 'Dear Guest, with Your information we could not find any room at the moment.', 'text-domain' ),
    nl2br( esc_html__( "\n\n", 'text-domain' ) ),
    sprintf(
        esc_html__( '%1$s %2$s', 'text-domain' ),
        esc_html__( 'Please contact us on our', 'text-domain' ),
        sprintf(
            '<a href="%s">%s</a>',
            esc_url( 'http://www.example.com/contact-us/' ),
            esc_html__( 'Contact Page', 'text-domain' )
        )
    ),
    esc_html__( ' or ', 'text-domain' ),
    sprintf(
        '<a href="%s">%s</a>',
        esc_url( 'mailto:info@example.com', array( 'mailto' ) ),
        esc_html__( 'Email', 'text-domain' )
    )
);

Essa maneira de fazer isso:

  1. Escape todos os textos traduzidos necessários.

  2. Permitir o HTML para link, email (com mailto: syntax) etc.

  3. Permite que os tradutores tenham todos os tipos de diferentes ordenações de textos para diferentes idiomas. A troca de argumentos ( %1$s , %2$s etc.) é usada para que os tradutores podem reordenar o texto traduzido onde for necessário.

Método 3 (Atualizado e Recomendado):

Como @shea apontou corretamente , o Método 2 acima funciona bem, mas pode ser difícil para os tradutores adicionar suporte a diferentes idiomas. Então, precisamos de uma solução que:

  1. Mantém as sentenças intactas (não quebra frases).

  2. Faz o escape adequado.

  3. Fornece maneiras de ter pedidos diferentes para contato & links de e-mail (ou qualquer coisa semelhante) dentro da sentença traduzida.

Para evitar a complicação do método-2 , a solução abaixo mantém as sentenças traduzíveis intactas e faz com que o URL correto escape & troca de argumentos ao mesmo tempo (mais notas dentro dos comentários do CODE):

// sample contact url (may be from an unsafe place like user input)
$contact_url = 'http://www.example.com/contact-us/';
// escaping $contact_url
$contact_url = esc_url( $contact_url );

// sample contact email (may be from an unsafe place like user input)
$contact_email = 'info@example.com';
// escaping, sanitizing & hiding $contact_email.
// Yes, you may still need to sanitize & escape email while using antispambot() function
$contact_email = esc_url( sprintf( 'mailto:%s', antispambot( sanitize_email( $contact_email ) ) ), array( 'mailto' ) );

esc_html_e( 'Dear Guest, with Your information we could not find any room at the moment.', 'text-domain' );
echo "<br><br>";

printf(
    esc_html__( 'Please contact us on our %1$s or per %2$s.', 'text-domain' ),
    sprintf(
        '<a href="%s">%s</a>',
        $contact_url,
        esc_html__( 'Contact Page', 'text-domain' )
        ),
    sprintf(
        '<a href="%s">%s</a>',
        $contact_email,
        esc_html__( 'Email', 'text-domain' )
        )
    );

Esta maneira de fazer isso dará aos tradutores duas sentenças completas & duas palavras separadas para traduzir. Assim, os tradutores só precisarão se preocupar com as seguintes linhas simples (enquanto o CODE cuida do resto):

esc_html_e( 'Dear Guest, with Your information we could not find any room at the moment.', 'text-domain' );
// ...
esc_html__( 'Please contact us on our %1$s or per %2$s', 'text-domain' )
// ...
esc_html__( 'Contact Page', 'text-domain' )
// ...
esc_html__( 'Email', 'text-domain' )

É isso aí, estrutura simples e faz o escape adequado e troca de argumentos também.

Leia mais sobre internacionalização de temas & internacionalização para plugins .

    
por Fayaz 18.03.2017 / 11:53
1

Eu acho que a resposta do @Fayaz é muito boa; eles estão definitivamente no caminho certo em que você deve usar sprintf () em torno de traduções para incluir coisas como HTML e links.

No entanto, não creio que seja uma boa ideia dividir as sentenças em partes para tradução, já que muitas línguas têm estruturas de sentenças diferentes que não são compatíveis com o inglês. Ao dividir palavras individuais, muito do contexto em que uma palavra específica é traduzida é muito, potencialmente levando a erros de ambigüidade e de tradução.

Em vez disso, recomendo traduzir frases e sentenças como um todo e, em seguida, usar sprintf ou funções de encapsulamento diferentes, quando apropriado.

Para o seu texto, a primeira parte pode simplesmente ser traduzida por si só com esc_html_e :

esc_html_e( 'Dear Guest, with your information we not find any room at the moment. ', 'text-domain' );

A segunda parte é um pouco mais difícil. Agora, suponho que você esteja recuperando o URL da página e o e-mail do banco de dados de alguma forma, provavelmente usando get_the_permalink() ou get_option() ou alguma outra função. Então, vou assumir que eles estão armazenados nas variáveis $contact_page_url e $contact_email .

O primeiro passo é traduzir a string, sem os links. Note que precisamos usar __() sem escapar neste ponto - que virá depois.

__( 'Please contact us on our <a href="%1$s">contact page</a> or by email %2$s.', text-domain' );

Desta forma, o tradutor está livre para escrever a frase conforme necessário e colocar o URL do link e o email onde eles precisam.

A próxima etapa é usar sprintf() para inserir o URL do link e o e-mail. Observe que usamos esc_url() para escapar do URL e também o antispambot() para codificar o endereço de e-mail para fornecer uma proteção mínima contra os raspadores:

$text = sprintf(
    __( 'Please contact us on our <a href="%1$s">contact page</a> or by email %2$s.', 'text-domain' );
    esc_url( $contact_page_url ),
    sprintf( '<a href="mailto:%1$s">%1$s</a>', antispambot( $contact_email ) );
);

Por fim, em vez de usar esc_html() , precisamos usar wp_kses() para permitir somente elementos de link no HTML traduzido:

echo wp_kses( $text, array( 'a' => array( 'href'  => array() ) ) );

E é isso! O código final é:

esc_html_e( 'Dear Guest, with your information we not find any room at the moment. ', 'text-domain' )

$text = sprintf(
    __( 'Please contact us on our <a href="%1$s">contact page</a> or by email %2$s.', 'text-domain' );
    esc_url( $contact_page_url ),
    sprintf( '<a href="mailto:%1$s">%1$s</a>', antispambot( $contact_email ) );
);

echo wp_kses( $text, array( 'a' => array( 'href'  => array() ) ) );
    
por shea 26.03.2017 / 06:14
-2

Se você estiver usando esc_html_e, esta função simplesmente diz que ele escapa das tags HTML. Então você não pode usar tags HTML dentro deste esc_html_e.

    
por Aftab 18.03.2017 / 06:28