Foros del Web » Programando para Internet » PHP » Symfony »

Traducir formularios y no morir intento en syfmony2

Estas en el tema de Traducir formularios y no morir intento en syfmony2 en el foro de Symfony en Foros del Web. hola aca un pequeño tuto sobre symfony 2 que quiero compartir con la comunidad deseas traducir los formularios generados por doctrine y no morir en ...
  #1 (permalink)  
Antiguo 07/09/2011, 22:07
 
Fecha de Ingreso: octubre-2008
Mensajes: 40
Antigüedad: 15 años, 6 meses
Puntos: 1
Traducir formularios y no morir intento en syfmony2

hola aca un pequeño tuto sobre symfony 2 que quiero compartir con la comunidad
deseas traducir los formularios generados por doctrine y no morir en el intento
existe una forma muy facil la cual describo aca


Código PHP:
use SymfonyComponentFormAbstractType;
use 
SymfonyComponentFormFormBuilder;
use 
SymfonyComponentTranslationTranslator;
class 
Tuformulariodoctrine extends AbstractType
{

    protected 
$Translator;
    public function 
setTranslator (Translator $Translator)
    {
        
///referenciamos el Translator
    
$this->Translator$Translator;
    }
    public function 
getTranslator()
    {
    
//lo optenemos
    
return $this->Translator;
    }
   public function 
buildForm(FormBuilder $builder, array $options)
    {
//lo llamamos y aplicamos el metodo trans
   
$builder->add('lastname','text',array("label"=>$this->getTranslator()->trans('LastName.message')))
    }

Código PHP:
    $tuformulariodoctrine =new Tuformulariodoctrine ();
         
/// la magia sucede aca creamos la referencia
    
$tuformulariodoctrine ->setTranslator($this->get('translator'));
        
$form   $this->createForm(tuformulariodoctrine$entity); 
creo que la forma mas facil no te rompes la cabeza ya que symfony es muy flexible
aunque no se si sea el mejor metodo a mi me funciono y es la forma mas limpia la unica desventaja es que daña los validadores del formularios creo que en ese caso habria que hacerlo de forma directa en el modelo o extenderla de FormBuilder y sobreescribir el metodo add pero es mas trabajo espero que les ayda podido ayudar gracias por todo
  #2 (permalink)  
Antiguo 07/10/2011, 12:01
 
Fecha de Ingreso: septiembre-2010
Mensajes: 4
Antigüedad: 13 años, 7 meses
Puntos: 0
Respuesta: Traducir formularios y no morir intento en syfmony2

Sí amigo Muchas Gracias por haber publicado la forma de poder internacionalizar los formularios generados por SF2, yo seguí todos tus pasos quedándome así:

//---Dudas----------------------------------------------------------------------------------------------------------------------------
¿A qué le digo id?
Mi formulario de traducción al español "src/Didetech/SisconBundle/Resources/translations/DidetechSisconBundle.es.yml" es así:

# Login [todo los demás están en el bundle FOSUserBundle]
login.welcome.head: Iniciar Sesión
login.vitual.keyboard: Escriba su contraseña usando el teclado virtual.

# Employee Form
employee.employeecode: Solapín

Aquí hay tres id:
login.welcome.head
login.vitual.keyboard
employee.employeecode


//---Fin Dudas-------------------------------------------------------------------------------------------------------------------------

Mis pasos fueron con la tabla Employee de SisCon:

En "src/Didetech/SisconBundle/Form/ScEmployeeType.php" hice lo siguiente:

---- Agregué la siguiente línea al inicio "use Symfony\Component\Translation\Translator;"

---- Dentro de la única clase que hay, en este caso "ScEmployeeType extends AbstractType" agregué:

protected $Translator;

public function setTranslator(Translator $Translator) {
///referenciamos el Translator
$this->Translator = $Translator;
}

public function getTranslator() {
//lo obtenemos
return $this->Translator;
}

--- Luego en la función "buildForm" modifiqué el campo "employeecode" para que se traduzca y en los formularios no se muestre el nombre employeecode sino "Código de Empleado", quedó así:

$builder->add('employeecode', 'text', array('label' => $this->getTranslator()->trans('employee.employeecode', array(), 'DidetechSisconBundle')))

donde:
employee.employeecode -> es el id de la palabra a traducir
DidetechSisconBundle -> es el fichero donde se encuentran las traducciones, en este caso son dos "DidetechSisconBundle.es.yml" y "DidetechSisconBundle.en.yml"

--- Luego nos vamos para el controlador, en este caso el controlador es "src/Didetech/SisconBundle/Controller/ScEmployeeController.php" y en la función "newAction" por ejemplo ponemos lo siguiente para que cuando se muestre el formulario lo haga traducido:

La función antes era así:
public function newAction()
{
$entity = new ScEmployee();
$form = $this->createForm(new ScEmployeeType(), $entity);

return $this->render('DidetechSisconBundle:ScEmployee:new.html. twig', array(
'entity' => $entity,
'form' => $form->createView()
));
}

Pero ahora para que se traduzca el formulario quedaría así:
public function newAction()
{
$entity = new ScEmployee();
$formTranslater = new ScEmployeeType(); //nueva línea agregada
$formTranslater->setTranslator($this->get('translator')); //se instancia la clases "setTranslator" que está en "ScEmployeeType.php"

$form = $this->createForm($formTranslater, $entity); //modificada esta línea.

return $this->render('DidetechSisconBundle:ScEmployee:new.html. twig', array(
'entity' => $entity,
'form' => $form->createView()
));
}

Finalmente ya está, saludos

//--------------------------------------------------------------------------------------------------------------
COMO QUEDÓ TODO AL FINAL
//--------------------------------------------------------------------------------------------------------------

#src/Didetech/SisconBundle/Resources/translations/DidetechSisconBundle.es.yml
# Navigation
navigation.welcome.head: Bienvenido al sistema.
navigation.who.are: Acerca de
navigation.configuration: Configuración
navigation.home: Inicio
navigation.search: Buscar
navigation.developed.for: Desarrollado por

# Login [todo los demás están en el bundle FOSUserBundle]
login.welcome.head: Iniciar Sesión
login.vitual.keyboard: Escriba su contraseña usando el teclado virtual.

# Employee Form
employee.employeecode: Solapín

//--------------------------------------------------------------------------------------------------------------

// src/Didetech/SisconBundle/Controller/ScEmployeeController.php

<?php

namespace Didetech\SisconBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controll er;

use Didetech\SisconBundle\Entity\ScEmployee;
use Didetech\SisconBundle\Form\ScEmployeeType;

/**
* Displays a form to create a new ScEmployee entity.
*
*/
public function newAction()
{
$entity = new ScEmployee();
$formTranslater = new ScEmployeeType();
$formTranslater->setTranslator($this->get('translator'));

$form = $this->createForm($formTranslater, $entity);

return $this->render('DidetechSisconBundle:ScEmployee:new.html. twig', array(
'entity' => $entity,
'form' => $form->createView()
));
}

//--------------------------------------------------------------------------------------------------------------

// src/Didetech/SisconBundle/Form/ScEmployeeType.php

<?php

namespace Didetech\SisconBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilder;
use Symfony\Component\Translation\Translator;

class ScEmployeeType extends AbstractType {

protected $Translator;

public function setTranslator(Translator $Translator) {
///referenciamos el Translator
$this->Translator = $Translator;
}

public function getTranslator() {
//lo optenemos
return $this->Translator;
}

public function buildForm(FormBuilder $builder, array $options) {
$builder
->add('employeecode', 'text', array('label' => $this->getTranslator()->trans('employee.employeecode', array(), 'DidetechSisconBundle')))
;
}

public function getName() {
return 'didetech_sisconbundle_scemployeetype';
}

}

Saludos, Victor Cruz ([email protected])
  #3 (permalink)  
Antiguo 09/06/2012, 01:35
 
Fecha de Ingreso: junio-2012
Mensajes: 1
Antigüedad: 11 años, 10 meses
Puntos: 0
Respuesta: Traducir formularios y no morir intento en syfmony2

Saludos Colegas

Yo empleo otra forma que es mas limpia ya que la traduccion le corresponde es a la vista y no al manejo del los formularios lo que podes hacer es lo siguiente.

creas tu archivo messages.xx.xliff => xxx => corresponde al idioma, en el creas las traducciones de las etiquetas de los labels puede ser algo como nombredelbundle_nombreformulario_label_nombrecampo , esto es con el objetivo de que no vaya a existir otra etiqueta de un label con el mismo nombre en otro formulario.

luego configuras tus labels en el formulario colocandole como traduccion la etiqueta que creastes para ese label en el diccionario de traduccion.

y listo ya lo tienes hecho, esto se debe a que en las opciones de los temas de la vista de twig el tiene parametrizado que todo texto que le llegue a un label el lo busca en el diccionario de idiomas y si lo enncuentra pues pone la traduccion.

Considero que esta manera es mucho mas facil y mejor.

Exitos

Hely Suarez Marin
Software Developer Symfony
Colombia

De todas maneras gracias a litoxXD por tu aporte fue de buena ayuda al principio ya que luego di con esta otra solucion.

Etiquetas: frameworks-y-php-orientado-a-objetos, intento, traducir, formulario
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 21:45.