Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Silex:允许用户通过单击html元素并保持URL干净来更改语言_Php_Ajax_Symfony_Silex - Fatal编程技术网

Php Silex:允许用户通过单击html元素并保持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

我正在为一个网站使用Silex和Twig,我想允许用户更改网站的语言

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

/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>