Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/295.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/73.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/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
如何根据URL更改PHP变量语言_Php_Html_Web_Url - Fatal编程技术网

如何根据URL更改PHP变量语言

如何根据URL更改PHP变量语言,php,html,web,url,Php,Html,Web,Url,我有两个PHP文件-en.PHP和fr.PHP。一个包含英语变量,另一个包含法语变量。我必须使用基于URL的所需文件。例如,如果URL以?lang=en结尾,我必须使用英语,反之亦然。我对PHP真的很陌生,所以这就是我在这里提问的原因。谢谢 您可以这样做: $lang = "en"; //default languague if(isset($_GET['lang'])) { $lang = $_GET['lang']; } require_once($lang

我有两个PHP文件-en.PHP和fr.PHP。一个包含英语变量,另一个包含法语变量。我必须使用基于URL的所需文件。例如,如果URL以
?lang=en
结尾,我必须使用英语,反之亦然。我对PHP真的很陌生,所以这就是我在这里提问的原因。谢谢

您可以这样做:

$lang = "en"; //default languague   
if(isset($_GET['lang'])) {
    $lang = $_GET['lang'];
}
require_once($lang.".php");

你可以这样做:

$lang = "en"; //default languague   
if(isset($_GET['lang'])) {
    $lang = $_GET['lang'];
}
require_once($lang.".php");
简单方法 您可以将文件保存在特定目录中,或者严格检查文件名语法

这是因为使用
require
include
包含变量将执行一个文件,该文件可能位于另一台服务器上,在您的web服务器的安全上下文下,由其他人控制(见下文“注入”)。你不想让这一切发生,这一点都不好笑。所以:检查文件名

记住上次使用的语言 更高级:使用函数接受语言。 现在从浏览器中读取它。 PHP必须检测浏览器需要什么语言

$languages = array();

$languages[] = 'en'; // Default, with lowest priority
// Note: "en" default is not guaranteed to exist. You must ensure it does.

// Browser choice, with more priority than default
if (class_exists('Locale')) {
    $locale = Locale::acceptFromHTTP($_SERVER['HTTP_ACCEPT_LANGUAGE']);
    if ($locale !== null) {
        $test = substr($locale, 0, 2);
        if (null !== ($test = validLanguage($test))) {
            $languages[] = $test;
        }
    }
}
// Session, with more priority
if (array_key_exists('lang', $_SESSION)) {
    $languages[] = $_SESSION['lang'];
}
// Language selected, with even more priority
if (array_key_exists('lang', $_REQUEST)) {
     $test = $_REQUEST['lang'];
     if (null !== ($test = validLanguage($test))) {
         $languages[] = $test;
     }
}

// Pop best choice for language
$lang = array_pop($languages);
// Remember for the next time
$_SESSION['lang'] = $lang;
// Finally include the appropriate file. 
include_once("{$lang}.php");
apachemod_重写 有了更多的经验,您甚至可以在事后让它变得如此https://yoursite.com/en/anypage.php实际上相当于请求普通的
https://yoursite.com/anypage.php?lang=en
使用Apache server的mod_重写功能,如果已安装并激活,实现更多用户和SEO友好的URL。更多详情请参阅

另一种方法是:使用locale() 出于下面更详细的原因,使用
include
毕竟不是一个好主意。但通常你这样做是因为你有

print "<h1>{$welcomeMessage}, {$username}!</h1>";
然后维护一个名为pofile的特殊文件,下划线系统可以使用该文件

这在内存使用和速度以及专业使用方面都有一些优势,因为您可以将英语pofile发送给(比如)俄罗斯专业翻译人员,他们(通常)会(更容易)省事、省钱,因此,你将能够购买适当的POP文件,一旦上传,它将把你的网站(或其关键部分)翻译成俄语。您甚至可以让您的网站所有者(如果您是第三方开发人员)提供自己的POP文件

使用gettext框架的工作可以通过以下技巧变得不那么麻烦:事先告诉PHP无论输出什么都必须通过一个过滤函数

ob_start('my_translate');
此函数将解析参数,查找某些文本需要翻译的特定信号,如果需要,则返回其翻译:

function my_translate($text) {
    // I will translate ??CAPITAL_STRINGS_IN_DOUBLE_QUESTI1MARKS??
    $telltale = '#\?\?([A-Z][A-Z_0-9]+)\?\?#';
    return preg_replace_callback(
        $telltale, 
        function ($matches) {
            return _($matches[1]);
        }
        $text
    );
}
因此,现在您的PHP代码变为

