是否可以在不将.po/.mo文件添加到插件目录的情况下将语言文件添加到插件?

时间:2013-11-06 作者:jjeaton

我需要向现有插件添加一个语言文件。不是因为翻译的原因,而是因为我想把某个单词的所有出现处都改成其他单词。而我可以放下另一个。采购订单/。mo文件设置到插件的语言目录中,我不想在插件更新时丢失语言文件。

如果使用的插件load_textdomainWP_LANG_DIR 除了load_plugin_textdomain 然后我可以顺便去看看。采购订单文件到/wp-content/languages/ 这会奏效的。

BuddyPress就是这样做的,并且有我想要做的事情的说明:http://codex.buddypress.org/getting-started/customizing/customizing-labels-messages-and-urls/. 我把所有对“集团”的称呼都改成了“社区”。

我所要做的就是将正确命名的文件放入/wp-content/languages/ 目录和文件已加载。

我试图修改的插件是:BuddyPress Group Email Subscription.

它使用以下函数加载语言:

function activitysub_textdomain() {
    load_plugin_textdomain( \'bp-ass\', false, dirname( plugin_basename( __FILE__ ) ) . \'/languages/\' );
}
add_action( \'init\', \'activitysub_textdomain\' );

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

最好的方法可能是使用第二个定制插件。

创建一个新的插件目录。可以将其称为“示例com自定义语言”或站点特有的语言。在那里,制作一个带有插件头的php文件,描述插件的功能(为了您自己的理智),然后执行以下操作:

add_action(\'plugins_loaded\',\'example_com_custom_langs_plugins_loaded\');

function example_com_custom_langs_plugins_loaded() {
  remove_action(\'init\', \'activitysub_textdomain\'); // disable the old lang files
  add_action(\'init\',\'example_com_custom_langs_init\'); // load our new lang files
}

function example_com_custom_langs_init() {
  load_plugin_textdomain( \'bp-ass\', false, dirname( plugin_basename( __FILE__ ) ) . \'/languages/\' );
}
现在,您可以将您的语言文件放入这个新插件的/languages目录中,它们将被加载,而不是其他插件中的原始文件。当其他插件更新时,此插件不会得到更新。因此,只要它们不从“bp ass”改为textdomain,你的就会被使用。

SO网友:Oleg Butuzov

我相信你可以用load_textdomain_mofile 滤器

add_filter(\'load_textdomain_mofile\', \'custom_load_textdomain_mofile\', 10, 2);
function custom_load_textdomain_mofile( $mofile, $domain){
    if ($domain == \'bp-ass\')
        $mofile = \'somepath/to/your/mo/file.mo\';
    return $mofile;
}
不同之处(比较Otto)是您实际上可以为domain 不知道如何更改(触发)本地化。

SO网友:Mark Kaplun

buddypress的方式很愚蠢,你不应该使用翻译来影响服务器和软件行为,翻译应该只针对标签(昨天刚刚花了一个小时试图找出CPT不起作用的原因,结果是因为它的类型是可翻译的,我翻译了它)。

奥托和奥列格的回答在技术上是正确的,但他们忽略了一个问题——未来的升级。插件的升级最终将丢弃您想要覆盖的字符串,然后您的更改将消失,并且由于此更改不是实际代码的一部分,因此没有人会记住您所做的操作,并且能够再次执行。此外,根据您想要进行的更改的类型和数量,您可能会使插件的任何文档都无法使用。

换言之,您正在分叉插件的代码,升级将在任何情况下扼杀您的更改,因此为什么不在代码级别执行这些操作,这样它们将很容易找到,然后更改插件名称和slug以防止错误升级。

说明:假设原始插件具有<? _e(\'give me money!\',\'text-domain\')?> 你想这样而不是打印“给我钱!”您希望打印“请给我您的钱”,您可以使用其他答案中描述的方法来实现这一点。

某个版本之后,插件的作者决定强调这个句子,并将其替换为<? _e(\'GIVE ME THE MONEY!\',\'text-domain\')?>, 但新字符串不在作为解决方案一部分使用的修改后的转换表中,因此没有得到预期的“请给我钱”,而是得到了“给我钱!”。这是一个很难弄清楚的bug,因为当它发生时,你会忘记你最初做过什么样的黑客。

结束

相关推荐

How to find installed plugins

我一直在寻找WordPress网站上安装的插件列表。虽然我找到了一种方法,“http wp plugins.nse”暴力脚本,但我不知道如何使用这个脚本。如果有人知道任何方法,请分享。