Castellaniza los nombre de tus modelos y controllers en CakePHP

Actualización: Por alguna razón el nuevo cake se niega a encontrar el singular de las palabras terminadas en “as”, he actualizado las reglas de inflexión para corregir este problema.

¿Alguna vez haz necesitado que los nombres de los modelos que creas en cake estén en español ? ¿Haz sufrido (como yo) los azares de hacer bake de nombres de tablas en español con una “a” al final? La solución es muy simple…. pero primero, algo de historia.

Algo increíble de CakePHP es que tiene la inteligencia necesaria para deducir sinónimos y plurales de palabras, lo cual es muy utlizado dentro de las convenciones de este framework para darle semántica a los nombres de archivo que se han de crear para cada capa de las aplicaciones.

Como podrás recordar, las convenciones dictan que los nombres de tabla deben estar en plural (cosa que a los purista de SQL no les agrada, puesto que una tabla representa una entidad, no un conjunto de ellas), los nombres de modelo en plural, que a veces representan el conjunto y a veces la entidad; finalmente los controladores, que deben ser nombrados igual que las tablas, pues representan acciones sobre el conjunto de datos.

El lado negativo de estas convenciones, es que, como fueron diseñadas para el idioma inglés, no toman en cuenta las inflexiones del lenguaje castellano, que si bien no son más complicadas que la de la lengua anglosajona, son un poco diferentes.

Una de las reglas que difieren entre estas dos lenguas, y que más me mortifican al momento de autogenerar código con CakePHP, son las palabras terminadas por “a”, puesto que el plural en inglés tiene terminación “um”, mientras que en la hermosa lengua castellana, simplemente se le agrega una “s” al final.

Pues bien, los desarrolladores de mi framework favorito sabían que el inglés no es el único idioma, así que dejaron la infraestructura armada para agregar o quitar reglas de inflexión muy sencillamente. A continuación les dejo mi archivo inflections.php, que debe ser depositado en la carpeta app/configs de tu aplicación cake, para ser utilizado. Si se les ocurren nuevas reglas de inflexión, por favor avísenme y se las iremos agregando hasta que cubramos las reglas enteras para el castellano:

  1. $pluralRules = array(‘/([r|d|j|n|l|m|y|z])$/i’ => \1es’,‘/a$/i’ => \1as’);
  2.  $uninflectedPlural = array();
  3.  $irregularPlural = array();
  4.  $singularRules = array(‘/([r|d|j|n|l|m|y|z])es$/i’ => \1, ‘/as$/i’ => ‘a’, ‘/([ti])a$/i’ => \1a’);
  5.  $uninflectedSingular = $uninflectedPlural;
  6.  $irregularSingular = array_flip($irregularPlural);

¡Qué lo disfruten!

Tags: ,


Comentarios

  1. Danilo Domínguez P.

    Tremenda ayuda con esas inflecciones. La verdad a veces nos puede causar problemas estos nombres en español.

  2. josepzin

    La verdad es que casi siempre suelo agregar los casos muy puntuales en que necesito una regla especial
    Este listado viene bien y lo voy a probar asi me olvido del tema.

  3. Manuel

    Muy buen aporte, ya me estaba complicando con esas reglas gringas… GRACIAS.

  4. Fabricio Sodano

    Hola!

    La verdad que tu artículo me ayudó mucho, así que te agradezco.

    Sin embargo, el otro día me encontré con un caso que no vi contemplado. Yo ‘heredé’ una base de datos, que tiene una tabla, cuyo nombre es ‘web_bases’

    El problema es que con las reglas de inflections.php, me modificaba el plural ‘bases’ a ‘basis’ como singular, cuando el singular es claramente ‘base’

    Así que le agregué un nuevo elemento a los arrays de inflection y me quedó así:

    ‘\1es’,
    ‘/a$/i’ => ‘\1as’,
    ‘/e$/i’ => ‘\1es’ //nuevo
    );

    $uninflectedPlural = array();

    $irregularPlural = array();

    $singularRules = array(
    ‘/([r|d|j|n|l|m|y|z])es$/i’ => ‘\1′,
    ‘/as$/i’ => ‘a’,
    ‘/([ti])a$/i’ => ‘\1a’,
    ‘/es$/i’ => ‘\1e’ //nuevo
    );

    $uninflectedSingular = $uninflectedPlural;

    $irregularSingular = array_flip($irregularPlural);
    ?>

    Ahora parece funcionar todo bien!

    Un saludo,
    Fabricio.

  5. Victor San Martin

    Una correción al la correción de Fabricio,

    $pluralRules = array(
    ‘/([r|d|j|n|l|m|y|z])$/i’ => ‘\1es’,
    ‘/a$/i’ => ‘\1as’,
    ‘/e$/i’ => ‘\1es’,
    ‘/s$/i’ => ‘\1ses’
    );

    $singularRules = array(
    ‘/([r|d|j|n|l|m|y|z])es$/i’ => ‘\1′,
    ‘/as$/i’ => ‘a’,
    ‘/([ti])a$/i’ => ‘\1a’,
    ‘/ises$/i’ => ‘\1is’, //nuevo
    ‘/es$/i’ => ‘e\1′,
    );

    El problema daba con la palabra Pais, me decia Paise.

    Saludos

  6. Sergio

    Buenas José,

    a ver si me puedes echar una mano. Estoy empezando con CakePHP y con la primera tabla de mi modelo ya tengo problemas de singulares/plurales (ya es puntería…). Se trata de ‘Serie’, al parecer el inflector lo traduce como ‘Series’ tanto en singular como en plural. ¿Alguna idea?

    Un saludo,

    Sergio.

  7. José Lorenzo

    @Sergio

    ¿Cual es exactamente el error que estás obteniendo?

  8. Sergio

    A ver, creo que he llegado a una solución un poco radical…

    el error era algo como “No se encuentra el modelo ‘Series’ …”, en lugar de ‘Serie’ que era el que yo creé. La causa parece estar en las variables $coreUninflectedPlural/Singular del Inflector de PHPCake, que contenían la palabra ‘Series’. Al final he optado por borrarla, y parece que ha funcionado, pero me pregunto si es posible “sobreescribir” de alguna forma esa regla sin tocar las librerías…

    Gracias!

  9. Joaquin Windmüller

    Para solucionar el problema de Series -> Series:


    $irregularPlural = array('serie' => 'series');

  10. jimmy

    Necesito ayuda, no se si sera un problema por los nombres, tengo una tabla “tipoexamen”, todas las demas andan bn, sus modelos, controller, vistas, pero al tratar de abrir esta, me dice:
    Missing Controller
    Error: TipoexamenesController could not be found.
    Error: Create the class TipoexamenesController below in file: app/controllers/tipoexamenes_controller.php

    y esta creado todo tal cual las otras tablas.

  11. jimmy

    ya encontre el problema, jejeje, lo que paso fue una letra cambiada, decia:
    <?php
    class TipoexamanesController
    cuando deberia haber sido:
    <?php
    class TipoexamenesController

    Gracias de todas formas.

¡Comenta sobre este artículo!