我想集成一个简单的HTML表单,允许用户更改Symfony2 Web应用程序的语言(即从页面en / faq转到fr / faq)。如何以适当的方式做到这一点?
我找到了一个很好的方法来使用Symfony而不是Symfony2:http://symfony.com/blog/play-with-the-user-language
答案 0 :(得分:31)
我找到的最简单的方法是直接在树枝模板中进行。至少,它适用于2.2:
<ul class="lang-menu">
<li><a href="{{ path(app.request.get('_route'), app.request.get('_route_params')|merge({'_locale': 'ca'})) }}">Català</a></li>
<li><a href="{{ path(app.request.get('_route'), app.request.get('_route_params')|merge({'_locale': 'en'})) }}">English</a></li>
</ul>
答案 1 :(得分:11)
您需要在控制器内拨打$this->get('session')->setLocale($locale)
(替换#39;会话&#39;请求#39;对于Symfony 2.1)。
我创建了一个表单,我传递了一系列语言:
<?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';
}
}
我将此表单提交给控制器中的单独操作,我在其中设置语言环境并返回重定向到最后一页:
<?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);
}
}
使用任何有效的区域设置(在创建表单时将其作为&#39;语言&#39;选项传递),前提是已启用PHP intl扩展名。如果不是,则您需要通过手动创建的区域设置名称列表替换\Locale::getDisplayName($lang)
。
答案 2 :(得分:5)
我没有使用表单,但只是在屏幕顶部使用小标记图像。每个标志都是指向当前页面的链接,但URL中的双字母语言代码被相应标志的语言替换。我的布局模板包含以下代码:
{% for language, description in languages %}
<a href="{{ replaceLanguageInUrl(app.session.locale, language, app.request.uri) }}">
<img src="{{ asset('images/flag_' ~ language ~ '.png') }}" alt="" title="{{ description }}"/>
</a>
{% endfor %}
replaceLanguageInUrl函数在我的Twig扩展类中定义:
public function getFunctions()
{
return array(
'replaceLanguageInUrl' => new \Twig_Function_Method($this, 'replaceLanguageInUrl'),
);
}
public function replaceLanguageInUrl($currentLanguage, $newLanguage, $url)
{
//EDIT BEGIN
if (strpos($url,$currentLanguage) == false) {
$url = getBaseUrl($url).'/'.$currentLanguage;
}
//EDIT END
return str_replace('/' . $currentLanguage . '/', '/' . $newLanguage . '/', $url);
}
单击标志时,将加载相同的页面,但是使用新语言。这也将自动在会话中设置新语言。
答案 3 :(得分:2)
在路由定义中使用_locale
参数会自动设置用户区域设置。
请参阅http://symfony.com/doc/current/book/translation.html#the-locale-and-the-url
答案 4 :(得分:2)
我是用本地做的,但比wdev的解决方案更简单,我用一些图片(旗帜)作为按钮。单击该标志时,将设置新的语言环境,并使用新语言刷新页面(使用重定向)。您需要使用Symfony's translation system。这是代码:
控制器:
public function englishAction(Request $request)
{
$this->get('session')->setLocale('en_US');
return $this->redirect($request->headers->get('referer'));
}
public function chineseAction(Request $request)
{
$this->get('session')->setLocale('zh_CN');
return $this->redirect($request->headers->get('referer'));
}
public function frenchAction(Request $request)
{
$this->get('session')->setLocale('fr_FR');
return $this->redirect($request->headers->get('referer'));
}
模板:
<ul class="nav pull-right">
<li>
<a href="{{ path('english') }}"><img src="{{ asset('bundles/fkmywebsite/images/flag-en.png') }}" alt="English Language" height="30" width="18" /></a>
</li>
<li>
<a href="{{ path('chinese') }}"><img src="{{ asset('bundles/fkmywebsite/images/flag-cn.jpg') }}" alt="Chinese Language" height="30" width="18" /></a>
</li>
<li>
<a href="{{ path('french') }}"><img src="{{ asset('bundles/fkmywebsite/images/flag-fr.png') }}" alt="French Language" height="30" width="18" /></a>
</li>
</ul>
编辑:此解决方案适用于Symfony2.0,用于Symfony2.1检查this question