web-dev-qa-db-ja.com

__($ str)を使って文字列を翻訳する(symfony/twig)

私はたいていYii(2)、Zend、Laravelのようなフレームワークを使ってページを構築していますが、今回はWordpressを使うことを強いられました。

私はテンプレートエンジンとしてSymfony/Twigを統合しましたが、今ではローカライズ/翻訳に問題があります。何をしても私の文字列は翻訳されずWordpressでも見つけられないでしょう。

Laravelのように、メッセージを翻訳するためにTwigエクステンションを作成しました

class TranslateExtension extends \Twig_Extension {
    public function getFunctions(){
        return array(
            '__' => new \Twig_SimpleFunction('__', array($this, 'translate'))
        );
    }

    public function getName(){
        return 'TranslateExtension';
    }

    public function translate($string, $handle){
        return __($string, $handle);
    }
}

だから私は私のテンプレート{{ __('Some strings here', 'plugin-handle') }}でこれを行うことができますが、これらは翻訳されていないか、あるいは Loco translate によってさえ見つけられ、カスタムエントリを.poファイルに作成して.moファイルにコンパイルすることもできません。

これがどのように機能するかを誰かに教えてください。ほとんどすべての回答/チュートリアルはPOeditを使用してそこに翻訳を挿入することについてですが、 "新しい翻訳を追加"ボタンがなく、.poファイルに手動で文字列を含めてコンパイルするときWPそれら。

WPメソッドを使用する方法がない場合は、Wordpressなしで文字列を翻訳するためのカスタム関数を含めます。

編集
私がもう少し情報を提供したときに、誰かが私のミスを見つけることができるかもしれませんこれは私のpoファイルが/languages/cardio-de_DE.poでどのように見えるかです。

"Project-Id-Version: Cardio Plugin\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-11-30 16:19+0000\n"
"PO-Revision-Date: 2017-12-07 12:07+0100\n"
"Last-Translator: ******"
"Language-Team: German\n"
"Language: de_DE\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 2.0.5\n"
msgid "test"
msgstr "Fooo"

Poeditでファイルを保存して.moフォーマットに変換してからpoファイルと同じディレクトリにアップロードします
私のテンプレートでは、phpから基本的に{{ __("test", 'cardio') }}を返す__("test", "cardio")を実行していますが、出力は期待どおりのtestではなく単なるFooです。

1
Robin Schambach

私はプラグインとしてWordPressで私自身の小枝の実装を持っています、そして私の翻訳は働いています。あなたは私のコードをチェックすることができます。

コードをテストするときは、次の点に注意してください。

  • あなたのWordPressがあなたが翻訳したいlocaleをセットしていることを確認してください
  • moファイルが最新バージョンのpoファイルからコンパイルされていることを確認してください。
  • moファイルが存在し、load_plugin_textdomain関数によってロードされていることを確認してください。

下記のスクリプトを使用して、WordPressがどの翻訳ファイルをロードしているかをデバッグできます。

function wpse_287988_debug_mofiles( $mofile, $domain ) {

    var_dump($mofile);

    return $mofile;
}

add_filter( 'load_textdomain_mofile', 'wpse_287988_debug_mofiles', 10, 2);

function wpse_287988_terminate() {
    die();
}

add_filter( 'wp_loaded', 'wpse_287988_terminate' );

実用的な小枝の実装:

/**
 * Load composer autloader
 */
require_once dirname(__FILE__) . '/vendor/autoload.php';

// Main class

class WPSE_287988_Twig {

    /**
     * Templates path
     */
    private $templates_path;

    /**
     * Templates path
     */
    private $options;

    /**
     * Twig instance
     */
    private $twig;

    /**
     * Twig class constructor
     */
    public function __construct() {

        $this->templates_path = array();
        $this->options = array();

        $this->initialize_twig_options();
        $this->initialize_twig();
        $this->initialize_twig_functions();

        $this->define_hooks();
    }

    /**
     * Render method
     */
    public function render( $template, $variables = array() ) {

        return $this->twig->render( $template, $variables );
    }

    /**
     * Initialize twig options
     */
    private function initialize_twig_options() {

        /**
         * Resolve twig templates path
         */
        $plugins_dir = plugin_dir_path( __FILE__ );

        $this->templates_path[] = $plugins_dir;
        $this->templates_path[] = $plugins_dir . 'templates';

        foreach ($this->templates_path as $path) {

            if ( ! file_exists($path) ) {
                mkdir($path);
            }
        }

        /**
         * Resolve twig env options, disable cache
         */
        $this->options['cache'] = false;
    }

    /**
     * Initialize twig 
     */
    private function initialize_twig() {

        $loader       = new Twig_Loader_Filesystem( $this->templates_path );
        $this->twig   = new Twig_Environment($loader, $this->options );
    }

    /**
     * Initialize additional twig funcitons
     */
    public function initialize_twig_functions() {

        /**
         * Add gettext __ functions to twig functions.
         */
        $function = new Twig_Function('__', '__');

        $this->twig->addFunction($function);
    }

    /**
     * Load the plugin translations
     */
    public function load_plugins_textdomain() {

        $textdomain = 'wpse_287988';

        load_plugin_textdomain( $textdomain, false, basename( dirname( __FILE__ ) ) . '/languages' );
    }

    /**
     * Define hooks required by twig class
     */
    private function define_hooks()  {

        add_action( 'plugins_loaded', array( $this, 'load_plugins_textdomain' ) );
    }
}

// End of main class

// Initialize class

function wpse_287988_twig() {

    static $plugin;

    if ( isset( $plugin ) && $plugin instanceof WPSE_287988_Twig ) {
        return $plugin;
    }

    $plugin = new WPSE_287988_Twig();

    return $plugin;
}

wpse_287988_twig();

// End of class initialization

// Testing code

function wpse_287988_test_render() {

    $twig = wpse_287988_twig();
    echo $twig->render('template.html.twig');

    die();
}

add_action('init', 'wpse_287988_test_render');

// End of testing code

私のtemplate.html.twigファイル:

{% set text = "Foo" %}

{{ __(text, 'wpse_287988') }}

私は自分の翻訳を自分のプラグインのメインディレクトリのlanguagesディレクトリに保存します。私の翻訳ファイルはtextdomainとlocale:wpse_287988-pl_PL.powpse_287988-pl_PL.moから作られています。

3
kierzniak