domingo, 18 de mayo de 2008

Convertir Joomla a UTF-8

Bueno en mi trabajo hemos utilizado Joomla (Gestor de contenidos) para desarrollar alguno de los portales que ofrecemos (tales como www.cica.es o supercomputacion.cica.es), una vez ya con las manos en la masa, nos encontramos con el problema de que la versión española de joomla (descargada de http://www.joomlaspanish.org/) se encuentra con la codificación ISO-8859-1 es decir latin 1.

Existen unos follones con las codificaciónes increibles, porque el ISO-8859-1 trae los caracteres especiales solo del castellano, luego existe otro para los caracteres griegos o los caracteres árabes, os podeis imaginar menudo follón.

Bueno pues para resolver el problema se ha inventado el UTF-8 que contiene todos los caracteres internacionales de modo que si utilizas esta codificación todos los navegadores ya sean arábes o griegos poseen este estandar y podrán ver los textos tal y como ha sido escritos y no con caracteres raros.

Bien pues en este artículo elaborado por dos compañeros de trabajo se explica como convertir todo el proyecto tanto frontend como backend de joomla a la codificación UTF-8.

GUÍA PARA CONVERTIR UN SITIO JOOMLA


DESDE CODIFICACIÓN ISO-8859-1x A UTF-8



Introducción:


Joomla es una potente herramienta capaz de gestionar un sito web de forma fácil a la vez que eficiente. Sin embargo, esta útil herramienta nos llega a los españoles con un problema que tiene mucho que ver con su política de desarrollo. La versión española de Joomla se entrega por defecto con una codificación ISO-8859-1, mientras que todo el mundo está migrando a la nueva codificación UTF-8. Este conflicto de codificaciones no es nuevo en el mundo de internet, y provocará que todos los símbolos no internacionales (tildes, eñes y similares) se muestren como carácteres desconocidos si nuestro navegador está configurado para mostrar las páginas bajo UTF-8.


Surge, por tanto, la necesidad de poder cambiar la codificación de todo el sitio web gestionado por Joomla a la internacional UTF-8, sin que por ello tengamos que perder mucho de nuestro valioso tiempo examinando archivos y modificándolos manualmente. Desgraciadamente, hay poca información al respecto sobre cómo se podría realizar esta migración, y mucho menos sobre cómo se podría hacer automáticamente.


Este documento pretende ser una guía con la que mostrar el camino a seguir para migrar un sitio Joomla ISO-8859-1 a UTF-8 de forma automática y bajo Linux, indicando todo el proceso paso a paso.


Visión general del proceso:


Estos van a ser, expresados de forma esquemática, los

pasos a seguir para realizar la migración del sitio web:


    1. Realizar una copia de seguridad del sitio.

    2. Aplicar el script para convertir los archivos iso-8859-1 a utf-8.

    3. Instalar el paquete de idioma español utf-8 para Joomla.

    4. Actualizar la base de datos de Joomla.


Realizar una copia de seguridad del sitio:


Ni que decir tiene que es una muy buena idea tener a mano una copia de seguridad del sitio que vayamos a migrar, por si acaso. Supongamos que nuestro sitio web se encuentra alojado en la carpeta /var/www/ejemplo de nuestro servidor. Para realizar la copia de seguridad y crear una carpeta llamado ejemploBAK, ejecutaremos las siguientes ordenes:


cd /var/www

mv ejemplo ejemploBAK


Aplicar el script para convertir los archivos iso-8859-1 a utf-8:


Ahora necesitamos copiar el script webiso2utf.sh a un sitio que sea accesible por nosotros, como por ejemplo el directorio en donde se encuentra alojado nuestro sitio de ejemplo. Supongamos que ya tenemos el script creado en nuestro directorio home. En este caso, tendríamos que hacer:


cd /var/www

mv $HOME/webiso2utf.sh .


Con el script en este directorio, sólo nos resta ejecutarlo sobre la carpeta de copia de seguridad, generando de esta forma nuestro sitio originial pero codificado como utf-8:


./webiso2utf.sh ejemploBAK ejemplo


Esto debería tardar un poco (Dependiendo del tamaño total del sitio que estemos migrando) y, al acabar, aparecerá una carpeta ejemplo en la que todos los archivos sujetos a ser convertidos estarán en utf-8. El script no convierte a utf-8 todos los archivos porque existen algunos, como los jpg o los png, que guardan su valor tal cual en binario, por lo que no tiene ningún sentido que se modifiquen para adaptarlos a una u otra codificación.


Nótese que la carpeta ejemploBAK sigue estando intacta y aún posee todos los archivos originales, en codificación iso-8859-1 por si nos hiciera falta en el futuro.

Instalar el paquete de idioma español utf-8 para Joomla:


Una vez que todos los demás archivos han sido convertidos a la codificación utf-8, tenemos que instalar en el propio Joomla el paquete español para utf-8. Este paso no se ha realizado previamente debido a que el paquete copia algunos archivos en codificación utf-8, con lo que al aplicarle el script estos archivos son recodificados y nos mostrarían carácteres extraños al representarlos nuestro navegador.


Para instalar el paquete en español utf-8, seguiremos los siguientes pasos:


Actualizar la base de datos de Joomla:


Por último, aún nos queda un paso para tener completamente nuestro sitio migrado. Joomla guarda la mayoría de su configuración en una base de datos, que se establece a la hora de la instalación. Esta base de datos es la encargada de mostrar las descripciones y opciones de la interfaz de cara al administrador del sitio, y estará por defecto codificada bajo iso-8859-1, por lo que tendremos que modificar su contenido para ajustarlo a utf-8.


Suponiendo que usamos mysql y que el nombre de la base de datos que guarda todas las tablas de configuración de Joomla es ejemplo, esto es lo que habría que hacerse:


  1. Volcamos el contenido del schema ejemplo a un archivo ejemplo.sql:

mysqldump -u [usuario] -p –opt ejemplo > ejemplo.sql

(Nos pedirá nuestra contraseña de acceso a la base de datos)


  1. Convertimos el archivo desde iso-8859-1 a utf-8:

iconv -f iso-8859-1 -t utf-8 ejemplo.sql > ejemploutf.sql


  1. Volcamos este archivo codificado como utf a la base de datos:


mysql -u [usuario] -p <>


Con esto, nuestra base de datos ya debería estar codificada en utf-8.



Sin embargo, cuando estuvimos trabajando con nuestro sitio de Joomla, los pasos previamente comentados no nos realizaron correctamente la codificación. Para convertir la base de datos a una codificación que mostrara correctamente los carácteres no internacionales en un navegador configurado para UTF-8, tuvimos que aplicar el siguiente script a ejemplo.sql en lugar de usar el comando iconv:


sqlfix.sh ejemplo.sql ejemploutf.sql


El tercer paso es idéntico al utilizado previamente, y una vez volcado el contenido, la base de datos funcionaba correctamente.


Scripts utilizados:


A continuación se incluyen los códigos de los dos scripts utilizados para realizar la migración del sitio. Estos han sido webiso2utf.sh y sqlfix.sh


webiso2utf.sh


#!/bin/bash

#

#Script que copia la estructura de archivos desde dir_origen hasta

#dir_destino y convierte todos los archivos del origen de iso-

8859-1

#a utf-8 en el destino.

#

#Ejemplo de uso:

#iso2utf.sh dir_origen dir_destino

#

#Creado por: Jhonatan Garcia Gutierrez

#


#Primero creamos algunas variables que usaremos mas adelante

comando=$0

dir_or=$1

dir_base=$2


#En principio, dir_des y nuevo tendran la cadena vacia.

#Conforme se vaya ejecutando el script, se iran llamando con otros valores

dir_des=$3

nuevo=$4


#En lista guardamos la relacion de archivos existentes en el directorio actual

if [ ! -z $nuevo ] ; then

lista=$(ls -A $dir_or/$dir_des);

else

lista=$(ls -A $dir_or);

fi


#Creamos una matriz ext en donde guardaremos las extensiones de los archivos que convertiremos a utf-8

#Los archivos de tipo jpg o png, por ejemplo, no serán convertidos a utf-8 (No tendria sentido)

declare -a ext

ext=( asp cfg css en es euc-jp euc-kr fr freebsd htm html js js_ lib linux php php~ php-dist properties sh sql src txt TXT xml )

tam=${#ext[*]}


#Si el directorio destino en donde vamos a crear los archivos convertidos no existe, crearlo

if [ ! -e ${dir_base}/${dir_des} ] ; then

mkdir ${dir_base}/${dir_des};

fi


#Por cada archivo existente en el directorio origen actual hacer:

for arch in $lista ; do


#Guardamos el nombre del archivo para usarlo mas adelante

nom_arch=${arch}


#Si no es la primera vez que se llama al script, sera porque estamos convirtiendo

#tambien los archivos incluidos dentro de un subdirectorio.

#En este caso le agregamos la ruta de este subdirectorio al archivo actual.

if [ ! -z $nuevo ] ; then

arch=${dir_des}/${arch};

fi


#Si el archivo es un directorio, habra que ejecutar esta script sobre el para convertir

#tambien sus archivos en el directorio destino.

if [ -d ${dir_or}/${arch} ] ; then

$comando ${dir_or} ${dir_base} ${arch} 1;


#En cambio, si es un archivo ordinario, tendremos que comprobar si lo convertimos o no

else


#Obtenemos el valor del archivo origen y destino para usarlos luego mas comodamente

archivo=${dir_or}/${arch}

archivo_des=${dir_base}/${arch}


#Obtenemos la extension del archivo

extension=${nom_arch##*.}


#Recorremos la matriz de extensiones. Si la extension del archivo actual esta dentro de

#la matriz, entonces tendremos que convertir el archivo.

#En otro caso, sera un archivo de tipo jpg o similar y nos limitaremos a copiarlo en el destino

let flag=1

let indice=0

while [ $flag -eq 1 -a $indice -lt $tam ] ; do

if [ $extension = ${ext[$indice]} ] ; then

#Si encontramos la extension en la matriz, ponemos la bandera a 0

let flag=0

fi

let indice=($indice + 1)

done


#Si la extension del archivo era una de las que vamos a convertir a utf-8:

if [ $flag -eq 0 ] ; then


#Creamos dos archivos temporales para guardar datos intermedios

aux1=$0$$1

aux2=$0$$2


#Convertimos todas las referencias que nos indican que el archivo esta en iso-8859-1X a utf-8

sed -e s/[cC][hH][aA][rR][sS][eE][tT]\ *=\ *[iI][sS][oO]-8859-1[0-9]/charset=utf-8/g $archivo > $aux1

sed -e s/[cC][hH][aA][rR][sS][eE][tT]\ *=\ *[iI][sS][oO]-8859-1/charset=utf-8/g $aux1 > $aux2


#Esta ultima es para los archivos de SQL

sed -e s/[cC][hH][aA][rR][sS][eE][tT]\ *=\ *[lL][aA][tT][iI][nN]1/CHARSET=UTF-8/g $aux2 > $aux1

#Realizamos la conversion del archivo ayudandonos del comando iconv

iconv -f iso-8859-1 -t utf-8 $aux1 > $archivo_des;


#Borramos los archivos temporales que habiamos utilizado previamente

rm $aux1

rm $aux2


#Si la extension del archivo no era una de las que vamos a convertir, lo copiamos en el destino

else

cp $archivo $archivo_des;


fi

fi

done


sqlfix.sh


#!/bin/bash

#

#Fichero creado por: Jhonatan Garcia Gutierrez

#

#Este script se ha creado para solucionar un problema que da muchos

#quebraderos de cabeza.

#

#Muchas veces consultamos una base de datos y el resultado nos lo

#devuelve en iso-8859-1, por lo que nuestro navegador no muestra

#bien los simbolos cuando esta configurado para mostrar utf-8.

#

#Usa solucion a este problema seria hacer un volcado de la base de datos:

#mysqldump -u [usuario] -p --opt [tabla] > [archivo].sql

#convertir el archivo resultante a utf-8 y subir este archivo

convertido

#a nuestra base de datos:

#mysql -u [usuario] -p [tabla] < [archivo].sql

#

#Sin embargo, hay veces en las que esto no funciona, y hay que codificar

#nuestro archivo de una manera especial para que la base de datos muestre

#los resultados de nuestras consultas como deberia.

#

#Para arreglar este problema, simplemente tendremos que ejecutar los

#siguientes pasos:

#

#mysqldump -u [usuario] -p --opt [tabla] > [archivo].sql

#./sqlfix.sh [archivo].sql [archivofix].sql

#mysql -u [usuario] -p [tabla] < [archivofix].sql

#



arch_or=$1

arch_des=$2


aux1=${0}$$1

aux2=${0}$$2


sed -e s/¿/¿/g $arch_or > $aux1

sed -e s/¡/¡/g $aux1 > $aux2

sed -e s/á/á/g $aux2 > $aux1

sed -e s/é/é/g $aux1 > $aux2

sed -e s/í/í/g $aux2 > $aux1

sed -e s/ó/ó/g $aux1 > $aux2

sed -e s/ú/ú/g $aux2 > $aux1

sed -e s/Á/Ã\201/g $aux1 > $aux2

sed -e s/É/É/g $aux2 > $aux1

sed -e s/Í/Ã\215/g $aux1 > $aux2

sed -e s/Ó/Ó/g $aux2 > $aux1

sed -e s/Ú/Ú/g $aux1 > $aux2

sed -e s/ñ/ñ/g $aux2 > $aux1

sed -e s/Ñ/Ñ/g $aux1 > $aux2

sed -e s/ü/ü/g $aux2 > $aux1

sed -e s/Ü/Ãœ/g $aux1 > $aux2

sed -e s/ç/ç/g $aux2 > $aux1

sed -e s/CHARSET=latin1/CHARSET=utf8/g $aux1 > $aux2


mv $aux2 $arch_des

rm $aux1


Paquetes instalados una vez migrada la web:


Nos hemos dado cuenta de que una vez que la web ha sido migrada a utf-8, al instalar un paquete nuevo, éste aparecía en formato iso-8859-1. Al parecer, la codificación del paquete no se modifica automáticamente al instalarlo, por lo que por defecto se instalará con la codificacón con la que el paquete fue creado.


Esto quiere decir que, cada vez que instalemos un paquete nuevo, habrá que convertirlo a utf-8. Afortunadamente, esto se puede hacer sólo con la carpeta del paquete, y no con el sitio web completo. Para realizar ésto, tendremos que buscar la carpeta en la que se ha instalado el nuevo paquete. Supongamos que el paquete se instala en la carpeta administrator/components/jos_paquete del sitio ejemplo. Lo que tendríamos que hacer sería:


cd /var/www/ejemplo/administrator/components

mv jos_paquete jos_paqueteBAK

$HOME/webiso2utf.sh jos_paqueteBAK jos_paquete


Y con eso el nuevo paquete estará codificado en utf-8. Ahora, si vemos carácteres extraños al usar el paquete, se deben a que los datos introducidos en la base de datos al instalar el paquete se han realizado en formato iso-8859-1. Por lo tanto, deberíamos reconvertir la base de datos a utf-8, usando los mismos pasos explicados anteriormente.


Todo esto hay que hacerlo, obviamente, si el nuevo

paquete que hemos instalado se encontraba realizado en iso-8859-1 y nos encontramos con carácteres raros al usar el Joomla. Si el paquete fue creado con la codificación utf-8 y no nos crea ningún problema a la hora de mostrarlo cuando estemos usando el navegador, mejor no tocamos nada.


Consideraciones finales:


Todo lo expuesto en esta guía ha sido probado y ejecutado satisfactoriamente para realizar la migración de codificaciones en el sitio web del CICA (www.cica.es). Los scripts cumplen su cometido cuando se ejecutan bajo Debian y con un bash como consola. Sin embargo, no hemos podido probar la eficacia de lo anteriormente expuesto en ninguna otra configuración de máquinas o sistemas operativos.


Debido a esto, puede que lo dicho previamente no funcione correctamente para la configuración actual de trabajo que estés usando. Si has tenido algún problema que no haya sido recogido por esta guía y has conseguido solucionarlo, exponlo abiertamente para que podamos recoger la información y ayudar a más personas con el mismo problema.


De todas formas, a continuación voy a redactar una pequeña guía de problemas relacionados con la configuración de equipos que sí son esperados y que podrían solucionarse con relativa facilidad:


Si al ejecutar los scripts no obtienes el resultado esperado, comprueba que tu máquina posee el comando iconv y que es accesible directamente. Si no lo posee, deberás buscar el comando equivalente para tu sistema operativo y modificar el script para que realice una llamada al comando correspondiente.


Si tu script no se ejecuta en absoluto, comprueba que tu consola de comandos es bash y no otra similar (Como

ksh). Si no es bash, prueba a modificar el script para que busque tu consola de comandos al principio en lugar de realizar la llamada a #!/bin/bash


Espero que no haga falta decir que estos scripts no funcionarán en Windows :P



Guía elaborada por:


Jhonatan Garcia Gutierrez

Cristóbal Tamayo

3 comentarios:

prueba dijo...
Este comentario ha sido eliminado por el autor.
Jorge Cantón Ferrero dijo...

Hola no sé porque dices que no tienen símbolo si te fijas en el script de arriba los símbolos equivalentes a las vocales en mayúsculas son:

sed -e s/Á/Ã\201/g $aux1 > $aux2

sed -e s/É/É/g $aux2 > $aux1

sed -e s/Í/Ã\215/g $aux1 > $aux2

sed -e s/Ó/Ó/g $aux2 > $aux1

sed -e s/Ú/Ú/g $aux1 > $aux2


Espero que te ayude esto.

prueba dijo...

Si perdón me confundí , muchas gracias por responder , me fue de gran ayuda.