|
| 1 | +# encoding: UTF-8 |
1 | 2 | # Be sure to restart your server when you modify this file.
|
2 | 3 |
|
| 4 | +############################################################################## |
| 5 | +# Inflections para trabajar en Español. |
| 6 | +# Por omisión, rails obtiene el singular y el plural según las reglas en |
| 7 | +# Inglés. La regla más básica consiste en agregar una 's' al final de la |
| 8 | +# palabra al obtener su plural, y eliminar la 's' al final para obtener el |
| 9 | +# singular. En español, esta regla se cumple la mayoría de las veces, pero no |
| 10 | +# siempre, por lo que es necesario especificar algunas más para las |
| 11 | +# excepciones. |
| 12 | +# |
| 13 | +# Las reglas para la formación del plural en Español son muy completas (y |
| 14 | +# complejas), en algunas ocasiones dependen de la acentuación. No se pretende |
| 15 | +# contemplar todas las posibilidades, sólo las más comunes. |
| 16 | +############################################################################## |
| 17 | + |
3 | 18 | ActiveSupport::Inflector.inflections do |inflect|
|
4 |
| - inflect.plural(/([rndl])([A-Z]|_|$)/, '\1es\2') |
| 19 | + |
| 20 | + # La regla básica en Español es similar al Inglés, el plural de las palabras |
| 21 | + # terminadas en vocal se obtiene agregándole una 's' al final. Sin embargo, |
| 22 | + # para formar correctamente el plural de palabras como doctor, camion, |
| 23 | + # universidad o pastel, se aplica una regla distinta: las palabras que |
| 24 | + # terminen con r, n, d, l se convierten a plural agregando la sílaba "es", |
| 25 | + # de otra forma, el plural se obtendrían como doctors, camions, universidads |
| 26 | + # y pastels. |
| 27 | + inflect.plural(/([rndlj])([A-Z]|_|$)/, '\1es\2') |
5 | 28 | inflect.plural(/([aeiou])([A-Z]|_|$)/, '\1s\2')
|
6 |
| - inflect.plural(/([aeiou])([A-Z]|_)([a-z]+)([rndl])([A-Z]|_|$)/, |
| 29 | + |
| 30 | + # Las reglas anteriores funcionan incluso cuando son palabras compuestas por |
| 31 | + # dos o más palabras, siempre y cuando, todas sean del mismo tipo, es decir, |
| 32 | + # que ambas terminen con r, n, d o l, o bien, que ambas terminen en vocal; |
| 33 | + # por ejemplo "doctor_operacion", o "libro_revista", serán pluralizadas |
| 34 | + # correctamente a "doctores_operaciones" y "libros_revistas" respectivamente. |
| 35 | + # Sin embargo, si las palabras no son del mismo tipo, la pluralización no |
| 36 | + # ocurre correctamente. Por ejemplo, "autor_libro" es pluralizado como |
| 37 | + # "autor_libros", y "paciente_doctor" es pluralizado como |
| 38 | + # "paciente_doctores". Esto sucede porque al pluralizar, rails aplica sólo |
| 39 | + # la última regla que coincida y omite las demás. |
| 40 | + # Para soportar palabras compuestas, es necesario agregar otras reglas. |
| 41 | + inflect.plural(/([aeiou])([A-Z]|_)([a-z]+)([rndlj])([A-Z]|_|$)/, |
7 | 42 | '\1s\2\3\4es\5')
|
8 |
| - inflect.plural(/([rndl])([A-Z]|_)([a-z]+)([aeiou])([A-Z]|_|$)/, |
| 43 | + inflect.plural(/([rndlj])([A-Z]|_)([a-z]+)([aeiou])([A-Z]|_|$)/, |
9 | 44 | '\1es\2\3\4s\5')
|
10 |
| - inflect.plural(/(z)$/i, 'ces') |
| 45 | + # Con estas reglas, ya se pueden traducir correctamente las palabras compuestas |
| 46 | + # de dos palabras aunque no sean del mismo tipo. |
| 47 | + # Se pueden agregar, de la misma manera, reglas para cuando se trate de tres |
| 48 | + # palabras compuestas, pero esto significa tomar en cuenta más combinaciones. |
| 49 | + # En la mayoría de los casos, creo que es suficiente con estas dos. |
| 50 | + |
| 51 | + # Para obtener correctamente el plural de palablas como maiz => maices, |
| 52 | + # pez => peces, las palabras terminadas en z se cambian la z por c, y |
| 53 | + # se agrega "es" |
| 54 | + inflect.plural(/z([A-Z]|_|$)$/i, 'ces\1') |
| 55 | + |
| 56 | + #----------------------------------------------------------------------------- |
11 | 57 |
|
12 |
| - final_plural_rndl = /([aeiou][rndl])es([A-Z]|_|$)/ |
13 |
| - final_plural_vocal = /((?<![aeiou][nrdl])[aeiou])s([A-Z]|_|$)/ |
14 |
| - palabra_compuesta_1 = /#{final_plural_rndl}([a-z]+)#{final_plural_vocal}/ |
15 |
| - palabra_compuesta_2 = /#{final_plural_vocal}([a-z]+)#{final_plural_rndl}/ |
| 58 | + # Para singularizar, generalmente basta con eliminar la 's' del final, pero |
| 59 | + # palabras como doctores y universidades se convertirían erróneamente como |
| 60 | + # doctore y universidade. |
| 61 | + # Podemos agregar una nueva regla, cuando la palabra termina en "es", eliminar |
| 62 | + # esa sílaba, pero esto tampoco es del todo cierto, ya que funciona con |
| 63 | + # palabras como "doctores" o "camiones", porque su singular son "doctor" y |
| 64 | + # "camion", respectivamente. Sin embargo, hay otras palabras que se |
| 65 | + # convertirían erróneamente, como semestres, por ejemplo, que al eliminar la |
| 66 | + # sílaba "es" del final, se singularizaría como 'semestr'. Para evitar eso, se |
| 67 | + # obliga que la palabra que termina en "es" y venga precedida de r, n, d o l, |
| 68 | + # deba también ser precedida por una vocal. |
| 69 | + # Para que la epresión no quede tan extensa, vamos a utilizar unas variables |
| 70 | + # para almacenar parte de la misma. También nos servirá para no tener que |
| 71 | + # repetir la mistra estructura. |
16 | 72 |
|
17 |
| - inflect.singular(/(ia)$/i, '\1') |
18 |
| - inflect.singular(final_plural_rndl, '\1\2') |
| 73 | + # Primero, definimos las palabras que terminen en 'es', precedido de r, n, d, |
| 74 | + # l o j, precedido de una vocal. |
| 75 | + final_plural_rndlj = /([aeiou][rndlj])es([A-Z]|_|$)/ |
| 76 | + # Después, definimos las palabras que terminen en vocal seguida de una 's'. En |
| 77 | + # caso de que esa vocal sea la e, entonces no debe ser precedida de alguna |
| 78 | + # combinación de vocal + r, n, d, l o j. |
| 79 | + final_plural_vocal = /((?<![aeiou][rndlj])e|a|i|o|u)s([A-Z]|_|$)/ |
| 80 | + # Lsas palabras compuestas serán las siguientes: la primera palabra es con r, |
| 81 | + # n, d, l o j, seguida de una palabra terminada en vocal. La segunda palabra |
| 82 | + # compuesta, será al revés. |
| 83 | + palabra_compuesta_1 = /#{final_plural_rndlj}([a-z]+)#{final_plural_vocal}/ |
| 84 | + palabra_compuesta_2 = /#{final_plural_vocal}([a-z]+)#{final_plural_rndlj}/ |
| 85 | + |
| 86 | + # las palabras terminadas en ia ya están en singular |
| 87 | + inflect.singular(/(ia)([A-Z]|_|$)$/i, '\1') |
| 88 | + |
| 89 | + # Utilizando las variables creadas anteriormente, se generan las nuevas reglas |
| 90 | + # para obtener el singular de las palabras sencillas y compuetas que terminen |
| 91 | + # tanto en vocal, como en r, n, d, l, o j. |
| 92 | + inflect.singular(final_plural_rndlj, '\1\2') |
19 | 93 | inflect.singular(final_plural_vocal, '\1\2')
|
20 | 94 | inflect.singular(palabra_compuesta_1, '\1\2\3\4\5')
|
21 | 95 | inflect.singular(palabra_compuesta_2, '\1\2\3\4\5')
|
| 96 | + |
| 97 | + # Para singularizar palabras con 'ces', como 'maices' |
22 | 98 | inflect.singular(/ces$/, 'z')
|
23 |
| - |
| 99 | + |
| 100 | + #----------------------------------------------------------------------------- |
| 101 | + |
| 102 | + # Las palabras en singular que terminan con s son un caso especial, ya que |
| 103 | + # rails infiere que ya están en plural, lo cual es falso. Por ejemplo, pais. |
| 104 | + # Es necesario indicar que el plural de pais es paises y viceversa. Esto se |
| 105 | + # puede hacer declarándolo como irregular: |
24 | 106 | inflect.irregular 'pais', 'paises'
|
| 107 | + # Pero es necesario agregar otra regla. Pais termina en s, pero ya está en |
| 108 | + # singular, por lo que hay que indicarle a rails que no elimine la s final. |
25 | 109 | inflect.singular /(pais)([A-Z]|_|$)/, '\1\2'
|
26 | 110 |
|
| 111 | + # Ejemplos cuyo plural y singular sea el mismo |
27 | 112 | inflect.uncountable %w( campus lunes martes miercoles jueves viernes )
|
| 113 | + |
| 114 | + #----------------------------------------------------------------------------- |
| 115 | + |
| 116 | + # Otros ejemplos de palabras irregulares |
| 117 | + # En ocasiones, quisiéramos aplicar reglas específicas que no cumplen con las |
| 118 | + # generales. Por ejemplo, si a estas alturas tratamos de obtener el plural de |
| 119 | + # "hermano_de_sangre", el resultado sería "hermanos_des_sangres", así que, |
| 120 | + # para estos casos, es necesario agregar reglas para indicar estos |
| 121 | + # comportamientos 'irregulares'. |
| 122 | + |
| 123 | + #inflect.irregular 'hermano_de_sangre', 'hermanos_de_sangre' |
| 124 | + #inflect.irregular 'HermanoDeSangre', 'HermanosDeSangre' |
| 125 | + |
| 126 | + # NOTA: es necesario indicar los dos modos (underscore y camelcase) porque el |
| 127 | + # método irregular no soporta expresiones regulares |
| 128 | + |
| 129 | + # Caso especial en el que la última palabra termina con 's' desde su versión |
| 130 | + # en singular (caso similar al de pais, pero en esta ocasión, con palabras |
| 131 | + # compuestas) |
| 132 | + |
| 133 | + #inflect.singular 'calificacion_matematicas', 'calificacion_matematicas' |
| 134 | + #inflect.singular 'CalificacionMatematicas', 'CalificacionMatematicas' |
| 135 | + #inflect.irregular 'calificacion_matematicas', 'calificaciones_matematicas' |
| 136 | + #inflect.irregular 'CalificacionMatematicas', 'CalificacionesMatematicas' |
| 137 | + |
| 138 | + # NOTA: por claridad, se indican los dos modos (underscore y camelcase) |
| 139 | + # porque el método irregular no soporta expresiones regulares, aunque en el |
| 140 | + # caso del singular sí, por lo que se puede escribir también de la siguiente |
| 141 | + # manera: |
| 142 | + #inflect.singular /([Cc])(alificacion)(_m|M)(atematicas)/, '\1\2\3\4' |
| 143 | + |
28 | 144 | end
|
0 commit comments