Supongo que ya sabrás de lo que voy a hablar, sí, codificación de caracteres y el jodío de Dreamweaver. Te cuento:
Estoy haciendo algunas pruebas con Symfony y su sistema de internacionalización ( I18N ), y para ello he hecho que el charset que muestre la plantilla sea utf-8 (además de las tablas de la BD y las conexiones desde y hacía la BD), lo curioso es que cuando he ido a verlo en el navegador el resultado me aparecía con chinos (unos cuadrados (aunque pueden ser otros símbolos) que sustituyen a las letras con tilde), total que me he tirado todo el día dándole vueltas al tema, y el problema lo tenía en Dreamweaver que, por defecto, guarda los archivos en «Europeo occidental» y no en utf-8.
Te explico todo lo que he modificado en el proyecto de Symfony, por si te pasa algo parecido puedas comparar. Con esta configuración que te voy a mostrar el sistema de internacionalización de Symfony funciona al 100%:
Antes de nada te informo que esto está pensado para Symfony 1.4, versiones superiores o inferiores pueden necesitar una configuración distinta. Cuando hablo de Dreamweaver me refiero a la versión CS3, aunque muy probablemente algo parecido haya en versiones superiores.
settings.yml
Doy por hecho que ya has creado el proyecto, al menos una aplicación y un módulo con el que hacer pruebas. Nos vamos al archivo settings.yml de la app y añadimos:
[codesyntax lang=»text» title=»Configuración del archivo settings.yml para internacionalización»]
all: .settings: # Indicamos la cultura por defecto # Aquí poned la que os interese default_culture: es_ES # Indicamos la codificación de caracteres charset: utf-8 # Esto lo dejo a tu elección # Puedes escribir esta línea para que el helper I18N esté # en todas las plantillas de forma global # Lo bueno de usar esta opción es que puedes añadir # más helpers: # standard_helpers: [I18N,text, etc] standard_helpers: [I18N] # O puedes escribir esta otra línea, pero # en cada una de las plantillas tendrás que incluir # al prinicipio <?php use_helper('I18N') ?> # la decisión es tuya i18n: true
[/codesyntax]
routing.yml
Modificamos este archivo para indicar el módulo que se mostrará como página de inicio (homepage):
[codesyntax lang=»text»]
# Esto es lo que está por defecto homepage: url: / param: { module: default, action: index } # Lo único que cambio es el nombre del módulo, que en mi caso es 'login' homepage: url: / param: { module: login, action: index }
[/codesyntax]
view.yml
Este archivo creo que no hacia falta modificarlo para la internacionalización, pero por si acaso:
[codesyntax lang=»text»]
metas: language: es
[/codesyntax]
indexSuccess.php del módulo
Añadimos el texto que vamos a probar:
[codesyntax lang=»php»]
// No voy a poner todo el código que tengo en mi plantilla // así que pongo solo un ejemplo <?php echo __('Hola Mundo!') ?> // Esto te mostrará el texto en español
[/codesyntax]
Bien, como le hemos dado el valor «es_ES» a «default_culture«, Symfony no mostrará ninguna traducción sino el valor que le hemos indicado en la plantilla. Para hacer una prueba en condiciones vamos a modificar la cultura de un usuario a «en_EN«, esto mantendrá la cultura de todo el proyecto como «es_ES«.
actions.class.php del módulo
En la acción Index escribimos lo siguiente:
[codesyntax lang=»php»]
class loginActions extends sfActions { /** * Executes index action * * @param sfRequest $request A request object */ public function executeIndex(sfWebRequest $request) { // Esta línea cambiará la cultura SÓLO para el usuario $this -> getUser() -> setCulture('en_EN'); return sfView::SUCCESS; } }
[/codesyntax]
Obviamente nos falta crear el archivo que le indicará a Symfony el texto que debe utilizar para su sustitución. A ello voy:
english.en.xml
Este archivo se guarda en la carpeta «i18n» de la app, aunque también puedes crear la carpeta dentro del módulo y guardar el archivo allí. Este archivo tiene un formato especial que se debe mantener:
[codesyntax lang=»text»]
<?xml version="1.0" encoding="utf-8"?> <xliff version="1.0"> <file orginal="global" source-language="en_EN" datatype="plaintext"> <body> <trans-unit id="1"> <source>Hola Mundo!</source> <target>Hello World!</target> </trans-unit> <trans-unit id="2"> <source>soy un texto</source> <target>I'm a text</target> </trans-unit> <trans-unit id="3"> <source>Adiós</source> <target>Bye</target> </trans-unit> </body> </file> </xliff>
[/codesyntax]
Cosas importantes respecto de este archivo:
- Le puedes poner cualquier nombre pero debe acabar en *.culture.xml, por ejemplo: login.en.xml, registro.en.xml, administracion.fr.xml, comentario.it.xml.
- También se puede poner la cultura completa, es decir, en vez de solo *.en.xml puedes nombrarlo como *.en_EN.xml.
- El parámetro «source-language» siempre debe indicar la cultura que se va a traducir, en este caso es el ingles (en_EN).
- Cada texto a traducir está dentro de la etiqueta <trans-unit>, que tiene el atributo id, pues bien, cada frase a traducir debe aumentar el id ( 1,2,3,4,5….500 etc)
- No es necesario que todas las frases estén en un solo archivo, puede haber varios archivos con textos diferentes, por ejemplo, para el menú, la cabecera, el pie de página, etc.,. Importante: aunque sean archivos para idiomas diferentes el nombre del archivo siempre debe ser el mismo, variando, eso sí, la cultura.
Una vez guardado el archivo volvemos al indexSuccess.php y lo modificamos para que quede tal que así;
[codesyntax lang=»php»]
// No voy a poner todo el código que tengo en mi plantilla // así que pongo solo un ejemplo <?php echo __('Hola Mundo!', null, 'login') ?> // Ahora mostrará el texto que corresponda con la cultura del usuario // Además lo buscará en un archivo concreto en este caso login.en.xml
[/codesyntax]
Y así se internacionaliza un proyecto Symfony. Ahora el problemita de Dreamweaver:
El bicho, (por llamarlo de alguna manera) tiene una opción para abrir archivos que no indiquen su codificación. Normalmente está en «Europeo occidental» y debería estar en «Unicode (utf-8)«. Para cambiarlo accedemos al menú «Edición -> Preferencias…» y en «Nuevo documento» busca un desplegable que ponga «Codificación pred.«; ahí elige «Unicode (utf-8)«, activa la casilla que dice «Utilizar al abarir archivos existentes que no indiquen su codificación» y en el desplegable de abajo (Formulario de normas Unicode) selecciona «C (descomposición de compatibilidad seguida de composición canónica)«. Pulsa aceptar y prueba el en navegador.
Tal vez tengas que limpiar la cache de Symfony para ello solo tienes que escribir en la consola (que debe apuntar a la carpeta donde tienes el proyecto) symfony cc o php symfony cc.
Si sigue fallando, abre el archivo indexSuccess.php del módulo con el bloc de notas, y sin modificar nada, vete a Archivo -> Guardar como… , ahí podrás elegir la codificación, en nuestro caso, utf-8, y para evitar que se guarde como un archivo .txt elige «Todos los archivos» y así se guardará en php. Vuelve a limpiar la caché y vuelve a probar, ahora sí te debería funcionar bien.