¿Cómo traducir una extensión de Magento? – How to translate a Magento extension?

¿qué opináis de si un trabajo está hecho y funciona, para qué volverlo a hacer?

En muchas ocasiones, hay desarrolladores de Magento que comparten sus trabajos con un coste que vale la pena pagar ya que el hecho de empezarlo de cero supone más esfuerzo y coste.

Hace no demasiado me encontré con uno de estos fabulosísimos trabajos con la excepción de que las traducciones al español no estaban ni pensadas y ahí fue dónde se me ocurrió poner este post donde explico cómo hacer que una extensión que no está traducida, empiece a estarlo.

Instaláis la extensión y….ta chan! sólo en inglés!
Debéis ir a app/code/community/directorios_extension/etc/config.xml y buscar dentro una referencia al fichero «.csv» o un tag <translate>

Pueden ocurrir dos cosas:
1.- No está ningún enlace a un fichero .csv
2.- Si está, pero no traduce tampoco

Vamos a explicarlo como si no estuviera y a partir de ahí, avanzamos hasta el caso 2 donde simplemente está pero no traduce.

Pasos a realizar:
1) Buscar el fichero config.xml en app/code/community donde normalmente se instalan las extensiones, en el propio directorio etc de la extención. Imaginemos que está dentro de app/code/community/extensionguay/masprogram/etc

2) coger el fichero config.xml que hemos comentado, editarlo e insertarle un trozo de código de este estilo, entre los tags de <frontend></frontend>

<translate>
            <modules>
                <advancedsearchsuggests>
                    <files>
                        <default>extensionguay_masprogram.csv</default>
                    </files>
                </advancedsearchsuggests>
            </modules>
</translate>

3) Generar ese fichero .csv en el directorio /app/locale/en_US con las líneas de los textos en inglés-inglés como de costumbre.

4) Generar ese fichero .csv en el directorio /app/locale/es_ES con las líneas de los textos en inglés-español como de costumbre y pongo un ejemplo por si no se sabe: «Price: «,»Precio: »

Y….c’est tout!

* Es importante recordar que los textos a traducir son literales, con espacios y todo. Es decir, no es lo mismo traducir «Price:» que «Price: «. Recordarlo porque suele dar unos cuantitos quebraderos de cabeza.

Bien sencillo, ¿verdad? Pues si estamos en el caso 2, sólo abrá que hacer el cuarto paso, pero..eso ya lo sabéis todos, verdad?

Optimización de caché – Aumento de rendimiento agregando Headers de Expiración

A través de la herramienta de google que os comenté en otro post, se puede ver que es importante definir la caché de las páginas y de los tipos de ficheros tipo javascript, estilos, imágenes,…
Es en este punto es donde se debe saber que se habla de header de expiración que es donde indicamos cuando un fichero expira. Si el fichero ha expirado, se vuelve a cargar y si el fichero no ha expirado, no se carga de nuevo para poder optimizar las cargas al máximo. Por tanto, para ficheris que no cambian comúnmente como las imágenes, vídeos, javascript, hojas de estilo podríamos agregarle headers de expiración con lo cual solo se cargarán la primera vez que accedemos a la pagina.

Esto lo podemos definir a través del fichero .htaccess. Para el caso de la expiración se puede utilizar ExpiresDefault, para ello tenemos las siguientes directivas de tiempo: years, months, weeks, days, hours, minutes, seconds.

Lo recomendables es colocar una expiración mínima de una semana en los ficheros menos modificados (jpg, png, gif, swf, js, css), entonces podríamos agregar el siguiente código:

ExpiresActive On
ExpiresDefault A0

# expiracion de 1 semana para archivos estaticos

ExpiresDefault "access plus 1 weeks"

La expiración también se puede expresar en segundos. El ejemplo anterior quedaría (7 dias = 60*60*24*7 = 604800):

ExpiresActive On
ExpiresDefault A0

# expiracion de 1 semana para archivos estaticos

ExpiresDefault A604800

Otra forma para agregar la expiración es por tipo de fichero utilizando la directiva ExpiresByType. Por ejemplo:

