web-dev-qa-db-fra.com

utilisez __ ($ str) pour traduire des chaînes (symfony/twig)

J'utilise généralement des frameworks tels que Yii (2), Zend ou Laravel pour construire des pages, mais un client nous a obligés à utiliser Wordpress cette fois-ci.

J'ai intégré Symfony/Twig en tant que moteur de gabarit, mais je rencontre maintenant des problèmes de localisation/traduction. Parce que peu importe ce que je fais, mes chaînes ne seront ni traduites ni même trouvées par Wordpress.

Comme dans Laravel j'ai créé une extension Twig pour traduire les messages

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);
    }
}

Donc, je peux le faire dans mon modèle {{ __('Some strings here', 'plugin-handle') }} mais ceux-ci ne sont pas traduits ni même trouvés par Loco translate en créant une entrée personnalisée dans le fichier .po et en le compilant dans .mo les fichiers ne fonctionnent pas non plus.

Quelqu'un peut-il m'expliquer s'il vous plaît comment cela fonctionne? Presque toutes les réponses/tutoriels concernent l’utilisation de POedit et y insèrent les traductions, mais il n’existe pas de bouton "Ajouter une nouvelle traduction" et lorsque j’inclus les chaînes manuellement dans mes fichiers .po et les compile WP ne se soucie toujours pas ceux.

S'il n'y a aucun moyen d'utiliser la méthode WP, j'inclurai mes fonctions personnalisées pour traduire les chaînes sans Wordpress.

Modifier
Peut-être que quelqu'un peut trouver mon erreur lorsque je fournis des informations supplémentaires Voici à quoi ressemble mon fichier po dans /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"

Avec Poedit, je sauvegarde le fichier et le convertis au format .mo, puis je le télécharge dans le même répertoire que le fichier po.
Dans mon modèle, je fais {{ __("test", 'cardio') }} qui renvoie fondamentalement __("test", "cardio") de php mais la sortie est juste test et non Foo comme prévu

1
Robin Schambach

J'ai ma propre implémentation de twig dans WordPress en tant que plugin et mes traductions fonctionnent. Vous pouvez vérifier mon code.

Gardez à l’esprit quelques points lorsque vous testerez le code:

  • assurez-vous que votre WordPress a défini locale que vous voulez traduire en
  • assurez-vous que votre fichier mo est compilé à partir de la dernière version du fichier po
  • assurez-vous que votre fichier mo existe et est chargé par la fonction load_plugin_textdomain

Vous pouvez déboguer les fichiers de traduction que WordPress charge en utilisant le script ci-dessous.

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' );

Mise en œuvre des rameaux de travail:

/**
 * 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

Mon fichier template.html.twig:

{% set text = "Foo" %}

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

Je garde mes traductions dans le répertoire des langues dans le répertoire principal de mon plugin. Mes fichiers de traduction sont nommés d'après textdomain et locale: wpse_287988-pl_PL.po et wpse_287988-pl_PL.mo.

3
kierzniak