print "<h1>??WELCOME?? {$username}!</h1>";
此外,您需要将适当的文件放在“/translations”目录中。在本例中,$lang有点复杂,因为它必须遵循“locale”语法——因此它应该是“fr_fr”而不是“fr”


关于PHP代码注入的安全说明
想象一下,您的服务器并不是很坚固(很多都不是;您会感到惊讶)。并且所需语言的名称未被检查或清除。我,约翰·Q·邪恶,有理由怀疑这可能是真的。或者只是想看看。我看到“lang=en”,我知道发生了什么

因此,我在我的服务器上准备了一个PHP脚本,并准备在不被解释的情况下提供它;访问
https://john.q.evil/hack.php
将向您展示一个包含
简单方法的PHP脚本
您可以将文件保存在特定目录中,或者严格检查文件名语法

这是因为使用
require
include
包含变量将执行一个文件,该文件可能位于另一台服务器上,在您的web服务器的安全上下文下,由其他人控制(见下文“注入”)。你不想让这一切发生,这一点都不好笑。所以:检查文件名

记住上次使用的语言 更高级:使用函数接受语言。 现在从浏览器中读取它。 PHP必须检测浏览器需要什么语言

$languages = array();

$languages[] = 'en'; // Default, with lowest priority
// Note: "en" default is not guaranteed to exist. You must ensure it does.

// Browser choice, with more priority than default
if (class_exists('Locale')) {
    $locale = Locale::acceptFromHTTP($_SERVER['HTTP_ACCEPT_LANGUAGE']);
    if ($locale !== null) {
        $test = substr($locale, 0, 2);
        if (null !== ($test = validLanguage($test))) {
            $languages[] = $test;
        }
    }
}
// Session, with more priority
if (array_key_exists('lang', $_SESSION)) {
    $languages[] = $_SESSION['lang'];
}
// Language selected, with even more priority
if (array_key_exists('lang', $_REQUEST)) {
     $test = $_REQUEST['lang'];
     if (null !== ($test = validLanguage($test))) {
         $languages[] = $test;
     }
}

// Pop best choice for language
$lang = array_pop($languages);
// Remember for the next time
$_SESSION['lang'] = $lang;
// Finally include the appropriate file. 
include_once("{$lang}.php");
apachemod_重写 有了更多的经验,您甚至可以在事后让它变得如此https://yoursite.com/en/anypage.php
实际上相当于请求普通的
https://yoursite.com/anypage.php?lang=en
使用Apache server的mod_重写功能,如果已安装并激活,实现更多用户和SEO友好的URL。更多详情请参阅

另一种方法是:使用locale() 出于下面更详细的原因,使用
include
毕竟不是一个好主意。但通常你这样做是因为你有

print "<h1>{$welcomeMessage}, {$username}!</h1>";
然后维护一个名为pofile的特殊文件,下划线系统可以使用该文件

这在内存使用和速度以及专业使用方面都有一些优势,因为您可以将英语pofile发送给(比如)俄罗斯专业翻译人员,他们(通常)会(更容易)省事、省钱,因此,你将能够购买适当的POP文件,一旦上传,它将把你的网站(或其关键部分)翻译成俄语。您甚至可以让您的网站所有者(如果您是第三方开发人员)提供自己的POP文件

使用gettext框架的工作可以通过以下技巧变得不那么麻烦:事先告诉PHP无论输出什么都必须通过一个过滤函数

ob_start('my_translate');
此函数将解析参数,查找某些文本需要翻译的特定信号,如果需要,则返回其翻译:

function my_translate($text) {
    // I will translate ??CAPITAL_STRINGS_IN_DOUBLE_QUESTI1MARKS??
    $telltale = '#\?\?([A-Z][A-Z_0-9]+)\?\?#';
    return preg_replace_callback(
        $telltale, 
        function ($matches) {
            return _($matches[1]);
        }
        $text
    );
}
因此,现在您的PHP代码变为

print "<h1>??WELCOME?? {$username}!</h1>";
此外,您需要将适当的文件放在“/translations”目录中。在本例中,$lang有点复杂,因为它必须遵循“locale”语法——因此它应该是“fr_fr”而不是“fr”


关于PHP代码注入的安全说明
想象一下,您的服务器并不是很坚固(很多都不是;您会感到惊讶)。你的名字是什么