【问题标题】:Set PHP language variable in all URLs在所有 URL 中设置 PHP 语言变量
【发布时间】:2019-11-25 06:31:32
【问题描述】:

我实际上正在为我的网站选择语言。一切都通过变量 $language 工作并设置在 cookie 中:

if(isset($_COOKIE["language"]))
{
    $language = $_COOKIE["language"];
}
else
{
    $language = 'en'; 
}

一切正常,除了网站的 URL 保持不变,无论语言设置如何:

http://localhost/modules/products/products.php

我的变量 $language 返回我:en fr es itde

如何在不更改所有链接的情况下在所有 URL 中插入此变量以获得此结果? :

http://localhost/modules/products/products.php?lang=en

http://localhost/en/modules/products/products.php(这将是我最喜欢的解决方案

【问题讨论】:

标签: php


【解决方案1】:

您不需要在所有 URL 上都设置它。您可以采用后备策略来完成此操作。按此顺序检查用户的意图:

  1. 网址
  2. 会话/Cookie
  3. 浏览器/标题设置(可选)
  4. 如果以上均未设置,请使用应用程序的默认值。

实施

在页面顶部有一个链接来切换语言。这是唯一包含语言参数的 URL。此 URL 可称为 语言转换器 URL。

当您处理语言转换器 URL 时,将他们选择的语言设置为会话。然后,在每个后续请求中,从会话中读取它。

如果它不在会话中,也不在 URL 中,那么您将回退到应用程序的默认语言。

我就这个话题写了一个相当深入的答案 - https://stackoverflow.com/a/49758067/296555

【讨论】:

    【解决方案2】:

    你可以做这样的事情: $language = $_GET["lang"] ?? $_COOKIE["language"] ?? "en"

    这将首先尝试从 URL 中获取 ?lang=en,然后尝试获取 cookie 值,如果不存在,则使用默认的 "en" 值。

    $_GET 数组将允许您访问通过 url 的查询字符串传递的每个值,这是问号之后的部分。

    ?? 运算符需要 PHP7 并在此处解释 https://www.php.net/manual/en/migration70.new-features.php#migration70.new-features.null-coalesce-op

    要允许这种类型的 url (http://localhost/en/modules/products/products.php),您需要通过您的 Web 服务器配置重写路径或使用某种框架来为您完成。

    【讨论】:

      【解决方案3】:

      您的代码似乎不支持多语言网址。也许最好的方法是创建将所选语言代码写入 COOKIES 并重定向回来的脚本。

      像这样:

      // switch_lang.php
      $language = $_GET["lang"] ?? "en";
      setcookie("language", $language);
      header('Location: ' . $_SERVER['HTTP_REFERER']);
      

      【讨论】:

        【解决方案4】:

        我的一个朋友给了我解决方案。在 apache 配置中激活 htaccess 文件。编辑您的 htaccess 文件并添加:

        RewriteEngine On
        RewriteBase /
        
        RewriteRule ^(en|fr|es|it|de)/(.*)$  $2?language=$1 [L,QSA]
        

        然后在你的 php 中:

        //Check if the select sends the Post lang
        if (isset($_POST["lang"]))
        {
            $var =substr_replace($_SERVER['REQUEST_URI'], $_POST["lang"], 1,2) ;
            header('Location:http://'.$_SERVER['HTTP_HOST'].$var);
        }
        
        //Redirect to EN laguage if no language is set in the URL, or Cookie
        if (empty($_COOKIE["language"]) && empty($_GET["language"]))
        {
            header('Location:http://'.$_SERVER['SERVER_NAME'].':8000/'.'en/');
        }
        
        //Check if language cookie is here and if it's different from the url
        if (isset($_COOKIE["language"]) && empty($_GET["language"]))
        {
                header('Location:http://'.$_SERVER['SERVER_NAME'].':8000/'.$_COOKIE["language"].'/');
        }
        elseif (isset($_GET["language"]))
        {
            $language = $_GET["language"];
            setcookie ('language', $language, time() + 60*60*24*30, '/', 'localhost');
        }
        else
        {
            $language = 'en';
        }
        

        语言选择器:

                <form action="" method="post">
                    <select name="lang" onchange='this.form.submit()'>
                        <option value="en" {if $language == en}selected{/if}>En</option>
                        <option value="fr" {if $language == fr}selected{/if}>Fr</option>
                        <option value="es" {if $language == es}selected{/if}>Es</option>
                        <option value="it" {if $language == it}selected{/if}>It</option>
                        <option value="de" {if $language == de}selected{/if}>De</option>
                    </select>
                </form>
        

        【讨论】:

          【解决方案5】:

          对于最后一个答案,您需要自己构建所有链接,在查看您当前拥有的链接时,您正在以默认方式访问文件。 你可以在你访问的每个文件中包含一个文件,如下所示:

          if(isset($_GET['lang']))
          { 
             header("Location: " .getcwd()."?lang=".$language.");
          }
          

          【讨论】:

            猜你喜欢
            • 2017-11-14
            • 2020-10-11
            • 2015-09-23
            • 2021-04-11
            • 1970-01-01
            • 2014-02-20
            • 1970-01-01
            • 2014-12-02
            • 2013-08-30
            相关资源
            最近更新 更多