サポート » 使い方全般 » 翻訳関数の中でHTMLを使う方法

  • 解決済 puniler

    (@puniler)


    翻訳関数に_e()__()などありますが、その使い方について質問があります。

    下記$text2のように「こちら」だけを<a>で囲みたい場合の書き方はどのようにしたらよろしいのでしょうか。

    $text1 = __( 'このメールは送信専用です', 'mytheme' );
    $text2 = __( 'このメールにお心当たりがない場合<a href="">こちら</a>をクリック', 'mytheme' );
6件の返信を表示中 - 1 - 6件目 (全6件中)
  • 「一部の例外を除き、翻訳したすべての文字列は HTML の実体参照文字ではなく普通のテキストで書きましょう」とのことです。
    https://wpdocs.osdn.jp/WordPress_%E3%81%AE%E7%BF%BB%E8%A8%B3/%E5%9B%BD%E9%9A%9B%E5%8C%96%E5%AF%BE%E5%BF%9C#HTML_.E5.AE.9F.E4.BD.93.E5.8F.82.E7.85.A7.E6.96.87.E5.AD.97

    こんにちは

    _e()__()は、翻訳関数の中では、最も身近な関数ですね

    例示された以下は、このまま動作しますよね

    
    $text2 = __( 'このメールにお心当たりがない場合<a href="">こちら</a>をクリック', 'mytheme' );
    

    よく見るのは、printf(),sprintf()との併用です。

    
    printf( __('read more <a href="%1$s">%2$s</a>','emulsion'), esc_url('https://example.com'), __('post','emulsion') );
    

    翻訳本文が生のURL表示になるか、%1$sになるかの違いです。

    留意点は、_e()__()は、翻訳文にhtmlを追加できる点

    あまり普及しない? esc_html_e()esc_html__()は、HTMLをエスケープします。

    デフォルトテーマでは、_e()__()をよく使っていますよね。でも、TRT(テーマレビューチーム)は、_e()__()ではなく esc_html_e()esc_html__()を使いなさいと言っていて、ダブルスタンダードみたいな状態にあります。

    個人的には、、_e()__()esc_html_e()esc_html__() に置き換えています。

    エスケープされるので、私自身がHTML交じりを記述する場合は、素直に翻訳文字列をつなぎます。

    
    $translation  = esc_html__( 'read more ','emulsion');
    /* translators: 1: link url https://example.com 2: link text */
    $translation .= sprintf( '<a href="%1$s">%2$s</a>', esc_url('https://example.com'), esc_html__('link text','emulsion') );
    				
    echo $translation;
    
    トピック投稿者 puniler

    (@puniler)

    @ishitaka さん
    なるほど、ありがとうございます。よく読んでおきます。

    トピック投稿者 puniler

    (@puniler)

    @nobita さん

    周辺の事情に大変お詳しそうにお見受けしました。
    安心感のあるご回答をどうもありがとうございます。

    「>翻訳本文が生のURL表示になるか、%1$sになるかの違いです。」とありますが、これは生URLにしないのはなぜですか?

    printf( __('read more <a href="%1$s">%2$s</a>','emulsion'), esc_url('https://example.com'), __('post','emulsion') );

    ↓どうせURL部分は翻訳しないので、下のように書いてもいいのでは、と思いました。

    printf( __('read more <a href="https://example.com">%1$s</a>','emulsion'), __('post','emulsion') );

    あとそもそも、エスケープはどうして必要なのでしょうか?エスケープというのは、ユーザーが入力した値を受け取るときにだけ、変なコードが実行されないようにしておくものだ、と理解してました。

    翻訳本文が生のURL表示になるか、%1$sになるかの違いです。

    2つ理由があります。

    翻訳を行う人は、大抵、外国人で、どんな人なのかよくわからないことが多いです。

    %!$sだと、URLを翻訳する時にミスるのを防ぐ効果があるかなぁ と思います

    最初から悪意のある人だと、__()の %1$sを生のURLに書き換えられてしまうと、簡単に書き換えられるので、私は、esc_html__()を使っています。

    また、wordpress.orgにホスティングするテーマの場合、生のリンク書かないでといったルールがあるため、
    そうせざるを得ないといった事もあります。

    https://ja.wordpress.org/plugins/theme-check/

    というプラグインを使うと、以下のような info メッセージが表示されます。

    Possible hard-coded links were found in the file header.php

    
    esc_url('https://example.com')
    

    直書きURLには必要ないですね。つい癖で書いてしまいました。get_permalink() みたいなURL関数で、値をリターンしてくる関数は、esc_url() 使った方がいいと思います。(大雑把ですみません)

    ついでなので、
    sprintf()などを使った場合、ホスティングテーマでは、以下のようなコメントを書くルールがあります。1が%1$sに相当します。

    
    /* translators: 1: link url https://example.com 2: link text */
    

    あとそもそも、エスケープはどうして必要なのでしょうか?エスケープというのは、ユーザーが入力した値を受け取るときにだけ、変なコードが実行されないようにしておくものだ、と理解してました。

    テーマレビューチームのテーマ審査に限って言えば、保存時バリデート、出力時サニタイズを強く言うようになっています。(個人的には、本当ですか?と思うこともありますが)
    WordPressでは、フィルターとか、アクションといった。元の出力を変更する機能がたくさんあるので、最終出力の時に、サニタイズしてー! という事になってきていると思います。

    https://wordpress.org/plugins/theme-sniffer/

    というプラグインを使うと、どれ位うるさいか実感できます。

    翻訳関数を使う用途が不明なので、余分だったかもしれませんがお許しください。

    • この返信は4年、 7ヶ月前にnobitaが編集しました。
    • この返信は4年、 7ヶ月前にnobitaが編集しました。
    • この返信は4年、 7ヶ月前にnobitaが編集しました。
    トピック投稿者 puniler

    (@puniler)

    なるほど翻訳者を想定してのことでしたか。そのようなご意見を伺うことができて幸運でした。コメントのルールについても知らなかったです。実用的なコードに使い方のご説明まで、幅広く教えていただき大変感謝です。余分だなんて…とんっでもないです。どうもありがとうございました!

6件の返信を表示中 - 1 - 6件目 (全6件中)
  • トピック「翻訳関数の中でHTMLを使う方法」には新たに返信することはできません。