很抱歉,如果标题不够清晰,我不知道如何写得更好。
这种情况是,我有一个cron作业,它向用户发送邮件。我有语言文件,根据用户的配置,我想用他的语言发送邮件。
但我不知道该怎么做。
每个语言文件都有常量定义,如:
en.php定义("日期","日期");define('TIME','TIME');
es.phpdefine('DATE','Fecha');define('TIME','Hora');
我需要根据用户语言显示正确的标签,但我还需要一段时间:
while ($row = mysql_fetch_array($res)) {
if ($row['lang'] == en) //load the english labels
}
所以我觉得我不能用";include_ once";在每次迭代中。
问题是您使用了PHP常量,因此一旦设置了它们,就无法在脚本中真正更改它们。尝试将您的常量及其所有引用重写为变量。
假设您的语言文件的名称如下lang.code.php
,并且将发送电子邮件的脚本是sendemail.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);
然后,您可以使用$terms
数组中的关键字引用语言文件中的术语。当然,您必须为语言文件、目录遍历等创建验证检查。但这是实现它的一种方法
如果您不能重写代码,那么我建议将所有电子邮件内容放在一个文件中,并使用file_get_contents()
通过HTTP获取电子邮件内容。在该文件中,您将有一个条件,用于加载所需的语言文件。
假设将生成电子邮件内容的文件名为emailcontent.php
,您可以执行以下操作:
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代码的重复编译方面有很大的开销。如果有其他方法可以清除每封电子邮件的全局分数,那么这是更好的方法。但如果你不能重写你的代码,这是我唯一能想到的方法。
在这件事上,你应该根据你可以从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
在您的情况下,常量将不起作用,因为它们在执行过程中无法更改。
相反,我建议将所有语言信息都包含在一个文件中,这些可以是常量,每个常量都包含一个不同的数组:
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
}