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

No funciona la traduccion (no coge _locale)

Estas en el tema de No funciona la traduccion (no coge _locale) en el foro de Symfony en Foros del Web. Hola de nuevo chicos. Comenzar con symfony me está costando la vida , más si cabe si no funcionan cosas tan básicas y faciles (sobre ...
  #1 (permalink)  
Antiguo 30/10/2014, 05:26
 
Fecha de Ingreso: enero-2010
Ubicación: Madrid
Mensajes: 22
Antigüedad: 14 años, 3 meses
Puntos: 0
No funciona la traduccion (no coge _locale)

Hola de nuevo chicos.

Comenzar con symfony me está costando la vida , más si cabe si no funcionan cosas tan básicas y faciles (sobre la teoría) como las traducciones en Symfony

Usando la versión 2.4.10 de Symfony, me encuentro con que, sobre la teoría y según los manuales que he seguido dicen mas o menos esto (ejemplo sacado de librosweb):

==================================================
La configuración regional o locale del usuario actual se almacena en la petición y se puede acceder a través del objeto Request:

// accediendo al objeto Request desde un controlador
$request = $this->getRequest();

$locale = $request->getLocale();

$request->setLocale('en_US');

También puedes almacenar el locale en la sesión del usuario (mediante la propiedad especial _locale) en vez de obtenerla cada vez de las peticiones. Si lo haces, las peticiones posteriores tendrán automáticamente el locale almacenado en la sesión.

$this->get('session')->set('_locale', 'en_US');
==================================================

Entonces yo digo cojonudo, pues voy a hacer lo que dice para que se almacene automáticamente.

Pues a eso voy:

Código config.yml:
Ver original
  1. framework:
  2.     #esi:             ~
  3.     translator:      { fallback: "en" }
  4.     secret:          "%secret%"
  5.     router:
  6.         resource: "%kernel.root_dir%/config/routing.yml"
  7.         strict_requirements: ~
  8.     form:            ~
  9.     csrf_protection: ~
  10.     validation:      { enable_annotations: true }
  11.     templating:
  12.         engines: ['twig']
  13.         #assets_version: SomeVersionScheme
  14.     trusted_hosts:   ~
  15.     trusted_proxies: ~
  16.     session:
  17.         # handler_id set to null will use default session handler from php.ini
  18.         handler_id:  ~
  19.     fragments:       ~
  20.     http_method_override: true

Tengo mi config.yml con el translator activado y fallback: "en".

Y luego en mi controller tengo:
Código IndexController.php:
Ver original
  1. <?php
  2.  
  3. namespace Mirame\Application\AppBundle\Controller;
  4.  
  5. use Symfony\Bundle\FrameworkBundle\Controller\Controller;
  6. use Symfony\Component\Security\Core\SecurityContext;
  7.  
  8. class IndexController extends Controller {
  9.    
  10.     public function indexAction() {
  11.     $this->get("session")->set('_locale', "es_ES");
  12.         //$this->getRequest()->setLocale("es_ES");
  13.  
  14.         $texto = "hola mundo";
  15.        
  16.         return $this->render('MirameAppBundle:Index:index.html.twig', array('texto' => $texto));
  17.     }
  18. }

Este es el controlador (simplificado su código) que recibe al usuario cuando se loguea. Aquí trato de definir el locale a es_ES (entre otros que he probado) para que se aplique el idioma español, diferente al fallback que es "en" (inglés).

Pues bien, tal y como está no me hace ni puxxxxx caso. La teoría dice que guarda en sesión ese valor (cosa que he comprobado y así es) y que coge ese valor como locale predeterminado, porque _locale es una variable especial, cosa que a mí no me hace en absoluto.

Si que me funciona si descomento la linea que está comentada que define el locale para esa petición, pero solo en esa petición, las siguientes ya vuelven a salir en el idioma definido por defecto... Y teniendo una manera supuesta de hacerlo automatico configurándolo solo una vez, entiendo estúpido tener que ir petición por petición definiendo el locale del Request.

¿Alguna solución, cosa a probar, consejo? No sé si se me escapa algo por desconocimiento o por omisión en los manuales que he leído.

Gracias por adelantado chicos.
  #2 (permalink)  
Antiguo 30/10/2014, 07:08
Avatar de GeekGirl  
Fecha de Ingreso: julio-2014
Mensajes: 423
Antigüedad: 9 años, 9 meses
Puntos: 44
Respuesta: No funciona la traduccion (no coge _locale)

Está mal definido el idioma. No le tenés que pasar "es_ES" sino "es":

Código PHP:
<?php
    $this
->getRequest()->setLocale("es");
?>
Por otra parte, las traducciones no funcionan mágicamente. Tenés que encerrar el texto dentro de {{'text'|trans}}, generar los archivos de traducciones correspondientes al lenguaje y luego traducir las palabras.
Saludos :)
  #3 (permalink)  
