Mój composer (przed) zmianą:
  1. "require": {
  2. "php": ">=5.3.3",
  3. "symfony/symfony": "2.2.*",
  4. "doctrine/orm": ">=2.2.3,<2.4-dev",
  5. "doctrine/doctrine-bundle": "1.0.*",
  6. "twig/extensions": "1.0.*@dev",
  7. "symfony/assetic-bundle": "2.1.*",
  8. "symfony/swiftmailer-bundle": "2.1.*",
  9. "symfony/monolog-bundle": "2.1.*",
  10. "sensio/distribution-bundle": "2.1.*",
  11. "sensio/framework-extra-bundle": "2.1.*",
  12. "sensio/generator-bundle": "2.1.*",
  13. "jms/security-extra-bundle": "1.2.*",
  14. "jms/di-extra-bundle": "1.1.*",
  15. "kriswallsmith/assetic": "1.1.*@dev",
  16. "doctrine/migrations": "*",
  17. "doctrine/doctrine-migrations-bundle": "dev-master",
  18. "doctrine/doctrine-fixtures-bundle": "dev-master",
  19. "mysql-workbench-schema-exporter/mysql-workbench-schema-exporter": "*",
  20. "gedmo/doctrine-extensions": "2.3.*",
  21. "jms/i18n-routing-bundle": "dev-master"
  22. }


Mój composer (po zmianie):
  1. "require": {
  2. "php": ">=5.3.3",
  3. "symfony/symfony": "2.2.*",
  4. "doctrine/orm": "~2.2,>=2.2.3",
  5. "doctrine/doctrine-bundle": "1.2.*",
  6. "twig/extensions": "1.0.*@dev",
  7. "symfony/assetic-bundle": "2.1.*",
  8. "symfony/swiftmailer-bundle": "2.2.*",
  9. "symfony/monolog-bundle": "2.2.*",
  10. "sensio/distribution-bundle": "2.2.*",
  11. "sensio/framework-extra-bundle": "2.2.*",
  12. "sensio/generator-bundle": "2.2.*",
  13. "jms/security-extra-bundle": "1.4.*",
  14. "jms/di-extra-bundle": "1.3.*",
  15. "kriswallsmith/assetic": "1.1.*@dev",
  16. "doctrine/migrations": "*",
  17. "doctrine/doctrine-migrations-bundle": "dev-master",
  18. "doctrine/doctrine-fixtures-bundle": "dev-master",
  19. "mysql-workbench-schema-exporter/mysql-workbench-schema-exporter": "dev-master",
  20. "gedmo/doctrine-extensions": "2.3.*",
  21. "jms/translation-bundle": "dev-master",
  22. "jms/i18n-routing-bundle": "dev-master"
  23. }


W config.yml (korzystam z wielojęzyczności):
  1. jms_i18n_routing:
  2. default_locale: pl
  3. locales: [pl, en]
  4. strategy: prefix_except_default

Chociaż podejrzewam, że ten element nie ma znaczenia w tym problemie.

Ogólnie pojawia się dziwne zachowanie dla translacji. Coś jest nie tak.

Przykład:
{% trans %}homepage{% endtrans %}

Mam dwa pliki w katalogu translations:
- messages.en.yml
homepage: 'Homepage'

- messages.pl.yml
homepage: 'Strona główna'

Zwraca mi wersję po polsku chociaż jak sprawdzam {{ app.request.locale }} to wersja jest 'en'. Wygląda to tak jakby w samym twig element locale nie był brany pod uwagę.

Wcześniej wszystko działało...

Problem pojawił się po aktualizacji symfony 2.1 na 2.2...ehh....

Jeszcze daje config.yml:
  1. framework:
  2. #esi: ~
  3. translator: { fallback: "%locale%" }
  4. secret: "%secret%"
  5. router:
  6. resource: "%kernel.root_dir%/config/routing.yml"
  7. strict_requirements: "%kernel.debug%"
  8. form: true
  9. csrf_protection: true
  10. validation: { enable_annotations: true }
  11. templating: { engines: ['twig'] } #assets_version: SomeVersionScheme
  12. default_locale: "%locale%"
  13. trust_proxy_headers: false # Whether or not the Request object should trust proxy headers (X_FORWARDED_FOR/HTTP_CLIENT_IP)
  14. session: ~
  15.  
  16. # Twig Configuration
  17. twig:
  18. debug: "%kernel.debug%"
  19. strict_variables: "%kernel.debug%"



Jestem już bliżej problemu smile.gif. Takie zachowanie dotyczy tylko subrequestów. Dla normalnych requestów jest ok...


ROZWIĄZANIE (dla symfony 2.2 - mam nadzieję, że w kolejnych wersjach zostanie to poprawione z automatu):

Pod wielu godzinach rozwiązanie znalezione. Okazało się, że to jest błąd subrequestów:
https://github.com/symfony/symfony/issues/7063

Należy zrobić subscribera, który będzie pobierał locale z głównego request i umożliwiał odczyt w subrequestach:

  1. <?php
  2.  
  3. namespace Lib\EventSubscriber;
  4.  
  5. use Symfony\Component\HttpKernel\HttpKernelInterface;
  6. use Symfony\Component\HttpKernel\Event\GetResponseEvent;
  7. use Symfony\Component\HttpKernel\KernelEvents;
  8. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  9.  
  10. class LocaleSubscriber implements EventSubscriberInterface
  11. {
  12. /**
  13. * @var \Monolog\Logger
  14. */
  15. protected $logger;
  16. protected $defaultLocale;
  17. protected $originalLocale;
  18. protected $router;
  19.  
  20. public function __construct(\Monolog\Logger $logger, $router, $defaultLocale = 'fi')
  21. {
  22. $this->logger = $logger;
  23. $this->defaultLocale = $defaultLocale;
  24. $this->router = $router;
  25. }
  26.  
  27. public function onKernelRequest(GetResponseEvent $event)
  28. {
  29. if($event->getRequestType() == HttpKernelInterface::MASTER_REQUEST)
  30. {
  31. $this->originalLocale = $event->getRequest()->getLocale();
  32. $this->logger->debug('LocaleListener: Setting originalLocale to ['.$this->originalLocale.']');
  33. }
  34.  
  35. $localeForRequest = $this->originalLocale ? $this->originalLocale : $this->defaultLocale;
  36. $this->logger->debug('LocaleListener: For this request, locale is ['.$localeForRequest.']');
  37. $event->getRequest()->setLocale($localeForRequest);
  38. $this->router->getContext()->setParameter('_locale', $localeForRequest);
  39. }
  40.  
  41. static public function getSubscribedEvents()
  42. {
  43. return array(
  44. KernelEvents::REQUEST => array(array('onKernelRequest', 13)),
  45. );
  46. }
  47.  
  48. }


  1. locale_subscriber:
  2. class: Lib\EventSubscriber\LocaleSubscriber
  3. arguments: [@logger, @router, %kernel.default_locale%]
  4. tags:
  5. - { name: kernel.event_subscriber }
  6.