Usando la traducción en plural de register_post_status () en el complemento

4

tl; dr: mi complemento quiere traducir cadenas del núcleo u otros complementos que utilicen _n_noop (). ¿Cómo?

Esta pregunta está relacionada con este complemento y es una especie de seguimiento hasta esta pregunta .

Mi complemento agrega "{estado} (n)" (por ejemplo, "Borradores (10)") a los menús de administración para cualquier tipo de publicación. Admite cualquier estado de publicación agregado con register_post_status() porque captura todos los estados con la función get_post_stati() (no el get_post_statuses() similarmente irritante).

Cuando alguien registra un estado de publicación con register_post_status() , uno incluye un valor label_count en el $args que es perfecto para lo que necesito. Siempre me gustaría mostrar el recuento de etiquetas plural en el menú y usar sprintf() para eliminar el valor del recuento.

Aquí hay un extracto truncado del código del complemento actual (ese primer sprintf() es lo que estoy buscando cambiar):

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

        );
    }
}

Esto funciona bien, pero no es traducible.

Puedo ver que cuando WordPress registra la publicación stati en el núcleo (en /wp-includes/post.php ) , utiliza la función _n_noop() para permitir traducciones plurales:

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

Sin embargo, no he podido averiguar cómo hacer funcionar la cadena traducida. Creo que necesito usar translate_nooped_plural() , pero no he podido hacer que eso funcione (y realmente, solo quiero usar la cadena plural incluso si solo hay una publicación en un estado). En segundo lugar, realmente pierdo el dominio de texto que debo usar porque los estados podrían provenir de Core, una llamada personalizada o register_post_status() , o un flujo de edición similar a un plugin.

    
pregunta mrwweb 14.01.2013 - 20:39

1 respuesta

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

Esto debería funcionar como se espera para las traducciones principales. Ahora necesita el dominio de texto, así que busquemos la cadena que desea traducir

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

    $domain = '';
}

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

Y ahora puede modificar el primer fragmento de código a

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

Solo necesita la forma plural del estado de la publicación, simplemente aumente el valor de conteo en translate_nooped_plural()

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

Esto siempre devolverá la forma plural porque el valor de conteo es mayor que 1. Asegúrese de usar un valor más gris que 3, porque en algunos idiomas hay diferencias entre los casos para uno, dos o más.

Solo para aclarar:

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

Lea otras preguntas en las etiquetas