Tips y consejos a tener en cuenta a la hora de realizar la internacionalización (Symfony)

En la tarea de internacionalizar una pagina, son muchos los puntos que solo alguien que tubo practica con las librerías de internacionalización nos puede contar.
En mi corta experiencia con symfony he encontrado varios de esos tips y consejos prácticos para tener en cuenta a la hora de trabajar.
Para comenzar un breve resumen de como realizar la correcta internacionalización.
La Cultura del Usuario:
Las características i18n y l10n de symfony se basan en la cultura del usuario. La cultura es la combinación del lenguaje y el país del usuario. Puedes manejar la cultura por el usuario llamando a los métodos setCulture() y getCulture() del objeto User:

			$this->getUser()->setCulture("cultura");
			$this->getUser()->getCulture();

La cultura del usuario es la configurada en el archivo de configuración settings.yml:

# apps/frontend/config/settings.yml
all:
  .settings:
    default_culture: it_IT

Como una dirección URL sólo puede representar a un único recurso, la cultura debe estar integrada en la URL. Para ello, abre el archivo routing.yml, y agrega la variable especial :sf_culture para todas las rutas, pero no para api_jobs y homepage. Para simples rutas, agrega /:sf_culture al principio de la url. Para colección de rutas, agrega una opción prefix_path que comience con /:sf_culture.:

# apps/frontend/config/routing.yml
prefix_path:    /:sf_culture/job

para mas información: http://www.symfony-project.org/jobeet/1_2/Doctrine/es/19

ahora una serie de tips y ayudas a tener en cuenta:

* El div que se debería agregar en el layout si deseamos tener dos link a los cuales seleccionar y cambiar de ese modo la cultura:

<!--Language switch -->
        <div id="language">
                <a href="<?php echo url_for('language/change?lang=es')?>" title="Español">Español</a> |
                <a href="<?php echo url_for('language/change?lang=en') ?>" title="English">English</a>
        </div>

* Para q funcione esto debemos agregar un modulo "language" y agregar el siguiente contenido:

<?php
class languageActions extends sfActions
{
    public function executeChange()
    {
            $lang = $this->getRequestParameter("lang");
            $this->getUser()->setCulture($lang);
            $this->redirect("@homepage");
            $this->redirect($redirect);
    }
    public function executeUri(){
        $uri = $this->getRequest()->getUri();
        return $uri;
    }
}

* crear en el frontend la carpeta i18n
y en ella crear el archivo messages.es.xml (si se desea realizar una internacionalización a otra cultura que no sea la española se deberá cambia el sufijo es por la correspondiente). Agregar en él el siguiente contenido:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xliff PUBLIC "-//XLIFF//DTD XLIFF//EN"
  "http://www.oasis-open.org/committees/xliff/documents/xliff.dtd">
  <!-- SPANISH  -->
<xliff version="1.0">
  <file source-language="EN" target-language="es" datatype="plaintext"
      original="messages" date="2010-05-14T12:11:22Z"
      product-name="messages">
    <header/>
    <body>
      <trans-unit id="1">
        <source>palabraOfraceEnIngles</source>
        <target>palabraOfraceEnEspañol</target>
      </trans-unit>
      <trans-unit id="2">
        <source>Example</source>
        <target>Ejemplo</target>
      </trans-unit>
    </body>
  </file>
</xliff>

* Al momento de traducir una palabra debemos llamar a la función __()
la cual recibe como parámetro la palábra en ingles para traducir (en este caso del ingles al español).
cabe aclarar q se debe escribir exactamente la palabra en ingles como esta en el archivo xml, para q este la traduzca, si al ingresar al archivo xml no la encuentra la dejara tal cual estaba antes de llamar a la función __()
Ejemplo:

               <?php echo __('Example') ?>

Muchas veces nos vemos obligados a internacionalizar hasta las imágenes he inclusive los CSS para dejar la pagina totalmente internacionalada.
Pero no es para preocuparse por esto, simplemente internacionalizamos el nombre de las imágenes ( siempre es conveniente dejar un distintivo y estandarizar, de esta manera los nombres, en este caso será el sufijo es o en. Ejemplo nombre_en, para las imágenes en ingles y nombre_es para las imágenes en español)
ejemplo:

                <img src="/images/'.__("imagen_en").'.jpg">'

Por supuesto debemos tener en ya agregado en nuestro archivo  xml la imagen en ingles y en español:

        <trans-unit id="3">
         <source>imagen_en</source>
         <target>imagen_es</target>
        </trans-unit>

y con el tema de los CSS lo mismo, por lo general conviene tener dos archivos CSS, uno por idioma.
En cuanto al manejo de  flash-messages, error messages, etc., es conveniente y a veces la única forma de internacionalizarlos, no a donde se produce el error sino donde se muestra, ya que nos aseguramos de q ningún error o mensaje se muestre sin pasar por la función __() y si vemos que se nos paso una frase o palabra por traducir, lo único que tenemos que hacer es ir y agregarla en nuestro archivo xml.
Y por ultimo pero menos importante, el manejo de las fechas, para ello he creado una simple función, la cual debe ser agregada en lib/service/ServiceI18n .
La cual es la siguiente:

        public static function internationalizationDate($format, $date){
            $dateFomated = date(__($format), $date);
            $day = date('l', $date);
            $retorno = str_replace($day, __($day), $dateFomated);
            $month = date('F', $date);
            $retorno = str_replace($month, __($month), $retorno);
            $month = date('M', $date);
            $retorno = str_replace($month, __($month), $retorno);
            return $retorno;
        }

