web-dev-qa-db-ja.com

テキストドメインとしてクラス定数を使用できないのはなぜですか?

Wordpress.orgがプラグインの国際化を承認した理由は何ですか?

私は私の最初のプラグインを作成しましたそしてこれがメインコードです:

https://plugins.trac.wordpress.org/browser/mastercurrency-wp/trunk/mastercurrencywp.php?rev=1374404

テキストドメインには定数を使用しています。

class mastercurrencywp {
    const plugin_textdomain = 'mcwpww';
}

そして後で同じクラスで私はこれを次のように使用します。

$curr_desc['EUR'] = __('Euro', self::plugin_textdomain);

私はこれをローカルでテストし、そしてプラグインの国際化がうまくいった、私はまたスウェーデン語の翻訳を追加しました(それは私のローカルサーバーで動作します)が、wordpress.orgは述べています:

This plugin is not properly prepared 
  for localization. If you would like to 
  translate this plugin, please contact the author.

https://translate.wordpress.org/projects/wp-plugins/mastercurrency-wp

どうしてですか?(何が足りないのですか?)

プラグインを更新したばかりなので、wordpress.orgがその文を更新するまでに時間がかかることがありますか。

定数または変数の値はPHPパーサーによってのみ評価できます。 に翻訳可能な文字列を抽出するのに使用されるツール はPHPのwrittenですが、単なる文字列パーサです。それはあなたのコードをrunすることではありません、なぜならそれは遅すぎてエラーを起こしやすいからです。

これはどれほど複雑になる可能性があるかの例です。

interface FooTranslate
{
    const TEXT_DOMAIN = 'foo';
}
interface BarTranslate extends FooTranslate {}

class FooBar implements BarTranslate
{
    public function greeting()
    {
        _e( 'hello!', self::TEXT_DOMAIN );
    }
}

(new FooBar)->greeting();

実行中 PHPなしで、テキストドメインの正しい文字列値を見つけます。難しいです。


翻訳関数へのすべての呼び出しには単純な文字列を使用する必要があります。

開発者ハンドブック は、残念ながらエラーメッセージのスタイルと間違った引用符で非常に明確に言っています:

Gettext関数のテキストドメイン部分に変数名を使用しないでください。ショートカットとしてこれをしないでください。__( ‘Translate me.’ , $text_domain );

もう1つ注意してください:initに翻訳ファイルをロードしないでください。これは費用がかかります:これらのファイルはAJAXリクエストへのすべての呼び出し、コメントの提出、そしてあなたのプラグインにさえ関連しないかもしれない他のすべてのファイルに今ロードされます。 WordPressにファイルをインクルードするように依頼する前に、現在のリクエストコンテキストを確認してください。

5
fuxia