wake-up-neo.com

benutze __ ($ str) um Strings zu übersetzen (symfony/twig)

Normalerweise benutze ich Frameworks wie Yii (2), Zend oder Laravel, um Seiten zu erstellen, aber ein Kunde hat uns gezwungen, dieses Mal Wordpress zu verwenden.

Ich habe Symfony/Twig als Template-Engine integriert, aber jetzt habe ich Probleme mit der Lokalisierung/Übersetzung. Weil meine Strings, egal was ich tue, nicht von Wordpress übersetzt oder gefunden werden.

Wie in Laravel habe ich eine Twig-Erweiterung erstellt, um die Nachrichten zu übersetzen

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

Ich kann dies in meiner Vorlage {{ __('Some strings here', 'plugin-handle') }} tun, aber diese werden nicht übersetzt oder sogar gefunden, indem Loco translate einen benutzerdefinierten Eintrag in der Datei .po erstellt und in .mo kompiliert. Dateien funktionieren auch nicht.

Kann mir bitte jemand erklären, wie das geht? In fast allen Antworten/Tutorials geht es darum, POedit zu verwenden und die Übersetzungen dort einzufügen. Es gibt jedoch keine Schaltflächen zum Hinzufügen neuer Übersetzungen. Wenn ich die Zeichenfolgen manuell in meine .po -Dateien einfüge und sie kompiliere, kümmert sich WP immer noch nicht darum.

Wenn es keine Möglichkeit gibt, die WP -Methode zu verwenden, füge ich meine benutzerdefinierten Funktionen hinzu, um die Zeichenfolgen ohne Wordpress zu übersetzen

Bearbeiten
Vielleicht kann jemand meinen Fehler finden, wenn ich weitere Informationen gebe. So sieht meine PO-Datei in /languages/cardio-de_DE.po aus.

"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"

Mit Poedit speichere ich die Datei und konvertiere sie in das .mo-Format. Anschließend lade ich sie in dasselbe Verzeichnis wie die po-Datei hoch
In meinem Template mache ich {{ __("test", 'cardio') }}, was im Grunde __("test", "cardio") von PHP zurückgibt, aber die Ausgabe ist nur test und nicht Foo wie erwartet

1
Robin Schambach

Ich habe meine eigene Implementierung von twig in WordPress als Plugin und meine Übersetzungen funktionieren. Sie können meinen Code überprüfen.

Beachten Sie Folgendes, wenn Sie den Code testen:

  • stellen Sie sicher, dass Ihr WordPress locale gesetzt hat, in die Sie übersetzen möchten
  • stellen Sie sicher, dass Ihre mo-Datei aus der neuesten Version der po-Datei kompiliert wurde
  • stellen Sie sicher, dass Ihre mo -Datei existiert und von der load_plugin_textdomain -Funktion geladen wird

Sie können debuggen, welche Übersetzungsdateien WordPress lädt, indem Sie das folgende Skript verwenden.

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

Arbeitende Zweigimplementierung:

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

Meine template.html.twig Datei:

{% set text = "Foo" %}

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

Ich behalte meine Übersetzungen im Sprachenverzeichnis im Hauptverzeichnis meines Plugins. Meine Übersetzungsdateien haben den Namen textdomain und locale: wpse_287988-pl_PL.po und wpse_287988-pl_PL.mo.

3
kierzniak