web-dev-qa-db-ja.com

__():変数を渡さなければならない場合はどうなりますか?

翻訳関数__( $text, $domain )のドキュメントでは、文字列を$ textの代わりに直接記述しなければならないと述べています。__( $my_text, 'text-domain' );のような賢いことはできません。

しかし、文字列を取り込んで__( ... )に渡す必要があるメソッドを書いています。方法はありますか?私はこれを回避することができますprintfまたはsprintfを通して?

何かのようなもの...

function print_description( $text ) {
    echo '<p>' . __( printf( '%s', $text ), 'text-domain' ) . '</p>';
}
3
geoff

printf()でそれをすることができます。

例えば。

printf( __( 'We deleted %d spam messages.', 'my-text-domain' ), $count );
8
Ahmad Awais

いいえ

翻訳を生成するのに役立つツールはあなたのコードを解析することができず、翻訳ルーチンに渡された文字列が完全に動的であるときに翻訳が必要な文字列は何かです。

あなたの例では、この関数をコーディングするための適切な方法は、

function print_description( $text ) {
    echo '<p>' . $text . '</p>';
}

そしてそれを呼ぶ

print_description(__('specific description','text_domain));
3
Mark Kaplun

いいえ、あなたが実際にそのテキストが何であるかがわからないとき、人はテキストを翻訳することができないので。

翻訳は基本的に大きな配列を介して機能します。あなたは自分のコードを受け取り、その中のすべての文字列を見つけ、そして文字列の大きなリストを構築します。翻訳者がそれらを他の言語に翻訳します。その後、さまざまな変換機能が大きな配列検索を行い、変換された文字列を返します。

あなたがテキスト文字列を保持するために変数を使用するならば、それが事前に何であるかを知るために翻訳されるべき文字列の最初のリストに入れる方法はありません。

実際には意味をなさないので、変数を変換関数で使用することはできません。変数を翻訳することはできません。

2
Otto

PHPを使用するほとんどのCMSのように、WordPressで文字列を翻訳するには、文字列をGetText翻訳関数(つまり、__()、_e()、_n()、_x()など)でラップする必要があります。

この文字列はPOファイル(GetText Portable Objectファイル、PHP - https://www.gnu.org/software/gettext/manual/の多言語Webサイトの業界標準)にも含める必要があります。 html_node/PO-Files.html )。このファイルには文字列のペアが含まれています。そのうちの1つは元の言語の文字列で、もう1つはターゲット言語のその翻訳です。

プラグインを翻訳する必要があるすべての言語(スペイン語の場合はmy-text-domain-es_ES.po、フランス語の場合はmy-text-domain-es_ES.poなど)用にこれらのPOファイルを構築するためにthemeでは、翻訳者は元の言語で翻訳するためのすべての文字列を含むPOTファイル(POテンプレート)を使用し、それらすべてに翻訳された文字列を追加します。 POファイルはバイナリMOファイルにコンパイルされているため、はるかに高速に処理できます。

実行時に、翻訳する文字列はMOファイルを介して取得され、その翻訳に置き換えられます。

POTファイルは通常、ソースコードファイルを解析して翻訳可能な文字列を抽出する特別なツールを使用して生成されます。

このようなコードを書くと:

    $translated_text = __( $text, 'my_text_domain');

コードが特別なツールによって解析されるとき、翻訳されるべき文字列の値($ text)はまだ定義されていないのでコードには存在しません。その結果、自動検索ツールはこの文字列をPOTファイルに含めないため、POファイルやMOファイルには含まれません。

実行時に、文字列$ textの値がすでに定義されていると思われる場合、翻訳ファイルにはこの値との対応関係がなくなり、翻訳は不可能になります。

しかし、その変数の可能な値のセットが制限されていて、それらを知っている場合、この問題を克服するには2つの選択肢があります。

オプション1: 手動でPOTフ​​ァイルを編集して、$ textの可能な値を持つエントリを追加します。このオプションはシンプルで簡単に実装できます。どんなコードエディタでもPOTフォーマットに関する最低限の知識で十分です。しかし、それには1つの欠点があります。コードを変更した後に自動検索ツールを使用して翻訳を更新するたびに、行った変更は失われ、手動でそれらを含める必要があります。

オプション2: 私たちのコードには、翻訳関数によって囲まれた$ textのすべての可能な値を含めます。例を見てみましょう。 $ textが値を取ることができるとしましょう:アップル、オレンジ、バナナ、ピーチ、そしてナシ。次のようなコードを書く必要があります。

    // this variable is used only to include as parameters in
    // translation functions all the possible values of $text 
    $locale = __('Apple', 'my_text_domain') .
              __('orange', 'my_text_domain') .
              __('banana', 'my_text_domain') .
              __('Peach', 'my_text_domain') .
              __('pear', 'my_text_domain');

    $translated_text = __( $text, 'my_text_domain');

このオプションも実装が簡単で、自動検索ツールを使って翻訳を更新しても失われないという利点があります。

テーマやプラグインに、翻訳したいいくつかの変数があり、それらの変数に既知の可能な値のセットが限られている場合は、それらすべてをルートフォルダーまたはサブフォルダーに配置する必要があります。以下に示すように、テーマまたはプラグインの(つまり「含む」または「資産」フォルダー)

    <?php
    //values of the variables to be translated
    $locale_var1 = __('text-of-var1_val1', 'my_text_domain') .
                   __('text-of-var1_val2', 'my_text_domain') .
                   __('text-of-var1_val3', 'my_text_domain') .
                   .......
                   __('text-of-var1_valn', 'my_text_domain');

    $locale_var2 = __('text-of-var2_val1', 'my_text_domain') .
                   __('text-of-var2_val2', 'my_text_domain') .
                   .......
                   __('text-of-var2_valn', 'my_text_domain');

    .............

    $locale_varn = __('text-of-varn_val1', 'my_text_domain') .
                   __('text-of-varn_val2', 'my_text_domain') .
                   .......
                   __('text-of-varn_valn', 'my_text_domain');

これは、他のコードファイルに影響を与えずに変更できる別のファイルにこれらの文字列の定義を保持する、クリーンで保守可能な方法です。

0
Juan Guerrero

何らかの理由で、私にとっては_e()に変数を渡すことでうまくいきます。

$string = 'ciao';
_e($string, 'textdomain'); // put your own textdomain..
// will output 'ciao' or 'hello', based on current language

明らかに、あなたは以前に、理想的にはyourtheme/functions.phpであなたのテキストドメインを作成しなければなりません:

add_action( 'after_setup_theme', 'theme_setup' );
function theme_setup() {
  load_theme_textdomain( 'yourtextdomain', TEMPLATEPATH . '/languages' );
  // [...] other init code
}

.poファイルの単語 'ciao'を翻訳すると、フロントエンドで正しく翻訳されます。 .moのコンパイルにはPoeditなどを使用してください。 .poと.moは両方とも/ wp-content/yourtheme/languagesに配置する必要があります(上記のコードに従ってください)。

#. Test en_EN.po
msgid "ciao"
msgstr "hello"

それが機能する理由はわかりませんが、機能します。イタリア語では「ciao」、英語では「hello」と出力されます。

0
Luca Reghellin

私がここで言及するように http://www.westofwonder.com/2013/12/whats-with-all-the-double-underscores-everywhere/ (テーマをご容赦くださいまだそれらをプッシュしていない)、これに対する一つの可能​​な解決策はテキストのための関数を作成することである:

function yourtheme_thisisthetext() {
    return __( 'This is the text.', 'yourthemetextdomain' );
}

それ自体は醜いですが、長いまたは頻繁に使用される翻訳文字列では、コードの読みやすさのためにトレードオフの価値があります。

(これは許可されていますか?質問に直接答えて自分のブログにリンクするにはどうしたらいいですか?そうでなければ、私は謝罪し、それをもうやりません。)

0
LindaJeanne