翻訳関数の中でHTMLを使う方法
-
「一部の例外を除き、翻訳したすべての文字列は 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;
@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/
というプラグインを使うと、どれ位うるさいか実感できます。
翻訳関数を使う用途が不明なので、余分だったかもしれませんがお許しください。
- トピック「翻訳関数の中でHTMLを使う方法」には新たに返信することはできません。