Tag: 国际化i18n优化

  • WordPress 6.7 国际化改进:翻译管理与性能优化

    WordPress 6.7 国际化改进:翻译管理与性能优化

    WordPress 6.7 中有各种国际化(i18n)改进,我们一起看看这些改进。

    确定翻译是否存在

    有时,无需先加载给定文本域的翻译,即可知道内存中是否已存在翻译,这一点很有用。新has_translation()功能正是可以实现这一点。

    有关更多详细信息,请参阅#52696 / [59029]

    图片[1]-361Sale WordPress Care

    以管理员的语言环境发送电子邮件

    在 4.7 版中,WordPress 增加了让用户设置其首选语言环境的功能。向用户发送电子邮件时,电子邮件始终以该语言环境发送,而其他所有人都会以站点的语言环境收到电子邮件。

    现在,WordPress 6.7 又迈进了一步:每次向管理员电子邮件地址 ( admin_email) 发送电子邮件时,WordPress 都会检查是否存在具有相同电子邮件地址的用户。如果存在,则以该用户的语言环境发送电子邮件。

    有关更多详细信息,请参阅#61518 / [59128]

    图片[2]-361Sale WordPress Care

    如果翻译加载过早,则会发出警告

    如果开发人员在插件或主题中过早加载翻译(在当前用户尚未知晓之前),WordPress 现在会发出警告。现有功能(如load_plugin_textdomain()和 )load_theme_textdomain()已更新,以将实际加载推迟到核心中现有的即时翻译逻辑。这降低了触发警告的可能性,甚至在某些情况下通过避免加载在给定页面上不需要的翻译来提高性能。

    after_setup_theme当尝试在或之前加载翻译时init,WordPress 会尝试比平时更早地加载当前用户,而不会给其他插件可能参与该过程的机会。它还会阻止任何插件过滤翻译调用,例如切换语言环境或文件位置。因此添加此警告以指出这种意外行为。

    图片[3]-361Sale WordPress Care

    有关更多详细信息,请参阅#44937[59127][59157] 。

    _doing_it_wrong()例如,如果直接调用get_plugin_data()(默认情况下会尝试加载翻译)或__()不等待钩子,插件可能会出现这种情况init。以下是在实际已修复的插件中发现的一个常见示例:

    /**
     * Plugin Name: Awesome Plugin
     */
    
    function myplugin_get_version() {
    	require_once ABSPATH . 'wp-admin/includes/plugin.php';
    	// Prevent early translation call by setting $translate to false.
    	$plugin_data = get_plugin_data( __FILE__, false, /* $translate */ false );
    	return $plugin_data['Version'];
    }
    
    define( 'MYPLUGIN_VERSION', myplugin_get_version() );

    如果在调用时未明确设置$translate为,则该函数默认翻译插件元数据。由于此插件只需要版本号,因此无需翻译任何其他字段。falseget_plugin_data()

    另一个例子:

    /**
     * Plugin Name: Awesome Plugin
     */
    
    class My_Awesome_Plugin {
    	public $name;
    	public function __construct() {
    		// This triggers just-in-time translation loading
    		$this->name = __( 'My Awesome Plugin', 'my-awesome-plugin' );
    
    		// ... do something
    	}
    }
    
    // This immediately instantiates the class, way before `init`.
    $myplugin = new My_Awesome_Plugin();

    这里,类在主插件文件中立即实例化,类构造函数中的代码使用转换函数。可以通过将类实例化推迟到之后init或将转换调用推迟到真正需要时来避免这种情况。

    如果插件受到此警告的影响,可以使用如下代码来找出触发该警告的代码路径:

    add_action(
    	'doing_it_wrong_run',
    	static function ( $function_name ) {
    		if ( '_load_textdomain_just_in_time' === $function_name ) {
    			debug_print_backtrace();
    		}
    	}
    );

    在这种情况下,Query Monitor之类的开发工具也很有用。

    图片[4]-361Sale WordPress Care