【发布时间】:2018-03-01 17:15:48
【问题描述】:
我正在为网站使用 Silex 和 Twig,我希望允许用户更改网站的语言。
我的问题
现在,如果我更改 URL 中的语言环境,它可以工作:
/my-account: 我的页面内容是英文(默认_locale)
/fr/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 我想要的。
关于如何做的一些想法/问题
- 使用 Ajax 调用是否是个好主意?
- 如果我在我的 url 中将
fr更改为en它可以工作,那么尝试在 JavaScript 中使用window.location.href进行更改是个好主意吗? (我认为没有,但仍在询问) - 我看到 this solution 有其他问题,并在我的控制器中尝试它,但我收到此错误:
500 (Internal Server Error)(我也这样做了,使用$new_langue而不是$app['defaultLanguage'],并且我的主页名称正确)。
这是我第一次使用 Silex 创建一个完整的网站,而且我是 php 框架的初学者,所以如果有人可以帮助实现我想要的......在此先感谢!
编辑:
根据我得到的答案和我想要实现的目标,是否可以更改语言环境并与 Silex / Twig 保持在同一页面中?
例如,这给了我当前路线: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>
但这肯定行不通...我可以这样做吗?
【问题讨论】: