全局变量的翻译问题

时间:2018-02-20 作者:Michele Fortunato

我正在创建一个支持国际化的插件。

除了全局变量外,一切正常。

全局变量中的字符串不会得到适当的转换。

说明:

_e(\'Hello World\',\'text-domain\'); // Gets translated

$var = __(\'Hello Global World\',\'text-domain\');
function fun() {
    global $var;
    echo $var; // Doesn\'t get translated
}
有没有关于如何纠正这种行为的线索?

更新:这个问题也有类似的问题,没有答案Wordpress Localization and Templating

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

转换与全局变量一起工作,您只需等待适当的挂钩来调用转换函数。我没有看过代码或文档,但只是通过实验,翻译是在after_setup_theme 钩子,但在其他钩子之前开火。

这意味着如果你想在plugins_loaded 胡克,你不会得到翻译后的结果。

例如,在下面的插件中$dash 在主插件文件中被“翻译”,则不会被翻译。无论发生什么情况,它都会打印“Dashboard”。同样的事情plugins_loaded

有趣的部分在于after_setup_theme 钩住全局$dash 打印的是英文,但新翻译的文本打印的是“Escritorio”。

init 钩子,全球$dash 打印翻译后的文本。我向闭包添加了一个回调,以确保它显示的是全局$dash 变量,确实如此。

/**
 * Plugin Name: StackExchange Sample
 */

namespace StackExchange\\WordPress;

$dash = __( \'Dashboard \' );
printf( \'<p>Main plugin file: %1$s</p>\', $dash );  // Dashboard

class plugin {
  public function plugins_loaded() {
    \\add_action( \'after_setup_theme\', [ $this, \'after_setup_theme\' ] );
    \\add_action( \'init\', [ $this, \'init\' ] );

    echo \'<h2>plugins_loaded</h2>\';
    global $dash;
    printf( \'<p>Global: %1$s</p>\', $dash );  // Dashboard
    $dash = __( \'Dashboard\' );
    printf( \'<p>Local: %1$s</p>\', $dash );  // Dashboard
  }
  public function after_setup_theme() {
    echo \'<h2>after_setup_theme</h2>\';
    global $dash;
    printf( \'<p>Global: %1$s</p>\', $dash );  // Dashboard
    $dash = __( \'Dashboard\' );
    printf( \'<p>Local: %1$s</p>\', $dash );  // Escritorio
  }
  public function init() {
    echo \'<h2>init</h2>\';
    global $dash;
    printf( \'<p>Global: %1$s</p>\', $dash );  // Escritorio
    $dash = __( \'Dashboard\' );
    printf( \'<p>Local: %1$s</p>\', $dash );  // Escritorio
  }
}
\\add_action( \'plugins_loaded\', [ new plugin(), \'plugins_loaded\' ] );
\\add_action( \'init\', function() {
  global $dash;
  printf( \'<p>Global: %1$s</p>\', $dash );  // Escritorio
}, 20 );
总而言之:具有翻译文本的全局变量确实有效,请确保等到after_setup_theme 钩子来翻译文本,不要使用全局变量,因为这只会导致问题。

SO网友:Mark Kaplun

一般来说,您不应该有全局变量。

特别是,如果您的文件未在全局范围内加载$var 除非明确声明它是全局的,否则它不会是全局的。你的问题不太可能与实际翻译有关。

结束

相关推荐

WordPress Plugins won't save

我有一个WordPress网站,我刚刚接管了一个客户,因此我没有能力与以前的网站管理员/开发人员交谈。该网站使用的是YOOtheme对Subway稍加修改的版本。为了更新插件位置,Subway的一部分有“小部件选项”。我无法更改外观或小部件显示的页面,因为我无法保存任何内容。它看起来像已保存,但没有保存,或者您会在保存按钮旁边看到“加载循环”,它一直在运行。Things to note:<WordPress和插件是最新的。在我们转移到新服务器之前,插件是可更新的。新服务器有一个max\\u inpu