使用__($str)转换字符串(symfony/twig)

时间:2017-12-07 作者:Robin Schambach

我通常使用像Yii(2)、Zend或Laravel这样的框架来构建页面,但这次一位客户强迫我们使用Wordpress。

我集成了Symfony/Twig作为我的模板引擎,但现在我在本地化/翻译方面遇到了麻烦。因为无论我做什么,我的字符串都不会被翻译,甚至不会被Wordpress找到。

就像在Laravel一样,我创建了一个树枝扩展来翻译消息

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

Edit<当我提供更多信息时,也许有人会发现我的错误这是我的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 文件在我的模板中我做{{ __("test", \'cardio\') }} 基本上是退货__("test", "cardio") 来自php,但输出只是test 而不是Foo 如期而至

2 个回复
最合适的回答,由SO网友:kierzniak 整理而成

我在WordPress中有自己的twig插件实现,我的翻译正在工作。你可以检查我的代码。

在测试代码时,请记住以下几点:

确保您的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和区域设置命名的:wpse_287988-pl_PL.powpse_287988-pl_PL.mo.

SO网友:luukvhoudt

使用自定义细枝过滤器。

为WordPress创建过滤器gettext function (__($text, $domain)):

$wpGetText = new \\Twig\\TwigFilter(\'__\', function ($text) {
  return __($text, \'my_domain\');
});
$templateEngine = new \\Twig\\Environment($loader); $templateEngine->addFilter($wpGetText); 在细枝模板中使用过滤器:
<h1>{{ \'Hello World\'|__ }}</h1>

结束

相关推荐

Custom metabox translation

我已经创建了一个自定义的帖子类型,并添加了一些自定义的元数据库,现在我想知道我在我的网站上使用了什么样的翻译插件?我对它们都没有经验,所以我不知道谁会支持我的自定义元数据库,谁不会。