本地化/文本域缓慢且混乱

时间:2016-05-19 作者:cjbj

我的主题有很多模板。其中大多数以通常的方式包含消息:

echo __(\'This is the message\',\'mytextdomain\')
这有几个缺点。例如,如果我想更改“阅读更多”消息,我必须浏览所有文件以查看它是否存在。拼写错误的风险更大,而且更难检查消息的一致性。那么,有没有办法将信息集中在一个地方呢?

我还想知道性能。对于每个页面加载,WP都会加载完整的textdomain,只会找到始终相同的翻译。尤其是在前端,这听起来效率不高。那么,有没有一种方法可以在不重复整个过程的情况下进行适当的本地化?

2 个回复
SO网友:Rarst

在我看来,在这种情况下,你把重点放在了一个错误的问题上。

例如,如果我想更改“阅读更多”消息,我必须浏览所有文件以查看它是否存在。

这并不表示存在本地化问题。这表明模板化问题。

如果您想更改标记,阅读更多其他内容,该怎么办?你也必须在多个地方这样做吗?然后,更多的是关于模板的结构以及模板中的复制。

并不是说WordPress在这方面特别好,但仍然值得考虑。

我还想知道性能。对于每个页面加载,WP都会加载完整的textdomain,只会找到始终相同的翻译。尤其是在前端,这听起来效率不高。

你犯了一个典型的错误,就是疑惑而不是测量。

WordPress中的本地化肯定会影响性能。然而,核心已经做了大量的it工作来为自身加载本地化。

若你们的主题在必要的翻译量上并没有接近或超过WP核心,那个么你们可能就没事了。如果要确定-请分析性能并确定。:)疑惑只是浪费你的时间在那些可能不需要解决的假设上。

SO网友:cjbj

有一种简单的方法可以绕过这个问题。将所有前端消息存储为主题选项。让我们定义一个选项“messages”:

add_option(\'messages\',array());
现在,我们必须填充此选项。让我们定义默认值:

$theme_messages_defaults = array (
    \'read-more\'         => __(\'Read more\',\'tekko\'),
    \'next-page\'         => __(\'Next page\',\'tekko\'),
    ... and so on ...
    )
现在,我们必须将默认值转换为选项。我们只想在第一次安装、翻译文件更新或用户切换语言时执行此操作。此测试通过后,运行此功能:

function run_only_at_install_or_new_version {
    global $theme_messages_defaults;
    var $messages = array();
    foreach ($theme_messages_defaults as $message_key => $message_val) {
        $messages[$message_key] = $theme_messages_defaults[$message_val];
    }
    update_option(\'messages\',$messages);
}
考虑到该选项是一个数组,我们需要一个稍微不同的get_option 功能:

function mytheme_get_message_option ($message_key) {
    $messages = get_option(\'messages\');
    $message = $messages[$message_key];
    return $message;
}
在模板中,替换所有echo语句,如下所示:

mytheme_get_message_option(\'read-more\');
不要忘记,前端不再需要textdomain,因此在函数文件中添加一个条件:

if (is_admin()) load_theme_textdomain (\'mytheme\', \'path/to/languages\');
现在,您将所有消息放在一个地方,并正在防止不必要的翻译操作。事实上,你有更多的可能性。您可以将消息添加到选项页面,并让客户更改文本,而无需更改模板。嘿,如果你用mod代替选项,你甚至可以将它们添加到主题定制器中。请注意,您必须向run_only_at_install_or_new_version 防止在更新主题时重写客户端消息。

Note: 以上内容改编自我自己使用的更复杂的设置,因此可能会有一些拼写错误。如果您正处于调试阶段,那么应该不会有问题。