我有一个语言函数(就像Wordpress和其他cms的系统一样)返回定义语言中的术语
function lang($term) {
include "language/cn.php";
if(!empty($tans[$term])) {$translatedterm=$tans[$term];}
else { $translated = $term;}
return $translated;
}
问题是我想在菜单上提供选择语言的选项,因为人们可以更改语言。为此,我需要为每种语言更新"include 'language/cn.php'"的值。它应该是include "language/$language.php";
,但$language
是来自菜单选择的字符串,并且在功能之外。你知道如何根据所选择的语言改变函数内的语言文件吗?
在处理语言选择表单的代码中,可以将选择的语言存储在会话中:
$allowed_languages = array('en', ...);
if (array_key_exists($_POST['language'], $allowed_languages)) {
$_SESSION['language'] = $_POST['language'];
}
然后,在这个函数中,如果该语言可用,则从会话中拉出该语言:
function lang($term) {
$language = isset($_SESSION['language']) ? $_SESSION['language'] : 'en';
require_once 'language/' . $langauge . '.php';
// ...
}
你正在这样做:
include 'language/$language.php';
这不起作用,因为PHP只在字符串被双引号括起来时才解释字符串中的变量。在这里,它将简单地接受您指定的字符串,而不转换变量名。
可以将变量置于字符串之外,如下所示:
include 'language/' . $language.php;
或者在字符串中使用双引号,如下:
include "language/{$language}.php";
(变量名周围的花括号在这个上下文中是可选的,但是推荐使用)
这两个都将导致$language
在文件被包含之前被转换为所需的值。
希望对你有帮助。
根据Alex Howansky给出的提示,最终的解决方案是使用php变量,如$_SEESION, $_GET, $_POST等。这些变量可以在函数中使用。但是,由于函数有自己的作用域,因此不能在函数内部读取来自函数外部的静态字符串。
你打算为每一个术语包括翻译文件吗?
加载你的翻译文件一次和安全:
function lang($term) {
static $trans;
if (!$trans) {
global $language; // seems the problem as silly as this
$langfile = "language/".basename($language).".php";
if (!is_readable($langfile)) {
$langfile = "language/default.php";
}
include $langfile;
}
return (empty($trans[$term]))?$term:$trans[$term];
}