ExpiresActive On
ExpiresDefault A0

ExpiresByType image/gif A604800
ExpiresByType image/png A604800
ExpiresByType text/css A604800
ExpiresByType text/javascript A604800

Scripts javascript – Async – Increase speed with script async

Las solucionas Javascript para incorporar módulos de facebook, twitter, zoopim o resto de programas que necesitamos para que nuestros clientes nos vean de diversas formas por la web están muy bien pero hay que tener en cuenta que son programas que se ejecutan en otro servidor y que si no se lanzan de forma asíncrona, ralentizan nuestra web.

Por ello es recomendable, en la medida de lo posible y siempre y cuando no sea un código que intervenga en la ejecución de los programas, el poner este tipo de scripts que se ejecuten de forma asíncrona.

Busca todo aquel código que se ejecute como script y evalúa cuál puedes cambiar. Por ejemplo, los de los módulos que he comentado al inicio son fácilmente ejecutados de forma asíncrona y harán que todo vaya mejor.

Para ello en las líneas donde empiecen de la siguiente forma:

<script.....>

se podrán cambiar por:

<script async...>

y veremos rápidamente el rendimiento.

Este tipo de temas se nota en gran medida cuando los servidores donde se encuentran las páginas de estos módulos no van bien o están dando fallos porque parece que nuestra propia página da errores.  Por tanto, es super recomendable ponerlo de forma asíncrona siempre que podamos.

Magento – Buy or Preorder – Comprar o Reservar bajo pedido – Parte II

En este post, explicaremos lo que dejamos en incertidumbre en el post Parte I.

Empezaremos por las partes previas a modificar los programas como es:

* Crear un atributo FECHA DE ENTREGA donde podemos definirlo como un texto abierto para poder poner una explicación a nuestros clientes tan extensa como queramos o definir los valores posibles de fecha de entrega.

* Editar la ficha de Producto y tener siempre documentada la fecha de entrega editada anteriormente en los casos de productos en reserva.

* En la ficha de producto también hay que tener en cuenta que el inventario en los productos sin stock tienen que ser cambiados y poner los siguientes parámetros cambiados:

  1. Disponibilidad en existencias – En Existencia (Stock Availability – In Stock)
  2. Pedidos de artículos sin existencias – Permitir por debajo de cero avisando o no según como se quiera (Backorders – Allow).

* Editar el fichero list.phtml de app\design\frontend\default\plantilla\template\catalog\product\ y el addtocart.phtml de httpdocs\app\design\frontend\default\plantilla\template\catalog\product\view\ para añadir el nuevo código con lo que podremos controlar si el producto está en stock y por tanto hacer visible o no la fecha de entrega.

En ambos ficheros habrá que definir 3 variables que nos dirá la situación del producto:

define("CUSTOM_BACKORDERS_YES", 1);
define("CUSTOM_BACKORDERS_YES_NOTIFY", 2);
define("CUSTOM_STOCK_INSTOCK", 1);

Por otro lado habrá que definir el botón con texto del estilo «Comprar» o «Reservar» según la situación. Se podría controlar con este código:

$rquantity = (int)Mage::getModel('cataloginventory/stock_item')->loadByProduct($_product)->getQty();
$rbackorder = Mage::getModel('catalog/product')->load($_product->getId())->getStockItem()->getBackorders();
$rstockavailability = $_product->getStockItem()->getIsInStock(); ?>
<?php if (($rquantity <= 0) && (($rbackorder == CUSTOM_BACKORDERS_YES) || ($rbackorder == CUSTOM_BACKORDERS_YES_NOTIFY)) && ($rstockavailability == CUSTOM_STOCK_INSTOCK) ) { ?>
<?php $buttonTitle = $this->__('Preorder'); ?>
<?php } else { ?>
<?php $buttonTitle = $this->__('Add to Cart'); ?>
<?php }

* Editar el fichero de traducciones para traducir la palabra backorder en el checkout.

Magento – Buy or Preorder – Comprar o Reservar bajo pedido – Parte I

