如何根据URL更改PHP变量语言
我有两个PHP文件-en.PHP和fr.PHP。一个包含英语变量,另一个包含法语变量。我必须使用基于URL的所需文件。例如,如果URL以如何根据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
?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代码注入的安全说明
想象一下,您的服务器并不是很坚固(很多都不是;您会感到惊讶)。你的名字是什么