我实际上正在研究网站的语言选择。所有操作都通过变量$language
并在Cookie中进行设置:
if(isset($_COOKIE["language"]))
{
$language = $_COOKIE["language"];
}
else
{
$language = 'en';
}
一切正常,除了网站的URL保持不变外,无论设置哪种语言:
http://localhost/modules/products/products.php
我的变量$language
返回了我:en
fr
es
it
和de
如何在不更改所有链接的情况下在所有URL中插入此变量以获得此结果? :
http://localhost/modules/products/products.php?lang=en
或
http://localhost/en/modules/products/products.php
(这是我最喜欢的解决方案
答案 0 :(得分:1)
您不需要在所有URL上进行设置。您可以采用后备策略来完成此任务。以此顺序检查用户的意图:
实施
在页面顶部有一个链接以切换语言。这是唯一具有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.");
}