Antiguo 30/10/2014, 08:37
 
Fecha de Ingreso: enero-2010
Ubicación: Madrid
Mensajes: 22
Antigüedad: 14 años, 3 meses
Puntos: 0
Respuesta: No funciona la traduccion (no coge _locale)

Cita:
Iniciado por GeekGirl Ver Mensaje
Está mal definido el idioma. No le tenés que pasar "es_ES" sino "es":

Código PHP:
<?php
    $this
->getRequest()->setLocale("es");
?>
Por otra parte, las traducciones no funcionan mágicamente. Tenés que encerrar el texto dentro de {{'text'|trans}}, generar los archivos de traducciones correspondientes al lenguaje y luego traducir las palabras.
Saludos :)
Gracias por contestar.
Sí, soy consciente de como funcionan las traducciones
De hecho, por eso indico que descomentando la línea del gerRequest me funciona, porque los trans estan funcionando bien, pero claro esa solución solo funciona para una petición (para un action).

Para guiaros un poco, mi problema no son los trans ni eso porque con la opción del Request si funciona mi problema es a la hora de indicar mediante _locale a la sesión y que esto se aplique automaticamente en todas las peticiones de ese usuario, a pesar de que aparentemente hago lo que dicen todos los manuales
  #4 (permalink)  
Antiguo 30/10/2014, 09:09
Avatar de GeekGirl  
Fecha de Ingreso: julio-2014
Mensajes: 423
Antigüedad: 9 años, 9 meses
Puntos: 44
Respuesta: No funciona la traduccion (no coge _locale)

Tenés que crear un listener para el idioma. En la documentación lo dice claramente. Y luego definir ese listener como un servicio para que se ejecute en todas las peticiones.

Acá te paso la documentación :)

http://symfony.com/doc/current/cookb...y_session.html
  #5 (permalink)  
Antiguo 30/10/2014, 10:04
 
Fecha de Ingreso: enero-2010
Ubicación: Madrid
Mensajes: 22
Antigüedad: 14 años, 3 meses
Puntos: 0
Respuesta: No funciona la traduccion (no coge _locale)

Cita:
Iniciado por GeekGirl Ver Mensaje
Tenés que crear un listener para el idioma. En la documentación lo dice claramente. Y luego definir ese listener como un servicio para que se ejecute en todas las peticiones.

Acá te paso la documentación :)

[URL="http://symfony.com/doc/current/cookbook/session/locale_sticky_session.html"]http://symfony.com/doc/current/cookbook/session/locale_sticky_session.html[/URL]
Eso que dices... como que ya me va cuadrando más... suena a la típica documentación mantenida por sinvergüenzas que no actualizan el contenido y mantienen información completamente obsoleta e inútil. Porque es exactamente lo que ocurría antes de Symfony 2.1

Os paso el enlace para que veais de primera mano la información en la que yo me he basado.

[URL="http://librosweb.es/symfony_2_4/capitulo_15/gestionando_la_configuracion_regional_del_usuario. html"]Gestionando la configuracion regional del usuario[/URL]

Lo raro es que en ningún sitio haya podido encontrar esto que tu me dices, aya donde he mirado parecían ir por el mismo camino.
De todas formas, no logro entender como algo tan básico como las traducciones han pasado de hacerlo tan fácil a complicarlo tanto, me parece mas facil el anterior metodo o sustituirlo por otro tipo setLocale como el del Request pero que valga para todas las peticiones... En fin, supongo que irá orientado a que se ponga el locale en la URL por el tema de los buscadores y tal pero para aplicaciones que no son webs sino aplicaciones web simplemente... es una jodienda.

Voy a probarlo y comento que tal me ha ido.

Muchas gracias GeekGirl!

Etiquetas: traduccion
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 22:30.