Ver índice de contenidos del libro

13.1. Cultura del usuario

Todas las opciones relacionadas con i18n en Symfony se basan en un parámetro de la sesión de usuario llamado culture (cultura). La cultura está formada por la combinación del país e idioma del usuario y determina la forma en la que se muestra el texto y la información que depende de la cultura. Como su valor se serializa en la sesión de usuario, la cultura se almacena de forma persistente entre páginas diferentes.

13.1.1. Indicando la cultura por defecto

Por defecto, la cultura de los nuevos usuarios toma el valor de la opción default_culture. Se puede modificar su valor en el archivo de configuración settings.yml, como se muestra en el listado 13-1.

Listado 13-1 - Indicando la cultura por defecto, en frontend/config/settings.yml

all:
  .settings:
    default_culture:     fr_FR

Nota Durante el desarrollo de la aplicación, es posible que los cambios en el archivo settings.yml no se reflejen en la aplicación accedida mediante el navegador. La razón es que la sesión guarda la información de la cultura de las páginas anteriores. Para acceder a la aplicación con el nuevo valor de la cultura, se deben borrar las cookies del dominio de la aplicación o se debe reiniciar el navegador.

La cultura debe indicar el país y el idioma ya que, por ejemplo, se puede disponer de una traducción al francés diferente para los usuarios de Francia, Bélgica y Canadá, como también se pueden ofrecer traducciones diferentes al español para los usuarios de España y México. El idioma se codifica mediante 2 caracteres en minúscula siguiendo el estándar ISO 639-1 (en para inglés, por ejemplo). El país se codifica en forma de 2 caracteres en mayúscula siguiendo el estándar ISO 3166-1 (GB para Reino Unido, por ejemplo).

13.1.2. Modificando la cultura de un usuario

La cultura de un usuario se puede modificar mientras accede a la aplicación (por ejemplo cuando un usuario decide cambiar la versión en inglés por la versión en francés) o cuando el usuario accede a la aplicación y se utiliza el idioma que ha seleccionado en sus preferencias. Por este motivo la clase sfUser ofrece métodos getter y setter para la cultura del usuario. El listado 13-2 muestra cómo utilizar estos métodos en la acción.

Listado 13-2 - Modificando y obteniendo la cultura en una acción

// Modificando la cultura
$this->getUser()->setCulture('en_US');
 
// Obteniendo la cultura
$cultura = $this->getUser()->getCulture();
 => en_US

13.1.3. Determinando la cultura de forma automática

En muchas aplicaciones, la cultura del usuario se define durante la primera petición, en función de las preferencias de su navegador. Los usuarios pueden definir en el navegador una serie de idiomas que están dispuestos a aceptar. Esta información se envía al servidor en cada petición, mediante la cabecera HTTP Accept-Language. En Symfony esta cabecera se puede acceder a través del objeto sfWebRequest. Si por ejemplo se quiere obtener la lista de idiomas preferidos del usuario en una acción, se utiliza la siguiente instrucción:

$idiomas = $peticion->getLanguages();

Aunque la cabecera HTTP es una cadena de texto, Symfony la procesa y la convierte automáticamente en un array. Por tanto, el idioma preferido del usuario se puede obtener en el ejemplo anterior mediante $idiomas[0].

En la página principal de un sitio web y en un filtro utilizado en varias páginas, puede ser útil establecer automáticamente la cultura del usuario al idioma preferido del navegador del usuario. Sin embargo, como tu sitio web sólo estará disponible en un número limitado de idiomas, se mejor utilizar el método getPreferredCulture(). Este método compara los idiomas preferidos por el usuario y los idiomas disponibles en la aplicación, devolviendo el mejor valor posible:

// El sitio web está disponible sólo en inglés y francés
$idioma = $peticion->getPreferredCulture(array('en', 'fr'));

Si no se producen coincidencias entre los idiomas preferidos por el usuario y los idiomas disponibles en la aplicación, el método anterior simplemente devuelve el primer idioma disponible (en el ejemplo anterior, el método devolvería el valor en).

Advertencia La cabecera HTTP Accept-Language no es una información muy fiable, ya que casi ningún usuario sabe cómo modificar su valor en el navegador. En la mayoría de los casos, el idioma preferido del navegador es el idioma de la propia interfaz del navegador y los usuarios no están disponibles en todos los idiomas. Si se decide establecer de forma automática el valor de la cultura según el idioma preferido del navegador, es una buena idea proporcionar una forma sencilla de seleccionar otro idioma.