我有一个 WordPress 插件,其中一些设置存储在一个数组中,每个设置都有一个 slug 和一个标签。
我的插件是基于类的,这是我的构造函数的代码
class My_Plugin {
function __construct() {
$this->_options = array(
'optionA' => __( 'Text for first option', 'my-plugin' ),
'optionB' => __( 'Text for second option', 'my-plugin' ),
'optionC' => __( 'Text for third option', 'my-plugin' ),
);
}
}
我在几个地方使用了类似的结构,来存储与带有获取文本的标签关联的值列表。例如,稍后,该数组可用于创建具有用户设置的表单
foreach ($this->_options as $option_name => $option_label) {
echo '<input type="text" name="' . $option_name . '" value="' . $option_label . '"/>';
}
我在其他地方也使用了类似的结构。 现在,我注意到的奇怪(?)的事情是,当我使用 PoEdit 翻译插件时,这些字符串没有被翻译。 为什么会发生这种情况?除了更改结构并直接写入每个输入字段或重复结构之外,我还能做些什么吗?
最佳答案
您需要了解 gettext 库(包括 WordPress 中的库)的工作原理 - 一旦了解了,就很容易推断出此类问题的原因:
__()
不是一些神奇的标记,而是一个普通的旧函数。它接受一个字符串作为输入,在当前加载的 MO 文件中搜索域(如果有的话),如果找到,则返回翻译。否则,它将返回未修改的输入(即回退为英语)。
因此,在了解此处未包含的其余代码的情况下,您需要问自己的问题是:my-plugin
域的翻译是否已加载当从构造函数调用 __()
时?
一个合理的猜测是,不,事实并非如此。您首先构建了 My_Plugin
对象,从而在未加载翻译且 gettext 库尚未正确初始化时调用 __()
。在这种情况下,该函数唯一能做的就是返回原始的英文字符串。在稍后的某个时刻(按时间顺序,不一定按源代码顺序)您的 gettext 初始化 Hook 被执行并调用load_plugin_textdomain
。从那时起,__()
将按预期运行。不过,这对于您的构造函数来说已经太晚了,因为您已经“翻译”了这些字符串。
像您一样存储翻译后的值是完全可以的(尽管这也有点毫无意义,因为它不会给您带来任何有意义的性能优势)。但您需要严格遵循一个简单的规则:首先加载翻译,然后使用它们。
关于php - WordPress插件国际化: variables not translated?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37379885/