在所有URL中设置PHP语言变量

时间:2019-07-16 13:41:20

标签: php

我实际上正在研究网站的语言选择。所有操作都通过变量$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(这是我最喜欢的解决方案

5 个答案:

答案 0 :(得分:1)

您不需要在所有URL上进行设置。您可以采用后备策略来完成此任务。以此顺序检查用户的意图:

  1. URL
  2. 会话/饼干
  3. 浏览器/标题设置(可选)
  4. 未设置上述任何一项时,请使用您应用程序的默认值。

实施

在页面顶部有一个链接以切换语言。这是唯一具有language参数的URL。此URL可以称为语言更改器 URL。

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

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

我对此主题写了一个非常深入的答案-https://stackoverflow.com/a/49758067/296555

答案 1 :(得分:0)

您可以执行以下操作: $language = $_GET["lang"] ?? $_COOKIE["language"] ?? "en"

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

通过$_GET数组,您可以访问通过查询字符串传递的每个值,该查询字符串是问号后面的部分。

??运算符需要PHP7,在这里https://www.php.net/manual/en/migration70.new-features.php#migration70.new-features.null-coalesce-op进行了解释

要允许这种网址(http://localhost/en/modules/products/products.php),您将需要通过Web服务器配置重写路径,或使用某种为您执行此操作的框架。

答案 2 :(得分:0)

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

赞:

Intent

答案 3 :(得分:0)

我的一个朋友给了我解决方案。在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>

答案 4 :(得分:-1)

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

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