la misma recibe como parámetros el formato en el que queremos la fecha, y la fecha de tipo strtotime. Para que la función funcione, debemos agregar en el archivo xml todos los días, los meces, los formatos posibles y todo lo que creamos que nos podría servir para internacionalizar las fechas. A continuación esta el contenido del archivo xml que utiliza esta función:

<!-- DATE -->
      <!-- month date -->
      <trans-unit id="2001">
        <source>January</source>
        <target>Enero</target>
      </trans-unit>
       <trans-unit id="2002">
        <source>February</source>
        <target>Febrero</target>
      </trans-unit>
       <trans-unit id="2003">
        <source>March</source>
        <target>Marzo</target>
      </trans-unit>
       <trans-unit id="2004">
        <source>April</source>
        <target>Abril</target>
      </trans-unit>
       <trans-unit id="2005">
        <source>May</source>
        <target>Mayo</target>
      </trans-unit>
       <trans-unit id="2006">
        <source>June</source>
        <target>Junio</target>
      </trans-unit>
       <trans-unit id="2007">
        <source>July</source>
        <target>Julio</target>
      </trans-unit>
       <trans-unit id="2008">
        <source>August</source>
        <target>Agosto</target>
      </trans-unit>
       <trans-unit id="2009">
        <source>September</source>
        <target>Septiembre</target>
      </trans-unit>
       <trans-unit id="2010">
        <source>October</source>
        <target>Octubre</target>
      </trans-unit>
       <trans-unit id="2011">
        <source>November</source>
        <target>Noviembre</target>
      </trans-unit>
       <trans-unit id="2012">
        <source>Dicember</source>
        <target>Diciembre</target>
      </trans-unit>
      <!-- month date -->
      <trans-unit id="2013">
        <source>Jan</source>
        <target>Ene</target>
      </trans-unit>
       <trans-unit id="2014">
        <source>Feb</source>
        <target>Feb</target>
      </trans-unit>
       <trans-unit id="2015">
        <source>Mar</source>
        <target>Mar</target>
      </trans-unit>
       <trans-unit id="2016">
        <source>Apr</source>
        <target>Abr</target>
      </trans-unit>
       <trans-unit id="2017">
        <source>May</source>
        <target>May</target>
      </trans-unit>
       <trans-unit id="2018">
        <source>Jun</source>
        <target>Jun</target>
      </trans-unit>
       <trans-unit id="2019">
        <source>Jul</source>
        <target>Jul</target>
      </trans-unit>
       <trans-unit id="2020">
        <source>Aug</source>
        <target>Ago</target>
      </trans-unit>
       <trans-unit id="2021">
        <source>Sep</source>
        <target>Sep</target>
      </trans-unit>
       <trans-unit id="2022">
        <source>Oct</source>
        <target>Oct</target>
      </trans-unit>
       <trans-unit id="2023">
        <source>Novr</source>
        <target>Nov</target>
      </trans-unit>
       <trans-unit id="2024">
        <source>Dic</source>
        <target>Dic</target>
      </trans-unit>
      <!-- day date -->
       <trans-unit id="2025">
        <source>Monday</source>
        <target>Lunes</target>
      </trans-unit>
       <trans-unit id="2026">
        <source>Tuesday</source>
        <target>Martes</target>
      </trans-unit>
       <trans-unit id="2027">
        <source>Wendesday</source>
        <target>Miercoles</target>
      </trans-unit>
      <trans-unit id="2028">
        <source>Thursday</source>
        <target>Jueves</target>
      </trans-unit>
       <trans-unit id="2029">
        <source>Friday</source>
        <target>Viernes</target>
      </trans-unit>
       <trans-unit id="2030">
        <source>Saturday</source>
        <target>Sabado</target>
      </trans-unit>
       <trans-unit id="2031">
        <source>Sunday</source>
        <target>Domingo</target>
      </trans-unit>
       <trans-unit id="2032">
        <source></source>
        <target></target>
      </trans-unit>
      <!-- format date -->
       <trans-unit id="2033">
        <source>F d, Y</source>
        <target>d F, Y</target>
      </trans-unit>
       <trans-unit id="2034">
        <source>l, F j, Y</source>
        <target>l, j F, Y</target>
      </trans-unit>
       <trans-unit id="2035">
        <source>F d, Y</source>
        <target>d F, Y</target>
      </trans-unit>
       <trans-unit id="2036">
        <source>F j, Y</source>
        <target>j F, Y</target>
      </trans-unit>
       <trans-unit id="2037">
        <source>M d, Y</source>
        <target>d M, Y</target>
      </trans-unit>
Posted in Metodologia, Uncategorized