【问题标题】:Making Wordpress PHP variables translatable使 Wordpress PHP 变量可翻译
【发布时间】:2015-11-16 12:28:08
【问题描述】:

我再次有一个关于 WordPress 和 PHP 的问题。事实上,它并不完全与 WordPress 相关,但在这种情况下考虑它会更容易理解。

我开发了一个框架,旨在使主题开发尽可能简单。因此,我想让一个主题自动翻译。使用该框架的开发人员不必在每次将字符串传递到某个地方时都使用 __(...)。

问题在于 PHP 的 gettext 函数无法按设计处理变量。这真的很有意义,因为动态内容无法翻译,并且还需要翻译生成器不仅解析,还要执行脚本文件 - 但在您的内容以某种方式固定(至少与PHP 中的字符串是)。

以下是开发人员当前必须做的一个示例:

new EaseWidgetArea(
    __('Notificationbar', 'themedomain'),
    "notificationbar",
    __("Top bar supposed to hold emergency information.", 'themedomain')
);

这是我的目标:

new EaseWidgetArea(
    "Notificationbar",
    "notificationbar",
    "Top bar supposed to hold emergency information."
);

在最终注册widget-area的类方法中:

register_sidebar(
    array(
        'name' => __($this->name),
        'id' => $this->id,
        'description' = __($this->description),
        'before_widget' => '<div class="widgetarea">',
        'after_widget' => '</div>'
    )
);

你知道任何干净方便的方法来完成这个吗? 提前致谢!

【问题讨论】:

    标签: php wordpress wordpress-theming translation


    【解决方案1】:

    我明白你在做什么,但你不能*这样解决你的问题:

    new EaseWidgetArea(
        "Notificationbar",
        "notificationbar",
        "Top bar supposed to hold emergency information."
    );
    

    然而,您可以做的是:

    new EaseWidgetArea(
        __("Notificationbar"),
        __("notificationbar"),
        __("Top bar supposed to hold emergency information.")
    );
    

    为此,您必须找到__ 函数,这是``translate()` 的别名。位于l10n.php

    在此,您可以随心所欲地自动翻译,这样做的另一个好处是,其他开发人员的软件确实使用 __() 仍然可以工作。

    • 永远不要说不能对吗?然而,在这种情况下,这意味着您必须运行 Wordpress 中的每一个功能,这将花费您至少 2225 年的时间。

    【讨论】:

    • 感谢您的建议!我考虑过这一点,但是,正如您自己指出的那样,这并不是真正的解决方案,而更像是一种妥协。如你所说;永远不要说不能! ;-)
    【解决方案2】:

    可能有一些方法可以实现。例如,扩展一个类方法,然后使用 fetch_all_args,并在您的 .po 文件中搜索该字符串,然后将其发送回原始方法。但是应该避免这些,因为它可能会降低你的性能,添加一个简单的 __() 是值得的。

    但有一种方法可能值得研究。您可能已经在主题开发工作流程中使用 grunt 或 gulp,因此您可以使用它自动将所有字符串替换为该字符串的本地化版本。由于您只是将其用于主题开发,因此您只需添加主题路径并让 gulp 监视对任何文件所做的任何更改。现在,只要您对该目录中的任何文件进行任何更改,它就会自动将您的字符串替换为本地化字符串。或者你可以在整个主题开发完成之后再做。这样您就不必做任何额外的工作,您的服务器也不会做任何额外的计算,您的主题仍将使用官方功能。

    编辑: 另一种方法是创建一个必备插件,然后使用它自动检查主题文件夹中的所有字符串,然后只替换没有包装函数 __() 的字符串。您可以向此插件添加一些挂钩,以便在主题更新或激活时自动运行。一旦字符串被替换,它还可以运行像LOCO 这样的插件,开发人员/用户可以通过管理面板本身翻译字符串。这样一来,性能不会下降,他们也不必在工作流程中使用 grunt/gulp。

    【讨论】:

    • 感谢您的回答,但我认为它并不能解决我原来的问题。我想让框架用户的开发更容易,而不是我。因此使用 grunt 或 gulp 并不是一个真正的选择。您的第一个解决方案可能有效,但由于性能大幅下降,这不是可行的方法......
    • 嗯,这确实变得有趣了 :) ,另一个想法刚刚从我的脑海中掠过,它可能不是您想要的,但您可以查看我的编辑。
    猜你喜欢
    • 2016-08-15
    • 1970-01-01
    • 2019-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多