我正在为网站使用Silex和Twig,并且我希望允许用户更改网站的语言。
现在,如果我更改URL的语言环境,则可以使用:
/my-account:我的页面内容为英文(默认为_locale)
/my-account
/fr/my-account:我的页面内容是法文
/fr/my-account
/en/my-account:我的页面内容是英文
/en/my-account
如何通过单击html元素来执行相同的操作?
我正在寻找解决我的问题的想法,并寻求一些好的实践来尽可能地做到“正确”。
这是我用来管理多语言的Silex组件:
// TRANSLATION $app->register(new Silex\Provider\LocaleServiceProvider()); $app->register(new Silex\Provider\TranslationServiceProvider()); $app->register(new \Pmaxs\Silex\Locale\Provider\LocaleServiceProvider(), [ 'locale.locales' => ['en', 'fr'], 'locale.default_locale' => 'en', 'locale.resolve_by_host' => false, 'locale.exclude_routes' => ['^_'] ]); $app->extend('translator', function($translator, $app) { $translator->addLoader('yaml', new YamlFileLoader()); $translator->addResource('yaml', __DIR__.'/../src/locales/en.yml', 'en'); $translator->addResource('yaml', __DIR__.'/../src/locales/fr.yml', 'fr'); return $translator; });
这是我的HTML供用户更改语言:
<li id="drop-langue" data-lg="en"> <span id="current-lg">EN</span> // My current langue <div class="drop-langue"> // The list of langage the user can choose : here ONE -> FR <div id="list_langue"> <a class="change_langue" href="#" data-lg="fr"> <span>FR</span></a> // Could be nice to change the langue staying on the same page </div> </div> </li>
现在我的jQuery获得价值:
$(document).ready(function() { $(".change_langue").on("click", function() { var new_langue = $(this).data("lg"); $.ajax({ url: "{{ path('new-langue') }}", type: 'POST', data: {'langue': new_langue}, success: function (resp) { console.log(resp); }, error: function (resp) { console.log(resp); } }); }); });
我的Ajax控制器:
$app->match('/new-langue', function (Request $request) use ($app) { $new_langue = $request->get('langue'); // some code to change the langage return New Response($new_langue); })->bind('new-langue');
如果这样做,我的Ajax成功就可以console.log(resp);给我en。
console.log(resp);
en
fr
window.location.href
500 (Internal Server Error)
$new_langue
$app['defaultLanguage']
这是我第一次使用Silex创建一个完整的网站,并且我是php框架的初学者,因此,如果有人可以帮助实现我想要的…,请先感谢!
编辑:
根据我得到的答案以及我想要实现的目标,是否可以更改语言环境并与Silex / Twig保持同一页面?
例如,这给了我当前路线:global.request.get('_route')这global.request.get('_locale')给了我区域设置。
global.request.get('_route')
global.request.get('_locale')
如果以我的主页为例,这就是我的控制器现在的外观(我只是显示模板):
$app->match('/', function (Request $request) use ($app) { return $app['twig']->render('home.html.twig'); })->bind('home');
如您所见,我的URL中没有{_locale}参数。 因此,我可以保留没有“ __locale”的“干净的URL”并单击并停留在同一页面上+更改当前语言吗?
我想做这样的事情: <a href="{{ path(global.request.get('_route')), global.request.set('_locale', 'FR') }}">FR</a>
<a href="{{ path(global.request.get('_route')), global.request.set('_locale', 'FR') }}">FR</a>
但这不能肯定…我可以这样做吗?
我终于找到了使用pmaxs/silex-locale(https://github.com/pmaxs/silex- locale)做我想要的解决方案。
pmaxs/silex-locale
就像我在问题中说的那样,我已经在翻译时使用了它,但是我并没有使用“ Url generation” …所以这里是使用方法的概述(如果您使用Silex v1,请阅读文档。X):
1 /加载提供者
$app->register(new \Pmaxs\Silex\Locale\Provider\LocaleServiceProvider(), [ 'locale.locales' => ['en', 'fr'], //I want to translate my site in English and French 'locale.default_locale' => 'en', // By default, the locale is "en" 'locale.resolve_by_host' => false, 'locale.exclude_routes' => ['^_'] ]); $app->register(new Silex\Provider\LocaleServiceProvider());
2 /用法
这是我的家庭路线控制器:
// this page is accessible by urls '/', '/fr/' or '/en/' $app->match('/', function (Request $request) use ($app) { // my code return $app['twig']->render('home.html.twig'); })->bind('home');
如您所见,{_locale}我的路由中没有变量,但是仍然可以使用它来更改页面的语言。
{_locale}
3 /网址生成器
现在,这是我如何更改语言的方法:
{% set locale_list = ["en", "fr"] %} // the list of all langage in my website {% set current_locale = global.request.getLocale() %} // the current langage of my page <li id="drop-langue"> // I display the current langage <span id="current-lg">{{ current_locale|upper }}</span> <div class="drop-langue"> <div id="list_langue"> {% for locale in locale_list %} {% if locale != current_locale %} // I create one link to change the langage according to all the langage I want, minus the current langage <a class="change_langue" href="{{ locale_generate(locale , global.request.get('_route')) }}" > <span>{{ locale|upper }}</span> </a> {% endif %} {% endfor %} </div> </div> </li>
我正在使用“网址生成器”,它的工作方式如下:(locale_generate('es', $name, $parameters = array(),$referenceType = UrlGeneratorInterface::ABSOLUTE_PATH)文档中有更多详细信息)。
locale_generate('es', $name, $parameters = array(),$referenceType = UrlGeneratorInterface::ABSOLUTE_PATH)
这样,当我进入我的网站时,我的英语是“ clean Url”(默认语言环境)/。然后,单击FR我的url /fr/并使用新的选择菜单将我的内容翻译成法语(current-langue = FR,然后我可以选择“ EN”)。
/
FR
/fr/