Bug en los locales es en Magento 1 y 2

Carrito

Con el lanzamiento de Magento 1.9.2.2 se corrigieron varios dolores de cabeza no menores en Magento. Pero para quienes debemos usar los locales en español, con la actualización del framework recibimos, además, un nuevo problema.

Debido a un error o cambio o como quieran llamarlo, las definiciones de formato de números y decimales que utiliza ZendFramework no son correctas para (casi) todos los locales en español (por ejemplo es_AR, es_CL, es_UY, etc, etc).

Los únicos que se salvan son es_ES y es_MX.

Para que se entienda mejor el problema, en una instalación limpia de Magento 1, usando uno de los locales afectados, no podríamos agregar más de una unidad al carrito.

Bug en Magento1

Lo mismo nos pasaría en Magento2:

Bug en Magento2

Esto sucede por que cuando Zend_Locale valida la cantidad no lo hace correctamente.

Hay solución, aunque no es tan prolija porque HAY QUE TOCAR EL CORE.

Lo primero será editar el archivo /lib/Zend/Locale/Data/es_419.xml.

Archivo es_419.xml

Y dentro del nodo de números, después de los símbolos (línea 192 aproximadamente, dependiendo de la versión que estén usando)

Archivo es_419.xml

Dentro del nodo decimalFormats, antes de decimalFormatLength agregamos:

<decimalFormatLength>
    <decimalFormat>
        <pattern>#,##0.###</pattern>
    </decimalFormat>
</decimalFormatLength>

Esto nos deja el archivo de esta forma:

Archivo es_419.xml

Guardamos, borramos cache de Magento y… esto es muy importante, borramos de /tmp los archivos cacheados del framework.

Si ejecutan un ls -l de /tmp, entre otras cosas de su sistema, verán algo como esto

-rw------- 1 www-data www-data     97 may 22 22:30 zend_cache---internal-metadatas---Zend_LocaleC_es_419_parentlocale_
-rw------- 1 www-data www-data     98 may 22 22:30 zend_cache---internal-metadatas---Zend_LocaleC_es_AR_date_
-rw------- 1 www-data www-data     97 may 22 22:30 zend_cache---internal-metadatas---Zend_LocaleC_es_AR_decimalnumber_
-rw------- 1 www-data www-data     98 may 22 22:30 zend_cache---internal-metadatas---Zend_LocaleC_es_AR_parentlocale_
-rw------- 1 www-data www-data     98 may 22 22:30 zend_cache---internal-metadatas---Zend_LocaleC_es_AR_scientificnumber_
-rw------- 1 www-data www-data     98 may 22 22:30 zend_cache---internal-metadatas---Zend_LocaleL_es_AR_day_
-rw------- 1 www-data www-data     98 may 22 22:30 zend_cache---internal-metadatas---Zend_LocaleL_es_AR_month_
-rw------- 1 www-data www-data     98 may 22 22:30 zend_cache---internal-metadatas---Zend_LocaleL_es_AR_month_gregorian_format_abbreviated
-rw------- 1 www-data www-data     98 may 22 22:30 zend_cache---internal-metadatas---Zend_LocaleL_es_AR_symbols_
-rw------- 1 www-data www-data     11 may 22 22:30 zend_cache---Zend_LocaleC_es_419_parentlocale_
-rw------- 1 www-data www-data     20 may 22 22:30 zend_cache---Zend_LocaleC_es_AR_date_
-rw------- 1 www-data www-data     18 may 22 22:30 zend_cache---Zend_LocaleC_es_AR_decimalnumber_
-rw------- 1 www-data www-data     21 may 22 22:30 zend_cache---Zend_LocaleC_es_AR_parentlocale_
-rw------- 1 www-data www-data     18 may 22 22:30 zend_cache---Zend_LocaleC_es_AR_scientificnumber_
-rw------- 1 www-data www-data    183 may 22 22:30 zend_cache---Zend_LocaleL_es_AR_day_
-rw------- 1 www-data www-data    229 may 22 22:30 zend_cache---Zend_LocaleL_es_AR_month_
-rw------- 1 www-data www-data    200 may 22 22:30 zend_cache---Zend_LocaleL_es_AR_month_gregorian_format_abbreviated
-rw------- 1 www-data www-data    228 may 22 22:30 zend_cache---Zend_LocaleL_es_AR_symbols_

Necesitamos borrar eso para que vuelva a generarse el cache con los cambios del XML.

Se supone que si intentamos repetir los pasos en nuestro Magento 1, el resultado, ahora, debería ser:

Solución en Magento1

Como decía al comienzo, esto se notó con el lanzamiento de la versión 1.9.2.2. Yo tuve la suerte de chocarme con este problema a los pocos días y creé, el 21/11/2015, el issue #8461 (tienen que estar logueados para verlo).

Dado que Magento 2 arrastra la misma librería, nos pasó lo mismo. Esto llevó a la creación del issue #3619 (y si lo siguen, pueden ver que no fue el único relacionado).

Para resolverlo en Magento 2 hay que seguir los mismos pasos. La única diferencia es que el archivo está ubicado en:

vendor/magento/zendframework1/library/Zend/Locale/Data/es_419.xml

Una vez terminada la modificación, en su Magento 2, deberían obtener este resultado:

Solución en Magento2

Al momento de este post, el problema sigue sucediendo. Acabo de crear el PR en el repositorio de la versión de ZendFramework que mantiene Magento para ver si podemos evitar el mantenimiento manual y, de paso, que se propague a Magento 2.2.

La solución definitiva no fue mía, sino que fue Martín quien tomó la posta de lo que yo estaba revisando, y luego se sumó Omar que ayudó con el testing y pruebas en varios entornos.