symfony2ウェブアプリケーションの言語を変更できるように単純なHTMLフォームを統合したいと思います(ページen/faqからfr/faqへ)。どのように適切な方法でそれを行うには?symfony2言語セレクタ
私はsymfonyでそれを行うための良い方法を見つけなくSymfony2のとしている:あなたのルーティング定義で_locale
パラメータを使用http://symfony.com/blog/play-with-the-user-language
symfony2ウェブアプリケーションの言語を変更できるように単純なHTMLフォームを統合したいと思います(ページen/faqからfr/faqへ)。どのように適切な方法でそれを行うには?symfony2言語セレクタ
私はsymfonyでそれを行うための良い方法を見つけなくSymfony2のとしている:あなたのルーティング定義で_locale
パラメータを使用http://symfony.com/blog/play-with-the-user-language
は、自動的にユーザーのロケールを設定します。
は、あなたがあなたのコントローラ内(symfonyの2.1のための '要求' で 'セッション' を置き換える)$this->get('session')->setLocale($locale)
を呼び出す必要がhttp://symfony.com/doc/current/book/translation.html#the-locale-and-the-url
を参照してください。
私は、言語の配列を渡すために、フォーム、作成しました:私はロケールを設定するコントローラで別のアクションにこのフォームを送信してへのリダイレクトを返す
<?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);
}
}
任意の有効なロケールを持つ作品は、(フォームの作成中に「言語」オプションとして渡す)、PHPの国際拡張機能が有効になっていることを条件とします。そうでない場合は、\Locale::getDisplayName($lang)
を手動で作成したロケール名のリストで置き換える必要があります。
ちょうど注意してください:リファラーはいくつかのオタクによって上書きされるかもしれません、そして '$ router-> match()'は一致がないので例外をスローします。フォールバックはここでうまくいくかもしれません:-) –
これはフォームでは行われていませんが、画面の上部に小さなフラグ画像が表示されています。各フラグは現在のページへのリンクですが、URL内の2文字の言語コードがそれぞれのフラグの言語に置き換えられています。私のレイアウトテンプレートには、次のコードを持っています
replaceLanguageInUrl機能は私の小枝拡張クラスで定義されています
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);
}
フラグをクリックすると、同じページがロードされますが、新しい言語で。これにより、自動的に新しい言語がセッションに設定されます。
私はローカルでもそれをやったが、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.1はthis question
最も簡単な方法を確認するために、このソリューションは、Symfony2.0で動作ここでは、コードです私は小枝のテンプレートでそれを直接行うことがわかった。少なくとも、それは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>
はい、これはすべてのページで行ったことですが、ユーザーがリストで選択することで希望の言語を選択できるようにしたいと思います。 – cvsoftware