Usando plural-somente tradução de register_post_status () no plugin

4

tl; dr: Meu plugin quer traduzir strings do core ou outros plugins que usam _n_noop (). Como?

Esta questão relacionada a este plugin é uma espécie de acompanhamento para esta questão .

Meu plugin adiciona "{status} (n)" (por exemplo, "Rascunhos (10)") aos menus de administração para qualquer tipo de postagem. Ele suporta qualquer status de postagem adicionado com register_post_status() , porque ele pega todos os status com a função get_post_stati() (não o irritantemente semelhante get_post_statuses() ).

Quando alguém registra um status de postagem com register_post_status() , um inclui um valor label_count no $args que é perfeito para o que eu preciso. Sempre gostaria de exibir a contagem de rótulos plural no menu e usar sprintf() para diminuir o valor da contagem.

Aqui está um trecho truncado do código do plug-in atual (esse primeiro sprintf() é a coisa que eu estou tentando mudar):

<?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
            )

        );
    }
}

Isso funciona bem, mas é intraduzível.

Eu posso ver que quando o WordPress registra o post stati no core (em /wp-includes/post.php ) , ele usa a função _n_noop() para permitir traduções plurais:

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>' ),
) );

No entanto, não consegui descobrir como fazer a string traduzida funcionar. Eu acho que preciso usar translate_nooped_plural() , mas eu não consegui fazer isso funcionar (e realmente, eu só quero usar a string plural mesmo se houver apenas uma postagem em um status). Em segundo lugar, estou realmente perdendo o domínio de texto que deveria usar, porque os status poderiam estar vindo do núcleo, de uma chamada personalizada ou de register_post_status() ou de um plug-in como o fluxo de edição.

    
por mrwweb 14.01.2013 / 20:39

1 resposta

2
// 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
  ),

Isso deve funcionar como esperado para as principais traduções. Agora você precisa do textdomain, então vamos procurar a string que você deseja traduzir

foreach ( $GLOBALS['l10n'] as $domain => $data ) {
    if ( in_array( $ps_status_label[0], array_keys( $data->entries ) ) )
        break;

    $domain = '';
}

$domain = ( ! empty( $domain ) ) ? $domain : 'default';

E agora você pode alterar o primeiro snippet de código para

// 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
  ),

Você só precisa da forma plural do status da postagem, apenas aumente o valor da contagem em translate_nooped_plural()

sprintf(
  translate_nooped_plural(
    $ps_status_label,
    10,
    $domain
  ),
  $ps_status_count
),

Isso sempre retornará o formulário plural porque o valor da contagem é maior que 1. Certifique-se de usar um valor grater que 3, porque em alguns idiomas existem diferenças entre os casos para um, dois ou mais.

Apenas para esclarecer:

translate_nooped_plural(
  [array(
    [string for singular]
    [string for plural]
  ),
  [count] (1 = select singular string, greater than 1 select the plural string)
  [domain]
)
    
por Ralf912 24.01.2013 / 05:14