En todas las tiendas que compramos, creo que la mayoría nos gusta saber si lo que compramos está en stock o no y el tiempo que tarda en llegarnos.

Hay una forma de desarrollarlo en Magento a través del botón de compra y los atributos del inventario, a parte de tener informado a través de páginas de cuál es nuestra política de envío y de inventario.

Pasos que debemos tener en cuenta:
* Poner por ejemplo un botón de comprar o reservar según si está en stock o no.
* Definir un atributo fecha de entrega que dará más información a nuestros clientes.
* Gestionar nosotros el stock a través del inventario del producto.
* Dar de alta texto de traducciones para las reservas, si tenemos la tienda en multiidioma.

En el siguiente post informaremos de cómo se puede realizar esto editando los programas de Magento.

PageSpeed Insights (by Google) – Disponible para Chrome

Hoy en día los clientes cada día más se preocupan no sólo que su página esté desarrollada, también de los comentarios a su vez de sus clientes, de las opiniones de ellos y de una herramienta que ha sacado google hace ya bastante tiempo, PageSpeed Insights y que ahora está disponible para Chrome.

Para mi gusto hay que mezclar la herramienta web junto con la de Pc, bajo chrome para poder conseguir los mejores consejos y poderlos comprobar tú mismo.

Evalúa bloqueos de Javascripts, rendimientos de CSS, tamaño de imágenes, visibilidad desde pc ó móvil y el timeout de las páginas o caché, así como muchos aspectos más. Todo esto es importante para el rendimiento y el placer de poder visitar una página y atraer más o menos clientes, pero no se debe olvidar que el aspecto que a tí te parece el más «genial» del mundo, a unos clientes les gusta a tope y a otros no les gusta nada y es más, hay aspectos que pueden mejorar el rendimiento y ser muy poco atractivos y otros ser muy atractivos pero tener un rendimiento pésimo. Evaluar todo esto junto con el desarrollo de una tienda es una de las tareas más duras y difíciles de aconsejar, asesorar y ayudar. Los informáticos nunca tenemos la razón, 😉

Ahondando en la herramienta que ha sacado Google para Chrome diré que es la maravilla para adentrarse en cada una de las peculiaridades de la programación y eso sí, la forma de pasar las horas muertas haciendo que una web pueda estar lo más óptima que se pueda.

A sudar, queridos, con esta herrmienta y a descubrir un nuevo universo! PageSpeed Insights (by Google)!

Comprimir .js o .css

¿alguna vez os habéis acordado de algún programador por no haber indentado un programa?

¿os habéis planteado que ocurre muy habitualmente en los .js y .css?

Es una práctica recomendada por google ahora y consiste en eliminar todo tipo de código de programación inútil como blancos, tabulaciones, indentados, controles de carro,…y dejar únicamente el código útil.

Es sencillo porque hay dos compresores que te ayudan a ello y no es necesario desarrollar nada. Por ello, os dejo aquí el enlace a ese compresor demo que te ayuda poniendo el código y llevando el resultado a tu web.

A los programadores de antes, nos gusta tener el código bien indentado, con lo que yo suelo dejarme la copia indentada para que sea más cómoda cualquier modificación.

También es posible hacerse una llamada a la función como explican en la web: http://www.phpied.com/cssmin-js/

Ahora vayamos a hacer la demo y veréis que rápido es! Para ello, habrá que acceder al siguiente enlace:

http://tools.w3clubs.com/cssmin/

En la primera casilla pondremos nuestro código .js o .css y en la segunda casilla nos pondrá como queda optimizado.

Increase the Magento Speed with mod_deflate – Incrementar la velocidad de Magento con mod_deflate

Hay varias tácticas para aumentar la velocidad de tu tienda de Magento y una de ellas es utilizar el módulo de PHP mod_deflate.

Para averiguar si está instalado en nuestra tienda, recordad que lo podemos averiguar realizando un fichero .php para llamar a la función phpinfo(); como describía en el post siguiente: http://www.patriciaseuba.es/2014/07/ioncube-o-cualquier-configuracion-de-tu-servidor/

