TigerZF
🌐Español

74.6. Notaciones de plural para la traducción

Desde Zend Framework 1.9, Zend_Translate es capaz de proporcionar soporte para plurales. La traducción profesional siempre tendrá la necesidad de usar plurales, ya que son nativos en casi todos los idiomas.

Entonces, ¿qué son los plurales? En general, hablando de forma amplia, los plurales son palabras que tienen en cuenta significados numéricos. Pero como puede imaginar, cada idioma tiene su propia definición de plurales. El inglés, por ejemplo, admite un solo plural. Tenemos una definición singular, por ejemplo "car", que significa implícitamente un coche, y tenemos la definición plural, "cars", que podría significar más de un coche pero también cero coches. Otros idiomas como el ruso o el polaco tienen más plurales y además las reglas para los plurales son diferentes.

Cuando desee usar plurales con Zend_Translate no necesita saber cómo se definen los plurales, solo el traductor debe saberlo, ya que es quien realiza la traducción. La única información que necesita tener es el idioma.

Hay dos formas de usar plurales... la tradicional, que significa que usa un método propio, y una moderna, que le permite hacer traducciones de plural con el mismo método que las traducciones normales.

74.6.1. Traducciones de plural tradicionales

Las personas que hayan trabajado con gettext en el pasado estarán más familiarizadas con las traducciones de plural tradicionales. Existe un método propio plural() que puede usarse para traducciones de plural.

Ejemplo 74.18. Ejemplo de traducciones de plural tradicionales

El método plural() acepta 4 parámetros. El primer parámetro es el messageId singular, el segundo es el messageId plural y el tercero es el número o cantidad.

El número se utilizará para detectar el plural que debe devolverse. Se puede usar un cuarto parámetro opcional para indicar un locale que se utilizará para devolver la traducción.

$translate = new Zend_Translate(
    array(
        'adapter' => 'gettext',
        'content' => '/path/to/german.mo',
        'locale'  => 'de'
    )
);
$translate->plural('Car', 'Cars', $number);

74.6.2. Traducciones de plural modernas

Dado que las traducciones de plural tradicionales están restringidas a código fuente que usa plurales en inglés, hemos añadido una nueva forma de traducciones de plural. Permite usar el mismo translate() tanto para traducciones estándar como para traducciones de plural.

Para usar traducciones de plural con translate() necesita dar un array como messageId en lugar de una cadena. Este array debe tener los messageId's originales del plural, luego la cantidad y por último un locale opcional cuando los messageId's dados no estén en notación inglesa.

Ejemplo 74.19. Ejemplo de traducciones de plural modernas

Cuando queremos traducir las mismas definiciones de plural que en el ejemplo anterior, tendría que definirse como se muestra a continuación.

$translate = new Zend_Translate(
    array(
        'adapter' => 'gettext',
        'content' => '/path/to/german.mo',
        'locale'  => 'de'
    )
);
$translate->translate(array('Car', 'Cars', $number));

Usando traducciones de plural modernas también es posible usar cualquier idioma como fuente para los messageId's.

Ejemplo 74.20. Ejemplo de traducciones de plural modernas usando un idioma de origen diferente

Supongamos que queremos usar el ruso y también supongamos que los messageId's dados están en ruso y no en inglés.

$translate = new Zend_Translate(
    array(
        'adapter' => 'gettext',
        'content' => '/path/to/german.mo',
        'locale'  => 'de'
    )
);
$translate->translate(
    array(
        'Car',
        'Cars first plural',
        'Cars second plural',
        $number,
        'ru'
    )
);

Como puede ver, puede dar más de un solo plural en inglés. Pero en este caso debe dar el idioma de origen para que Zend_Translate sepa qué reglas de plural debe aplicar.

Cuando omite el idioma del plural, entonces se utilizará el inglés por defecto y cualquier definición de plural adicional será ignorada.

74.6.3. Archivos de origen de plural

No todos los formatos de origen admiten formas plurales. Consulte esta lista para más detalles:

Tabla 74.3. Soporte de plurales

