__()または_e()言語翻訳文字列内のHTML


24

翻訳文字列を構築するための適切なアプローチは何ですか?

例えば、

echo __( 'Hello ' . $first . ' you owe me money.' );
echo __( '<div><p>Top: ' . $t_margin . '</p>' . '<p>Bottom: ' . $b_margin . '</p></div>' )

文字列やHTMLを追加しても大丈夫ですか、それとも最初に行ってから次のような翻訳を実行する必要がありますか?

$html = '<div><p>Top: ' . $t_margin . '</p>' . '<p>Bottom: ' . $b_margin . '</p></div>';
echo __( $html ); 

回答:


41

__()関数には2番目の引数があります。プラグインまたはテーマに使用しているドメインに設定する必要があります。以下の例では、を使用します'text_domain'。ドメイン文字列は一意である必要があります。他のドメイン文字列と一致してはなりません。テキストドメイン引数を使用しない場合、デフォルト'default'でWordPressドメイン名が使用されます。詳細については、リンクを参照してください。

常に文字列('text_domain')を使用します。文字列を含む変数、関数、または定数を使用しないでください。ほとんどの(すべて?)翻訳プログラムは、そこに文字列がないと表示されません。

あなたのコード:

echo __( 'Hello ' . $first . ' you own me money.' );

文字列に変数を含めないでください。

より良い方法:

echo sprintf( __( 'Hello %s you own me money.', 'text_domain' ), $first );

あるいは単に:

printf( __( 'Hello %s you own me money.', 'text_domain' ), $first );

%sプレースホルダ文字列がそこで起こっていることを人間の翻訳者に伝えます。%d数字に使用します。他のプレースホルダーもあります。

(この文は文法的に正しくない英語です。どちらを使用するか、'Hello %s, you owe me money.'または'Hello %s, you own my money.'意図していた意味に応じて使用してください。)


あなたのコード:

$html = '<div><p>Top: ' . $t_margin . '</p>' . <p>Bottom: ' . $b_margin . '</p></div>';

HTMLを翻訳しないでください。どの言語でも同じです。

より良い方法:

$html = sprintf( '<div><p>%s</p><p>%s</p></div>', __( 'Top: ', 'text_domain' ) .  $t_margin, __( 'Bottom: ', 'text_domain' ) . $b_margin );

または、複数行に分割します。

$html = sprintf(
    '<div><p>%s</p><p>%s</p></div>',
    __( 'Top: ', 'text_domain' ) .  $t_margin,
    __( 'Bottom: ', 'text_domain' ) . $b_margin
);

それが明らかでない場合はどのようなトップボトム、あなたが使用する可能性がありますされている_x()これらの用語の内容を説明します。


他の翻訳事例はここで見つけることができます:国際化:あなたはおそらくそれを間違っているのでしょう


あなたはHTMLを翻訳しないと言います。翻訳されていないこと、事前に翻訳された文字列の既存のテーブルで検索されていることを指摘できます。文字列にHTMLが含まれていても、翻訳者がHTMLを削除しなければ違いはありません。実際、状況によっては、正規表現の検索と置換よりもパフォーマンスが向上します。
トウィフティ

無関係ですが、注目に値します:はtextdomainリテラル文字列である必要があり、変数/定数/プロパティにすることはできません。
ブラソフィロ

@brasofilo、そのアドバイスは上部近くの回答に書かれていますが、繰り返します。顧客向けに作成したいくつかのカスタムプラグインでこの間違いを犯しました。
チャールズクラークソン

+1 sprintf()。これが、翻訳可能な文字列にHTMLを含める方法です。
ヘルガサビキング

sprintf()多分もっときれいな見た目以外の方法での使用がどのように役立つかわかりません。あなたがSome text with a <strong>strong</strong> word inside.どのようにHTMLを含む文を持っているのであれば、文全体を翻訳しSome text with a、翻訳しないでstrongword inside個別に(それは意味をなさない)可能ですか?
phpheini

4

既に述べられているため、文字列内の変数の問題には対処しません。

文字列を静的に保ちたいので、コンテンツは変更されません。また、不要なHTMLを排除する必要があります。

__( '<p>Hello World!</p>' );
__( '<h1>Hello World!</h1>' );

上記は、基本的に同じテキストであるため、テーブル内の2つの行を占有します。次のように書き換えることができます。

'<p>' . __( 'Hello World!' ) . '</p>'
'<h1>' . __( 'Hello World!' ) . '</h1>'

単一の行に減らします。

テキスト内のHTMLが避けられない場合があります。例:

__( 'You currently owe <b>%s</b> dollars' );

言語は文法的であるため、テキストを分割すると翻訳している人に問題が発生します。

経験則。中間文のHTMLテキスト書式タグは問題ありません。HTMLで始まる文とHTMLで終わる文はスペースを無駄にします。


最後の例では、挿入された引数を太字のタグで囲むことができます"<b>$string</b>"。次に、を使用できます'You currently owe %s dollars'。ただし_n()%dプレースホルダーを必要とする関数で使用する場合は、そのままにしておく必要があります。
チャールズクラークソン

@CharlesClarksonグッドコール。おそらく、私は%sそれをもう少し明確にするために除外すべきでした。
トウィフティ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.