<?
phpinfo();
?>

Si no está, deberemos ponerlo en el servidor para utilizar las funcionalidades que vienen a continuación.

Para revisar si la web utiliza el mod_deflate podemos acceder a una web que nos lo “chivará”: Accede a http://www.whatsmyip.org/http-compression-test/ y pon en la casilla la URL de la tienda. Si no pone OK, sabremos que no está utilizando el módulo mod_deflate.

Para utilizarlas, iremos al .htaccess del web site y donde aparezca lo siguiente o nada si buscamos el mod_deflate:

<IfModule mod_deflate.c> ############################################ ## enable apache served files compression ## http://developer.yahoo.com/performance/rules.html#gzip # Insert filter on all content ###SetOutputFilter DEFLATE # Insert filter on selected content types only #AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript # Netscape 4.x has some problems... #BrowserMatch ^Mozilla/4 gzip-only-text/html # Netscape 4.06-4.08 have some more problems #BrowserMatch ^Mozilla/4\.0[678] no-gzip # MSIE masquerades as Netscape, but it is fine #BrowserMatch \bMSIE !no-gzip !gzip-only-text/html # Don't compress images #SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png)$ no-gzip dont-vary # Make sure proxies don't deliver the wrong content #Header append Vary User-Agent env=!dont-vary </IfModule>

lo cambiaremos por lo siguiente:

<IfModule mod_deflate.c>

    AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript
    AddOutputFilterByType DEFLATE application/xml application/xhtml+xml application/rss+xml
    AddOutputFilterByType DEFLATE application/javascript application/x-javascript
    #AddOutputFilterByType DEFLATE application/x-httpd-php

    BrowserMatch ^Mozilla/4 gzip-only-text/html
    BrowserMatch ^Mozilla/4\.0[678] no-gzip
    BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html

    SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png)$ no-gzip dont-vary
    SetEnvIfNoCase Request_URI \.(?:exe|t?gz|zip|bz2|sit|rar)$ no-gzip dont-vary
    SetEnvIfNoCase Request_URI \.(?:pdf|doc)$ no-gzip dont-vary
    SetEnvIfNoCase Request_URI \.(?:avi|mov|mp3|mp4|rm)$ no-gzip dont-vary

</IfModule>

Espero que os sirva pero de todas formas si queréis oirlo en inglés a través de un youtube os dejo aquí el enlace:
http://youtu.be/g6dXt6gyUTk

Error Enabled Compilation before Running a Compile Magento – Error al activar compilación antes de compilar Magento

Desastre! Desastre! Hemos ejecutado la compilación antes de compilar Magento y ahora no podemos acceder a la tienda.

Queríamos solucionar un tema de rendimiento y ahora hemos ido un paso atrás! Ni el cliente ni nosotros podemos acceder!

Todo tiene solución! tranquilos! Vamos a desactivar la compilación:

1.- Ir a la carpeta «includes» de tu web. ¿dónde? var/www/tuweb/includes

2.- Editar el fichero «config.php»

3.- Comentar la siguiente linea siguiente:

define(‘COMPILER_INCLUDE_PATH’, dirname(FILE).DIRECTORY_SEPARATOR.’src’);

Ioncube o cualquier configuración de tu servidor

¿cómo saber qué módulos de php tienes configurado en tu servidor? Por ejemplo, saber si tienes ioncube.

Aquí dejo un pequeño programa que puedes dejarte en cualquiera de tus dominios para verificar la instalación de PHP así como si tienes ioncube.

El trozo de programa lo puedes meter en el raiz de tu dominio, por ejemplo con nombre info.php

Para ejecutarlo y comprobar el estado de tus módulos, sólo debes poner en el navegador: www.tudominio.com/info.php

La función primera te saca un listado de los módulos instalados. El if simplemente te comprueba si tienes Ioncube instalado por si sólo quisieras saber esa información.

<?
phpinfo();

if(extension_loaded("IonCube Loader")) {     
 echo "Ioncube loaded";
}
else {
 echo "Ioncube not loaded";
}
?>