自定义 WordPress 插件不显示翻译
custom WordPress plugin is not showing the translations
我正在努力创建一个自定义 wordpress 插件,但在尝试进行翻译时遇到了这个问题。我的一切都正确完成。
例如:
插件文件夹名称 'translated_plugin' 和主文件 'translated_plugin.php'
<?php
/**
* Plugin Name: Translated Plugin
* Plugin URI: https://example.com
* Description: Example Plugin Description
* Version: 1.0.0
* Author: dev
* Author URI: https://example.com
* License: GPL-2.0+
* License URI: http://www.gnu.org/licenses/gpl-2.0.txt
* Text Domain: translated_plugin
* Domain Path: /languages
*/
if ( !defined( 'WPINC' ) ) {
die;
}
require __DIR__ . '/vendor/autoload.php';
$app = new Application();
register_activation_hook( __FILE__, [$app, 'activate'] );
register_deactivation_hook( __FILE__, [$app, 'deactivate'] );
例子'class_Application'class
class Application {
public function __construct() {
add_action( 'init', [$this, 'translate_it'] );
echo __('Test Text', 'translated_plugin');
}
public function translate_it(){
$loaded = load_plugin_textdomain( 'translated_plugin', false, dirname(dirname( plugin_basename( __FILE__ ) )) . '/languages/' );
// $loaded returns true when vardump($loaded), means textdomain path is correct and domain is loaded
}
}
在 languages 文件夹中,pot 文件 'translated_plugin.pot' 是由 loco 翻译插件生成的。 .mo 文件也是通过 loco 翻译插件的翻译过程生成的。但文本不会根据 WordPress 设置中的语言而改变。
(测试主题上的类似过程工作正常,但不确定为什么不对插件工作,即使翻译文件正确,文件名与文本域相同,已加载是真的)
这里可能有什么问题或者 WordPress 的错误?
谢谢!
在 OP 更新代码后编辑:
好的,现在我看到了:那个 echo 命令在 translate_it()
触发之前发生。 add_action()
函数将函数添加到队列中,以便在 init
操作设置为触发时触发,但不是立即触发。尝试将 echo 命令放在 load_plugin_textdomain()
.
下面的 translate_it()
函数中
class Application {
public function __construct() {
add_action( 'init', [$this, 'translate_it'] );
echo __('Test Text', 'translated_plugin'); //Will fire before text domain is loaded
}
public function translate_it(){
$loaded = load_plugin_textdomain( 'translated_plugin', false, dirname(dirname( plugin_basename( __FILE__ ) )) . '/languages/' );
// $loaded returns true when vardump($loaded), means textdomain path is correct and domain is loaded
echo __('Test Text', 'translated_plugin'); //Will fire after text domain is loaded
}
}
如果您想直观了解事件的顺序,请按以下步骤进行
- WordPress 启动
- WordPress 加载插件
$app = new Application();
运行 __construct() 函数
add_action( 'init', [$this, 'translate_it'] );
将函数添加到队列
- 回显“测试文本”
- WordPress 做一些其他的事情...
- WordPress 达到
do_action( 'init' );
- 现在您的
translate_it()
函数运行,加载文本域
原始答案(现已过时):
您似乎在使用两个不同的文本域:__()
调用中的 translated_plugin
和 load_plugin_textdomain()
调用中的 adev_translated_plugin
。我相当确定那些必须相同。看起来你打算在所有地方使用 adev_translated_plugin
,这可能是最好的选择。所以这会让你的构造函数看起来像这样:
public function __construct() {
add_action( 'init', [$this, 'translate_it'] );
echo __('Test Text', 'adev_translated_plugin');
}
我正在努力创建一个自定义 wordpress 插件,但在尝试进行翻译时遇到了这个问题。我的一切都正确完成。
例如: 插件文件夹名称 'translated_plugin' 和主文件 'translated_plugin.php'
<?php
/**
* Plugin Name: Translated Plugin
* Plugin URI: https://example.com
* Description: Example Plugin Description
* Version: 1.0.0
* Author: dev
* Author URI: https://example.com
* License: GPL-2.0+
* License URI: http://www.gnu.org/licenses/gpl-2.0.txt
* Text Domain: translated_plugin
* Domain Path: /languages
*/
if ( !defined( 'WPINC' ) ) {
die;
}
require __DIR__ . '/vendor/autoload.php';
$app = new Application();
register_activation_hook( __FILE__, [$app, 'activate'] );
register_deactivation_hook( __FILE__, [$app, 'deactivate'] );
例子'class_Application'class
class Application {
public function __construct() {
add_action( 'init', [$this, 'translate_it'] );
echo __('Test Text', 'translated_plugin');
}
public function translate_it(){
$loaded = load_plugin_textdomain( 'translated_plugin', false, dirname(dirname( plugin_basename( __FILE__ ) )) . '/languages/' );
// $loaded returns true when vardump($loaded), means textdomain path is correct and domain is loaded
}
}
在 languages 文件夹中,pot 文件 'translated_plugin.pot' 是由 loco 翻译插件生成的。 .mo 文件也是通过 loco 翻译插件的翻译过程生成的。但文本不会根据 WordPress 设置中的语言而改变。
(测试主题上的类似过程工作正常,但不确定为什么不对插件工作,即使翻译文件正确,文件名与文本域相同,已加载是真的) 这里可能有什么问题或者 WordPress 的错误? 谢谢!
在 OP 更新代码后编辑:
好的,现在我看到了:那个 echo 命令在 translate_it()
触发之前发生。 add_action()
函数将函数添加到队列中,以便在 init
操作设置为触发时触发,但不是立即触发。尝试将 echo 命令放在 load_plugin_textdomain()
.
translate_it()
函数中
class Application {
public function __construct() {
add_action( 'init', [$this, 'translate_it'] );
echo __('Test Text', 'translated_plugin'); //Will fire before text domain is loaded
}
public function translate_it(){
$loaded = load_plugin_textdomain( 'translated_plugin', false, dirname(dirname( plugin_basename( __FILE__ ) )) . '/languages/' );
// $loaded returns true when vardump($loaded), means textdomain path is correct and domain is loaded
echo __('Test Text', 'translated_plugin'); //Will fire after text domain is loaded
}
}
如果您想直观了解事件的顺序,请按以下步骤进行
- WordPress 启动
- WordPress 加载插件
$app = new Application();
运行 __construct() 函数add_action( 'init', [$this, 'translate_it'] );
将函数添加到队列- 回显“测试文本”
- WordPress 做一些其他的事情...
- WordPress 达到
do_action( 'init' );
- 现在您的
translate_it()
函数运行,加载文本域
原始答案(现已过时):
您似乎在使用两个不同的文本域:__()
调用中的 translated_plugin
和 load_plugin_textdomain()
调用中的 adev_translated_plugin
。我相当确定那些必须相同。看起来你打算在所有地方使用 adev_translated_plugin
,这可能是最好的选择。所以这会让你的构造函数看起来像这样:
public function __construct() {
add_action( 'init', [$this, 'translate_it'] );
echo __('Test Text', 'adev_translated_plugin');
}