web-dev-qa-db-ja.com

HTML URLを使って翻訳対応テキストを印刷する方法

それが「より深い」カスタマイズについてであれば、私はWordPressでやや新しいです。

今私はこの機能を持っています:

esc_html_e( 'Dear Guest, with Your information we not find any room at the moment. Please contact us per email [email protected].', 'awebooking' );

そしてテキストはこれまでのところ示しています。

しかし、ahref(HTML link)を追加したい場合、どのような function を使用する必要がありますか

だから私はこのテキストを持っているのが好きです:

親愛なるゲスト、あなたの情報では、現時点では部屋が見つかりません。

<a href="http://www.whitesandsamuiresort.com/contact-us/">contact page</a>またはEメール[email protected]でお問い合わせください。

翻訳(国際化/ローカライズ)のサポートとHTMLリンクのエスケープが同時にうまくいかない。

5
Simon Vetterli

esc_html_e はHTMLリンクをエスケープするので(したがってHTMLアンカーをプレーンテキストとして表示します)、テキストをセグメント化し、非HTML部分をesc_html_eまたは esc_html__ でエスケープする必要があります。 HTMLエスケープせずにHTML LINK部分を印刷します。

方法1(あなたの理解のためだけに):

このように、部分的に行うことができます。

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:[email protected]', array( 'mailto' ) ),
    esc_html__( 'Email', 'text-domain' )
);

方法2(あなたの理解のためだけに):

明らかに、言語が異なるとテキストの順序も異なるため、翻訳者の柔軟性を高めるため(テキストのエスケープと順序付け)、代わりに次のようにしてください。

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:[email protected]', array( 'mailto' ) ),
        esc_html__( 'Email', 'text-domain' )
    )
);

このやり方は、

  1. 必要な翻訳テキストをすべてエスケープします。

  2. リンク、電子メール(mailto:構文付き)などにHTMLを許可する.

  3. 翻訳者が異なる言語のためにあらゆる種類の異なるテキストの順序を持​​つことを許可します。翻訳者が必要に応じて翻訳されたテキストを並べ替えることができるように、 引数交換表記%1$s%2$sなど)が使用されます。


方法3(更新および推奨):

@sheaは正しく指摘しました Method-2 は問題なく動作しますが、翻訳者が異なる言語のサポートを追加するのは難しいかもしれません。だから私たちは解決策が必要です:

  1. 文をそのままに保ちます(文を壊すことはありません)。

  2. 適切にエスケープします。

  3. 翻訳された文の中で連絡先とEメールのリンク(または類似のもの)の順序を変える方法を提供します。

そのため、 method-2 の複雑さを避けるために、以下の解決策は翻訳可能な文をそのままに保ち、同時に適切なURLのエスケープと引数の交換を行います(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 = '[email protected]';
// 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' )
        )
    );

こうすることで、翻訳者は2つの完全な文章と2つの別々の単語を翻訳することができます。そのため、翻訳者は次の単純な行について心配するだけで済みます(それ以外はCODEが処理します)。

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

それはそれです、単純な構造と同様に適切なエスケープと引数交換をします。


テーマの国際化プラグインの国際化 についてもっと読んでください。

4
Fayaz

@Fayazの答えはとても良いと思います。 HTMLやリンクなどのものを含めるには、sprintf()を使用して翻訳を囲む必要があります。

しかし、多くの言語では文構造が異なり、英語との互換性がまったくないため、文を複数の部分に分割して翻訳することをお勧めします。個々の単語を分割することによって、特定の単語が翻訳される文脈の多くはたくさんあり、潜在的に曖昧さと翻訳エラーを引き起こします。

代わりに、フレーズや文全体を翻訳してから、必要に応じてsprintfまたは別のエスケープ関数を使用することをお勧めします。

あなたのテキストでは、最初の部分はesc_html_eでそれ自身で簡単に翻訳することができます。

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

第二部は少し難しいです。さて、私はあなたがデータベースからページのURLとEメールを何らかの形で検索していると仮定します。おそらくget_the_permalink()get_option()あるいはその他の関数を使用します。だから私はそれらが$contact_page_url$contact_email変数に格納されていると仮定します。

最初のステップは、リンクなしで文字列を翻訳することです。この時点ではエスケープせずに__()を使う必要があることに注意してください - それは後で来るでしょう。

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

このようにして、翻訳者は必要に応じて文章を自由に書き、リンクURLとEメールを必要な場所に配置します。

次のステップはsprintf()を使ってリンクURLとEメールを挿入することです。ここではesc_url()を使用してURLをエスケープし、antispambot()を使用してEメールアドレスをエンコードして、スクレーパーに対する最小限の保護を提供しています。

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

最後に、esc_html()を使用するのではなく、翻訳されたHTMLのリンク要素のみを許可するためにwp_kses()を使用する必要があります。

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

以上です!最後のコードは次のとおりです。

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() ) ) );
1
shea