Múltiples formas plurales en gettext()

3 minutos de lectura

avatar de usuario
Atadj

Vea este ejemplo de _n(); función (http://codex.wordpress.org/Function_Reference/_n):

sprintf( _n('%d comment.', '%d comments.', $number, 'text-domain'), $number );

en inglés:

1 Comment
2 Comments

en idiomas como el polaco hay un patrón diferente y múltiples formas plurales:

1 Komentarz
2 Komentarze
3 Komentarze
4 Komentarze
5 Komentarzy
6 Komentarzy
...
21 Komentarzy
22 Komentarze
23 Komentarze
24 Komentarze
25 Komentarzy
...
31 Komentarzy
32 Komentarze
...
91 Komentarzy
92 Komentarze
...
111 Komentarzy
112 Komentarzy (!)
...
121 Komentarzy
122 Komentarze

Estoy buscando alguna forma de permitir que los traductores establezcan su propio patrón si su idioma admite múltiples formas plurales. ¿Puedes pensar en algún enfoque PHP creativo para hacer esto?

Se me ocurre alguna solución (pero aún así los traductores no podrán establecer ningún patrón):

if($number == 1){
    $message = __(‘1 Komentarz’ , ‘text-domain’);
}else if($number == 2){
    $message = __(‘2 Komentarze’ , ‘text-domain’);
}else if($number == 3){
    $message = __(‘3 Komentarze’ , ‘text-domain’);
}

EDITAR: Encontré esto en el archivo PO para polaco: "Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" pero aun no entiendo como prepararme _n(); función para apoyar eso.

avatar de usuario
Akky

Primero, su archivo de configuración regional debe tener la definición de plural. Como agregó en la pregunta, en el caso polaco puede ver

"Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"

o una definición similar en el archivo (domain_name)-pl.po.

Luego, debe preparar la traducción de “%d comentario”/”%d comentarios” en el archivo .po. Por ejemplo,

msgid "%d Comment"
msgid_plural "%d Comments"
msgstr[0] "%d Komentarz"
msgstr[1] "%d Komentarze"
msgstr[2] "%d Komentarzy"

Compile el archivo .po en el archivo .mo y colóquelo en una carpeta adecuada. (por ejemplo, idiomas/(nombre_de_dominio)-pl.mo

En su código de WordPress (complemento/tema, supongo), puede llamarlo así,

for ($i=1;$i<15;$i++) {
  printf(_n("%d Comment", "%d Comments", $i, "(domain_name)"), $i);echo "<br />";
}
printf(_n("%d Comment", "%d Comments", 112, "(domain_name)"), 112);echo "<br />";

luego, por supuesto, configure la configuración regional de WordPress en polaco, en wp-config.php,

define ('WPLANG', 'pl');

deberías ver los resultados con las formas plurales correctas.

  • Su respuesta es en gran parte correcta (excepto que no necesita for() – funcionará con solo _n(); incluso si admite teóricamente sólo dos formas plurales). Lo descubrí ayer 🙂 ¡Gracias!

    – Atadj

    26 de agosto de 2012 a las 15:11

  • El ciclo for es solo para mostrar los textos generados con más números.

    – Akky

    12 de noviembre de 2012 a las 6:45

  • Podrías explicar "Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" ¿un poco más? ¿Es esto parte de babel.cfg (en matraz_babel)? ¿O el archivo de la olla? El archivo po?

    – Martín Tomas

    11 de agosto de 2019 a las 19:54

  • Está en el archivo .po para convertirlo en un archivo .mo, luego gettext usa la definición.

    – Akky

    12 de agosto de 2019 a las 22:57

Creo que encontré una manera de hacer lo que quiero. La aplicación POEdit le permite crear múltiples formas plurales utilizando el patrón que puede especificar en la configuración.

El traductor tiene que codificar el patrón por su cuenta (ver patrón para polaco en mi pregunta). Todavía estoy investigando ese tema, pero si alguien tiene una pregunta similar, es un buen lugar para comenzar: http://www.poedit.net/trac/wiki/Doc/PluralForms

¿Ha sido útil esta solución?