Bạn cần phải gọi $this->get('session')->setLocale($locale)
(thay thế 'phiên' của 'yêu cầu' cho Symfony 2.1) bên trong điều khiển của bạn.
tôi đã tạo ra một hình thức, mà tôi vượt qua một loạt các ngôn ngữ:
<?php
class LanguageType extends AbstractType
{
public function buildForm(FormBuilder $builder, array $options)
{
$langs = $options['languages'];
$langs = array_combine($langs, $langs);
foreach ($langs as &$lang) {
$lang = \Locale::getDisplayName($lang);
}
$builder->add('language', 'choice', array(
'choices' => $langs,
'required' => false,
));
}
public function getDefaultOptions(array $options)
{
return array(
'languages' => array('fr_FR', 'en_GB'),
'csrf_protection' => false,
);
}
public function getName()
{
return 'my_language';
}
}
tôi gửi đơn này đến một hành động riêng biệt trong một bộ điều khiển, trong đó tôi thiết lập miền địa phương và trả về một chuyển hướng đến trang cuối cùng:
<?php
class LanguageController extends Controller
{
public function switchLanguageAction()
{
$form = $this->get('form.factory')->create(
new LanguageType(),
array('language' => $this->get('session')->getLocale()),
array('languages' => $this->container->getParameter('roger.admin.languages', null))
);
$request = $this->get('request');
$form->bindRequest($request);
$referer = $request->headers->get('referer');
if ($form->isValid()) {
$locale = $form->get('language')->getData();
$router = $this->get('router');
// Create URL path to pass it to matcher
$urlParts = parse_url($referer);
$basePath = $request->getBaseUrl();
$path = str_replace($basePath, '', $urlParts['path']);
// Match route and get it's arguments
$route = $router->match($path);
$routeAttrs = array_replace($route, array('_locale' => $locale));
$routeName = $routeAttrs['_route'];
unset($routeAttrs['_route']);
// Set Locale
$this->get('session')->setLocale($locale);
return new RedirectResponse($router->generate($routeName, $routeAttrs));
}
return new RedirectResponse($referer);
}
}
Làm việc với bất kỳ ngôn ngữ hợp lệ nào (bạn chuyển tùy chọn 'ngôn ngữ' khi tạo biểu mẫu), với điều kiện mở rộng phần mở rộng PHP. Nếu không, bạn cần phải thay thế \Locale::getDisplayName($lang)
bằng danh sách tên miền địa phương được tạo theo cách thủ công.
Vâng, đó là những gì tôi đã làm cho mỗi trang, tuy nhiên tôi cũng muốn cho phép người dùng chọn ngôn ngữ mà anh ấy muốn bằng cách chọn ngôn ngữ đó trong danh sách. – cvsoftware