Php 在while循环中包含自定义语言文件
对不起,如果标题不够清楚,我不知道如何写得更好 现在的情况是,我有一个cron任务,它向用户发送邮件。我有语言文件,根据用户的配置,我想用他的语言发送邮件 但我不知道怎么做 每个语言文件都有如下常量定义: en.php定义('DATE','DATE');定义(‘时间’,‘时间’) es.php定义('DATE','Fecha');定义(‘时间’、‘时间’) 我需要根据用户语言显示正确的标签,但我处于一个while循环中:Php 在while循环中包含自定义语言文件,php,include,while-loop,Php,Include,While Loop,对不起,如果标题不够清楚,我不知道如何写得更好 现在的情况是,我有一个cron任务,它向用户发送邮件。我有语言文件,根据用户的配置,我想用他的语言发送邮件 但我不知道怎么做 每个语言文件都有如下常量定义: en.php定义('DATE','DATE');定义(‘时间’,‘时间’) es.php定义('DATE','Fecha');定义(‘时间’、‘时间’) 我需要根据用户语言显示正确的标签,但我处于一个while循环中: while ($row = mysql_fetch_array($res)
while ($row = mysql_fetch_array($res)) {
if ($row['lang'] == en) //load the english labels
}
因此,我认为我不能在每次迭代中使用“include_once”之类的东西。在这个我能做的事情中,您应该存储模板以根据您可以从DB获取的语言对其自身进行数据库化 或 另一种方法是让每个变量都有条件
en.php define('DATE_EN','Date'); define('TIME','Time');
es.php define('DATE_FR','Fecha'); define('TIME','Hora');
if ($row['lang'] == en)
DATE_EN
else
DATE_FR
问题是,您使用PHP常量进行设置,因此一旦设置了PHP常量,就无法在脚本中真正更改它们。尝试将常量及其所有引用重写为变量 假设您的语言文件命名如下
lang.code.php
,发送电子邮件的脚本位于sendmail.php
。您可以这样做:
In lang.en.php
<?php
$terms['date'] = 'Date';
In lang.es.php
<?php
$terms['date'] = 'Fecha';
In sendemail.php:
<?php
function sendEmail($language = 'en')
{
include "lang.$language.php";
extract($terms);
$to = 'foo@bar.com';
$subject = 'Test';
$body = "The $date today is: " . date('r');
mail(...);
}
foreach($users as $user)
sendEmail($user->preferredLanguage);
In lang.en.php
<?php
define('DATE', 'Date');
In lang.es.php
<?php
define('DATE, 'Fecha');
In emailcontent.php
<?php
require "lang.{$_GET['lang']}.php";
echo 'The ' . DATE . ' today is: ' . date('r');
In sendemail.php
<?php
$to = 'foo@bar.com';
$subject = 'Test';
foreach($users as $user)
{
$contents = file_get_contents('http://yourhost.com/emailcontent.php?lang=en');
mail(...);
}
当然,您需要添加一些安全检查以防止本地文件包含、访问emailcontent.php等,但这是它的要点。然而,这在延迟和重复编译PHP代码方面有很大的开销。如果有任何其他方法来清除每封电子邮件的全球分数,那么这是更好的方法。但是如果你不能重写你的代码,这是我能想到的唯一方法 在您的情况下,常量将不起作用,因为它们在执行期间无法更改 相反,我建议将所有语言信息包含在一个文件中,这些可以是常量,每个常量包含不同的数组: langs.php
define('EN', array(
'DATE' => 'Date',
'TIME' => 'Time',
));
define('ES', array(
'DATE' => 'Fecha',
'TIME' => 'Hora',
));
接下来,您可以为每个用户向数组$row
添加一个值,也可以使用类似$lang
的变量,该变量将在每次while循环时被覆盖
require_once 'langs.php' //or include_once
while ($row = mysql_fetch_array($res)) {
if ($row['lang'] == en) { //load the english labels
$lang = EN;
} elseif ($row['lang'] == es {
$lang = ES;
}
echo "Welcome {$row['name']}, today it's {$lang['DATE']}" //will display the corresponding $lang value
}
我强烈建议你考虑转机。谢谢。我喜欢你的解决方案。对每种语言使用不同的文件,但使用数组而不是常量。