Adaptador Plurales soportados
Array
Csv
Gettext
Ini no
Qt no
Tbx no
Tmx no
Xliff no
XmlTm no

A continuación puede encontrar ejemplos de archivos de origen con plurales definidos.

74.6.3.1. Origen array con definiciones de plural

Un array con definiciones de plural debe tener el aspecto del siguiente ejemplo.

array(
    'plural_0' => array(
        'plural_0 (ru)',
        'plural_1 (ru)',
        'plural_2 (ru)',
        'plural_3 (ru)'
    ),
    'plural_1' => ''
);

En el ejemplo anterior, 'plural_0' y 'plural_1' son las definiciones de plural del código fuente. Y el array en 'plural_0' tiene disponibles todas las formas plurales traducidas. Eche un vistazo al siguiente ejemplo con contenido real y traducción de origen en inglés a alemán.

array(
    'Car' => array(
        'Auto',
        'Autos'
    ),
    'Cars' => ''
);

Cuando su idioma traducido admita más formas plurales, simplemente añádalas al array debajo de la primera forma plural. Cuando su idioma de origen admita más formas plurales, simplemente añada una nueva traducción vacía.

74.6.3.2. Origen Csv con definiciones de plural

Un archivo csv con definiciones de plural debe tener el aspecto del siguiente ejemplo.

"plural_0";"plural_0 (ru)";"plural_1 (ru)";"plural_2 (ru)";"plural_3 (ru)"
"plural_1";

Todas las formas plurales traducidas deben añadirse después del primer plural del idioma de origen. Y todas las demás formas plurales del idioma de origen deben añadirse debajo pero sin traducción. Tenga en cuenta que debe añadir un delimitador a los plurales de origen vacíos.

74.6.3.3. Origen Gettext con definiciones de plural

Los orígenes gettext admiten formas plurales de fábrica. No es necesaria ninguna adaptación, ya que el archivo *.mo contendrá todos los datos necesarios.

[Note] Nota

Tenga en cuenta que gettext no admite el uso de idiomas de origen que no utilicen formas plurales inglesas. Cuando planee usar un idioma de origen que admita otras formas plurales, como el ruso por ejemplo, entonces no podrá usar orígenes gettext.

74.6.4. Reglas de plural personalizadas

En casos poco frecuentes puede ser útil poder definir reglas de plural propias. Vea el chino como ejemplo. Este idioma define dos reglas de plural. Por defecto no usa plurales. Pero en casos poco frecuentes usa una regla como (number == 1) ? 0 : 1.

También cuando desee usar un idioma que no tenga reglas de plural conocidas, y quisiera definir sus propias reglas.

Esto puede hacerse usando Zend_Translate_Plural::setRule(). El método espera dos parámetros que deben proporcionarse. Una regla, que es simplemente un callback a un método definido por uno mismo. Y un locale para el cual se usará la regla.

Su regla podría verse así:

public function MyRule($number) {
    return ($number == 10) ? 0 : 1;
}

Como puede ver, su regla debe aceptar un parámetro. Es el número que usará para determinar qué plural debe usar la traducción. En nuestro ejemplo definimos que cuando obtengamos un '10' debe usarse la definición de plural 0, en todos los demás casos usamos la 1.

Sus reglas pueden ser tan simples o tan complicadas como quiera. Solo debe devolver un valor entero. La definición de plural 0 representa la traducción singular, y 1 representa la primera regla de plural.

Para activar su regla, y vincularla al locale deseado, debe llamarla de este modo:

Zend_Translate_Plural::setPlural('MyPlural', 'zh');

Ahora hemos vinculado nuestra definición de plural al idioma chino.

Puede definir una regla de plural para cada idioma. Pero debe tener en cuenta que debe establecer las reglas de plural antes de realizar traducciones.

[Note] Defina plurales personalizados solo cuando sea necesario

Zend_Translate define plurales para la mayoría de los idiomas conocidos. No debería definir plurales propios cuando no lo necesite. Las reglas por defecto funcionan la mayor parte del tiempo.