Php Silex:允许用户通过单击html元素并保持URL干净来更改语言
我正在为一个网站使用Silex和Twig,我想允许用户更改网站的语言 我的问题 现在,如果我更改URL中的区域设置,它会起作用:Php Silex:允许用户通过单击html元素并保持URL干净来更改语言,php,ajax,symfony,silex,Php,Ajax,Symfony,Silex,我正在为一个网站使用Silex和Twig,我想允许用户更改网站的语言 我的问题 现在,如果我更改URL中的区域设置,它会起作用: /my account:我的页面内容为英语(默认语言环境) /fr/my account:我的页面内容是法语的 /en/my account:我的页面内容是英文的 如何通过单击html元素来执行相同操作? 我正在寻找一些解决我的问题的想法,并在可能的情况下,采取一些良好的做法来做到这一“正确的方法” 我的代码 下面是我用来管理多语言的Silex组件: // TRANS
/my account
:我的页面内容为英语(默认语言环境)
/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>
我的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中通过en
更改fr
,它可以正常工作,那么尝试在javascript中使用window.location.href
这样做是一个好主意吗?(我想没有,但仍在问)
我发现了另一个问题,并在我的控制器中尝试了它,但我得到了这个错误:500(内部服务器错误)
(我也这样做了,使用了$new\u language
而不是$app['defaultLanguage']
,并且使用了我主页的正确名称)
这是我第一次用Silex创建一个完整的网站,我是php框架的初学者,所以如果有人能帮我实现我想要的…提前感谢
编辑:
根据我得到的anwser和我想要实现的,是否有可能更改区域设置并与Silex/Twig保持在同一页面上
例如,这会给我当前的路由:global.request.get(“'u route')
,而这global.request.get('u locale')
会给我区域设置
如果以我的主页为例,这就是我的控制器现在的样子(我只是显示模板):
如您所见,我的URL中没有{u locale}参数那么我可以保留这个没有{u locale}的“干净URL”并单击保持在同一页面上并更改当前语言吗?
我想做这样的事情:
但是它肯定不行……我可以这样做吗?因此,从您的消息中,我可以提取您的目标是允许在单击HTML元素时更改语言
标记的使用定义了一个超链接,该超链接用于从一个页面链接到另一个页面,并可用于实现您想要的内容
我以前做过多语言网站,你可以通过多种方式实现
///////////////////////////////方法1:在HTML属性href中定义位置
在HTML代码中,您在超链接中使用了哈希-#
超链接需要href属性,因为它指定了位置
查看您的代码,您有标记,但它缺少指向要将用户重定向到的特定位置的链接
假设您想让它进入法语版的我的账户
页面
因此,您的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="http://yourwebsite.com/fr/my-account" data-lg="fr"><span>FR</span></a>
</div>
</div>
</li>
在您的情况下,它只是添加适当的链接,以允许用户切换语言的问题。剩下的工作你已经完成了。语言切换器下拉列表必须包含所有支持的语言,包括英语。请参见下面的am示例图像
而不是将用户重定向到http://yourwebsite.com/[fr]/my account
您必须重定向到一种特殊方法,如http://www.yourwebsite.com/language_change?lang=fr
。您将在$\u SERVER
变量中获得HTTP\u referer
,这样您就可以将用户重定向回他们所在的原始页面。这样,您可以保留用户当前访问的页面/url
第二,Ajax vs Redirect:最好使用重定向而不是Ajax。如果您使用AJAX,您将增加对自己的共谋
当使用多语言网站时,我们必须遵循这些最佳实践
- 每种语言的具体路线
- 菜单、标签和表格
- 网站的内容
- 额外:翻译FOSUserBundle
这里的简单想法是:应用程序如何确定用于呈现页面的语言
解决方案#1(您当前的解决方案)基于URL参数(即
\u locale
),并在没有给出URL参数的情况下返回到某个默认值。
因此在该解决方案中,翻译组件始终在路由器组件准备的参数包中查找所选语言
解决方案#2将语言标识符放入会话变量中。
您的/new langue
页面必须使用它接收的值设置此会话变量。您的路由器将从该会话变量填充\u locale
参数
稍后我可能会提供一些代码片段。我终于找到了一个解决方案,使用pmax/silex locale
()来完成我想要的任务
正如我在问题中所说,我已经在翻译中使用了它,但我没有像我应该使用的那样使用“Url生成”…因此这里是如何使用它的概述(如果使用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');
如您所见,我的路由中没有{u locale}
变量,但仍然可以使用它来更改页面的语言
3/Url生成器
$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());
现在,以下是我如何改变我的语言:
{% 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>
{%set locale_list=[“en”,“fr”]%}//我的网站中所有语言的列表
{%set current\u locale=global.request.getLocale()%}//当前
// 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');
{% 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>