tl;dr:我的插件想从使用\\u n\\u noop()的核心插件或其他插件转换字符串。怎样
此问题与this plugin 是对this question.
我的插件将“{status}(n)”(例如,“Drafts(10)”)添加到任何帖子类型的管理菜单中。它支持添加的任何post状态register_post_status()
因为它通过get_post_stati()
功能(不太相似get_post_statuses()
).
当某人向注册post状态时register_post_status()
, 一个包括label_count
中的值$args
这正是我所需要的。我总是希望在菜单中显示复数标签计数,并使用sprintf()
输入计数值。
以下是current plugin code (首先sprintf()
是我想要改变的事情):
<?php
// an array of all the statuses
$ps_statuses = get_post_stati( array( \'show_in_admin_status_list\' => true ), \'objects\' );
// a filter for the list of statuses for anything people want to do that\'s plugin specific
$ps_statuses = apply_filters( \'psmi_statuses\', $ps_statuses );
// Get status counts of all post types
$ps_status_counts = wp_count_posts( $ps_type_id );
foreach( $ps_statuses as $status ) {
$ps_status_id = $status->name;
$ps_status_count = $ps_status_counts -> $ps_status_id;
// If a status has any posts, show it
if( $ps_status_count > 0 ) {
// Get the plural post status label
$ps_status_label = $status->label_count[\'plural\'];
$submenu[$menu][] = array(
sprintf(
$ps_status_label,
$ps_status_count
),
\'read\',
sprintf(
\'%1$sedit.php?post_status=%2$s&post_type=%3$s\',
get_admin_url(),
$ps_status_id,
$ps_type_id
)
);
}
}
这很好用,但无法翻译。
我可以看到当WordPress注册post stati时in core (in /wp-includes/post.php
), 它使用_n_noop()
允许复数翻译的函数:
register_post_status( \'draft\', array(
\'label\' => _x( \'Draft\', \'post\' ),
\'protected\' => true,
\'_builtin\' => true, /* internal use only. */
\'label_count\' => _n_noop( \'Draft <span class="count">(%s)</span>\', \'Drafts <span class="count">(%s)</span>\' ),
) );
然而,我还没有弄清楚如何让翻译后的字符串工作。我想我需要使用
translate_nooped_plural()
, 但我还没能做到这一点(实际上,我只想使用复数字符串,即使状态中只有一篇帖子)。其次,我真的不知道应该使用什么文本域,因为状态可能来自核心、自定义调用或
register_post_status()
, 或者像编辑流这样的插件。
SO网友:Ralf912
// Get the plural post status label
$ps_status_label = $status->label_count;
$submenu[$menu][] = array(
sprintf(
translate_nooped_plural(
$ps_status_label,
$ps_status_count
),
$ps_status_count
),
这应该与核心翻译的预期一样有效。现在您需要textdomain,所以让我们搜索您要翻译的字符串
foreach ( $GLOBALS[\'l10n\'] as $domain => $data ) {
if ( in_array( $ps_status_label[0], array_keys( $data->entries ) ) )
break;
$domain = \'\';
}
$domain = ( ! empty( $domain ) ) ? $domain : \'default\';
现在您可以将第一个代码段更改为
// Get the plural post status label
$ps_status_label = $status->label_count;
$submenu[$menu][] = array(
sprintf(
translate_nooped_plural(
$ps_status_label,
$ps_status_count,
$domain
),
$ps_status_count
),
您只需要post status的复数形式,只需在
translate_nooped_plural()
sprintf(
translate_nooped_plural(
$ps_status_label,
10,
$domain
),
$ps_status_count
),
这将始终返回复数形式,因为计数值大于1。请确保使用大于3的值graeter,因为在某些语言中,一个、两个或多个值的大小写之间存在差异。
只是为了澄清:
translate_nooped_plural(
[array(
[string for singular]
[string for plural]
),
[count] (1 = select singular string, greater than 1 select the plural string)
[domain]
)