自定义 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
}


}

如果您想直观了解事件的顺序,请按以下步骤进行

  1. WordPress 启动
  2. WordPress 加载插件
  3. $app = new Application(); 运行 __construct() 函数
  4. add_action( 'init', [$this, 'translate_it'] ); 将函数添加到队列
  5. 回显“测试文本”
  6. WordPress 做一些其他的事情...
  7. WordPress 达到 do_action( 'init' );
  8. 现在您的 translate_it() 函数运行,加载文本域

原始答案(现已过时):

您似乎在使用两个不同的文本域:__() 调用中的 translated_pluginload_plugin_textdomain() 调用中的 adev_translated_plugin。我相当确定那些必须相同。看起来你打算在所有地方使用 adev_translated_plugin,这可能是最好的选择。所以这会让你的构造函数看起来像这样:

public function __construct() {
    add_action( 'init', [$this, 'translate_it'] );
    echo __('Test Text', 'adev_translated_plugin');
}