Ver índice de contenidos del libro

8.1. Internacionalización de formularios

Los formularios de Symfony son internacionalizables por defecto. La traducción de los títulos o labels, los mensajes de ayuda y los mensajes de error se realiza mediante la traducción de los ficheros XLIFF, gettext o cualquier otro formato soportado por Symfony.

El listado 8-1 muestra el formulario de contacto desarrollado en los capítulos anteriores.

Listado 8-1 - Formularios de contacto

class FormularioContacto extends sfForm
{
  public function configure()
  {
    $this->setWidgets(array(
      'nombre'  => new sfWidgetFormInput(),    // el título o label por defecto es "Nombre"
      'email'   => new sfWidgetFormInput(),    // el título o label por defecto es "Email"
      'mensaje' => new sfWidgetFormTextarea(), // el título o label por defecto es "Mensaje"
    ));
 
    // Modificar el título del widget del campo email
    $this->widgetSchema->setLabel('email', 'Dirección de email');
  }
}

El listado 8-2 muestra cómo traducir los títulos anteriores al francés utilizando un archivo en formato XLIFF.

Listado 8-2 - Archivo de traducción en formato XLIFF

// apps/frontend/i18n/messages.fr.xml
<?xml version="1.0" ?>
<xliff version="1.0">
  <file orginal="global" source-language="en" datatype="plaintext">
    <body>
      <trans-unit>
        <source>Name</source>
        <target>Nom</target>
      </trans-unit>
      <trans-unit>
        <source>Email address</source>
        <target>Adresse email</target>
      </trans-unit>
      <trans-unit>
        <source>Body</source>
        <target>Message</target>
      </trans-unit>
    </body>
  </file>
</xliff>

8.1.1. Indicar el catálogo utilizado para la traducción

Si utilizas la opción de los catálogos de la parte de internacionalización de Symfony, puedes asociar un formulario con un catálogo existente. El listado 8-3 asocia el fomulario FormularioContacto con el catálogo formulario_contacto. Por lo tanto, las traducciones de los elementos de ese formulario se buscarán en el archivo formulario_contacto.fr.xml.

Listado 8-3 - Estableciendo el catálogo utilizado para la traducción

class FormularioContacto extends sfForm
{
  public function configure()
  {
    // ...
 
    $this->widgetSchema->getFormFormatter()->setTranslationCatalogue('formulario_contacto');
  }
}

Nota Utilizar catálogos permite organizar mejor las traducciones, ya que por ejemplo se puede utilizar un archivo para cada formulario.

8.1.2. Internacionalización de los mensajes de error

En ocasiones, los mensajes de error incluyen el valor enviado por el usuario, como por ejemplo: "La dirección de email [email protected] no es válida.". El el capítulo 2 se explicó lo fácil que es hacerlo definiendo mensajes de error personalizados en la clase del formulario y utilizando referencias a los valores enviados por el usuario. Las referencias siguen el patron %nombre_parametro%.

El listado 8-4 muestra cómo aplicar este principio al campo nombre del formulario de contacto.

Listado 8-4 - Internacionalización de los mensajes de error

class FormularioContacto extends sfForm
{
  public function configure()
  {
    // ...
 
    $this->validatorSchema['nombre'] = new sfValidatorEmail(
      array('min_length' => 2, 'max_length' => 45),
      array('min_length' => 'El nombre "%value%" debe tener al menos %min_length% caracteres.',
            'max_length' => 'El nombre "%value%" no puede tener más de %max_length% caracteres.',
      ),
    );
  }
}

Para traducir los mensajes de error anteriores, sólo es necesario editar el archivo en formato XLIFF como muestra el listado 8-5.

Listado 8-5 - Archivo de traducción en formato XLIFF para los mensajes de error

<trans-unit>
  <source>El nombre "%value%" debe tener al menos %min_length% caracteres</source>
  <target>Le nom "%value%" doit comporter un minimum de %min_length% caractères</target>
</trans-unit>
<trans-unit>
  <source>El nombre "%value%" no puede tener más de %max_length% caracteres</source>
  <target>Le nom "%value%" ne peut comporter plus de %max_length% caractères</target>
</trans-unit>