こんにちは
_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;
@ishitaka さん
なるほど、ありがとうございます。よく読んでおきます。
@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/
というプラグインを使うと、どれ位うるさいか実感できます。
翻訳関数を使う用途が不明なので、余分だったかもしれませんがお許しください。
なるほど翻訳者を想定してのことでしたか。そのようなご意見を伺うことができて幸運でした。コメントのルールについても知らなかったです。実用的なコードに使い方のご説明まで、幅広く教えていただき大変感謝です。余分だなんて…とんっでもないです。どうもありがとうございました!