为什么我不能使用类常量作为文本域?

时间:2016-03-19 作者:bestprogrammerintheworld

是什么造就了Wordpress。组织是否批准插件国际化?

我已经创建了第一个插件,下面是主要代码:

https://plugins.trac.wordpress.org/browser/mastercurrency-wp/trunk/mastercurrencywp.php?rev=1374404

我正在为文本域使用一个常量:

class mastercurrencywp {
    const plugin_textdomain = \'mcwpww\';
}
后来在同一节课上,我这样使用它:

$curr_desc[\'EUR\'] = __(\'Euro\', self::plugin_textdomain);
我已经在本地测试了这个插件,然后插件的国际化工作了,我还添加了一个瑞典语翻译(可以在我的本地服务器上工作),但没有wordpress。组织状态:

This plugin is not properly prepared 
  for localization. If you would like to 
  translate this plugin, please contact the author.
()https://translate.wordpress.org/projects/wp-plugins/mastercurrency-wp )

Why? (缺少什么?)

我刚刚更新了插件,所以在wordpress之前可能需要一些时间。组织更新it声明?

1 个回复
最合适的回答,由SO网友:fuxia 整理而成

常量或变量的值只能由PHP解析器计算。用于extract the translatable strings 是用PHP编写的,但只是一个字符串解析器。它不会运行你的代码,因为那样会太慢而且容易出错。

下面是一个例子,说明这可能有多复杂:

interface FooTranslate
{
    const TEXT_DOMAIN = \'foo\';
}
interface BarTranslate extends FooTranslate {}

class FooBar implements BarTranslate
{
    public function greeting()
    {
        _e( \'hello!\', self::TEXT_DOMAIN );
    }
}

(new FooBar)->greeting();
现在,在不执行PHP的情况下,为文本域找到正确的字符串值。困难的

所有对翻译函数的调用都必须使用一个简单的字符串。

这个developer handbook 非常清楚地告诉我们,不幸的是,以错误消息的形式并使用错误的引号:

不要对gettext函数的文本域部分使用变量名。不要将此作为快捷方式:__( ‘Translate me.’ , $text_domain );

第二点注意:请do not load your translation files on init. 这是昂贵的:现在,这些文件在每次调用AJAX请求、评论提交和其他可能与插件无关的文件时都会加载。在要求WordPress包含文件之前,请检查当前请求上下文。

相关推荐

Can I make plugins required?

我正在开发自己的Wordpress主题,将用于多个客户端。它有一个主题选项页面,这样我每次都可以轻松自定义网站,但我也会在我制作的每个网站上使用一些插件(如SEO插件、安全性等)。有没有办法让它们成为“必需的”,这样我就可以得到这些插件的列表,这样当我在新网站上安装主题时就不必在插件目录中找到它们了?