在插件中使用REGISTER_POST_STATUS()的仅复数转换

时间:2013-01-14 作者:mrwweb

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(), 或者像编辑流这样的插件。

1 个回复
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]
)

结束

相关推荐

Wp-content/plugins中的权限问题

我在本地机器上安装了一个WP,试图用插件弄脏我的手。我希望从github克隆一个包含此插件代码的项目。然而,我没有插件内部的权限,作为一个没有su权限的普通用户,我无法做到这一点。(当然,我可以成为根并这样做,但我不认为这是应该的)。然后,默认情况下,WP安装中的文件夹将组设置为“tape”,这对我来说很奇怪。本地WP安装上内部文件夹的正确权限应该是什么?