Я работаю над приложением symfony, где моя цель состоит в том, что независимо от того, на какой странице находится пользователь, он перейдет к языковой версии страницы.
Например, если пользователь переходит на «/» на домашней странице, он будет перенаправлен на «/en/».
Если они находятся на странице "/admin", они будут перенаправлены на "/en/admin" таким образом, что свойство _locale
будет установлено из маршрута.
Также ему необходимо определить локаль, если они посещают /admin из браузера пользователей, поскольку локаль не была определена, поэтому он знает, на какую страницу перенаправить.
В настоящее время мой контроллер по умолчанию выглядит так, как показано ниже, так как я тестирую. Я использую режим разработки и профилировщик, чтобы проверить, правильно ли работают переводы.
<?php
namespace AppBundle\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;
class DefaultController extends Controller
{
/**
* @Route("/", name="homepage")
* @Route("/{_locale}/", name="homepage_locale")
*/
public function indexAction(Request $request)
{
$translated = $this->get('translator')->trans('Symfony is great');
// replace this example code with whatever you need
return $this->render('default/index.html.twig', [
'base_dir' => realpath($this->container->getParameter('kernel.root_dir').'/..'),
'translated' => $translated
]);
}
}
Этот текущий метод будет удерживать пользователя в «/», если он перейдет туда, но я хочу, чтобы он перенаправлялся на «/en/». Это должно работать и для других страниц, таких как /admin или /somepath/pathagain/article1 (/en/admin , /en/somepath/pathagain/article1)
Как мне это сделать?
Ссылки, которые я читал, не помогли:
Symfony2 Использовать локаль по умолчанию в маршрутизации (один URL-адрес для один язык)
Локаль Symfony2 по умолчанию в маршрутизации
::Обновление::
Я не решил свою проблему, но я приблизился к ней, а также научился нескольким приемам, чтобы быть более эффективным.
DefaultController.php
<?php
namespace AppBundle\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;
class DefaultController extends Controller
{
/**
* @Route("/", name="home", defaults={"_locale"="en"}, requirements={"_locale" = "%app.locales%"})
* @Route("/{_locale}/", name="home_locale", requirements={"_locale" = "%app.locales%"})
*/
public function indexAction(Request $request)
{
$translated = $this->get('translator')->trans('Symfony is great');
// replace this example code with whatever you need
return $this->render('default/index.html.twig', [
'base_dir' => realpath($this->container->getParameter('kernel.root_dir').'/..'),
'translated' => $translated
]);
}
/**
* @Route("/admin", name="admin", defaults={"_locale"="en"}, requirements={"_locale" = "%app.locales%"})
* @Route("/{_locale}/admin", name="admin_locale", requirements={"_locale" = "%app.locales%"})
*/
public function adminAction(Request $request)
{
$translated = $this->get('translator')->trans('Symfony is great');
// replace this example code with whatever you need
return $this->render('default/index.html.twig', [
'base_dir' => realpath($this->container->getParameter('kernel.root_dir').'/..'),
'translated' => $translated
]);
}
}
?>
Config.yml
imports:
- { resource: parameters.yml }
- { resource: security.yml }
- { resource: services.yml }
# Put parameters here that don't need to change on each machine where the app is deployed
# http://symfony.com/doc/current/best_practices/configuration.html#application-related-configuration
parameters:
locale: en
app.locales: en|es|zh
framework:
#esi: ~
translator: { fallbacks: ["%locale%"] }
secret: "%secret%"
router:
resource: "%kernel.root_dir%/config/routing.yml"
strict_requirements: ~
form: ~
csrf_protection: ~
validation: { enable_annotations: true }
#serializer: { enable_annotations: true }
templating:
engines: ['twig']
#assets_version: SomeVersionScheme
default_locale: "%locale%"
trusted_hosts: ~
trusted_proxies: ~
session:
# handler_id set to null will use default session handler from php.ini
handler_id: ~
save_path: "%kernel.root_dir%/../var/sessions/%kernel.environment%"
fragments: ~
http_method_override: true
assets: ~
# Twig Configuration
twig:
debug: "%kernel.debug%"
strict_variables: "%kernel.debug%"
# Doctrine Configuration
doctrine:
dbal:
driver: pdo_mysql
host: "%database_host%"
port: "%database_port%"
dbname: "%database_name%"
user: "%database_user%"
password: "%database_password%"
charset: UTF8
# if using pdo_sqlite as your database driver:
# 1. add the path in parameters.yml
# e.g. database_path: "%kernel.root_dir%/data/data.db3"
# 2. Uncomment database_path in parameters.yml.dist
# 3. Uncomment next line:
# path: "%database_path%"
orm:
auto_generate_proxy_classes: "%kernel.debug%"
naming_strategy: doctrine.orm.naming_strategy.underscore
auto_mapping: true
# Swiftmailer Configuration
swiftmailer:
transport: "%mailer_transport%"
host: "%mailer_host%"
username: "%mailer_user%"
password: "%mailer_password%"
spool: { type: memory }
Обратите внимание на значение app.locales: en|es|zh
под параметрами. Теперь это значение, на которое я могу ссылаться всякий раз, когда я создаю свои маршруты, если я планирую поддерживать больше локалей в будущем, что я и делаю. Эти маршруты английский, испанский, китайский в порядке для тех, кто любопытен. В DefaultController в аннотациях "%app.locales%"
— это часть, которая ссылается на параметр конфигурации.
Проблема с моим текущим методом заключается в том, что /admin, например, не перенаправляет пользователя на /{locale браузеров}/admin, что было бы более элегантным решением для организации всего... но, по крайней мере, маршруты работают. Все еще ищет лучшее решение.
****Обновлять****
Я думаю, что, возможно, нашел ответ здесь как нижний ответ (Добавьте локаль и требования ко всем маршрутам — Symfony2), ответ Athlan. Просто не уверен, как реализовать это в symfony 3, так как его указания были мне недостаточно ясны.
Я думаю, что эта статья также может помочь (http://symfony.com/doc/current/components/event_dispatcher/introduction.html)