php - WordPress插件国际化: variables not translated?

标签 php wordpress internationalization gettext

我有一个 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/

相关文章:

php - 未捕获的 PDOException:PDO::__construct():php_network_getaddresses:getaddrinfo 失败:名称或服务未知

php - WordPress PHP功能文件中的Google Analytics(分析)代码404错误跟踪

ruby-on-rails - 将 i18n 翻译存储在 activerecord 中 — Rails 3.2

ruby-on-rails - 如何使用 RSpec 在 Rails 中测试 i18n

php词过滤功能?

javascript - ACF 中继器现场事件同时触发

php - 来自 MYSQL 查询的 PHP 国家/地区总金额

ruby-on-rails - 使用I18n转换ActionController错误消息

php - 如何获取十进制数左右两边的位数

php - 查询生成器调用非对象上的成员函数 createQueryBuilder()