Mój composer (przed) zmianą:
"require": {
"php": ">=5.3.3",
"symfony/symfony": "2.2.*",
"doctrine/orm": ">=2.2.3,<2.4-dev",
"doctrine/doctrine-bundle": "1.0.*",
"twig/extensions": "1.0.*@dev",
"symfony/assetic-bundle": "2.1.*",
"symfony/swiftmailer-bundle": "2.1.*",
"symfony/monolog-bundle": "2.1.*",
"sensio/distribution-bundle": "2.1.*",
"sensio/framework-extra-bundle": "2.1.*",
"sensio/generator-bundle": "2.1.*",
"jms/security-extra-bundle": "1.2.*",
"jms/di-extra-bundle": "1.1.*",
"kriswallsmith/assetic": "1.1.*@dev",
"doctrine/migrations": "*",
"doctrine/doctrine-migrations-bundle": "dev-master",
"doctrine/doctrine-fixtures-bundle": "dev-master",
"mysql-workbench-schema-exporter/mysql-workbench-schema-exporter": "*",
"gedmo/doctrine-extensions": "2.3.*",
"jms/i18n-routing-bundle": "dev-master"
}
Mój composer (po zmianie):
"require": {
"php": ">=5.3.3",
"symfony/symfony": "2.2.*",
"doctrine/orm": "~2.2,>=2.2.3",
"doctrine/doctrine-bundle": "1.2.*",
"twig/extensions": "1.0.*@dev",
"symfony/assetic-bundle": "2.1.*",
"symfony/swiftmailer-bundle": "2.2.*",
"symfony/monolog-bundle": "2.2.*",
"sensio/distribution-bundle": "2.2.*",
"sensio/framework-extra-bundle": "2.2.*",
"sensio/generator-bundle": "2.2.*",
"jms/security-extra-bundle": "1.4.*",
"jms/di-extra-bundle": "1.3.*",
"kriswallsmith/assetic": "1.1.*@dev",
"doctrine/migrations": "*",
"doctrine/doctrine-migrations-bundle": "dev-master",
"doctrine/doctrine-fixtures-bundle": "dev-master",
"mysql-workbench-schema-exporter/mysql-workbench-schema-exporter": "dev-master",
"gedmo/doctrine-extensions": "2.3.*",
"jms/translation-bundle": "dev-master",
"jms/i18n-routing-bundle": "dev-master"
}
W config.yml (korzystam z wielojęzyczności):
jms_i18n_routing:
default_locale: pl
locales: [pl, en]
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:
framework:
#esi: ~
translator: { fallback: "%locale%" }
secret: "%secret%"
router:
resource: "%kernel.root_dir%/config/routing.yml"
strict_requirements: "%kernel.debug%"
form: true
csrf_protection: true
validation: { enable_annotations: true }
templating: { engines: ['twig'] } #assets_version: SomeVersionScheme
default_locale: "%locale%"
trust_proxy_headers: false # Whether or not the Request object should trust proxy headers (X_FORWARDED_FOR/HTTP_CLIENT_IP)
session: ~
# Twig Configuration
twig:
debug: "%kernel.debug%"
strict_variables: "%kernel.debug%"
Jestem już bliżej problemu

. 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/7063Należy zrobić subscribera, który będzie pobierał locale z głównego request i umożliwiał odczyt w subrequestach:
<?php
namespace Lib\EventSubscriber;
use Symfony\Component\HttpKernel\HttpKernelInterface;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class LocaleSubscriber implements EventSubscriberInterface
{
/**
* @var \Monolog\Logger
*/
protected $logger;
protected $defaultLocale;
protected $originalLocale;
protected $router;
public function __construct(\Monolog\Logger $logger, $router, $defaultLocale = 'fi')
{
$this->logger = $logger;
$this->defaultLocale = $defaultLocale;
$this->router = $router;
}
public function onKernelRequest(GetResponseEvent $event)
{
if($event->getRequestType() == HttpKernelInterface::MASTER_REQUEST)
{
$this->originalLocale = $event->getRequest()->getLocale();
$this->logger->debug('LocaleListener: Setting originalLocale to ['.$this->originalLocale.']');
}
$localeForRequest = $this->originalLocale ? $this->originalLocale : $this->defaultLocale;
$this->logger->debug('LocaleListener: For this request, locale is ['.$localeForRequest.']');
$event->getRequest()->setLocale($localeForRequest);
$this->router->getContext()->setParameter('_locale', $localeForRequest);
}
static public function getSubscribedEvents
() {
KernelEvents
::REQUEST => array(array('onKernelRequest', 13
)), );
}
}
locale_subscriber:
class: Lib\EventSubscriber\LocaleSubscriber
arguments: [@logger, @router, %kernel.default_locale%]
tags:
- { name: kernel.event_subscriber }
Ten post edytował blackroger 3.05.2013, 19:08:47