php – Silex:允许用户通过单击html元素并保持干净的URL来更改语言

我正在使用Silex和Twig建立一个网站,我希望允许用户更改网站的语言.

我的问题

现在,如果我更改URL中的区域设置,它会起作用:

/ my-account:我的页面内容是英文(认为_locale)

/ fr / my-account:我的页面内容是法语

/ en / my-account:我的页面内容是英文的

如何通过单击html元素来执行相同的操作?

我正在寻找一些想法,以解决我的问题和一些良好的做法,如果可能的话,“正确的方式”.

我的代码

这是我用来管理multilangue的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);按我的意愿给我.

关于如何做的一些想法/问题

>使用Ajax调用是否是一个好主意?
>如果我在我的网址中通过en更改fr,它是否有效,尝试使用window.location.href在javascript中执行此操作是否是个好主意? (我想不是但仍然在问)
>我看到了this solution的另一个问题,并在我的控制器中尝试但是我收到此错误:500(内部服务器错误)(我做了同样的事情,使用$new_langue而不是$app [‘defaultLanguage’]并使用正确的名称我的主页).

这是我第一次使用Silex创建一个完整的网站,而且我是PHP框架的初学者,所以如果有人可以帮助实现我想要的东西……感谢提前!

编辑:

根据我得到的anwser以及我想要实现的目标,是否可以更改区域设置并与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')}}”&gt ; FR&LT / A&GT 但它肯定不会起作用……我可以这样做吗?

解决方法:

因此,从您的消息中,我可以提取您的目标是允许在单击HTML元素时更改语言.

a标签用法定义了一个链接,用于从一个页面链接到另一个页面,可以用来实现你想要的.

我以前做过多廊网站,你可以通过各种方式实现这一点.

///////////////////////////////方法1:在HTML属性href中定义位置

在你的HTML代码中,你已经在超链接中使用了hash – #.

链接需要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>

注意:将yourwebsite.com替换为您网站的域名.

///////////////////////////////方法1的结尾

在您的HTML代码中,您提到//可能很高兴更改停留在同一页面上的语言.

这可以使用AJAX来完成,是的.

但我不建议你这样做,因为通过查看同样拥有多种语言网站的大公司,例如SAPApple,它们都会重定向到不同的页面.

///////////////////////////////更新:到现在为止的答案是因为我认为你的需要只是为了允许语言单击HTML元素时要更改.

显然,你的目标稍微复杂一些.

根据Silex文档,_locale的用法the way to go.

this question you can see working code

<?PHP

require_once __DIR__.'/../vendor/autoload.PHP';

$app = new Silex\Application();
$app['debug'] = true;

$app->register(new Silex\Provider\UrlGeneratorServiceProvider());
$app->register(new Silex\Provider\TwigServiceProvider(), array(
    'twig.path' => __DIR__.'/../views',
));

$app->register(new Silex\Provider\TranslationServiceProvider(array(
    'locale_fallbacks' => array('hr'),
)));


$app['translator'] = $app->share($app->extend('translator', function($translator) {

    $translator->addLoader('xlf', new \Symfony\Component\Translation\Loader\XliffFileLoader());

    $translator->addResource('xlf', __DIR__.'/../locales/hr.xlf', 'hr');
    $translator->addResource('xlf', __DIR__.'/../locales/en.xlf', 'en');
    $translator->addResource('xlf', __DIR__.'/../locales/sl.xlf', 'sl');

    return $translator;
}));


$app->get('/', function () use ($app) {

    $app['translator']->setLocale('hr');

    return $app['twig']->render('home.twig', array('d' => $app['translator']->getLocale()));

});


$app->get('/{_locale}/', function() use ($app) {
    $app['translator']->setLocale($app['request']->get('locale'));

    return $app['twig']->render('home.twig', array('d' => $app['translator']->getLocale()));
});



$app->run();

相关文章

IE6是一个非常老旧的网页浏览器,虽然现在很少人再使用它,但...
PHP中的count()函数是用来计算数组或容器中元素的个数。这个...
使用 AJAX(Asynchronous JavaScript and XML)技术可以在不...
Ajax(Asynchronous JavaScript and XML)是一种用于改进网页...
本文将介绍如何通过AJAX下载Excel文件流。通过AJAX,我们可以...
Ajax是一种用于客户端和服务器之间的异步通信技术。通过Ajax...